diff --git a/src/runtime/component_node.ts b/src/runtime/component_node.ts index bffc0fc5..97950ab4 100644 --- a/src/runtime/component_node.ts +++ b/src/runtime/component_node.ts @@ -6,7 +6,7 @@ import { OwlError } from "../common/owl_error"; import { Fiber, makeChildFiber, makeRootFiber, MountFiber, MountOptions } from "./fibers"; import { clearReactivesForCallback, getSubscriptions, reactive, targets } from "./reactivity"; import { STATUS } from "./status"; -import { batched, Callback } from "./utils"; +import { batched, Callback, possiblySync } from "./utils"; let currentNode: ComponentNode | null = null; @@ -128,21 +128,29 @@ export class ComponentNode

implements VNode f.call(component))); - } catch (e) { - this.app.handleError({ node: this, error: e }); - return; - } - if (this.status === STATUS.NEW && this.fiber === fiber) { - fiber.render(); - } + return possiblySync( + () => { + const willStartResults = this.willStart.map((f) => f.call(component)); + if (willStartResults.some((r) => typeof r?.then === "function")) { + return Promise.all(willStartResults); + } + return; + }, + () => { + if (this.status === STATUS.NEW && this.fiber === fiber) { + fiber.render(); + } + }, + (e: any) => { + this.app.handleError({ node: this, error: e }); + } + ); } async render(deep: boolean) { @@ -238,7 +246,7 @@ export class ComponentNode

implements VNode implements VNode f.call(component, props))); - await prom; - if (fiber !== this.fiber) { - return; - } - component.props = props; - fiber.render(); - const parentRoot = parentFiber.root!; - if (this.willPatch.length) { - parentRoot.willPatch.push(fiber); - } - if (this.patched.length) { - parentRoot.patched.push(fiber); - } + return possiblySync( + () => { + const willUpdateProps = this.willUpdateProps.map((f) => f.call(component, props)); + if (willUpdateProps.some((p) => typeof p?.then === "function")) { + return Promise.all(willUpdateProps); + } + return; + }, + () => { + if (fiber !== this.fiber) { + return; + } + component.props = props; + fiber.render(); + const parentRoot = parentFiber.root!; + if (this.willPatch.length) { + parentRoot.willPatch.push(fiber); + } + if (this.patched.length) { + parentRoot.patched.push(fiber); + } + } + ); } /** diff --git a/src/runtime/utils.ts b/src/runtime/utils.ts index 7aa9b112..4721950b 100644 --- a/src/runtime/utils.ts +++ b/src/runtime/utils.ts @@ -88,3 +88,24 @@ export class Markup extends String {} export function markup(value: any) { return new Markup(value); } + +export function possiblySync(computation: Function, onSuccess: Function, onError?: Function) { + try { + let result; + if (onError) { + try { + result = computation(); + } catch (e) { + return onError(e); + } + } else { + result = computation(); + } + if (typeof result?.then === "function") { + return result.then(onSuccess, onError); + } + return onSuccess(result); + } catch (e) { + return Promise.reject(e); + } +} diff --git a/tests/components/__snapshots__/concurrency.test.ts.snap b/tests/components/__snapshots__/concurrency.test.ts.snap index e9d6b70c..331eb0b3 100644 --- a/tests/components/__snapshots__/concurrency.test.ts.snap +++ b/tests/components/__snapshots__/concurrency.test.ts.snap @@ -1861,10 +1861,10 @@ exports[`renderings, destruction, patch, stuff, ... yet another variation 3`] = ) { let { text, createBlock, list, multi, html, toggler, comment } = bdom; - let block3 = createBlock(\`

\`); + let block3 = createBlock(\`\`); return function template(ctx, node, key = \\"\\") { - const b2 = text(\`D\`); + const b2 = text(\`C\`); let hdlr1 = [ctx['increment'], ctx]; let txt1 = ctx['state'].val; const b3 = block3([hdlr1, txt1]); @@ -1878,10 +1878,10 @@ exports[`renderings, destruction, patch, stuff, ... yet another variation 4`] = ) { let { text, createBlock, list, multi, html, toggler, comment } = bdom; - let block3 = createBlock(\`\`); + let block3 = createBlock(\`

\`); return function template(ctx, node, key = \\"\\") { - const b2 = text(\`C\`); + const b2 = text(\`D\`); let hdlr1 = [ctx['increment'], ctx]; let txt1 = ctx['state'].val; const b3 = block3([hdlr1, txt1]); diff --git a/tests/components/concurrency.test.ts b/tests/components/concurrency.test.ts index b6ff3e55..8507037f 100644 --- a/tests/components/concurrency.test.ts +++ b/tests/components/concurrency.test.ts @@ -206,13 +206,15 @@ test("destroying/recreating a subcomponent, other scenario", async () => { "Parent:willRender", "Child:setup", "Child:willStart", + "Child:willRender", + "Child:rendered", "Parent:rendered", "Parent:willRender", "Child:setup", "Child:willStart", - "Parent:rendered", "Child:willRender", "Child:rendered", + "Parent:rendered", "Child:willDestroy", "Parent:willPatch", "Child:mounted", @@ -369,9 +371,9 @@ test("creating two async components, scenario 2", async () => { "Parent:willRender", "ChildA:setup", "ChildA:willStart", - "Parent:rendered", "ChildA:willRender", "ChildA:rendered", + "Parent:rendered", "ChildA:mounted", "Parent:mounted", ] @@ -467,9 +469,9 @@ test("creating two async components, scenario 3 (patching in the same frame)", a "Parent:willRender", "ChildA:setup", "ChildA:willStart", - "Parent:rendered", "ChildA:willRender", "ChildA:rendered", + "Parent:rendered", "ChildA:mounted", "Parent:mounted", ] @@ -550,9 +552,9 @@ test("update a sub-component twice in the same frame", async () => { "Parent:willRender", "ChildA:setup", "ChildA:willStart", - "Parent:rendered", "ChildA:willRender", "ChildA:rendered", + "Parent:rendered", "ChildA:mounted", "Parent:mounted", ] @@ -626,9 +628,9 @@ test("update a sub-component twice in the same frame, 2", async () => { "Parent:willRender", "ChildA:setup", "ChildA:willStart", - "Parent:rendered", "ChildA:willRender", "ChildA:rendered", + "Parent:rendered", "ChildA:mounted", "Parent:mounted", ] @@ -642,6 +644,8 @@ test("update a sub-component twice in the same frame, 2", async () => { Array [ "Parent:willRender", "ChildA:willUpdateProps", + "ChildA:willRender", + "ChildA:rendered", "Parent:rendered", ] `); @@ -651,12 +655,7 @@ test("update a sub-component twice in the same frame, 2", async () => { // I do not see anything harmful in waiting an extra tick. But it is annoying to not // know what is different. await nextMicroTick(); - expect(steps.splice(0)).toMatchInlineSnapshot(` - Array [ - "ChildA:willRender", - "ChildA:rendered", - ] - `); + expect(steps.splice(0)).toMatchInlineSnapshot(`Array []`); expect(fixture.innerHTML).toBe("
1
"); parent.state.valA = 3; await nextMicroTick(); @@ -665,6 +664,8 @@ test("update a sub-component twice in the same frame, 2", async () => { Array [ "Parent:willRender", "ChildA:willUpdateProps", + "ChildA:willRender", + "ChildA:rendered", "Parent:rendered", ] `); @@ -672,12 +673,7 @@ test("update a sub-component twice in the same frame, 2", async () => { await nextMicroTick(); // same as above await nextMicroTick(); - expect(steps.splice(0)).toMatchInlineSnapshot(` - Array [ - "ChildA:willRender", - "ChildA:rendered", - ] - `); + expect(steps.splice(0)).toMatchInlineSnapshot(`Array []`); expect(fixture.innerHTML).toBe("
1
"); await nextTick(); @@ -733,13 +729,13 @@ test("properly behave when destroyed/unmounted while rendering ", async () => { "Parent:willRender", "Child:setup", "Child:willStart", - "Parent:rendered", "Child:willRender", "SubChild:setup", "SubChild:willStart", - "Child:rendered", "SubChild:willRender", "SubChild:rendered", + "Child:rendered", + "Parent:rendered", "SubChild:mounted", "Child:mounted", "Parent:mounted", @@ -755,10 +751,10 @@ test("properly behave when destroyed/unmounted while rendering ", async () => { Array [ "Parent:willRender", "Child:willUpdateProps", - "Parent:rendered", "Child:willRender", "SubChild:willUpdateProps", "Child:rendered", + "Parent:rendered", ] `); @@ -835,13 +831,15 @@ test("rendering component again in next microtick", async () => { "Parent:willRender", "Child:setup", "Child:willStart", + "Child:willRender", + "Child:rendered", "Parent:rendered", "Parent:willRender", "Child:setup", "Child:willStart", - "Parent:rendered", "Child:willRender", "Child:rendered", + "Parent:rendered", "Child:willDestroy", "Parent:willPatch", "Child:mounted", @@ -895,13 +893,13 @@ test("concurrent renderings scenario 1", async () => { "ComponentA:willRender", "ComponentB:setup", "ComponentB:willStart", - "ComponentA:rendered", "ComponentB:willRender", "ComponentC:setup", "ComponentC:willStart", - "ComponentB:rendered", "ComponentC:willRender", "ComponentC:rendered", + "ComponentB:rendered", + "ComponentA:rendered", "ComponentC:mounted", "ComponentB:mounted", "ComponentA:mounted", @@ -926,10 +924,10 @@ test("concurrent renderings scenario 1", async () => { Array [ "ComponentA:willRender", "ComponentB:willUpdateProps", - "ComponentA:rendered", "ComponentB:willRender", "ComponentC:willUpdateProps", "ComponentB:rendered", + "ComponentA:rendered", ] `); expect(ComponentC.prototype.someValue).toBeCalledTimes(1); @@ -996,13 +994,13 @@ test("concurrent renderings scenario 2", async () => { "ComponentA:willRender", "ComponentB:setup", "ComponentB:willStart", - "ComponentA:rendered", "ComponentB:willRender", "ComponentC:setup", "ComponentC:willStart", - "ComponentB:rendered", "ComponentC:willRender", "ComponentC:rendered", + "ComponentB:rendered", + "ComponentA:rendered", "ComponentC:mounted", "ComponentB:mounted", "ComponentA:mounted", @@ -1016,10 +1014,10 @@ test("concurrent renderings scenario 2", async () => { Array [ "ComponentA:willRender", "ComponentB:willUpdateProps", - "ComponentA:rendered", "ComponentB:willRender", "ComponentC:willUpdateProps", "ComponentB:rendered", + "ComponentA:rendered", ] `); @@ -1099,13 +1097,13 @@ test("concurrent renderings scenario 2bis", async () => { "ComponentA:willRender", "ComponentB:setup", "ComponentB:willStart", - "ComponentA:rendered", "ComponentB:willRender", "ComponentC:setup", "ComponentC:willStart", - "ComponentB:rendered", "ComponentC:willRender", "ComponentC:rendered", + "ComponentB:rendered", + "ComponentA:rendered", "ComponentC:mounted", "ComponentB:mounted", "ComponentA:mounted", @@ -1119,10 +1117,10 @@ test("concurrent renderings scenario 2bis", async () => { Array [ "ComponentA:willRender", "ComponentB:willUpdateProps", - "ComponentA:rendered", "ComponentB:willRender", "ComponentC:willUpdateProps", "ComponentB:rendered", + "ComponentA:rendered", ] `); @@ -1217,17 +1215,17 @@ test("concurrent renderings scenario 3", async () => { "ComponentA:willRender", "ComponentB:setup", "ComponentB:willStart", - "ComponentA:rendered", "ComponentB:willRender", "ComponentC:setup", "ComponentC:willStart", - "ComponentB:rendered", "ComponentC:willRender", "ComponentD:setup", "ComponentD:willStart", - "ComponentC:rendered", "ComponentD:willRender", "ComponentD:rendered", + "ComponentC:rendered", + "ComponentB:rendered", + "ComponentA:rendered", "ComponentD:mounted", "ComponentC:mounted", "ComponentB:mounted", @@ -1258,10 +1256,10 @@ test("concurrent renderings scenario 3", async () => { Array [ "ComponentB:willRender", "ComponentC:willUpdateProps", - "ComponentB:rendered", "ComponentC:willRender", "ComponentD:willUpdateProps", "ComponentC:rendered", + "ComponentB:rendered", ] `); @@ -1273,12 +1271,12 @@ test("concurrent renderings scenario 3", async () => { "ComponentD:willRender", "ComponentD:rendered", "ComponentA:willPatch", - "ComponentB:willPatch", "ComponentC:willPatch", + "ComponentB:willPatch", "ComponentD:willPatch", "ComponentD:patched", - "ComponentC:patched", "ComponentB:patched", + "ComponentC:patched", "ComponentA:patched", ] `); @@ -1343,17 +1341,17 @@ test("concurrent renderings scenario 4", async () => { "ComponentA:willRender", "ComponentB:setup", "ComponentB:willStart", - "ComponentA:rendered", "ComponentB:willRender", "ComponentC:setup", "ComponentC:willStart", - "ComponentB:rendered", "ComponentC:willRender", "ComponentD:setup", "ComponentD:willStart", - "ComponentC:rendered", "ComponentD:willRender", "ComponentD:rendered", + "ComponentC:rendered", + "ComponentB:rendered", + "ComponentA:rendered", "ComponentD:mounted", "ComponentC:mounted", "ComponentB:mounted", @@ -1384,10 +1382,10 @@ test("concurrent renderings scenario 4", async () => { Array [ "ComponentB:willRender", "ComponentC:willUpdateProps", - "ComponentB:rendered", "ComponentC:willRender", "ComponentD:willUpdateProps", "ComponentC:rendered", + "ComponentB:rendered", ] `); @@ -1406,12 +1404,12 @@ test("concurrent renderings scenario 4", async () => { "ComponentD:willRender", "ComponentD:rendered", "ComponentA:willPatch", - "ComponentB:willPatch", "ComponentC:willPatch", + "ComponentB:willPatch", "ComponentD:willPatch", "ComponentD:patched", - "ComponentC:patched", "ComponentB:patched", + "ComponentC:patched", "ComponentA:patched", ] `); @@ -1452,9 +1450,9 @@ test("concurrent renderings scenario 5", async () => { "ComponentA:willRender", "ComponentB:setup", "ComponentB:willStart", - "ComponentA:rendered", "ComponentB:willRender", "ComponentB:rendered", + "ComponentA:rendered", "ComponentB:mounted", "ComponentA:mounted", ] @@ -1540,9 +1538,9 @@ test("concurrent renderings scenario 6", async () => { "ComponentA:willRender", "ComponentB:setup", "ComponentB:willStart", - "ComponentA:rendered", "ComponentB:willRender", "ComponentB:rendered", + "ComponentA:rendered", "ComponentB:mounted", "ComponentA:mounted", ] @@ -1628,9 +1626,9 @@ test("concurrent renderings scenario 7", async () => { "ComponentA:willRender", "ComponentB:setup", "ComponentB:willStart", - "ComponentA:rendered", "ComponentB:willRender", "ComponentB:rendered", + "ComponentA:rendered", "ComponentB:mounted", "ComponentA:mounted", ] @@ -1639,11 +1637,13 @@ test("concurrent renderings scenario 7", async () => { component.state.fromA = 2; await nextTick(); expect(fixture.innerHTML).toBe("

2c

"); - expect(ComponentB.prototype.someValue).toBeCalledTimes(2); + expect(ComponentB.prototype.someValue).toBeCalledTimes(3); expect(steps.splice(0)).toMatchInlineSnapshot(` Array [ "ComponentA:willRender", "ComponentB:willUpdateProps", + "ComponentB:willRender", + "ComponentB:rendered", "ComponentA:rendered", "ComponentB:willRender", "ComponentB:rendered", @@ -1686,9 +1686,9 @@ test("concurrent renderings scenario 8", async () => { "ComponentA:willRender", "ComponentB:setup", "ComponentB:willStart", - "ComponentA:rendered", "ComponentB:willRender", "ComponentB:rendered", + "ComponentA:rendered", "ComponentB:mounted", "ComponentA:mounted", ] @@ -1789,17 +1789,17 @@ test("concurrent renderings scenario 9", async () => { "ComponentA:willRender", "ComponentB:setup", "ComponentB:willStart", - "ComponentC:setup", - "ComponentC:willStart", - "ComponentA:rendered", "ComponentB:willRender", "ComponentB:rendered", + "ComponentC:setup", + "ComponentC:willStart", "ComponentC:willRender", "ComponentD:setup", "ComponentD:willStart", - "ComponentC:rendered", "ComponentD:willRender", "ComponentD:rendered", + "ComponentC:rendered", + "ComponentA:rendered", "ComponentD:mounted", "ComponentC:mounted", "ComponentB:mounted", @@ -1815,12 +1815,12 @@ test("concurrent renderings scenario 9", async () => { "ComponentA:willRender", "ComponentB:willUpdateProps", "ComponentC:willUpdateProps", - "ComponentA:rendered", "ComponentC:willRender", "ComponentD:willUpdateProps", - "ComponentC:rendered", "ComponentD:willRender", "ComponentD:rendered", + "ComponentC:rendered", + "ComponentA:rendered", ] `); @@ -1831,9 +1831,9 @@ test("concurrent renderings scenario 9", async () => { Array [ "ComponentC:willRender", "ComponentD:willUpdateProps", - "ComponentC:rendered", "ComponentD:willRender", "ComponentD:rendered", + "ComponentC:rendered", ] `); @@ -1918,9 +1918,9 @@ test("concurrent renderings scenario 10", async () => { "ComponentA:willRender", "ComponentB:setup", "ComponentB:willStart", - "ComponentA:rendered", "ComponentB:willRender", "ComponentB:rendered", + "ComponentA:rendered", "ComponentB:mounted", "ComponentA:mounted", ] @@ -2010,9 +2010,9 @@ test("concurrent renderings scenario 11", async () => { "Parent:willRender", "Child:setup", "Child:willStart", - "Parent:rendered", "Child:willRender", "Child:rendered", + "Parent:rendered", "Child:mounted", "Parent:mounted", ] @@ -2086,9 +2086,9 @@ test("concurrent renderings scenario 12", async () => { "Parent:willRender", "Child:setup", "Child:willStart", - "Parent:rendered", "Child:willRender", "Child:rendered", + "Parent:rendered", "Child:mounted", "Parent:mounted", ] @@ -2175,9 +2175,9 @@ test("concurrent renderings scenario 13", async () => { "Parent:willRender", "Child:setup", "Child:willStart", - "Parent:rendered", "Child:willRender", "Child:rendered", + "Parent:rendered", "Child:mounted", "Parent:mounted", "Child:willRender", @@ -2201,9 +2201,9 @@ test("concurrent renderings scenario 13", async () => { "Parent:willRender", "Child:setup", "Child:willStart", - "Parent:rendered", "Child:willRender", "Child:rendered", + "Parent:rendered", "Parent:willPatch", "Child:mounted", "Parent:patched", @@ -2271,13 +2271,13 @@ test("concurrent renderings scenario 14", async () => { "A:willRender", "B:setup", "B:willStart", - "A:rendered", "B:willRender", "C:setup", "C:willStart", - "B:rendered", "C:willRender", "C:rendered", + "B:rendered", + "A:rendered", "C:mounted", "B:mounted", "A:mounted", @@ -2297,10 +2297,12 @@ test("concurrent renderings scenario 14", async () => { Array [ "A:willRender", "B:willUpdateProps", - "A:rendered", "B:willRender", "C:willUpdateProps", + "C:willRender", + "C:rendered", "B:rendered", + "A:rendered", ] `); @@ -2317,13 +2319,11 @@ test("concurrent renderings scenario 14", async () => { ); expect(steps.splice(0)).toMatchInlineSnapshot(` Array [ - "C:willRender", - "C:rendered", "B:willRender", "C:willUpdateProps", - "B:rendered", "C:willRender", "C:rendered", + "B:rendered", "A:willPatch", "B:willPatch", "C:willPatch", @@ -2378,13 +2378,13 @@ test("concurrent renderings scenario 15", async () => { "A:willRender", "B:setup", "B:willStart", - "A:rendered", "B:willRender", "C:setup", "C:willStart", - "B:rendered", "C:willRender", "C:rendered", + "B:rendered", + "A:rendered", "C:mounted", "B:mounted", "A:mounted", @@ -2404,10 +2404,12 @@ test("concurrent renderings scenario 15", async () => { Array [ "A:willRender", "B:willUpdateProps", - "A:rendered", "B:willRender", "C:willUpdateProps", + "C:willRender", + "C:rendered", "B:rendered", + "A:rendered", ] `); @@ -2426,12 +2428,7 @@ test("concurrent renderings scenario 15", async () => { await nextMicroTick(); app.scheduler.flush(); expect(fixture.innerHTML).toBe("

123

"); - expect(steps.splice(0)).toMatchInlineSnapshot(` - Array [ - "C:willRender", - "C:rendered", - ] - `); + expect(steps.splice(0)).toMatchInlineSnapshot(`Array []`); await nextTick(); expect(fixture.innerHTML).toBe( @@ -2441,9 +2438,9 @@ test("concurrent renderings scenario 15", async () => { Array [ "B:willRender", "C:willUpdateProps", - "B:rendered", "C:willRender", "C:rendered", + "B:rendered", "A:willPatch", "B:willPatch", "C:willPatch", @@ -2506,13 +2503,13 @@ test("concurrent renderings scenario 16", async () => { "A:willRender", "B:setup", "B:willStart", - "A:rendered", "B:willRender", "C:setup", "C:willStart", - "B:rendered", "C:willRender", "C:rendered", + "B:rendered", + "A:rendered", "C:mounted", "B:mounted", "A:mounted", @@ -2533,12 +2530,12 @@ test("concurrent renderings scenario 16", async () => { Array [ "A:willRender", "B:willUpdateProps", - "A:rendered", "B:willRender", "C:willUpdateProps", - "B:rendered", "C:willRender", "C:rendered", + "B:rendered", + "A:rendered", ] `); @@ -2558,11 +2555,11 @@ test("concurrent renderings scenario 16", async () => { "C:rendered", "B:willRender", "C:willUpdateProps", - "B:rendered", "C:willRender", "D:setup", "D:willStart", "C:rendered", + "B:rendered", "D:willDestroy", ] `); @@ -2722,7 +2719,7 @@ test("changing state before first render does not trigger a render", async () => setup() { useLogLifecycle(); this.state.drinks++; - onWillStart(() => { + onWillStart(async () => { this.state.drinks++; }); } @@ -2757,7 +2754,7 @@ test("changing state before first render does not trigger a render (with parent) setup() { useLogLifecycle(); this.state.drinks++; - onWillStart(() => { + onWillStart(async () => { this.state.drinks++; }); } @@ -2843,24 +2840,21 @@ test("two renderings initiated between willPatch and patched", async () => { "Parent:willRender", "Panel:setup", "Panel:willStart", - "Parent:rendered", "Panel:willRender", "Panel:rendered", + "Parent:rendered", "Panel:mounted", "Parent:mounted", "Parent:willRender", "Panel:willUpdateProps", + "Panel:willRender", + "Panel:rendered", "Parent:rendered", ] `); await nextMicroTick(); - expect(steps.splice(0)).toMatchInlineSnapshot(` - Array [ - "Panel:willRender", - "Panel:rendered", - ] - `); + expect(steps.splice(0)).toMatchInlineSnapshot(`Array []`); await nextTick(); expect(steps.splice(0)).toMatchInlineSnapshot(` @@ -2881,9 +2875,9 @@ test("two renderings initiated between willPatch and patched", async () => { "Parent:willRender", "Panel:setup", "Panel:willStart", - "Parent:rendered", "Panel:willRender", "Panel:rendered", + "Parent:rendered", "Parent:willPatch", "Panel:willUnmount", "Panel:willDestroy", @@ -2891,6 +2885,8 @@ test("two renderings initiated between willPatch and patched", async () => { "Parent:patched", "Parent:willRender", "Panel:willUpdateProps", + "Panel:willRender", + "Panel:rendered", "Parent:rendered", ] `); @@ -2899,8 +2895,6 @@ test("two renderings initiated between willPatch and patched", async () => { expect(fixture.innerHTML).toBe("
Panel2Mounted
"); expect(steps.splice(0)).toMatchInlineSnapshot(` Array [ - "Panel:willRender", - "Panel:rendered", "Parent:willPatch", "Panel:willPatch", "Panel:patched", @@ -2963,9 +2957,9 @@ test("parent and child rendered at exact same time", async () => { "Parent:willRender", "Child:setup", "Child:willStart", - "Parent:rendered", "Child:willRender", "Child:rendered", + "Parent:rendered", "Child:mounted", "Parent:mounted", ] @@ -2980,9 +2974,9 @@ test("parent and child rendered at exact same time", async () => { Array [ "Parent:willRender", "Child:willUpdateProps", - "Parent:rendered", "Child:willRender", "Child:rendered", + "Parent:rendered", "Parent:willPatch", "Child:willPatch", "Child:patched", @@ -3026,9 +3020,9 @@ test("delay willUpdateProps", async () => { "Parent:willRender", "Child:setup", "Child:willStart", - "Parent:rendered", "Child:willRender", "Child:rendered", + "Parent:rendered", "Child:mounted", "Parent:mounted", ] @@ -3148,17 +3142,17 @@ test("delay willUpdateProps with rendering grandchild", async () => { "GrandParent:willRender", "Parent:setup", "Parent:willStart", - "GrandParent:rendered", "Parent:willRender", "DelayedChild:setup", "DelayedChild:willStart", - "ReactiveChild:setup", - "ReactiveChild:willStart", - "Parent:rendered", "DelayedChild:willRender", "DelayedChild:rendered", + "ReactiveChild:setup", + "ReactiveChild:willStart", "ReactiveChild:willRender", "ReactiveChild:rendered", + "Parent:rendered", + "GrandParent:rendered", "ReactiveChild:mounted", "DelayedChild:mounted", "Parent:mounted", @@ -3178,13 +3172,13 @@ test("delay willUpdateProps with rendering grandchild", async () => { Array [ "GrandParent:willRender", "Parent:willUpdateProps", - "GrandParent:rendered", "Parent:willRender", "DelayedChild:willUpdateProps", "ReactiveChild:willUpdateProps", - "Parent:rendered", "ReactiveChild:willRender", "ReactiveChild:rendered", + "Parent:rendered", + "GrandParent:rendered", ] `); @@ -3200,13 +3194,13 @@ test("delay willUpdateProps with rendering grandchild", async () => { Array [ "GrandParent:willRender", "Parent:willUpdateProps", - "GrandParent:rendered", "Parent:willRender", "DelayedChild:willUpdateProps", "ReactiveChild:willUpdateProps", - "Parent:rendered", "ReactiveChild:willRender", "ReactiveChild:rendered", + "Parent:rendered", + "GrandParent:rendered", ] `); @@ -3218,12 +3212,12 @@ test("delay willUpdateProps with rendering grandchild", async () => { "DelayedChild:willRender", "DelayedChild:rendered", "GrandParent:willPatch", - "Parent:willPatch", "ReactiveChild:willPatch", + "Parent:willPatch", "DelayedChild:willPatch", "DelayedChild:patched", - "ReactiveChild:patched", "Parent:patched", + "ReactiveChild:patched", "GrandParent:patched", ] `); @@ -3266,9 +3260,9 @@ test("two sequential renderings before an animation frame", async () => { "Parent:willRender", "Child:setup", "Child:willStart", - "Parent:rendered", "Child:willRender", "Child:rendered", + "Parent:rendered", "Child:mounted", "Parent:mounted", ] @@ -3285,9 +3279,9 @@ test("two sequential renderings before an animation frame", async () => { Array [ "Parent:willRender", "Child:willUpdateProps", - "Parent:rendered", "Child:willRender", "Child:rendered", + "Parent:rendered", ] `); @@ -3303,9 +3297,9 @@ test("two sequential renderings before an animation frame", async () => { Array [ "Parent:willRender", "Child:willUpdateProps", - "Parent:rendered", "Child:willRender", "Child:rendered", + "Parent:rendered", ] `); @@ -3581,9 +3575,9 @@ test("rendering parent twice, with different props on child and stuff", async () "Parent:willRender", "Child:setup", "Child:willStart", - "Parent:rendered", "Child:willRender", "Child:rendered", + "Parent:rendered", "Child:mounted", "Parent:mounted", ] @@ -3599,9 +3593,9 @@ test("rendering parent twice, with different props on child and stuff", async () Array [ "Parent:willRender", "Child:willUpdateProps", - "Parent:rendered", "Child:willRender", "Child:rendered", + "Parent:rendered", ] `); expect(fixture.innerHTML).toBe("1"); @@ -3614,9 +3608,9 @@ test("rendering parent twice, with different props on child and stuff", async () Array [ "Parent:willRender", "Child:willUpdateProps", - "Parent:rendered", "Child:willRender", "Child:rendered", + "Parent:rendered", "Parent:willPatch", "Child:willPatch", "Child:patched", @@ -3677,17 +3671,17 @@ test("delayed rendering, but then initial rendering is cancelled by yet another "A:willRender", "B:setup", "B:willStart", - "A:rendered", "B:willRender", "C:setup", "C:willStart", - "B:rendered", "C:willRender", "D:setup", "D:willStart", - "C:rendered", "D:willRender", "D:rendered", + "C:rendered", + "B:rendered", + "A:rendered", "D:mounted", "C:mounted", "B:mounted", @@ -3718,10 +3712,10 @@ test("delayed rendering, but then initial rendering is cancelled by yet another Array [ "A:willRender", "B:willUpdateProps", - "A:rendered", "B:willRender", "C:willUpdateProps", "B:rendered", + "A:rendered", ] `); @@ -3798,13 +3792,13 @@ test("delayed rendering, reusing fiber and stuff", async () => { "A:willRender", "B:setup", "B:willStart", - "A:rendered", "B:willRender", "C:setup", "C:willStart", - "B:rendered", "C:willRender", "C:rendered", + "B:rendered", + "A:rendered", "C:mounted", "B:mounted", "A:mounted", @@ -3901,13 +3895,13 @@ test("delayed rendering, then component is destroyed and stuff", async () => { "A:willRender", "B:setup", "B:willStart", - "A:rendered", "B:willRender", "C:setup", "C:willStart", - "B:rendered", "C:willRender", "C:rendered", + "B:rendered", + "A:rendered", "C:mounted", "B:mounted", "A:mounted", @@ -3989,13 +3983,13 @@ test("delayed rendering, reusing fiber then component is destroyed and stuff", "A:willRender", "B:setup", "B:willStart", - "A:rendered", "B:willRender", "C:setup", "C:willStart", - "B:rendered", "C:willRender", "C:rendered", + "B:rendered", + "A:rendered", "C:mounted", "B:mounted", "A:mounted", @@ -4085,13 +4079,13 @@ test("another scenario with delayed rendering", async () => { "A:willRender", "B:setup", "B:willStart", - "A:rendered", "B:willRender", "C:setup", "C:willStart", - "B:rendered", "C:willRender", "C:rendered", + "B:rendered", + "A:rendered", "C:mounted", "B:mounted", "A:mounted", @@ -4197,15 +4191,15 @@ test("delayed fiber does not get rendered if it was cancelled", async () => { "A:setup", "A:willRender", "B:setup", - "A:rendered", "B:willRender", "C:setup", - "B:rendered", "C:willRender", "D:setup", - "C:rendered", "D:willRender", "D:rendered", + "C:rendered", + "B:rendered", + "A:rendered", "D:mounted", "C:mounted", "B:mounted", @@ -4218,6 +4212,8 @@ test("delayed fiber does not get rendered if it was cancelled", async () => { expect(steps.splice(0)).toMatchInlineSnapshot(` Array [ "C:willRender", + "D:willRender", + "D:rendered", "C:rendered", ] `); @@ -4229,20 +4225,20 @@ test("delayed fiber does not get rendered if it was cancelled", async () => { expect(steps.splice(0)).toMatchInlineSnapshot(` Array [ "A:willRender", - "A:rendered", "B:willRender", - "B:rendered", "C:willRender", - "C:rendered", "D:willRender", "D:rendered", + "C:rendered", + "B:rendered", + "A:rendered", "A:willPatch", - "B:willPatch", - "C:willPatch", "D:willPatch", - "D:patched", - "C:patched", + "C:willPatch", + "B:willPatch", "B:patched", + "C:patched", + "D:patched", "A:patched", ] `); @@ -4310,13 +4306,13 @@ test("destroyed component causes other soon to be destroyed component to rerende "A:willRender", "B:setup", "B:willStart", - "C:setup", - "C:willStart", - "A:rendered", "B:willRender", "B:rendered", + "C:setup", + "C:willStart", "C:willRender", "C:rendered", + "A:rendered", ] `); @@ -4328,13 +4324,13 @@ test("destroyed component causes other soon to be destroyed component to rerende "A:willRender", "B:setup", "B:willStart", - "C:setup", - "C:willStart", - "A:rendered", "B:willRender", "B:rendered", + "C:setup", + "C:willStart", "C:willRender", "C:rendered", + "A:rendered", "B:willDestroy", "C:willDestroy", "A:willPatch", @@ -4399,17 +4395,17 @@ test("delayed rendering, destruction, stuff happens", async () => { "A:willRender", "B:setup", "B:willStart", - "A:rendered", "B:willRender", "C:setup", "C:willStart", - "B:rendered", "C:willRender", "D:setup", "D:willStart", - "C:rendered", "D:willRender", "D:rendered", + "C:rendered", + "B:rendered", + "A:rendered", "D:mounted", "C:mounted", "B:mounted", @@ -4424,10 +4420,10 @@ test("delayed rendering, destruction, stuff happens", async () => { Array [ "A:willRender", "B:willUpdateProps", - "A:rendered", "B:willRender", "C:willUpdateProps", "B:rendered", + "A:rendered", ] `); @@ -4506,19 +4502,19 @@ test("renderings, destruction, patch, stuff, ... yet another variation", async ( "A:willRender", "B:setup", "B:willStart", - "D:setup", - "D:willStart", - "A:rendered", "B:willRender", "C:setup", "C:willStart", - "B:rendered", - "D:willRender", - "D:rendered", "C:willRender", "C:rendered", - "C:mounted", + "B:rendered", + "D:setup", + "D:willStart", + "D:willRender", + "D:rendered", + "A:rendered", "D:mounted", + "C:mounted", "B:mounted", "A:mounted", ] @@ -4604,9 +4600,9 @@ test("delayed render does not go through when t-component value changed", async "A:setup", "A:willRender", "B:setup", - "A:rendered", "B:willRender", "B:rendered", + "A:rendered", "B:mounted", "A:mounted", ] @@ -4621,9 +4617,9 @@ test("delayed render does not go through when t-component value changed", async Array [ "A:willRender", "C:setup", - "A:rendered", "C:willRender", "C:rendered", + "A:rendered", "A:willPatch", "B:willUnmount", "B:willDestroy", @@ -4666,9 +4662,9 @@ test("delayed render is not cancelled by upcoming render", async () => { "A:willRender", "B:setup", "B:willStart", - "A:rendered", "B:willRender", "B:rendered", + "A:rendered", "B:mounted", "A:mounted", ] @@ -4690,9 +4686,9 @@ test("delayed render is not cancelled by upcoming render", async () => { Array [ "A:willRender", "B:willUpdateProps", - "A:rendered", "B:willRender", "B:rendered", + "A:rendered", ] `); @@ -4702,9 +4698,9 @@ test("delayed render is not cancelled by upcoming render", async () => { Array [ "A:willRender", "B:willUpdateProps", - "A:rendered", "B:willRender", "B:rendered", + "A:rendered", "A:willPatch", "B:willPatch", "B:patched", @@ -4785,9 +4781,9 @@ test("components are not destroyed between animation frame", async () => { "B:willRender", "C:setup", "C:willStart", - "B:rendered", "C:willRender", "C:rendered", + "B:rendered", "B:willDestroy", "A:willPatch", "C:mounted", @@ -4824,9 +4820,9 @@ test("component destroyed just after render", async () => { "A:willRender", "B:setup", "B:willStart", - "A:rendered", "B:willRender", "B:rendered", + "A:rendered", "B:mounted", "A:mounted", ] diff --git a/tests/components/error_handling.test.ts b/tests/components/error_handling.test.ts index 24a178f8..b9b4b36e 100644 --- a/tests/components/error_handling.test.ts +++ b/tests/components/error_handling.test.ts @@ -76,8 +76,9 @@ describe("basics", () => { } const app = new App(Parent); let error: Error; + const appError = nextAppError(app); const mountProm = app.mount(fixture).catch((e: Error) => (error = e)); - await expect(nextAppError(app)).resolves.toThrow( + await expect(appError).resolves.toThrow( 'Cannot find the definition of component "SomeMispelledComponent"' ); await mountProm; @@ -96,8 +97,9 @@ describe("basics", () => { } const app = new App(Parent, { test: true }); let error: Error; + const appError = nextAppError(app); const mountProm = app.mount(fixture).catch((e: Error) => (error = e)); - await expect(nextAppError(app)).resolves.toThrow( + await expect(appError).resolves.toThrow( 'Cannot find the definition of component "SomeMispelledComponent"' ); await mountProm; @@ -116,8 +118,9 @@ describe("basics", () => { } const app = new App(Parent as typeof Component); let error: Error; + const appError = nextAppError(app); const mountProm = app.mount(fixture).catch((e: Error) => (error = e)); - await expect(nextAppError(app)).resolves.toThrow( + await expect(appError).resolves.toThrow( '"SomeComponent" is not a Component. It must inherit from the Component class' ); await mountProm; @@ -133,8 +136,9 @@ describe("basics", () => { } const app = new App(Parent as typeof Component); let error: Error; + const appError = nextAppError(app); const mountProm = app.mount(fixture).catch((e: Error) => (error = e)); - await expect(nextAppError(app)).resolves.toThrow( + await expect(appError).resolves.toThrow( 'Cannot find the definition of component "MissingChild", missing static components key in parent' ); await mountProm; @@ -197,8 +201,9 @@ function(app, bdom, helpers) { }`; const app = new App(Parent as typeof Component); let error: Error; + const appError = nextAppError(app); const mountProm = app.mount(fixture).catch((e: Error) => (error = e)); - await expect(nextAppError(app)).resolves.toThrow(expectedErrorMessage); + await expect(appError).resolves.toThrow(expectedErrorMessage); await mountProm; expect(error!).toBeDefined(); expect(error!.message).toBe(expectedErrorMessage); @@ -244,8 +249,9 @@ describe("errors and promises", () => { const app = new App(Root); let error: OwlError; + const appError = nextAppError(app); const mountProm = app.mount(fixture).catch((e: Error) => (error = e)); - await expect(nextAppError(app)).resolves.toThrow("error occured in the owl lifecycle"); + await expect(appError).resolves.toThrow("error occured in the owl lifecycle"); await mountProm; expect(error!).toBeDefined(); expect(error!.cause).toBeDefined(); @@ -268,8 +274,9 @@ describe("errors and promises", () => { const app = new App(Root); let error: OwlError; + const appError = nextAppError(app); const mountProm = app.mount(fixture).catch((e: Error) => (error = e)); - await expect(nextAppError(app)).resolves.toThrow("error occured in the owl lifecycle"); + await expect(appError).resolves.toThrow("error occured in the owl lifecycle"); await mountProm; expect(error!).toBeDefined(); expect(error!.cause).toBeDefined(); @@ -291,8 +298,9 @@ describe("errors and promises", () => { const app = new App(Root, { test: true }); let error: OwlError; + const appError = nextAppError(app); const mountProm = app.mount(fixture).catch((e: Error) => (error = e)); - await expect(nextAppError(app)).resolves.toThrow("error occurred in onMounted"); + await expect(appError).resolves.toThrow("error occurred in onMounted"); await mountProm; expect(error!).toBeDefined(); expect(error!.stack).toContain("Root.setup"); @@ -317,8 +325,9 @@ describe("errors and promises", () => { const app = new App(Root, { test: true }); let error: OwlError; + const appError = nextAppError(app); const mountProm = app.mount(fixture).catch((e: Error) => (error = e)); - await expect(nextAppError(app)).resolves.toThrow("error occurred in onWillRender"); + await expect(appError).resolves.toThrow("error occurred in onWillRender"); await mountProm; expect(error!).toBeDefined(); expect(error!.message).toBe( @@ -358,8 +367,9 @@ describe("errors and promises", () => { const app = new App(Root, { test: true }); let error: OwlError; + const appError = nextAppError(app); const mountProm = app.mount(fixture).catch((e: Error) => (error = e)); - await expect(nextAppError(app)).resolves.toThrow("error occurred in onWillStart"); + await expect(appError).resolves.toThrow("error occurred in onWillStart"); await mountProm; expect(error!).toBeDefined(); expect(error!.message).toBe( @@ -426,8 +436,9 @@ describe("errors and promises", () => { const app = new App(Parent); let error: OwlError; + const appError = nextAppError(app); const mountProm = app.mount(fixture).catch((e: Error) => (error = e)); - await expect(nextAppError(app)).resolves.toThrow("error occured in the owl lifecycle"); + await expect(appError).resolves.toThrow("error occured in the owl lifecycle"); await mountProm; expect(error!).toBeDefined(); expect(error!.cause).toBeDefined(); @@ -472,8 +483,9 @@ describe("errors and promises", () => { const app = new App(Parent); let error: OwlError; + const appError = nextAppError(app); const mountProm = app.mount(fixture).catch((e: Error) => (error = e)); - await expect(nextAppError(app)).resolves.toThrow("error occured in the owl lifecycle"); + await expect(appError).resolves.toThrow("error occured in the owl lifecycle"); await mountProm; expect(error!).toBeDefined(); expect(error!.cause).toBeDefined(); @@ -502,8 +514,9 @@ describe("errors and promises", () => { const app = new App(Example, { test: true }); let error: OwlError; + const appError = nextAppError(app); const mountProm = app.mount(fixture).catch((e: Error) => (error = e)); - await expect(nextAppError(app)).resolves.toThrow("error occurred in onMounted"); + await expect(appError).resolves.toThrow("error occurred in onMounted"); await mountProm; expect(error!.message).toBe(`The following error occurred in onMounted: "Error in mounted"`); // 1 additional error is logged because the destruction of the app causes @@ -577,9 +590,9 @@ describe("can catch errors", () => { } const app = new App(Root, { test: true }); let error: OwlError; - const crashProm = expect(nextAppError(app)).resolves.toThrow("error occurred in onWillStart"); + const appError = nextAppError(app); await app.mount(fixture).catch((e: Error) => (error = e)); - await crashProm; + await expect(appError).resolves.toThrow("error occurred in onWillStart"); expect(error!.message).toBe( `The following error occurred in onWillStart: "No active component (a hook function should only be called in 'setup')"` ); @@ -599,8 +612,9 @@ describe("can catch errors", () => { } const app = new App(Root, { test: true }); let error: OwlError; + const appError = nextAppError(app); const mountProm = app.mount(fixture).catch((e: Error) => (error = e)); - await expect(nextAppError(app)).resolves.toThrow("error occurred in onMounted"); + await expect(appError).resolves.toThrow("error occurred in onMounted"); await mountProm; expect(error!.message).toBe(`The following error occurred in onMounted: "test error"`); expect(error!.cause).toBe(err); @@ -621,8 +635,9 @@ describe("can catch errors", () => { } const app = new App(Root, { test: true }); let error: OwlError; + const appError = nextAppError(app); const mountProm = app.mount(fixture).catch((e: Error) => (error = e)); - await expect(nextAppError(app)).resolves.toThrow("error occurred in onWillStart"); + await expect(appError).resolves.toThrow("error occurred in onWillStart"); await mountProm; expect(error!.message).toBe(`The following error occurred in onWillStart: "test error"`); expect(error!.cause).toBe(err); @@ -642,8 +657,9 @@ describe("can catch errors", () => { } const app = new App(Root); let error: OwlError; + const appError = nextAppError(app); const mountProm = app.mount(fixture).catch((e: Error) => (error = e)); - await expect(nextAppError(app)).resolves.toThrow("error occured in the owl lifecycle"); + await expect(appError).resolves.toThrow("error occured in the owl lifecycle"); await mountProm; expect(error!.message).toBe( `An error occured in the owl lifecycle (see this Error's "cause" property)` @@ -666,8 +682,9 @@ describe("can catch errors", () => { } const app = new App(Root); let error: OwlError; + const appError = nextAppError(app); const mountProm = app.mount(fixture).catch((e: Error) => (error = e)); - await expect(nextAppError(app)).resolves.toThrow("error occured in the owl lifecycle"); + await expect(appError).resolves.toThrow("error occured in the owl lifecycle"); await mountProm; expect(error!.message).toBe( `An error occured in the owl lifecycle (see this Error's "cause" property)` @@ -688,8 +705,9 @@ describe("can catch errors", () => { } const app = new App(Root, { test: true }); let error: OwlError; + const appError = nextAppError(app); const mountProm = app.mount(fixture).catch((e: Error) => (error = e)); - await expect(nextAppError(app)).resolves.toThrow("not an Error was thrown in onMounted"); + await expect(appError).resolves.toThrow("not an Error was thrown in onMounted"); await mountProm; expect(error!.message).toBe( `Something that is not an Error was thrown in onMounted (see this Error's "cause" property)` @@ -710,8 +728,9 @@ describe("can catch errors", () => { } const app = new App(Root); let error: OwlError; + const appError = nextAppError(app); const mountProm = app.mount(fixture).catch((e: Error) => (error = e)); - await expect(nextAppError(app)).resolves.toThrow("error occured in the owl lifecycle"); + await expect(appError).resolves.toThrow("error occured in the owl lifecycle"); await mountProm; expect(error!.message).toBe( `An error occured in the owl lifecycle (see this Error's "cause" property)` @@ -956,13 +975,13 @@ describe("can catch errors", () => { "Root:willRender", "ErrorBoundary:setup", "ErrorBoundary:willStart", - "Root:rendered", "ErrorBoundary:willRender", "ErrorComponent:setup", "ErrorComponent:willStart", - "ErrorBoundary:rendered", "ErrorComponent:willRender", "ErrorComponent:rendered", + "ErrorBoundary:rendered", + "Root:rendered", "ErrorComponent:mounted", "boom", "ErrorBoundary:willRender", @@ -1008,9 +1027,9 @@ describe("can catch errors", () => { "Root:willRender", "ErrorComponent:setup", "ErrorComponent:willStart", - "Root:rendered", "ErrorComponent:willRender", "ErrorComponent:rendered", + "Root:rendered", "ErrorComponent:mounted", "boom", "Root:willRender", @@ -1071,17 +1090,17 @@ describe("can catch errors", () => { "A:willRender", "B:setup", "B:willStart", - "A:rendered", "B:willRender", "C:setup", "C:willStart", - "B:rendered", "C:willRender", "Boom:setup", "Boom:willStart", - "C:rendered", "Boom:willRender", "Boom:rendered", + "C:rendered", + "B:rendered", + "A:rendered", "Boom:mounted", "boom", "C:willRender", @@ -1144,17 +1163,17 @@ describe("can catch errors", () => { "Root:willRender", "OK:setup", "OK:willStart", - "ErrorBoundary:setup", - "ErrorBoundary:willStart", - "Root:rendered", "OK:willRender", "OK:rendered", + "ErrorBoundary:setup", + "ErrorBoundary:willStart", "ErrorBoundary:willRender", "ErrorComponent:setup", "ErrorComponent:willStart", - "ErrorBoundary:rendered", "ErrorComponent:willRender", "ErrorComponent:rendered", + "ErrorBoundary:rendered", + "Root:rendered", "ErrorComponent:mounted", "boom", "ErrorBoundary:willRender", @@ -1497,9 +1516,9 @@ describe("can catch errors", () => { "Parent:willRender", "Child:setup", "Child:willStart", - "Parent:rendered", "Child:willRender", "Child:rendered", + "Parent:rendered", "Child:mounted", "Parent:mounted", ] @@ -1576,9 +1595,9 @@ describe("can catch errors", () => { "Parent:willRender", "Child:setup", "Child:willStart", - "Parent:rendered", "Child:willRender", "Child:rendered", + "Parent:rendered", ] `); parent.state.hasChild = false; diff --git a/tests/components/hooks.test.ts b/tests/components/hooks.test.ts index 7b72e265..74ea564c 100644 --- a/tests/components/hooks.test.ts +++ b/tests/components/hooks.test.ts @@ -660,8 +660,9 @@ describe("hooks", () => { let error: OwlError; const app = new App(MyComponent); + const appError = nextAppError(app); const mountProm = app.mount(fixture).catch((e: Error) => (error = e)); - await expect(nextAppError(app)).resolves.toThrow("error occured in the owl lifecycle"); + await expect(appError).resolves.toThrow("error occured in the owl lifecycle"); await mountProm; expect(error!.cause.message).toBe("Intentional error"); // no console.error because the error has been caught in this test diff --git a/tests/components/lifecycle.test.ts b/tests/components/lifecycle.test.ts index a140b2b4..8640e106 100644 --- a/tests/components/lifecycle.test.ts +++ b/tests/components/lifecycle.test.ts @@ -342,15 +342,16 @@ describe("lifecycle hooks", () => { parent.state.n = 2; await nextTick(); app.destroy(); - expect(steps).toEqual([ - "parent:willPatch", - "child:willPatch", - "childchild:willPatch", - "childchild:patched", - "child:patched", - "parent:patched", - ]); - Object.freeze(steps); + expect(steps.splice(0)).toMatchInlineSnapshot(` + Array [ + "parent:willPatch", + "childchild:willPatch", + "child:willPatch", + "child:patched", + "childchild:patched", + "parent:patched", + ] + `); }); test("willStart, mounted on subwidget rendered after main is mounted in some other position", async () => { @@ -463,9 +464,9 @@ describe("lifecycle hooks", () => { "Parent:willRender", "Child:setup", "Child:willStart", - "Parent:rendered", "Child:willRender", "Child:rendered", + "Parent:rendered", "Child:mounted", "Parent:mounted", ] @@ -478,9 +479,9 @@ describe("lifecycle hooks", () => { Array [ "Parent:willRender", "Child:willUpdateProps", - "Parent:rendered", "Child:willRender", "Child:rendered", + "Parent:rendered", "Parent:willPatch", "Child:willPatch", "Child:patched", @@ -528,9 +529,9 @@ describe("lifecycle hooks", () => { "Parent:willRender", "Child:setup", "Child:willStart", - "Parent:rendered", "Child:willRender", "Child:rendered", + "Parent:rendered", "Child:mounted", "Parent:mounted", ] @@ -650,9 +651,9 @@ describe("lifecycle hooks", () => { "Parent:willRender", "Child:setup", "Child:willStart", - "Parent:rendered", "Child:willRender", "Child:rendered", + "Parent:rendered", "Child:mounted", "Parent:mounted", ] @@ -712,13 +713,13 @@ describe("lifecycle hooks", () => { "Parent:willRender", "Child:setup", "Child:willStart", - "Parent:rendered", "Child:willRender", "GrandChild:setup", "GrandChild:willStart", - "Child:rendered", "GrandChild:willRender", "GrandChild:rendered", + "Child:rendered", + "Parent:rendered", "Parent:willPatch", "GrandChild:mounted", "Child:mounted", @@ -834,11 +835,11 @@ describe("lifecycle hooks", () => { "Parent:willRender", "Child:setup", "Child:willStart", - "Parent:rendered", "Child:willRender", "GrandChild:setup", "GrandChild:willStart", "Child:rendered", + "Parent:rendered", ] `); @@ -878,9 +879,9 @@ describe("lifecycle hooks", () => { "Parent:willRender", "Child:setup", "Child:willStart", - "Parent:rendered", "Child:willRender", "Child:rendered", + "Parent:rendered", "Child:mounted", "Parent:mounted", ] @@ -925,9 +926,9 @@ describe("lifecycle hooks", () => { "Parent:willRender", "Child:setup", "Child:willStart", - "Parent:rendered", "Child:willRender", "Child:rendered", + "Parent:rendered", "Child:mounted", "Parent:mounted", ] @@ -939,9 +940,9 @@ describe("lifecycle hooks", () => { Array [ "Parent:willRender", "Child:willUpdateProps", - "Parent:rendered", "Child:willRender", "Child:rendered", + "Parent:rendered", "Parent:willPatch", "Child:willPatch", "Child:patched", @@ -986,9 +987,9 @@ describe("lifecycle hooks", () => { "Parent:willRender", "Child:setup", "Child:willStart", - "Parent:rendered", "Child:willRender", "Child:rendered", + "Parent:rendered", "Child:mounted", "Parent:mounted", ] @@ -1113,21 +1114,21 @@ describe("lifecycle hooks", () => { "A:willRender", "B:setup", "B:willStart", - "C:setup", - "C:willStart", - "A:rendered", "B:willRender", "B:rendered", + "C:setup", + "C:willStart", "C:willRender", "D:setup", "D:willStart", - "E:setup", - "E:willStart", - "C:rendered", "D:willRender", "D:rendered", + "E:setup", + "E:willStart", "E:willRender", "E:rendered", + "C:rendered", + "A:rendered", "E:mounted", "D:mounted", "C:mounted", @@ -1144,9 +1145,9 @@ describe("lifecycle hooks", () => { "C:willRender", "F:setup", "F:willStart", - "C:rendered", "F:willRender", "F:rendered", + "C:rendered", "C:willPatch", "E:willUnmount", "E:willDestroy", @@ -1181,9 +1182,9 @@ describe("lifecycle hooks", () => { "Parent:willRender", "Child:setup", "Child:willStart", - "Parent:rendered", "Child:willRender", "Child:rendered", + "Parent:rendered", "Child:mounted", "Parent:mounted", ] @@ -1209,9 +1210,9 @@ describe("lifecycle hooks", () => { "Parent:willRender", "Child:setup", "Child:willStart", - "Parent:rendered", "Child:willRender", "Child:rendered", + "Parent:rendered", "Parent:willPatch", "Child:mounted", "Parent:patched", @@ -1465,6 +1466,8 @@ describe("lifecycle hooks", () => { "Parent:willRender", "Child:setup", "Child:willStart", + "Child:willRender", + "Child:rendered", "Parent:rendered", "Parent:willUnmount", "Child:willDestroy", diff --git a/tests/components/props.test.ts b/tests/components/props.test.ts index e1a11a9a..8d80f22c 100644 --- a/tests/components/props.test.ts +++ b/tests/components/props.test.ts @@ -279,9 +279,9 @@ test("bound functions are considered 'alike'", async () => { "Parent:willRender", "Child:setup", "Child:willStart", - "Parent:rendered", "Child:willRender", "Child:rendered", + "Parent:rendered", "Child:mounted", "Parent:mounted", ] @@ -341,9 +341,9 @@ test(".alike suffix in a simple case", async () => { "Parent:willRender", "Child:setup", "Child:willStart", - "Parent:rendered", "Child:willRender", "Child:rendered", + "Parent:rendered", "Child:mounted", "Parent:mounted", ] @@ -403,13 +403,13 @@ test(".alike suffix in a list", async () => { "Parent:willRender", "Todo:setup", "Todo:willStart", + "Todo:willRender", + "Todo:rendered", "Todo:setup", "Todo:willStart", + "Todo:willRender", + "Todo:rendered", "Parent:rendered", - "Todo:willRender", - "Todo:rendered", - "Todo:willRender", - "Todo:rendered", "Todo:mounted", "Todo:mounted", "Parent:mounted", diff --git a/tests/components/props_validation.test.ts b/tests/components/props_validation.test.ts index 265a36ba..6efb9355 100644 --- a/tests/components/props_validation.test.ts +++ b/tests/components/props_validation.test.ts @@ -51,8 +51,9 @@ describe("props validation", () => { const app = new App(Parent, { test: true }); let error: OwlError | undefined; + const appError = nextAppError(app); const mountProm = app.mount(fixture).catch((e: Error) => (error = e)); - await expect(nextAppError(app)).resolves.toThrow( + await expect(appError).resolves.toThrow( "Invalid props for component 'SubComp': 'message' is missing" ); await mountProm; @@ -80,8 +81,9 @@ describe("props validation", () => { const app = new App(Parent, { test: true }); let error: OwlError | undefined; + const appError = nextAppError(app); const mountProm = app.mount(fixture).catch((e: Error) => (error = e)); - await expect(nextAppError(app)).resolves.toThrow( + await expect(appError).resolves.toThrow( "Invalid props for component 'SubComp': 'message' is missing" ); await mountProm; @@ -131,8 +133,9 @@ describe("props validation", () => { props = {}; let app = new App(Parent, { test: true }); let error: OwlError | undefined; + let appError = nextAppError(app); let mountProm = app.mount(fixture).catch((e: Error) => (error = e)); - await expect(nextAppError(app)).resolves.toThrow("Invalid props for component '_a'"); + await expect(appError).resolves.toThrow("Invalid props for component '_a'"); await mountProm; expect(error!).toBeDefined(); expect(error!.message).toBe( @@ -148,8 +151,9 @@ describe("props validation", () => { expect(error!).toBeUndefined(); props = { p: test.ko }; app = new App(Parent, { test: true }); + appError = nextAppError(app); mountProm = app.mount(fixture).catch((e: Error) => (error = e)); - await expect(nextAppError(app)).resolves.toThrow("Invalid props for component '_a'"); + await expect(appError).resolves.toThrow("Invalid props for component '_a'"); await mountProm; expect(error!).toBeDefined(); expect(error!.message).toBe( @@ -183,8 +187,9 @@ describe("props validation", () => { props = {}; let app = new App(Parent, { test: true }); let error: OwlError | undefined; + let appError = nextAppError(app); let mountProm = app.mount(fixture).catch((e: Error) => (error = e)); - await expect(nextAppError(app)).resolves.toThrow("Invalid props for component '_a'"); + await expect(appError).resolves.toThrow("Invalid props for component '_a'"); await mountProm; expect(error!).toBeDefined(); expect(error!.message).toBe( @@ -200,8 +205,9 @@ describe("props validation", () => { expect(error!).toBeUndefined(); props = { p: test.ko }; app = new App(Parent, { test: true }); + appError = nextAppError(app); mountProm = app.mount(fixture).catch((e: Error) => (error = e)); - await expect(nextAppError(app)).resolves.toThrow("Invalid props for component '_a'"); + await expect(appError).resolves.toThrow("Invalid props for component '_a'"); await mountProm; expect(error!).toBeDefined(); expect(error!.message).toBe( @@ -240,8 +246,9 @@ describe("props validation", () => { expect(error!).toBeUndefined(); props = { p: 1 }; const app = new App(Parent, { test: true }); + const appError = nextAppError(app); const mountProm = app.mount(fixture).catch((e: Error) => (error = e)); - await expect(nextAppError(app)).resolves.toThrow("Invalid props for component 'SubComp'"); + await expect(appError).resolves.toThrow("Invalid props for component 'SubComp'"); await mountProm; expect(error!).toBeDefined(); expect(error!.message).toBe( @@ -279,8 +286,9 @@ describe("props validation", () => { expect(error!).toBeUndefined(); props = { p: 1 }; const app = new App(Parent, { test: true }); + const appError = nextAppError(app); const mountProm = app.mount(fixture).catch((e: Error) => (error = e)); - await expect(nextAppError(app)).resolves.toThrow("Invalid props for component 'SubComp'"); + await expect(appError).resolves.toThrow("Invalid props for component 'SubComp'"); await mountProm; expect(error!).toBeDefined(); expect(error!.message).toBe("Invalid props for component 'SubComp': 'p' is not a string"); @@ -316,14 +324,16 @@ describe("props validation", () => { expect(error!).toBeUndefined(); props = { p: [1] }; let app = new App(Parent, { test: true }); + let appError = nextAppError(app); let mountProm = app.mount(fixture).catch((e: Error) => (error = e)); - await expect(nextAppError(app)).resolves.toThrow("Invalid props for component 'SubComp'"); + await expect(appError).resolves.toThrow("Invalid props for component 'SubComp'"); await mountProm; expect(error!).toBeDefined(); error = undefined; app = new App(Parent, { test: true }); + appError = nextAppError(app); mountProm = app.mount(fixture).catch((e: Error) => (error = e)); - await expect(nextAppError(app)).resolves.toThrow("Invalid props for component 'SubComp'"); + await expect(appError).resolves.toThrow("Invalid props for component 'SubComp'"); await mountProm; expect(error!).toBeDefined(); }); @@ -365,8 +375,9 @@ describe("props validation", () => { expect(error!).toBeUndefined(); props = { p: [true, 1] }; const app = new App(Parent, { test: true }); + const appError = nextAppError(app); const mountProm = app.mount(fixture).catch((e: Error) => (error = e)); - await expect(nextAppError(app)).resolves.toThrow("Invalid props for component 'SubComp'"); + await expect(appError).resolves.toThrow("Invalid props for component 'SubComp'"); await mountProm; expect(error!).toBeDefined(); expect(error!.message).toBe( @@ -399,8 +410,9 @@ describe("props validation", () => { expect(error!).toBeUndefined(); props = { p: { id: 1, url: "url", extra: true } }; let app = new App(Parent, { test: true }); + let appError = nextAppError(app); let mountProm = app.mount(fixture).catch((e: Error) => (error = e)); - await expect(nextAppError(app)).resolves.toThrow("Invalid props for component 'SubComp'"); + await expect(appError).resolves.toThrow("Invalid props for component 'SubComp'"); await mountProm; expect(error!).toBeDefined(); expect(error!.message).toBe( @@ -408,8 +420,9 @@ describe("props validation", () => { ); props = { p: { id: "1", url: "url" } }; app = new App(Parent, { test: true }); + appError = nextAppError(app); mountProm = app.mount(fixture).catch((e: Error) => (error = e)); - await expect(nextAppError(app)).resolves.toThrow("Invalid props for component 'SubComp'"); + await expect(appError).resolves.toThrow("Invalid props for component 'SubComp'"); await mountProm; expect(error!).toBeDefined(); expect(error!.message).toBe( @@ -418,8 +431,9 @@ describe("props validation", () => { error = undefined; props = { p: { id: 1 } }; app = new App(Parent, { test: true }); + appError = nextAppError(app); mountProm = app.mount(fixture).catch((e: Error) => (error = e)); - await expect(nextAppError(app)).resolves.toThrow("Invalid props for component 'SubComp'"); + await expect(appError).resolves.toThrow("Invalid props for component 'SubComp'"); await mountProm; expect(error!).toBeDefined(); expect(error!.message).toBe( @@ -465,8 +479,9 @@ describe("props validation", () => { expect(error!).toBeUndefined(); props = { p: { id: 1, url: [12, true] } }; const app = new App(Parent, { test: true }); + const appError = nextAppError(app); const mountProm = app.mount(fixture).catch((e: Error) => (error = e)); - await expect(nextAppError(app)).resolves.toThrow("Invalid props for component 'SubComp'"); + await expect(appError).resolves.toThrow("Invalid props for component 'SubComp'"); await mountProm; expect(error!).toBeDefined(); expect(error!.message).toBe( @@ -675,8 +690,9 @@ describe("props validation", () => { } let error: Error; const app = new App(Parent, { test: true }); + const appError = nextAppError(app); const mountProm = app.mount(fixture).catch((e: Error) => (error = e)); - await expect(nextAppError(app)).resolves.toThrow("Invalid props for component 'SubComp'"); + await expect(appError).resolves.toThrow("Invalid props for component 'SubComp'"); await mountProm; expect(error!).toBeDefined(); expect(error!.message).toBe("Invalid props for component 'SubComp': 'p' is missing"); @@ -765,8 +781,9 @@ describe("props validation", () => { } let error: Error; const app = new App(Parent, { test: true }); + const appError = nextAppError(app); const mountProm = app.mount(fixture).catch((e: Error) => (error = e)); - await expect(nextAppError(app)).resolves.toThrow("Invalid props for component 'Child'"); + await expect(appError).resolves.toThrow("Invalid props for component 'Child'"); await mountProm; expect(error!).toBeDefined(); expect(error!.message).toBe( @@ -821,8 +838,9 @@ describe("props validation", () => { const app = new App(Parent, { test: true }); let error: OwlError | undefined; + const appError = nextAppError(app); const mountProm = app.mount(fixture).catch((e: Error) => (error = e)); - await expect(nextAppError(app)).resolves.toThrow( + await expect(appError).resolves.toThrow( "Invalid props for component 'Child': 'message' is missing" ); await mountProm; @@ -895,10 +913,9 @@ describe("default props", () => { } let error: Error; const app = new App(Parent, { test: true }); + const appError = nextAppError(app); const mountProm = app.mount(fixture).catch((e: Error) => (error = e)); - await expect(nextAppError(app)).resolves.toThrow( - "default value cannot be defined for a mandatory prop" - ); + await expect(appError).resolves.toThrow("default value cannot be defined for a mandatory prop"); await mountProm; expect(error!).toBeDefined(); expect(error!.message).toBe( diff --git a/tests/components/reactivity.test.ts b/tests/components/reactivity.test.ts index 042757d5..e7b86963 100644 --- a/tests/components/reactivity.test.ts +++ b/tests/components/reactivity.test.ts @@ -151,9 +151,10 @@ describe("reactivity in lifecycle", () => { } } const prom = mount(Comp, fixture); + expect(steps).toEqual([1]); (STATE as any).val = 2; await prom; - expect(steps).toEqual([2]); + expect(steps).toEqual([1, 2]); expect(fixture.innerHTML).toBe("
2
"); }); @@ -182,9 +183,9 @@ describe("reactivity in lifecycle", () => { "Parent:willRender", "Child:setup", "Child:willStart", - "Parent:rendered", "Child:willRender", "Child:rendered", + "Parent:rendered", "Child:mounted", "Parent:mounted", ] diff --git a/tests/components/refs.test.ts b/tests/components/refs.test.ts index b6cf1fb7..aa5e0795 100644 --- a/tests/components/refs.test.ts +++ b/tests/components/refs.test.ts @@ -125,10 +125,11 @@ describe("refs", () => { } const app = new App(Test, { test: true }); + const appError = nextAppError(app); const mountProm = expect(app.mount(fixture)).rejects.toThrowError( 'Cannot set the same ref more than once in the same component, ref "coucou" was set multiple times in Test' ); - await expect(nextAppError(app)).resolves.toThrow( + await expect(appError).resolves.toThrow( 'Cannot set the same ref more than once in the same component, ref "coucou" was set multiple times in Test' ); await mountProm; diff --git a/tests/components/rendering.test.ts b/tests/components/rendering.test.ts index 2464b623..d6272d4f 100644 --- a/tests/components/rendering.test.ts +++ b/tests/components/rendering.test.ts @@ -49,9 +49,9 @@ describe("rendering semantics", () => { "Parent:willRender", "Child:setup", "Child:willStart", - "Parent:rendered", "Child:willRender", "Child:rendered", + "Parent:rendered", "Child:mounted", "Parent:mounted", ] @@ -179,9 +179,9 @@ describe("rendering semantics", () => { "Parent:willRender", "Child:setup", "Child:willStart", - "Parent:rendered", "Child:willRender", "Child:rendered", + "Parent:rendered", "Child:mounted", "Parent:mounted", ] @@ -198,9 +198,9 @@ describe("rendering semantics", () => { Array [ "Parent:willRender", "Child:willUpdateProps", - "Parent:rendered", "Child:willRender", "Child:rendered", + "Parent:rendered", ] `); @@ -213,9 +213,9 @@ describe("rendering semantics", () => { Array [ "Parent:willRender", "Child:willUpdateProps", - "Parent:rendered", "Child:willRender", "Child:rendered", + "Parent:rendered", "Parent:willPatch", "Child:willPatch", "Child:patched", @@ -253,9 +253,9 @@ describe("rendering semantics", () => { "Parent:willRender", "Child:setup", "Child:willStart", - "Parent:rendered", "Child:willRender", "Child:rendered", + "Parent:rendered", "Child:mounted", "Parent:mounted", ] @@ -305,9 +305,9 @@ describe("rendering semantics", () => { "Parent:willRender", "Child:setup", "Child:willStart", - "Parent:rendered", "Child:willRender", "Child:rendered", + "Parent:rendered", "Child:mounted", "Parent:mounted", ] @@ -404,13 +404,13 @@ describe("rendering semantics", () => { "A:willRender", "B:setup", "B:willStart", - "A:rendered", "B:willRender", "C:setup", "C:willStart", - "B:rendered", "C:willRender", "C:rendered", + "B:rendered", + "A:rendered", "C:mounted", "B:mounted", "A:mounted", @@ -473,13 +473,13 @@ test("force render in case of existing render", async () => { "A:willRender", "B:setup", "B:willStart", - "A:rendered", "B:willRender", "C:setup", "C:willStart", - "B:rendered", "C:willRender", "C:rendered", + "B:rendered", + "A:rendered", "C:mounted", "B:mounted", "A:mounted", @@ -516,14 +516,14 @@ test("force render in case of existing render", async () => { Array [ "B:willRender", "C:willUpdateProps", - "B:rendered", "C:willRender", "C:rendered", + "B:rendered", "A:willPatch", - "B:willPatch", "C:willPatch", - "C:patched", + "B:willPatch", "B:patched", + "C:patched", "A:patched", ] `); @@ -561,9 +561,9 @@ test("children, default props and renderings", async () => { "Parent:willRender", "Child:setup", "Child:willStart", - "Parent:rendered", "Child:willRender", "Child:rendered", + "Parent:rendered", "Child:mounted", "Parent:mounted", ] diff --git a/tests/components/slots.test.ts b/tests/components/slots.test.ts index f36ef6d0..c3a478d3 100644 --- a/tests/components/slots.test.ts +++ b/tests/components/slots.test.ts @@ -223,8 +223,9 @@ describe("slots", () => { let error: Error; const app = new App(Parent); + const appError = nextAppError(app); const mountProm = app.mount(fixture).catch((e: Error) => (error = e)); - await expect(nextAppError(app)).resolves.toThrow("error occured in the owl lifecycle"); + await expect(appError).resolves.toThrow("error occured in the owl lifecycle"); await mountProm; expect(error!).not.toBeNull(); expect(mockConsoleWarn).toBeCalledTimes(1); diff --git a/tests/components/style_class.test.ts b/tests/components/style_class.test.ts index e57dcd5e..988c12af 100644 --- a/tests/components/style_class.test.ts +++ b/tests/components/style_class.test.ts @@ -349,8 +349,9 @@ describe("style and class handling", () => { } let error: OwlError; const app = new App(Parent); + const appError = nextAppError(app); const mountProm = app.mount(fixture).catch((e: Error) => (error = e)); - await expect(nextAppError(app)).resolves.toThrow("error occured in the owl lifecycle"); + await expect(appError).resolves.toThrow("error occured in the owl lifecycle"); await mountProm; expect(error!).toBeDefined(); expect(error!.cause).toBeDefined(); diff --git a/tests/components/t_component.test.ts b/tests/components/t_component.test.ts index b682fe53..a32aaff2 100644 --- a/tests/components/t_component.test.ts +++ b/tests/components/t_component.test.ts @@ -36,9 +36,9 @@ describe("t-component", () => { "Parent:willRender", "Child:setup", "Child:willStart", - "Parent:rendered", "Child:willRender", "Child:rendered", + "Parent:rendered", "Child:mounted", "Parent:mounted", ] @@ -77,9 +77,9 @@ describe("t-component", () => { "Parent:willRender", "ChildA:setup", "ChildA:willStart", - "Parent:rendered", "ChildA:willRender", "ChildA:rendered", + "Parent:rendered", "ChildA:mounted", "Parent:mounted", ] @@ -94,9 +94,9 @@ describe("t-component", () => { "Parent:willRender", "ChildB:setup", "ChildB:willStart", - "Parent:rendered", "ChildB:willRender", "ChildB:rendered", + "Parent:rendered", "Parent:willPatch", "ChildA:willUnmount", "ChildA:willDestroy", diff --git a/tests/components/t_foreach.test.ts b/tests/components/t_foreach.test.ts index 952d76d9..b570e92b 100644 --- a/tests/components/t_foreach.test.ts +++ b/tests/components/t_foreach.test.ts @@ -99,13 +99,13 @@ describe("list of components", () => { "Parent:willRender", "Child:setup", "Child:willStart", + "Child:willRender", + "Child:rendered", "Child:setup", "Child:willStart", + "Child:willRender", + "Child:rendered", "Parent:rendered", - "Child:willRender", - "Child:rendered", - "Child:willRender", - "Child:rendered", "Child:mounted", "Child:mounted", "Parent:mounted", @@ -326,10 +326,11 @@ describe("list of components", () => { } const app = new App(Parent, { test: true }); + const appError = nextAppError(app); const mountProm = expect(app.mount(fixture)).rejects.toThrow( "Got duplicate key in t-foreach: child" ); - await expect(nextAppError(app)).resolves.toThrow("Got duplicate key in t-foreach: child"); + await expect(appError).resolves.toThrow("Got duplicate key in t-foreach: child"); await mountProm; console.info = consoleInfo; expect(mockConsoleWarn).toBeCalledTimes(1); @@ -352,12 +353,11 @@ describe("list of components", () => { } const app = new App(Parent, { test: true }); + const appError = nextAppError(app); const mountProm = expect(app.mount(fixture)).rejects.toThrow( "Got duplicate key in t-foreach: [object Object]" ); - await expect(nextAppError(app)).resolves.toThrow( - "Got duplicate key in t-foreach: [object Object]" - ); + await expect(appError).resolves.toThrow("Got duplicate key in t-foreach: [object Object]"); await mountProm; console.info = consoleInfo; expect(mockConsoleWarn).toBeCalledTimes(1); diff --git a/tests/helpers.ts b/tests/helpers.ts index 377d9953..f5515d90 100644 --- a/tests/helpers.ts +++ b/tests/helpers.ts @@ -235,7 +235,7 @@ expect.extend({ }; const currentSteps = steps.splice(0); - const pass = this.equals(currentSteps, expected); + let pass = this.equals(currentSteps, expected); const message = pass ? () => diff --git a/tests/misc/portal.test.ts b/tests/misc/portal.test.ts index e07d524f..3e6e74ce 100644 --- a/tests/misc/portal.test.ts +++ b/tests/misc/portal.test.ts @@ -270,8 +270,9 @@ describe("Portal", () => { let error: Error; const app = new App(Parent); + const appError = nextAppError(app); const mountProm = app.mount(fixture).catch((e: Error) => (error = e)); - await expect(nextAppError(app)).resolves.toThrow("invalid portal target"); + await expect(appError).resolves.toThrow("invalid portal target"); await mountProm; expect(error!).toBeDefined(); @@ -1002,8 +1003,9 @@ describe("Portal: Props validation", () => { } let error: OwlError; const app = new App(Parent); + const appError = nextAppError(app); const mountProm = app.mount(fixture).catch((e: Error) => (error = e)); - await expect(nextAppError(app)).resolves.toThrow("error occured in the owl lifecycle"); + await expect(appError).resolves.toThrow("error occured in the owl lifecycle"); await mountProm; expect(error!).toBeDefined(); expect(error!.cause).toBeDefined(); @@ -1021,8 +1023,9 @@ describe("Portal: Props validation", () => { } let error: Error; const app = new App(Parent); + const appError = nextAppError(app); const mountProm = app.mount(fixture).catch((e: Error) => (error = e)); - await expect(nextAppError(app)).resolves.toThrow("invalid portal target"); + await expect(appError).resolves.toThrow("invalid portal target"); await mountProm; expect(error!).toBeDefined(); expect(error!.message).toBe(`invalid portal target`); diff --git a/tests/reactivity.test.ts b/tests/reactivity.test.ts index d1adda0e..081bcc1e 100644 --- a/tests/reactivity.test.ts +++ b/tests/reactivity.test.ts @@ -1858,13 +1858,13 @@ describe("Reactivity: useState", () => { "Parent:willRender", "Child:setup", "Child:willStart", + "Child:willRender", + "Child:rendered", "Child:setup", "Child:willStart", + "Child:willRender", + "Child:rendered", "Parent:rendered", - "Child:willRender", - "Child:rendered", - "Child:willRender", - "Child:rendered", "Child:mounted", "Child:mounted", "Parent:mounted", @@ -1916,13 +1916,13 @@ describe("Reactivity: useState", () => { "Parent:willRender", "Child:setup", "Child:willStart", + "Child:willRender", + "Child:rendered", "Child:setup", "Child:willStart", + "Child:willRender", + "Child:rendered", "Parent:rendered", - "Child:willRender", - "Child:rendered", - "Child:willRender", - "Child:rendered", "Child:mounted", "Child:mounted", "Parent:mounted", @@ -1992,17 +1992,17 @@ describe("Reactivity: useState", () => { "GrandFather:willRender", "Child:setup", "Child:willStart", - "Parent:setup", - "Parent:willStart", - "GrandFather:rendered", "Child:willRender", "Child:rendered", + "Parent:setup", + "Parent:willStart", "Parent:willRender", "Child:setup", "Child:willStart", - "Parent:rendered", "Child:willRender", "Child:rendered", + "Parent:rendered", + "GrandFather:rendered", "Child:mounted", "Parent:mounted", "Child:mounted", @@ -2215,9 +2215,9 @@ describe("Reactivity: useState", () => { "Parent:willRender", "Child:setup", "Child:willStart", - "Parent:rendered", "Child:willRender", "Child:rendered", + "Parent:rendered", "Child:mounted", "Parent:mounted", ]