From ae900a0123512f326d7819b8e632f9b63cb434ba Mon Sep 17 00:00:00 2001 From: Magomed Chemurziev Date: Mon, 7 Oct 2024 18:49:56 +0300 Subject: [PATCH 1/5] fix(i-data): `componentStatus` updating after component destroying --- CHANGELOG.md | 6 +++ src/components/super/i-data/CHANGELOG.md | 6 +++ src/components/super/i-data/i-data.ts | 2 +- src/components/super/i-data/test/unit/main.ts | 42 +++++++++++++++++++ 4 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 src/components/super/i-data/test/unit/main.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index ade5a13673..4ba5652e16 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,12 @@ Changelog _Note: Gaps between patch versions are faulty, broken or test releases._ +## v4.0.0-beta.?? (2024-10-??) + +#### :bug: Bug Fix + +* Fixed an issue with updating the `componentStatus` after destroying the component `components/super/i-data` + ## v4.0.0-beta.142 (2024-10-04) #### :bug: Bug Fix diff --git a/src/components/super/i-data/CHANGELOG.md b/src/components/super/i-data/CHANGELOG.md index da6989182b..a2e350350e 100644 --- a/src/components/super/i-data/CHANGELOG.md +++ b/src/components/super/i-data/CHANGELOG.md @@ -9,6 +9,12 @@ Changelog > - :house: [Internal] > - :nail_care: [Polish] +## v4.0.0-beta.?? (2024-10-??) + +#### :bug: Bug Fix + +* Fixed an issue with updating the `componentStatus` after destroying the component + ## v4.0.0-beta.30 (2023-10-11) #### :bug: Bug Fix diff --git a/src/components/super/i-data/i-data.ts b/src/components/super/i-data/i-data.ts index 0b23883f83..fae22504b4 100644 --- a/src/components/super/i-data/i-data.ts +++ b/src/components/super/i-data/i-data.ts @@ -80,7 +80,7 @@ export default abstract class iData extends iDataHandlers { join: 'replace' }; - const callSuper = () => super.initLoad(() => this.db, opts); + const callSuper = $a.proxy(() => super.initLoad(() => this.db, opts)); try { if (opts.emitStartEvent !== false) { diff --git a/src/components/super/i-data/test/unit/main.ts b/src/components/super/i-data/test/unit/main.ts new file mode 100644 index 0000000000..3aa0a45c03 --- /dev/null +++ b/src/components/super/i-data/test/unit/main.ts @@ -0,0 +1,42 @@ +/*! + * V4Fire Client Core + * https://github.com/V4Fire/Client + * + * Released under the MIT license + * https://github.com/V4Fire/Client/blob/master/LICENSE + */ + +import test from 'tests/config/unit/test'; +import { Component, RequestInterceptor } from 'tests/helpers'; + +import type bSuperIDataEffectDummy from 'components/super/i-data/test/b-super-i-data-effect-dummy/b-super-i-data-effect-dummy'; + +test.describe(' component', () => { + test.beforeEach(async ({demoPage}) => { + await demoPage.goto(); + }); + + test('should not update the `componentStatus` if the component was destroyed during the loading', async ({page}) => { + const interceptor = new RequestInterceptor(page, /api/); + await interceptor + .response(200, {root: true}, {delay: 100}) + .start(); + + const target = await Component.createComponent(page, 'b-dummy', { + attrs: { + 'data-id': 'target', + dataProvider: 'Provider' + } + }); + + const mockStatusChange = await target.evaluateHandle(() => jestMock.mock()); + + await target.evaluate((ctx, mockStatusChange) => { + ctx.on('onComponentStatusChange', mockStatusChange); + + ctx.unsafe.$destroy(); + }, mockStatusChange); + + test.expect(await mockStatusChange.evaluate((fn) => fn.mock.calls)).toEqual([['destroyed', 'loading']]); + }); +}); From 341c687866b0ecb618938436e9f8a1e3287e037b Mon Sep 17 00:00:00 2001 From: Magomed Chemurziev Date: Mon, 7 Oct 2024 19:05:42 +0300 Subject: [PATCH 2/5] chore: linter --- src/components/super/i-data/test/unit/main.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/components/super/i-data/test/unit/main.ts b/src/components/super/i-data/test/unit/main.ts index 3aa0a45c03..a5f27e1b57 100644 --- a/src/components/super/i-data/test/unit/main.ts +++ b/src/components/super/i-data/test/unit/main.ts @@ -9,8 +9,6 @@ import test from 'tests/config/unit/test'; import { Component, RequestInterceptor } from 'tests/helpers'; -import type bSuperIDataEffectDummy from 'components/super/i-data/test/b-super-i-data-effect-dummy/b-super-i-data-effect-dummy'; - test.describe(' component', () => { test.beforeEach(async ({demoPage}) => { await demoPage.goto(); @@ -22,9 +20,8 @@ test.describe(' component', () => { .response(200, {root: true}, {delay: 100}) .start(); - const target = await Component.createComponent(page, 'b-dummy', { + const target = await Component.createComponent(page, 'b-dummy', { attrs: { - 'data-id': 'target', dataProvider: 'Provider' } }); From 4224a4baea1e1257d39856536fd5851dad25be90 Mon Sep 17 00:00:00 2001 From: Magomed Chemurziev Date: Tue, 8 Oct 2024 11:03:22 +0300 Subject: [PATCH 3/5] review suggestions --- CHANGELOG.md | 6 +++++- src/components/super/i-data/test/unit/main.ts | 11 ++++++----- tests/CHANGELOG.md | 6 ++++++ tests/helpers/mock/index.ts | 4 ++++ tests/helpers/mock/interface.ts | 5 +++++ 5 files changed, 26 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4ba5652e16..8aa111e257 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,9 +13,13 @@ _Note: Gaps between patch versions are faulty, broken or test releases._ ## v4.0.0-beta.?? (2024-10-??) +#### :rocket: New Feature + +* Added the mock agent itself in `SpyObject.agent` `tests/helpers/mock` + #### :bug: Bug Fix -* Fixed an issue with updating the `componentStatus` after destroying the component `components/super/i-data` +* Fixed an issue with updating the `componentStatus` after destroying the component `iData` ## v4.0.0-beta.142 (2024-10-04) diff --git a/src/components/super/i-data/test/unit/main.ts b/src/components/super/i-data/test/unit/main.ts index a5f27e1b57..f249e3c7cb 100644 --- a/src/components/super/i-data/test/unit/main.ts +++ b/src/components/super/i-data/test/unit/main.ts @@ -8,6 +8,7 @@ import test from 'tests/config/unit/test'; import { Component, RequestInterceptor } from 'tests/helpers'; +import { createMockFn } from 'tests/helpers/mock'; test.describe(' component', () => { test.beforeEach(async ({demoPage}) => { @@ -26,14 +27,14 @@ test.describe(' component', () => { } }); - const mockStatusChange = await target.evaluateHandle(() => jestMock.mock()); + const mockStatusChange = await createMockFn(page, (...args) => args); - await target.evaluate((ctx, mockStatusChange) => { - ctx.on('onComponentStatusChange', mockStatusChange); + await target.evaluate((ctx, mock) => { + ctx.on('onComponentStatusChange', mock); ctx.unsafe.$destroy(); - }, mockStatusChange); + }, mockStatusChange.agent); - test.expect(await mockStatusChange.evaluate((fn) => fn.mock.calls)).toEqual([['destroyed', 'loading']]); + test.expect(await mockStatusChange.calls).toEqual([['destroyed', 'loading']]); }); }); diff --git a/tests/CHANGELOG.md b/tests/CHANGELOG.md index 9560d94a97..cdc34f9417 100644 --- a/tests/CHANGELOG.md +++ b/tests/CHANGELOG.md @@ -9,6 +9,12 @@ Changelog > - :house: [Internal] > - :nail_care: [Polish] +## v4.0.0-beta.?? (2024-10-??) + +#### :rocket: New Feature + +* Added the mock agent itself in `SpyObject.agent` + ## v4.0.0 (2023-04-19) #### :boom: Breaking Change diff --git a/tests/helpers/mock/index.ts b/tests/helpers/mock/index.ts index c0006dbe2e..bb56343f16 100644 --- a/tests/helpers/mock/index.ts +++ b/tests/helpers/mock/index.ts @@ -27,6 +27,10 @@ export function wrapAsSpy(agent: JSHandle agent.evaluate((ctx) => ctx.mock.calls) }, + agent: { + get: () => agent + }, + callsCount: { get: () => agent.evaluate((ctx) => ctx.mock.calls.length) }, diff --git a/tests/helpers/mock/interface.ts b/tests/helpers/mock/interface.ts index 7fb317eb76..000c75aba5 100644 --- a/tests/helpers/mock/interface.ts +++ b/tests/helpers/mock/interface.ts @@ -13,6 +13,11 @@ import type { ModuleMocker } from 'jest-mock'; * Represents a spy object with properties for accessing spy information. */ export interface SpyObject { + /** + * The spy object itself. + */ + readonly agent: JSHandle | ReturnType>; + /** * The array of arguments passed to the spy function on each call. */ From 3afe69f1ddf24fbb27d6876c26f31c30bcc7ff0f Mon Sep 17 00:00:00 2001 From: Magomed Chemurziev Date: Tue, 8 Oct 2024 12:26:06 +0300 Subject: [PATCH 4/5] rename spy object field --- CHANGELOG.md | 2 +- src/components/super/i-data/test/unit/main.ts | 2 +- tests/CHANGELOG.md | 2 +- tests/helpers/mock/README.md | 12 ++++-------- tests/helpers/mock/index.ts | 2 +- tests/helpers/mock/interface.ts | 4 ++-- 6 files changed, 10 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8aa111e257..da85fbaad9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,7 +15,7 @@ _Note: Gaps between patch versions are faulty, broken or test releases._ #### :rocket: New Feature -* Added the mock agent itself in `SpyObject.agent` `tests/helpers/mock` +* Added `JSHandle` representing the mock agent in `SpyObject.handle` `tests/helpers/mock` #### :bug: Bug Fix diff --git a/src/components/super/i-data/test/unit/main.ts b/src/components/super/i-data/test/unit/main.ts index f249e3c7cb..eb3857bf05 100644 --- a/src/components/super/i-data/test/unit/main.ts +++ b/src/components/super/i-data/test/unit/main.ts @@ -33,7 +33,7 @@ test.describe(' component', () => { ctx.on('onComponentStatusChange', mock); ctx.unsafe.$destroy(); - }, mockStatusChange.agent); + }, mockStatusChange.handle); test.expect(await mockStatusChange.calls).toEqual([['destroyed', 'loading']]); }); diff --git a/tests/CHANGELOG.md b/tests/CHANGELOG.md index cdc34f9417..8778185a56 100644 --- a/tests/CHANGELOG.md +++ b/tests/CHANGELOG.md @@ -13,7 +13,7 @@ Changelog #### :rocket: New Feature -* Added the mock agent itself in `SpyObject.agent` +* Added `JSHandle` representing the mock agent in `SpyObject.handle` ## v4.0.0 (2023-04-19) diff --git a/tests/helpers/mock/README.md b/tests/helpers/mock/README.md index 46ccecb386..7dd38201cc 100644 --- a/tests/helpers/mock/README.md +++ b/tests/helpers/mock/README.md @@ -85,17 +85,13 @@ console.log(await spy.calls); // [[], []] To create a mock function, use the `createMockFn` function. It will create a mock function and automatically inject it into the page. ```typescript -import { expandedStringify } from 'core/prelude/test-env/components/json'; - const mockFn = await createMockFn(page, () => 1); -await page.evaluate(([obj]) => { - const parsed = globalThis.expandedParse(obj); - - parsed.mockFn(); - parsed.mockFn(); +await page.evaluate(([mock]) => { + mock(); + mock(); -}, [expandedStringify({ mockFn })]); +}, [mockFn.handle]); console.log(await mockFn.calls); // [[], []] ``` diff --git a/tests/helpers/mock/index.ts b/tests/helpers/mock/index.ts index bb56343f16..8e7bca7525 100644 --- a/tests/helpers/mock/index.ts +++ b/tests/helpers/mock/index.ts @@ -27,7 +27,7 @@ export function wrapAsSpy(agent: JSHandle agent.evaluate((ctx) => ctx.mock.calls) }, - agent: { + handle: { get: () => agent }, diff --git a/tests/helpers/mock/interface.ts b/tests/helpers/mock/interface.ts index 000c75aba5..b0af0c9ed6 100644 --- a/tests/helpers/mock/interface.ts +++ b/tests/helpers/mock/interface.ts @@ -14,9 +14,9 @@ import type { ModuleMocker } from 'jest-mock'; */ export interface SpyObject { /** - * The spy object itself. + * The {@link JSHandle} representing the spy object. */ - readonly agent: JSHandle | ReturnType>; + readonly handle: JSHandle | ReturnType>; /** * The array of arguments passed to the spy function on each call. From 641ece65b9593d283093db8a6a88f489e091f9c4 Mon Sep 17 00:00:00 2001 From: Magomed Chemurziev Date: Tue, 8 Oct 2024 13:03:02 +0300 Subject: [PATCH 5/5] chore: jsdoc Co-authored-by: Andrey Kobets --- tests/helpers/mock/interface.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/helpers/mock/interface.ts b/tests/helpers/mock/interface.ts index b0af0c9ed6..9148542a62 100644 --- a/tests/helpers/mock/interface.ts +++ b/tests/helpers/mock/interface.ts @@ -14,7 +14,7 @@ import type { ModuleMocker } from 'jest-mock'; */ export interface SpyObject { /** - * The {@link JSHandle} representing the spy object. + * The {@link JSHandle} representing the spy object */ readonly handle: JSHandle | ReturnType>;