@vnejs/test-utils 0.1.1 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2 @@
1
+ import type { EventSpy } from "./spy-event.js";
2
+ export declare const expectCallSequence: (spy: EventSpy, ...calls: unknown[]) => void;
@@ -0,0 +1,7 @@
1
+ import { expect } from "vitest";
2
+ export const expectCallSequence = (spy, ...calls) => {
3
+ expect(spy).toHaveBeenCalledTimes(calls.length);
4
+ calls.forEach((expected, index) => {
5
+ expect(spy.mock.calls[index]?.[0]).toMatchObject(expected);
6
+ });
7
+ };
package/dist/harness.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import type { ModuleGlobalStateRegistry, ModuleInject } from "@vnejs/module";
2
- import { Observer } from "@vnejs/observer";
1
+ import type { ModuleGlobalStateRegistry, ModuleInject, ModuleShared } from "@vnejs/module";
2
+ import type { Observer } from "@vnejs/observer";
3
3
  export type TestModuleInstance = {
4
4
  name: string;
5
5
  inject: (arg?: ModuleInject) => void;
@@ -13,4 +13,5 @@ export declare const createTestModule: <T extends TestModuleInstance>(ModuleClas
13
13
  module: T;
14
14
  observer: Observer;
15
15
  state: ModuleGlobalStateRegistry;
16
+ shared: ModuleShared;
16
17
  };
package/dist/harness.js CHANGED
@@ -1,16 +1,17 @@
1
- import { Observer } from "@vnejs/observer";
1
+ import { createTestObserver } from "./stub-event.js";
2
2
  export const createTestModule = (ModuleClass, { subscribe = true, ...injectArg } = {}) => {
3
- const observer = new Observer();
3
+ const observer = createTestObserver();
4
4
  const state = (injectArg.state ?? {});
5
+ const shared = (injectArg.shared ?? {});
5
6
  const module = new ModuleClass();
6
7
  module.inject({
7
8
  observer,
8
9
  state,
9
- shared: (injectArg.shared ?? {}),
10
+ shared,
10
11
  media: injectArg.media ?? {},
11
12
  ...injectArg,
12
13
  });
13
14
  if (subscribe)
14
15
  module.subscribe();
15
- return { module, observer, state };
16
+ return { module, observer, state, shared };
16
17
  };
package/dist/index.d.ts CHANGED
@@ -3,7 +3,9 @@ export { createTestModule, type CreateTestModuleOptions, type TestModuleInstance
3
3
  export { registerCoreVne } from "./register-core-vne.js";
4
4
  export { registerVnePlugin } from "./register-vne.js";
5
5
  export { resetDom } from "./reset-dom.js";
6
- export { spyEvent } from "./spy-event.js";
7
- export { stubEvent, stubLogsEmit, stubVendorEvents } from "./stub-event.js";
6
+ export { expectCallSequence } from "./expect-call-sequence.js";
7
+ export { spyEvent, type EventSpy } from "./spy-event.js";
8
+ export { createTestObserver, stubEvent, stubLogsEmit, stubSilentEvent, stubVendorEvents } from "./stub-event.js";
9
+ export { stubSideEffectEvents } from "./stub-side-effect-events.js";
8
10
  export { mockFullscreen } from "./mocks/dom.js";
9
11
  export { createLocalforageMock } from "./mocks/localforage.js";
package/dist/index.js CHANGED
@@ -3,7 +3,9 @@ export { createTestModule } from "./harness.js";
3
3
  export { registerCoreVne } from "./register-core-vne.js";
4
4
  export { registerVnePlugin } from "./register-vne.js";
5
5
  export { resetDom } from "./reset-dom.js";
6
+ export { expectCallSequence } from "./expect-call-sequence.js";
6
7
  export { spyEvent } from "./spy-event.js";
7
- export { stubEvent, stubLogsEmit, stubVendorEvents } from "./stub-event.js";
8
+ export { createTestObserver, stubEvent, stubLogsEmit, stubSilentEvent, stubVendorEvents } from "./stub-event.js";
9
+ export { stubSideEffectEvents } from "./stub-side-effect-events.js";
8
10
  export { mockFullscreen } from "./mocks/dom.js";
9
11
  export { createLocalforageMock } from "./mocks/localforage.js";
@@ -1,9 +1,9 @@
1
+ import { type Mock } from "vitest";
1
2
  export type MockFullscreenOptions = {
2
3
  fullscreenElement?: Element | null;
3
4
  };
4
- export declare const mockFullscreen: ({ fullscreenElement }?: MockFullscreenOptions) => {
5
- requestFullscreen: () => Promise<undefined>;
6
- exitFullscreen: () => Promise<undefined>;
7
- getRequestCount: () => number;
8
- getExitCount: () => number;
5
+ export type MockFullscreen = {
6
+ requestFullscreen: Mock<() => Promise<void>>;
7
+ exitFullscreen: Mock<() => Promise<void>>;
9
8
  };
9
+ export declare const mockFullscreen: ({ fullscreenElement }?: MockFullscreenOptions) => MockFullscreen;
package/dist/mocks/dom.js CHANGED
@@ -1,21 +1,12 @@
1
+ import { vi } from "vitest";
1
2
  export const mockFullscreen = ({ fullscreenElement = null } = {}) => {
2
3
  Object.defineProperty(document, "fullscreenElement", { value: fullscreenElement, configurable: true });
3
- let requestCount = 0;
4
- let exitCount = 0;
5
- const requestFullscreen = () => {
6
- requestCount += 1;
7
- return Promise.resolve(undefined);
8
- };
9
- const exitFullscreen = () => {
10
- exitCount += 1;
11
- return Promise.resolve(undefined);
12
- };
4
+ const requestFullscreen = vi.fn(() => Promise.resolve(undefined));
5
+ const exitFullscreen = vi.fn(() => Promise.resolve(undefined));
13
6
  document.body.requestFullscreen = requestFullscreen;
14
7
  document.exitFullscreen = exitFullscreen;
15
8
  return {
16
9
  requestFullscreen,
17
10
  exitFullscreen,
18
- getRequestCount: () => requestCount,
19
- getExitCount: () => exitCount,
20
11
  };
21
12
  };
@@ -1,7 +1,4 @@
1
1
  import type { Observer } from "@vnejs/observer";
2
- export declare const spyEvent: (observer: Observer, event: string) => {
3
- calls: unknown[][];
4
- count: () => number;
5
- last: () => unknown[] | undefined;
6
- first: () => unknown[];
7
- };
2
+ import { type Mock } from "vitest";
3
+ export type EventSpy = Mock<(...args: unknown[]) => void>;
4
+ export declare const spyEvent: (observer: Observer, event: string) => EventSpy;
package/dist/spy-event.js CHANGED
@@ -1,12 +1,8 @@
1
+ import { vi } from "vitest";
1
2
  export const spyEvent = (observer, event) => {
2
- const calls = [];
3
+ const spy = vi.fn();
3
4
  observer.subscribe(event, (...args) => {
4
- calls.push(args);
5
+ spy(...args);
5
6
  });
6
- return {
7
- calls,
8
- count: () => calls.length,
9
- last: () => calls.at(-1),
10
- first: () => calls[0],
11
- };
7
+ return spy;
12
8
  };
@@ -1,4 +1,6 @@
1
- import type { Observer } from "@vnejs/observer";
1
+ import { Observer } from "@vnejs/observer";
2
+ export declare const stubSilentEvent: (observer: Observer, event: string, handler?: (...args: unknown[]) => unknown) => void;
3
+ export declare const createTestObserver: () => Observer;
2
4
  export declare const stubEvent: (observer: Observer, event: string, handler?: (...args: unknown[]) => unknown) => void;
3
5
  export declare const stubLogsEmit: (observer: Observer) => void;
4
6
  export declare const stubVendorEvents: (observer: Observer) => void;
@@ -1,9 +1,19 @@
1
1
  import { SUBSCRIBE_EVENTS as LOGS_EVENTS } from "@vnejs/contracts.core.logs";
2
2
  import { SUBSCRIBE_EVENTS as VENDORS_EVENTS } from "@vnejs/contracts.core.vendors";
3
+ import { Observer } from "@vnejs/observer";
4
+ import { stubSideEffectEvents } from "./stub-side-effect-events.js";
5
+ export const stubSilentEvent = (observer, event, handler = () => undefined) => {
6
+ observer.subscribe(event, handler, { filterFromResult: true });
7
+ };
8
+ export const createTestObserver = () => {
9
+ const observer = new Observer();
10
+ stubSideEffectEvents(observer);
11
+ return observer;
12
+ };
3
13
  export const stubEvent = (observer, event, handler = () => undefined) => {
4
14
  observer.subscribe(event, handler);
5
15
  };
6
- export const stubLogsEmit = (observer) => stubEvent(observer, LOGS_EVENTS.EMIT);
16
+ export const stubLogsEmit = (observer) => stubSilentEvent(observer, LOGS_EVENTS.EMIT);
7
17
  export const stubVendorEvents = (observer) => {
8
18
  stubEvent(observer, VENDORS_EVENTS.UID, () => "test-uid");
9
19
  stubEvent(observer, VENDORS_EVENTS.CLONE, (value) => structuredClone(value));
@@ -0,0 +1,2 @@
1
+ import type { Observer } from "@vnejs/observer";
2
+ export declare const stubSideEffectEvents: (observer: Observer) => void;
@@ -0,0 +1,24 @@
1
+ import { SUBSCRIBE_EVENTS as INTERACT_EVENTS } from "@vnejs/contracts.core.interact";
2
+ import { SUBSCRIBE_EVENTS as LOGS_EVENTS } from "@vnejs/contracts.core.logs";
3
+ import { SUBSCRIBE_EVENTS as SCENARIO_EVENTS } from "@vnejs/contracts.core.scenario";
4
+ import { SUBSCRIBE_EVENTS as SETTINGS_EVENTS } from "@vnejs/contracts.core.settings";
5
+ import { SUBSCRIBE_EVENTS as STACK_EVENTS } from "@vnejs/contracts.core.stack";
6
+ import { SUBSCRIBE_EVENTS as SYSTEM_EVENTS } from "@vnejs/contracts.core.system";
7
+ import { stubSilentEvent, stubVendorEvents } from "./stub-event.js";
8
+ const CORE_SIDE_EFFECT_EVENTS = [
9
+ LOGS_EVENTS.EMIT,
10
+ INTERACT_EVENTS.EMIT,
11
+ INTERACT_EVENTS.PUSH,
12
+ INTERACT_EVENTS.POP,
13
+ SETTINGS_EVENTS.INIT,
14
+ SCENARIO_EVENTS.NEXT,
15
+ SCENARIO_EVENTS.LINE_EXEC_REG,
16
+ SYSTEM_EVENTS.STARTED,
17
+ SYSTEM_EVENTS.CLOSE,
18
+ STACK_EVENTS.EMIT,
19
+ ];
20
+ export const stubSideEffectEvents = (observer) => {
21
+ stubVendorEvents(observer);
22
+ for (const event of CORE_SIDE_EFFECT_EVENTS)
23
+ stubSilentEvent(observer, event);
24
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vnejs/test-utils",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "Test harness utilities for @vnejs plugin modules",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -30,7 +30,8 @@
30
30
  "@vnejs/shared": "~0.1.0"
31
31
  },
32
32
  "peerDependencies": {
33
- "@vnejs/module": "~0.1.0"
33
+ "@vnejs/module": "~0.1.0",
34
+ "vitest": ">=3.0.0"
34
35
  },
35
36
  "devDependencies": {
36
37
  "@vnejs/configs.ts-common": "~0.1.0",
@@ -47,6 +48,7 @@
47
48
  "@vnejs/contracts.core.storage": "~0.1.0",
48
49
  "@vnejs/contracts.core.system": "~0.1.0",
49
50
  "@vnejs/contracts.core.vendors": "~0.1.0",
50
- "@vnejs/module": "~0.1.0"
51
+ "@vnejs/module": "~0.1.0",
52
+ "vitest": "~3.2.0"
51
53
  }
52
54
  }
@@ -0,0 +1,11 @@
1
+ import { expect } from "vitest";
2
+
3
+ import type { EventSpy } from "./spy-event.js";
4
+
5
+ export const expectCallSequence = (spy: EventSpy, ...calls: unknown[]) => {
6
+ expect(spy).toHaveBeenCalledTimes(calls.length);
7
+
8
+ calls.forEach((expected, index) => {
9
+ expect(spy.mock.calls[index]?.[0]).toMatchObject(expected as Record<string, unknown>);
10
+ });
11
+ };
package/src/harness.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import type { ModuleGlobalStateRegistry, ModuleInject, ModuleShared } from "@vnejs/module";
2
- import { Observer } from "@vnejs/observer";
2
+ import type { Observer } from "@vnejs/observer";
3
+ import { createTestObserver } from "./stub-event.js";
3
4
 
4
5
  export type TestModuleInstance = {
5
6
  name: string;
@@ -16,18 +17,19 @@ export const createTestModule = <T extends TestModuleInstance>(
16
17
  ModuleClass: new () => T,
17
18
  { subscribe = true, ...injectArg }: CreateTestModuleOptions = {},
18
19
  ) => {
19
- const observer = new Observer();
20
+ const observer = createTestObserver();
20
21
  const state = (injectArg.state ?? {}) as ModuleGlobalStateRegistry;
22
+ const shared = (injectArg.shared ?? {}) as ModuleShared;
21
23
  const module = new ModuleClass();
22
24
 
23
25
  module.inject({
24
26
  observer,
25
27
  state,
26
- shared: (injectArg.shared ?? {}) as ModuleShared,
28
+ shared,
27
29
  media: injectArg.media ?? {},
28
30
  ...injectArg,
29
31
  });
30
32
  if (subscribe) module.subscribe();
31
33
 
32
- return { module, observer, state };
34
+ return { module, observer, state, shared };
33
35
  };
package/src/index.ts CHANGED
@@ -3,7 +3,9 @@ export { createTestModule, type CreateTestModuleOptions, type TestModuleInstance
3
3
  export { registerCoreVne } from "./register-core-vne.js";
4
4
  export { registerVnePlugin } from "./register-vne.js";
5
5
  export { resetDom } from "./reset-dom.js";
6
- export { spyEvent } from "./spy-event.js";
7
- export { stubEvent, stubLogsEmit, stubVendorEvents } from "./stub-event.js";
6
+ export { expectCallSequence } from "./expect-call-sequence.js";
7
+ export { spyEvent, type EventSpy } from "./spy-event.js";
8
+ export { createTestObserver, stubEvent, stubLogsEmit, stubSilentEvent, stubVendorEvents } from "./stub-event.js";
9
+ export { stubSideEffectEvents } from "./stub-side-effect-events.js";
8
10
  export { mockFullscreen } from "./mocks/dom.js";
9
11
  export { createLocalforageMock } from "./mocks/localforage.js";
package/src/mocks/dom.ts CHANGED
@@ -1,22 +1,19 @@
1
+ import { vi, type Mock } from "vitest";
2
+
1
3
  export type MockFullscreenOptions = {
2
4
  fullscreenElement?: Element | null;
3
5
  };
4
6
 
5
- export const mockFullscreen = ({ fullscreenElement = null }: MockFullscreenOptions = {}) => {
6
- Object.defineProperty(document, "fullscreenElement", { value: fullscreenElement, configurable: true });
7
-
8
- let requestCount = 0;
9
- let exitCount = 0;
7
+ export type MockFullscreen = {
8
+ requestFullscreen: Mock<() => Promise<void>>;
9
+ exitFullscreen: Mock<() => Promise<void>>;
10
+ };
10
11
 
11
- const requestFullscreen = () => {
12
- requestCount += 1;
13
- return Promise.resolve(undefined);
14
- };
12
+ export const mockFullscreen = ({ fullscreenElement = null }: MockFullscreenOptions = {}): MockFullscreen => {
13
+ Object.defineProperty(document, "fullscreenElement", { value: fullscreenElement, configurable: true });
15
14
 
16
- const exitFullscreen = () => {
17
- exitCount += 1;
18
- return Promise.resolve(undefined);
19
- };
15
+ const requestFullscreen = vi.fn(() => Promise.resolve(undefined));
16
+ const exitFullscreen = vi.fn(() => Promise.resolve(undefined));
20
17
 
21
18
  document.body.requestFullscreen = requestFullscreen;
22
19
  document.exitFullscreen = exitFullscreen;
@@ -24,7 +21,5 @@ export const mockFullscreen = ({ fullscreenElement = null }: MockFullscreenOptio
24
21
  return {
25
22
  requestFullscreen,
26
23
  exitFullscreen,
27
- getRequestCount: () => requestCount,
28
- getExitCount: () => exitCount,
29
24
  };
30
25
  };
package/src/spy-event.ts CHANGED
@@ -1,16 +1,14 @@
1
1
  import type { Observer } from "@vnejs/observer";
2
+ import { vi, type Mock } from "vitest";
2
3
 
3
- export const spyEvent = (observer: Observer, event: string) => {
4
- const calls: unknown[][] = [];
4
+ export type EventSpy = Mock<(...args: unknown[]) => void>;
5
+
6
+ export const spyEvent = (observer: Observer, event: string): EventSpy => {
7
+ const spy = vi.fn() as EventSpy;
5
8
 
6
9
  observer.subscribe(event, (...args: unknown[]) => {
7
- calls.push(args);
10
+ spy(...args);
8
11
  });
9
12
 
10
- return {
11
- calls,
12
- count: () => calls.length,
13
- last: () => calls.at(-1),
14
- first: () => calls[0],
15
- };
13
+ return spy;
16
14
  };
package/src/stub-event.ts CHANGED
@@ -1,6 +1,24 @@
1
1
  import { SUBSCRIBE_EVENTS as LOGS_EVENTS } from "@vnejs/contracts.core.logs";
2
2
  import { SUBSCRIBE_EVENTS as VENDORS_EVENTS } from "@vnejs/contracts.core.vendors";
3
- import type { Observer } from "@vnejs/observer";
3
+ import { Observer } from "@vnejs/observer";
4
+
5
+ import { stubSideEffectEvents } from "./stub-side-effect-events.js";
6
+
7
+ export const stubSilentEvent = (
8
+ observer: Observer,
9
+ event: string,
10
+ handler: (...args: unknown[]) => unknown = () => undefined,
11
+ ) => {
12
+ observer.subscribe(event, handler, { filterFromResult: true });
13
+ };
14
+
15
+ export const createTestObserver = () => {
16
+ const observer = new Observer();
17
+
18
+ stubSideEffectEvents(observer);
19
+
20
+ return observer;
21
+ };
4
22
 
5
23
  export const stubEvent = (
6
24
  observer: Observer,
@@ -10,7 +28,7 @@ export const stubEvent = (
10
28
  observer.subscribe(event, handler);
11
29
  };
12
30
 
13
- export const stubLogsEmit = (observer: Observer) => stubEvent(observer, LOGS_EVENTS.EMIT);
31
+ export const stubLogsEmit = (observer: Observer) => stubSilentEvent(observer, LOGS_EVENTS.EMIT);
14
32
 
15
33
  export const stubVendorEvents = (observer: Observer) => {
16
34
  stubEvent(observer, VENDORS_EVENTS.UID, () => "test-uid");
@@ -0,0 +1,28 @@
1
+ import { SUBSCRIBE_EVENTS as INTERACT_EVENTS } from "@vnejs/contracts.core.interact";
2
+ import { SUBSCRIBE_EVENTS as LOGS_EVENTS } from "@vnejs/contracts.core.logs";
3
+ import { SUBSCRIBE_EVENTS as SCENARIO_EVENTS } from "@vnejs/contracts.core.scenario";
4
+ import { SUBSCRIBE_EVENTS as SETTINGS_EVENTS } from "@vnejs/contracts.core.settings";
5
+ import { SUBSCRIBE_EVENTS as STACK_EVENTS } from "@vnejs/contracts.core.stack";
6
+ import { SUBSCRIBE_EVENTS as SYSTEM_EVENTS } from "@vnejs/contracts.core.system";
7
+ import type { Observer } from "@vnejs/observer";
8
+
9
+ import { stubSilentEvent, stubVendorEvents } from "./stub-event.js";
10
+
11
+ const CORE_SIDE_EFFECT_EVENTS = [
12
+ LOGS_EVENTS.EMIT,
13
+ INTERACT_EVENTS.EMIT,
14
+ INTERACT_EVENTS.PUSH,
15
+ INTERACT_EVENTS.POP,
16
+ SETTINGS_EVENTS.INIT,
17
+ SCENARIO_EVENTS.NEXT,
18
+ SCENARIO_EVENTS.LINE_EXEC_REG,
19
+ SYSTEM_EVENTS.STARTED,
20
+ SYSTEM_EVENTS.CLOSE,
21
+ STACK_EVENTS.EMIT,
22
+ ] as const;
23
+
24
+ export const stubSideEffectEvents = (observer: Observer) => {
25
+ stubVendorEvents(observer);
26
+
27
+ for (const event of CORE_SIDE_EFFECT_EVENTS) stubSilentEvent(observer, event);
28
+ };