mirror of
https://github.com/odoo/owl.git
synced 2025-10-06 19:59:41 +07:00
c16d8ed6de
We re-add the possibility to validate props when dev mode is active. No change in the API right Now. The dev mode is activated via the configure method of App class.
171 lines
4.9 KiB
TypeScript
171 lines
4.9 KiB
TypeScript
//import { AsyncRoot } from "../../src/misc/async_root";
|
|
import { useState, mount } from "../../src";
|
|
import { xml } from "../../src/tags";
|
|
import { makeDeferred, makeTestFixture, snapshotEverything, nextTick } from "../helpers";
|
|
import { Component } from "../../src/component/component";
|
|
|
|
let fixture: HTMLElement;
|
|
|
|
snapshotEverything();
|
|
|
|
beforeEach(() => {
|
|
fixture = makeTestFixture();
|
|
});
|
|
|
|
describe("Asyncroot", () => {
|
|
test.skip("delayed component with AsyncRoot component", async () => {
|
|
class Child extends Component {
|
|
static template = xml`<span><t t-esc="props.val"/></span>`;
|
|
}
|
|
class AsyncChild extends Child {
|
|
willUpdateProps() {
|
|
return def;
|
|
}
|
|
}
|
|
class Parent extends Component {
|
|
static template = xml`
|
|
<div>
|
|
<button t-on-click="updateApp">Update App State</button>
|
|
<div class="children">
|
|
<Child val="state.val"/>
|
|
<AsyncRoot>
|
|
<AsyncChild val="state.val"/>
|
|
</AsyncRoot>
|
|
</div>
|
|
</div>`;
|
|
static components = { Child, AsyncChild /*AsyncRoot*/ };
|
|
state = useState({ val: 0 });
|
|
|
|
updateApp() {
|
|
this.state.val++;
|
|
}
|
|
}
|
|
|
|
await mount(Parent, fixture);
|
|
|
|
expect(fixture.querySelector(".children")!.innerHTML).toBe("<span>0</span><span>0</span>");
|
|
|
|
// click on button to increment Parent counter
|
|
const def = makeDeferred();
|
|
fixture.querySelector("button")!.click();
|
|
await nextTick();
|
|
|
|
expect(fixture.querySelector(".children")!.innerHTML).toBe("<span>1</span><span>0</span>");
|
|
|
|
def.resolve();
|
|
await nextTick();
|
|
|
|
expect(fixture.querySelector(".children")!.innerHTML).toBe("<span>1</span><span>1</span>");
|
|
});
|
|
|
|
test.skip("fast component with AsyncRoot", async () => {
|
|
class Child extends Component {
|
|
static template = xml`<span><t t-esc="props.val"/></span>`;
|
|
}
|
|
class AsyncChild extends Child {
|
|
willUpdateProps() {
|
|
return def;
|
|
}
|
|
}
|
|
|
|
class Parent extends Component {
|
|
static template = xml`
|
|
<div>
|
|
<button t-on-click="updateApp">Update App State</button>
|
|
<div class="children">
|
|
<AsyncRoot>
|
|
<Child val="state.val"/>
|
|
</AsyncRoot>
|
|
<AsyncChild val="state.val"/>
|
|
</div>
|
|
</div>`;
|
|
static components = { Child, AsyncChild /*AsyncRoot*/ };
|
|
state = useState({ val: 0 });
|
|
|
|
updateApp() {
|
|
this.state.val++;
|
|
}
|
|
}
|
|
|
|
await mount(Parent, fixture);
|
|
|
|
expect(fixture.querySelector(".children")!.innerHTML).toBe("<span>0</span><span>0</span>");
|
|
|
|
// click on button to increment Parent counter
|
|
const def = makeDeferred();
|
|
fixture.querySelector("button")!.click();
|
|
await nextTick();
|
|
|
|
expect(fixture.querySelector(".children")!.innerHTML).toBe("<span>1</span><span>0</span>");
|
|
|
|
def.resolve();
|
|
await nextTick();
|
|
|
|
expect(fixture.querySelector(".children")!.innerHTML).toBe("<span>1</span><span>1</span>");
|
|
});
|
|
|
|
test.skip("asyncroot component: mixed re-renderings", async () => {
|
|
class Child extends Component {
|
|
static template = xml`
|
|
<span t-on-click="increment">
|
|
<t t-esc="state.val"/>/<t t-esc="props.val"/>
|
|
</span>`;
|
|
state = useState({ val: 0 });
|
|
|
|
increment() {
|
|
this.state.val++;
|
|
}
|
|
}
|
|
class AsyncChild extends Child {
|
|
willUpdateProps() {
|
|
return def;
|
|
}
|
|
}
|
|
class Parent extends Component {
|
|
static template = xml`
|
|
<div>
|
|
<button t-on-click="updateApp">Update App State</button>
|
|
<div class="children">
|
|
<Child val="state.val"/>
|
|
<AsyncRoot>
|
|
<AsyncChild val="state.val"/>
|
|
</AsyncRoot>
|
|
</div>
|
|
</div>`;
|
|
static components = { Child, AsyncChild /*AsyncRoot*/ };
|
|
state = useState({ val: 0 });
|
|
|
|
updateApp() {
|
|
this.state.val++;
|
|
}
|
|
}
|
|
|
|
const parent = await mount(Parent, fixture);
|
|
|
|
expect(fixture.querySelector(".children")!.innerHTML).toBe("<span>0/0</span><span>0/0</span>");
|
|
|
|
// click on button to increment Parent counter
|
|
const def = makeDeferred();
|
|
fixture.querySelector("button")!.click();
|
|
await nextTick();
|
|
|
|
expect(fixture.querySelector(".children")!.innerHTML).toBe("<span>0/1</span><span>0/0</span>");
|
|
|
|
// click on each Child to increment their local counter
|
|
const children = (<HTMLElement>parent.el).querySelectorAll("span");
|
|
children[0]!.click();
|
|
await nextTick();
|
|
expect(fixture.querySelector(".children")!.innerHTML).toBe("<span>1/1</span><span>0/0</span>");
|
|
|
|
children[1]!.click();
|
|
await nextTick();
|
|
expect(fixture.querySelector(".children")!.innerHTML).toBe("<span>1/1</span><span>0/0</span>");
|
|
|
|
// finalize first re-rendering (coming from the props update)
|
|
def.resolve();
|
|
await nextTick();
|
|
|
|
expect(fixture.querySelector(".children")!.innerHTML).toBe("<span>1/1</span><span>1/1</span>");
|
|
});
|
|
});
|