@motiadev/test 0.13.2-beta.163 → 0.13.2-beta.164-562802

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,12 @@
1
+ import { Event, EventAdapter } from "@motiadev/core";
2
+
3
+ //#region src/event-manager.d.ts
4
+ interface TestEventManager {
5
+ emit: <TData>(event: Event<TData>, file?: string) => Promise<void>;
6
+ waitEvents(): Promise<void>;
7
+ subscribe: <TData>(topic: string, stepName: string, handler: (event: Event<TData>) => void | Promise<void>) => void;
8
+ }
9
+ declare const createEventManager: (eventAdapter: EventAdapter) => TestEventManager;
10
+ //#endregion
11
+ export { createEventManager };
12
+ //# sourceMappingURL=event-manager.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-manager.d.mts","names":[],"sources":["../src/event-manager.ts"],"sourcesContent":[],"mappings":";;;UAGU,gBAAA;uBACa,MAAM,0BAA0B;EAD7C,UAAA,EAAA,EAEM,OAFU,CAAA,IAAA,CAAA;EACG,SAAA,EAAA,CAAA,KAAA,CAAA,CAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,MAAA,EAAA,OAAA,EAAA,CAAA,KAAA,EAE0C,KAF1C,CAEgD,KAFhD,CAAA,EAAA,GAAA,IAAA,GAEkE,OAFlE,CAAA,IAAA,CAAA,EAAA,GAAA,IAAA;;AAA0B,cAK1C,kBAL0C,EAAA,CAAA,YAAA,EAKN,YALM,EAAA,GAKS,gBALT"}
@@ -0,0 +1,29 @@
1
+ import { DefaultQueueEventAdapter } from "@motiadev/core";
2
+
3
+ //#region src/event-manager.ts
4
+ const createEventManager = (eventAdapter) => {
5
+ const waitEvents = async () => {
6
+ await new Promise((resolve) => setTimeout(resolve, 200));
7
+ if (eventAdapter instanceof DefaultQueueEventAdapter) {
8
+ let hasWork = true;
9
+ while (hasWork) {
10
+ await new Promise((resolve) => setTimeout(resolve, 100));
11
+ const metrics = eventAdapter.getAllMetrics();
12
+ hasWork = Object.values(metrics).some((m) => m.queueDepth > 0 || m.processingCount > 0);
13
+ }
14
+ }
15
+ await new Promise((resolve) => setTimeout(resolve, 100));
16
+ };
17
+ const subscribe = (topic, stepName, handler) => {
18
+ eventAdapter.subscribe(topic, stepName, handler);
19
+ };
20
+ return {
21
+ emit: eventAdapter.emit,
22
+ waitEvents,
23
+ subscribe
24
+ };
25
+ };
26
+
27
+ //#endregion
28
+ export { createEventManager };
29
+ //# sourceMappingURL=event-manager.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-manager.mjs","names":["metrics: Record<string, QueueMetrics>"],"sources":["../src/event-manager.ts"],"sourcesContent":["import type { Event, EventAdapter, QueueMetrics } from '@motiadev/core'\nimport { DefaultQueueEventAdapter } from '@motiadev/core'\n\ninterface TestEventManager {\n emit: <TData>(event: Event<TData>, file?: string) => Promise<void>\n waitEvents(): Promise<void>\n subscribe: <TData>(topic: string, stepName: string, handler: (event: Event<TData>) => void | Promise<void>) => void\n}\n\nexport const createEventManager = (eventAdapter: EventAdapter): TestEventManager => {\n const waitEvents = async () => {\n await new Promise((resolve) => setTimeout(resolve, 200))\n\n if (eventAdapter instanceof DefaultQueueEventAdapter) {\n let hasWork = true\n while (hasWork) {\n await new Promise((resolve) => setTimeout(resolve, 100))\n const metrics: Record<string, QueueMetrics> = eventAdapter.getAllMetrics()\n hasWork = Object.values(metrics).some((m) => m.queueDepth > 0 || m.processingCount > 0)\n }\n }\n\n await new Promise((resolve) => setTimeout(resolve, 100))\n }\n\n const subscribe = <TData>(\n topic: string,\n stepName: string,\n handler: (event: Event<TData>) => void | Promise<void>,\n ) => {\n eventAdapter.subscribe(topic, stepName, handler)\n }\n\n return {\n emit: eventAdapter.emit,\n waitEvents,\n subscribe,\n }\n}\n"],"mappings":";;;AASA,MAAa,sBAAsB,iBAAiD;CAClF,MAAM,aAAa,YAAY;AAC7B,QAAM,IAAI,SAAS,YAAY,WAAW,SAAS,IAAI,CAAC;AAExD,MAAI,wBAAwB,0BAA0B;GACpD,IAAI,UAAU;AACd,UAAO,SAAS;AACd,UAAM,IAAI,SAAS,YAAY,WAAW,SAAS,IAAI,CAAC;IACxD,MAAMA,UAAwC,aAAa,eAAe;AAC1E,cAAU,OAAO,OAAO,QAAQ,CAAC,MAAM,MAAM,EAAE,aAAa,KAAK,EAAE,kBAAkB,EAAE;;;AAI3F,QAAM,IAAI,SAAS,YAAY,WAAW,SAAS,IAAI,CAAC;;CAG1D,MAAM,aACJ,OACA,UACA,YACG;AACH,eAAa,UAAU,OAAO,UAAU,QAAQ;;AAGlD,QAAO;EACL,MAAM,aAAa;EACnB;EACA;EACD"}
@@ -0,0 +1,17 @@
1
+ import { MockFlowContext } from "./types.mjs";
2
+ import { Logger } from "@motiadev/core";
3
+ import { RedisClientType } from "redis";
4
+
5
+ //#region src/helpers.d.ts
6
+ declare const createMockLogger: () => jest.Mocked<Logger>;
7
+ declare const setupLoggerMock: () => void;
8
+ declare const createMockRedisClient: () => RedisClientType;
9
+ declare const createMockContext: (options?: {
10
+ logger?: jest.Mocked<Logger>;
11
+ emit?: jest.Mock;
12
+ traceId?: string;
13
+ state?: Partial<MockFlowContext["state"]>;
14
+ }) => MockFlowContext;
15
+ //#endregion
16
+ export { createMockContext, createMockLogger, createMockRedisClient, setupLoggerMock };
17
+ //# sourceMappingURL=helpers.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.mts","names":[],"sources":["../src/helpers.ts"],"sourcesContent":[],"mappings":";;;;;cAIa,wBAQU,IAAA,CAAK,OAAO;cAGtB;AAXA,cAeA,qBAPU,EAAA,GAAK,GAOa,eAPP;AAGrB,cAkCA,iBAhCZ,EAAA,CAAA,OAkCQ,CAlCR,EAAA;EAEY,MAAA,CAAA,EA+BF,IAAA,CAAK,MA/BH,CA+BU,MAHtB,CAAA;EAEY,IAAA,CAAA,EAEJ,IAAA,CAAK,IAFD;EACU,OAAA,CAAA,EAAA,MAAA;EAAZ,KAAK,CAAA,EAGN,OAHM,CAGE,eAHF,CAAA,OAAA,CAAA,CAAA;CACP,EAAA,GAGL,eAHU"}
@@ -0,0 +1,64 @@
1
+ import { Logger } from "@motiadev/core";
2
+
3
+ //#region src/helpers.ts
4
+ const createMockLogger = () => {
5
+ return {
6
+ info: jest.fn(),
7
+ error: jest.fn(),
8
+ warn: jest.fn(),
9
+ debug: jest.fn(),
10
+ log: jest.fn()
11
+ };
12
+ };
13
+ const setupLoggerMock = () => {
14
+ Logger.mockImplementation(createMockLogger);
15
+ };
16
+ const createMockRedisClient = () => {
17
+ return {
18
+ connect: jest.fn().mockResolvedValue(void 0),
19
+ quit: jest.fn().mockResolvedValue(void 0),
20
+ disconnect: jest.fn().mockResolvedValue(void 0),
21
+ isOpen: true,
22
+ on: jest.fn(),
23
+ get: jest.fn().mockResolvedValue(null),
24
+ set: jest.fn().mockResolvedValue("OK"),
25
+ del: jest.fn().mockResolvedValue(1),
26
+ exists: jest.fn().mockResolvedValue(1),
27
+ keys: jest.fn().mockResolvedValue([]),
28
+ flushAll: jest.fn().mockResolvedValue("OK"),
29
+ ping: jest.fn().mockResolvedValue("PONG"),
30
+ xAdd: jest.fn().mockResolvedValue(""),
31
+ xRead: jest.fn().mockResolvedValue([]),
32
+ xReadGroup: jest.fn().mockResolvedValue([]),
33
+ xGroupCreate: jest.fn().mockResolvedValue("OK"),
34
+ xAck: jest.fn().mockResolvedValue(1),
35
+ hGet: jest.fn().mockResolvedValue(null),
36
+ hSet: jest.fn().mockResolvedValue(1),
37
+ hGetAll: jest.fn().mockResolvedValue({}),
38
+ hDel: jest.fn().mockResolvedValue(1),
39
+ hExists: jest.fn().mockResolvedValue(0),
40
+ expire: jest.fn().mockResolvedValue(1),
41
+ ttl: jest.fn().mockResolvedValue(-1),
42
+ publish: jest.fn().mockResolvedValue(0)
43
+ };
44
+ };
45
+ const createMockContext = (options) => {
46
+ const { logger = createMockLogger(), emit = jest.fn(), traceId = "mock-trace-id", state } = options || {};
47
+ return {
48
+ logger,
49
+ emit,
50
+ traceId,
51
+ state: {
52
+ get: jest.fn(),
53
+ set: jest.fn(),
54
+ delete: jest.fn(),
55
+ clear: jest.fn(),
56
+ getGroup: jest.fn(),
57
+ ...state
58
+ }
59
+ };
60
+ };
61
+
62
+ //#endregion
63
+ export { createMockContext, createMockLogger, createMockRedisClient, setupLoggerMock };
64
+ //# sourceMappingURL=helpers.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.mjs","names":[],"sources":["../src/helpers.ts"],"sourcesContent":["import { Logger } from '@motiadev/core'\nimport type { RedisClientType } from 'redis'\nimport type { MockFlowContext, MockLogger } from './types'\n\nexport const createMockLogger = () => {\n const mockLogger: MockLogger = {\n info: jest.fn(),\n error: jest.fn(),\n warn: jest.fn(),\n debug: jest.fn(),\n log: jest.fn(),\n }\n return mockLogger as jest.Mocked<Logger>\n}\n\nexport const setupLoggerMock = () => {\n ;(Logger as jest.MockedClass<typeof Logger>).mockImplementation(createMockLogger)\n}\n\nexport const createMockRedisClient = (): RedisClientType => {\n return {\n connect: jest.fn().mockResolvedValue(undefined),\n quit: jest.fn().mockResolvedValue(undefined),\n disconnect: jest.fn().mockResolvedValue(undefined),\n isOpen: true,\n on: jest.fn(),\n get: jest.fn().mockResolvedValue(null),\n set: jest.fn().mockResolvedValue('OK'),\n del: jest.fn().mockResolvedValue(1),\n exists: jest.fn().mockResolvedValue(1),\n keys: jest.fn().mockResolvedValue([]),\n flushAll: jest.fn().mockResolvedValue('OK'),\n ping: jest.fn().mockResolvedValue('PONG'),\n xAdd: jest.fn().mockResolvedValue(''),\n xRead: jest.fn().mockResolvedValue([]),\n xReadGroup: jest.fn().mockResolvedValue([]),\n xGroupCreate: jest.fn().mockResolvedValue('OK'),\n xAck: jest.fn().mockResolvedValue(1),\n hGet: jest.fn().mockResolvedValue(null),\n hSet: jest.fn().mockResolvedValue(1),\n hGetAll: jest.fn().mockResolvedValue({}),\n hDel: jest.fn().mockResolvedValue(1),\n hExists: jest.fn().mockResolvedValue(0),\n expire: jest.fn().mockResolvedValue(1),\n ttl: jest.fn().mockResolvedValue(-1),\n publish: jest.fn().mockResolvedValue(0),\n } as unknown as RedisClientType\n}\n\nexport const createMockContext = (options?: {\n logger?: jest.Mocked<Logger>\n emit?: jest.Mock\n traceId?: string\n state?: Partial<MockFlowContext['state']>\n}): MockFlowContext => {\n const { logger = createMockLogger(), emit = jest.fn(), traceId = 'mock-trace-id', state } = options || {}\n\n return {\n logger,\n emit,\n traceId,\n state: {\n get: jest.fn(),\n set: jest.fn(),\n delete: jest.fn(),\n clear: jest.fn(),\n getGroup: jest.fn(),\n ...state,\n },\n }\n}\n"],"mappings":";;;AAIA,MAAa,yBAAyB;AAQpC,QAP+B;EAC7B,MAAM,KAAK,IAAI;EACf,OAAO,KAAK,IAAI;EAChB,MAAM,KAAK,IAAI;EACf,OAAO,KAAK,IAAI;EAChB,KAAK,KAAK,IAAI;EACf;;AAIH,MAAa,wBAAwB;AAClC,CAAC,OAA2C,mBAAmB,iBAAiB;;AAGnF,MAAa,8BAA+C;AAC1D,QAAO;EACL,SAAS,KAAK,IAAI,CAAC,kBAAkB,OAAU;EAC/C,MAAM,KAAK,IAAI,CAAC,kBAAkB,OAAU;EAC5C,YAAY,KAAK,IAAI,CAAC,kBAAkB,OAAU;EAClD,QAAQ;EACR,IAAI,KAAK,IAAI;EACb,KAAK,KAAK,IAAI,CAAC,kBAAkB,KAAK;EACtC,KAAK,KAAK,IAAI,CAAC,kBAAkB,KAAK;EACtC,KAAK,KAAK,IAAI,CAAC,kBAAkB,EAAE;EACnC,QAAQ,KAAK,IAAI,CAAC,kBAAkB,EAAE;EACtC,MAAM,KAAK,IAAI,CAAC,kBAAkB,EAAE,CAAC;EACrC,UAAU,KAAK,IAAI,CAAC,kBAAkB,KAAK;EAC3C,MAAM,KAAK,IAAI,CAAC,kBAAkB,OAAO;EACzC,MAAM,KAAK,IAAI,CAAC,kBAAkB,GAAG;EACrC,OAAO,KAAK,IAAI,CAAC,kBAAkB,EAAE,CAAC;EACtC,YAAY,KAAK,IAAI,CAAC,kBAAkB,EAAE,CAAC;EAC3C,cAAc,KAAK,IAAI,CAAC,kBAAkB,KAAK;EAC/C,MAAM,KAAK,IAAI,CAAC,kBAAkB,EAAE;EACpC,MAAM,KAAK,IAAI,CAAC,kBAAkB,KAAK;EACvC,MAAM,KAAK,IAAI,CAAC,kBAAkB,EAAE;EACpC,SAAS,KAAK,IAAI,CAAC,kBAAkB,EAAE,CAAC;EACxC,MAAM,KAAK,IAAI,CAAC,kBAAkB,EAAE;EACpC,SAAS,KAAK,IAAI,CAAC,kBAAkB,EAAE;EACvC,QAAQ,KAAK,IAAI,CAAC,kBAAkB,EAAE;EACtC,KAAK,KAAK,IAAI,CAAC,kBAAkB,GAAG;EACpC,SAAS,KAAK,IAAI,CAAC,kBAAkB,EAAE;EACxC;;AAGH,MAAa,qBAAqB,YAKX;CACrB,MAAM,EAAE,SAAS,kBAAkB,EAAE,OAAO,KAAK,IAAI,EAAE,UAAU,iBAAiB,UAAU,WAAW,EAAE;AAEzG,QAAO;EACL;EACA;EACA;EACA,OAAO;GACL,KAAK,KAAK,IAAI;GACd,KAAK,KAAK,IAAI;GACd,QAAQ,KAAK,IAAI;GACjB,OAAO,KAAK,IAAI;GAChB,UAAU,KAAK,IAAI;GACnB,GAAG;GACJ;EACF"}
@@ -0,0 +1,5 @@
1
+ import { createEventManager } from "./event-manager.mjs";
2
+ import { CapturedEvent, MockFlowContext, MockLogger, MotiaTester, RequestOptions, Watcher } from "./types.mjs";
3
+ import { createMockContext, createMockLogger, createMockRedisClient, setupLoggerMock } from "./helpers.mjs";
4
+ import { createMotiaTester } from "./tester.mjs";
5
+ export { CapturedEvent, MockFlowContext, MockLogger, MotiaTester, RequestOptions, Watcher, createEventManager, createMockContext, createMockLogger, createMockRedisClient, createMotiaTester, setupLoggerMock };
package/dist/index.mjs ADDED
@@ -0,0 +1,5 @@
1
+ import { createEventManager } from "./event-manager.mjs";
2
+ import { createMockContext, createMockLogger, createMockRedisClient, setupLoggerMock } from "./helpers.mjs";
3
+ import { createMotiaTester } from "./tester.mjs";
4
+
5
+ export { createEventManager, createMockContext, createMockLogger, createMockRedisClient, createMotiaTester, setupLoggerMock };
@@ -0,0 +1,7 @@
1
+ import { MotiaTester } from "./types.mjs";
2
+
3
+ //#region src/tester.d.ts
4
+ declare const createMotiaTester: () => MotiaTester;
5
+ //#endregion
6
+ export { createMotiaTester };
7
+ //# sourceMappingURL=tester.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tester.d.mts","names":[],"sources":["../src/tester.ts"],"sourcesContent":[],"mappings":";;;cAgBa,yBAAwB"}
@@ -0,0 +1,58 @@
1
+ import { createEventManager } from "./event-manager.mjs";
2
+ import { createMockRedisClient } from "./helpers.mjs";
3
+ import { DefaultCronAdapter, DefaultQueueEventAdapter, Logger, MemoryStreamAdapterManager, createServer, createStateAdapter } from "@motiadev/core";
4
+ import { generateLockedData } from "motia";
5
+ import path from "path";
6
+ import request from "supertest";
7
+
8
+ //#region src/tester.ts
9
+ const createMotiaTester = () => {
10
+ const eventAdapter = new DefaultQueueEventAdapter();
11
+ const eventManager = createEventManager(eventAdapter);
12
+ const logger = new Logger();
13
+ const promise = (async () => {
14
+ const lockedData = await generateLockedData({
15
+ projectDir: path.join(process.cwd()),
16
+ streamAdapter: new MemoryStreamAdapterManager(),
17
+ printerType: "disabled",
18
+ redisClient: createMockRedisClient()
19
+ });
20
+ const state = createStateAdapter({ adapter: "memory" });
21
+ const { server, socketServer, close } = createServer(lockedData, state, { isVerbose: false }, {
22
+ eventAdapter,
23
+ cronAdapter: new DefaultCronAdapter()
24
+ });
25
+ return {
26
+ server,
27
+ socketServer,
28
+ eventManager,
29
+ state,
30
+ close
31
+ };
32
+ })();
33
+ return {
34
+ logger,
35
+ waitEvents: async () => promise.then(({ eventManager: eventManager$1 }) => eventManager$1.waitEvents()),
36
+ post: async (path$1, options) => promise.then(({ server }) => request(server).post(path$1).send(options.body)),
37
+ get: async (path$1, options) => promise.then(({ server }) => request(server).get(path$1).send(options.body)),
38
+ emit: async (event) => eventManager.emit(event),
39
+ watch: async (event) => {
40
+ const events = [];
41
+ eventManager.subscribe(event, "$watcher", async (event$1) => {
42
+ const { logger: logger$1, tracer, ...rest } = event$1;
43
+ events.push(rest);
44
+ });
45
+ return {
46
+ getCapturedEvents: () => events,
47
+ getLastCapturedEvent: () => events[events.length - 1],
48
+ getCapturedEvent: (index) => events[index]
49
+ };
50
+ },
51
+ sleep: async (ms) => new Promise((resolve) => setTimeout(resolve, ms)),
52
+ close: async () => promise.then(({ close }) => close())
53
+ };
54
+ };
55
+
56
+ //#endregion
57
+ export { createMotiaTester };
58
+ //# sourceMappingURL=tester.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tester.mjs","names":["eventManager","path","events: CapturedEvent<TData>[]","event"],"sources":["../src/tester.ts"],"sourcesContent":["import {\n createServer,\n createStateAdapter,\n DefaultCronAdapter,\n DefaultQueueEventAdapter,\n type Event,\n Logger,\n MemoryStreamAdapterManager,\n} from '@motiadev/core'\nimport { generateLockedData } from 'motia'\nimport path from 'path'\nimport request from 'supertest'\nimport { createEventManager } from './event-manager'\nimport { createMockRedisClient } from './helpers'\nimport type { CapturedEvent, MotiaTester } from './types'\n\nexport const createMotiaTester = (): MotiaTester => {\n const eventAdapter = new DefaultQueueEventAdapter()\n const eventManager = createEventManager(eventAdapter)\n const logger = new Logger()\n\n const promise = (async () => {\n const lockedData = await generateLockedData({\n projectDir: path.join(process.cwd()),\n streamAdapter: new MemoryStreamAdapterManager(),\n printerType: 'disabled',\n redisClient: createMockRedisClient(),\n })\n const state = createStateAdapter({ adapter: 'memory' })\n const { server, socketServer, close } = createServer(\n lockedData,\n state,\n { isVerbose: false },\n { eventAdapter, cronAdapter: new DefaultCronAdapter() },\n )\n\n return { server, socketServer, eventManager, state, close }\n })()\n\n return {\n logger,\n waitEvents: async () => promise.then(({ eventManager }) => eventManager.waitEvents()),\n post: async (path, options) => promise.then(({ server }) => request(server).post(path).send(options.body)),\n get: async (path, options) => promise.then(({ server }) => request(server).get(path).send(options.body)),\n emit: async (event) => eventManager.emit(event),\n watch: async <TData>(event: string) => {\n const events: CapturedEvent<TData>[] = []\n\n eventManager.subscribe(event, '$watcher', async (event: Event<TData>) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { logger, tracer, ...rest } = event\n events.push(rest)\n })\n\n return {\n getCapturedEvents: () => events,\n getLastCapturedEvent: () => events[events.length - 1],\n getCapturedEvent: (index) => events[index],\n }\n },\n sleep: async (ms) => new Promise((resolve) => setTimeout(resolve, ms)),\n close: async () => promise.then(({ close }) => close()),\n }\n}\n"],"mappings":";;;;;;;;AAgBA,MAAa,0BAAuC;CAClD,MAAM,eAAe,IAAI,0BAA0B;CACnD,MAAM,eAAe,mBAAmB,aAAa;CACrD,MAAM,SAAS,IAAI,QAAQ;CAE3B,MAAM,WAAW,YAAY;EAC3B,MAAM,aAAa,MAAM,mBAAmB;GAC1C,YAAY,KAAK,KAAK,QAAQ,KAAK,CAAC;GACpC,eAAe,IAAI,4BAA4B;GAC/C,aAAa;GACb,aAAa,uBAAuB;GACrC,CAAC;EACF,MAAM,QAAQ,mBAAmB,EAAE,SAAS,UAAU,CAAC;EACvD,MAAM,EAAE,QAAQ,cAAc,UAAU,aACtC,YACA,OACA,EAAE,WAAW,OAAO,EACpB;GAAE;GAAc,aAAa,IAAI,oBAAoB;GAAE,CACxD;AAED,SAAO;GAAE;GAAQ;GAAc;GAAc;GAAO;GAAO;KACzD;AAEJ,QAAO;EACL;EACA,YAAY,YAAY,QAAQ,MAAM,EAAE,mCAAmBA,eAAa,YAAY,CAAC;EACrF,MAAM,OAAO,QAAM,YAAY,QAAQ,MAAM,EAAE,aAAa,QAAQ,OAAO,CAAC,KAAKC,OAAK,CAAC,KAAK,QAAQ,KAAK,CAAC;EAC1G,KAAK,OAAO,QAAM,YAAY,QAAQ,MAAM,EAAE,aAAa,QAAQ,OAAO,CAAC,IAAIA,OAAK,CAAC,KAAK,QAAQ,KAAK,CAAC;EACxG,MAAM,OAAO,UAAU,aAAa,KAAK,MAAM;EAC/C,OAAO,OAAc,UAAkB;GACrC,MAAMC,SAAiC,EAAE;AAEzC,gBAAa,UAAU,OAAO,YAAY,OAAO,YAAwB;IAEvE,MAAM,EAAE,kBAAQ,QAAQ,GAAG,SAASC;AACpC,WAAO,KAAK,KAAK;KACjB;AAEF,UAAO;IACL,yBAAyB;IACzB,4BAA4B,OAAO,OAAO,SAAS;IACnD,mBAAmB,UAAU,OAAO;IACrC;;EAEH,OAAO,OAAO,OAAO,IAAI,SAAS,YAAY,WAAW,SAAS,GAAG,CAAC;EACtE,OAAO,YAAY,QAAQ,MAAM,EAAE,YAAY,OAAO,CAAC;EACxD"}
@@ -0,0 +1,41 @@
1
+ import { Event, FlowContext, InternalStateManager, Logger } from "@motiadev/core";
2
+ import { Response } from "supertest";
3
+
4
+ //#region src/types.d.ts
5
+ type Watcher<TData = unknown> = {
6
+ getCapturedEvents(): CapturedEvent<TData>[];
7
+ getLastCapturedEvent(): CapturedEvent<TData> | undefined;
8
+ getCapturedEvent(index: number): CapturedEvent<TData> | undefined;
9
+ };
10
+ interface MotiaTester {
11
+ post(path: string, options: RequestOptions): Promise<Response>;
12
+ get(path: string, options: RequestOptions): Promise<Response>;
13
+ emit(event: Event): Promise<void>;
14
+ watch<TData>(event: string): Promise<Watcher<TData>>;
15
+ sleep(ms: number): Promise<void>;
16
+ close(): Promise<void>;
17
+ waitEvents(): Promise<void>;
18
+ logger: Logger;
19
+ }
20
+ type RequestOptions = {
21
+ body?: Record<string, unknown>;
22
+ headers?: Record<string, string>;
23
+ cookies?: Record<string, string>;
24
+ };
25
+ type CapturedEvent<TData = unknown> = Omit<Event<TData>, 'logger' | 'tracer'>;
26
+ type MockFlowContext = {
27
+ logger: jest.Mocked<Logger>;
28
+ emit: jest.Mock | FlowContext<unknown>['emit'];
29
+ traceId: string;
30
+ state: jest.Mocked<InternalStateManager>;
31
+ };
32
+ interface MockLogger {
33
+ info: (message: string) => void;
34
+ debug: (message: string) => void;
35
+ warn: (message: string) => void;
36
+ error: (message: string) => void;
37
+ log: (message: string) => void;
38
+ }
39
+ //#endregion
40
+ export { CapturedEvent, MockFlowContext, MockLogger, MotiaTester, RequestOptions, Watcher };
41
+ //# sourceMappingURL=types.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.mts","names":[],"sources":["../src/types.ts"],"sourcesContent":[],"mappings":";;;;KAGY;uBACW,cAAc;EADzB,oBAAO,EAAA,EAEO,aAFP,CAEqB,KAFrB,CAAA,GAAA,SAAA;EACkB,gBAAA,CAAA,KAAA,EAAA,MAAA,CAAA,EAEF,aAFE,CAEY,KAFZ,CAAA,GAAA,SAAA;CAAd;AACiB,UAIvB,WAAA,CAJuB;EAAd,IAAA,CAAA,IAAA,EAAA,MAAA,EAAA,OAAA,EAKI,cALJ,CAAA,EAKqB,OALrB,CAK6B,QAL7B,CAAA;EACuB,GAAA,CAAA,IAAA,EAAA,MAAA,EAAA,OAAA,EAKpB,cALoB,CAAA,EAKH,OALG,CAKK,QALL,CAAA;EAAd,IAAA,CAAA,KAAA,EAMrB,KANqB,CAAA,EAMb,OANa,CAAA,IAAA,CAAA;EAAa,KAAA,CAAA,KAAA,CAAA,CAAA,KAAA,EAAA,MAAA,CAAA,EAOjB,OAPiB,CAOT,OAPS,CAOD,KAPC,CAAA,CAAA;EAG/B,KAAA,CAAA,EAAA,EAAA,MAAW,CAAA,EAKP,OALO,CAAA,IAAA,CAAA;EACE,KAAA,EAAA,EAKnB,OALmB,CAAA,IAAA,CAAA;EAAyB,UAAA,EAAA,EAMvC,OANuC,CAAA,IAAA,CAAA;EAAR,MAAA,EAOrC,MAPqC;;AACO,KAS1C,cAAA,GAT0C;EAAR,IAAA,CAAA,EAUrC,MAVqC,CAAA,MAAA,EAAA,OAAA,CAAA;EAChC,OAAA,CAAA,EAUF,MAVE,CAAA,MAAA,EAAA,MAAA,CAAA;EAAQ,OAAA,CAAA,EAWV,MAXU,CAAA,MAAA,EAAA,MAAA,CAAA;CACyB;AAAR,KAa3B,aAb2B,CAAA,QAAA,OAAA,CAAA,GAaM,IAbN,CAaW,KAbX,CAaiB,KAbjB,CAAA,EAAA,QAAA,GAAA,QAAA,CAAA;AAAR,KAenB,eAAA,GAfmB;EACV,MAAA,EAeX,IAAA,CAAK,MAfM,CAeC,MAfD,CAAA;EACV,IAAA,EAeH,IAAA,CAAK,IAfF,GAeS,WAfT,CAAA,OAAA,CAAA,CAAA,MAAA,CAAA;EACK,OAAA,EAAA,MAAA;EACN,KAAA,EAeD,IAAA,CAAK,MAfJ,CAeW,oBAfX,CAAA;CAAM;AAGJ,UAeK,UAAA,CAfS;EACjB,IAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,GAAA,IAAA;EACG,KAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,GAAA,IAAA;EACA,IAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,GAAA,IAAA;EAAM,KAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,GAAA,IAAA;EAGN,GAAA,EAAA,CAAA,OAAA,EAAA,MAAa,EAAA,GAAA,IAAA"}
package/package.json CHANGED
@@ -1,12 +1,14 @@
1
1
  {
2
2
  "name": "@motiadev/test",
3
3
  "description": "A testing utility package for Motia workflows that provides tools for mocking, testing, and simulating Motia components.",
4
- "version": "0.13.2-beta.163",
5
- "main": "dist/index.js",
6
- "types": "dist/index.d.ts",
4
+ "type": "module",
5
+ "version": "0.13.2-beta.164-562802",
6
+ "main": "dist/index.mjs",
7
+ "module": "dist/index.mjs",
8
+ "types": "dist/index.d.mts",
7
9
  "peerDependencies": {
8
- "@motiadev/core": "0.13.2-beta.163",
9
- "motia": "0.13.2-beta.163"
10
+ "@motiadev/core": "0.13.2-beta.164-562802",
11
+ "motia": "0.13.2-beta.164-562802"
10
12
  },
11
13
  "dependencies": {
12
14
  "jest": "^29.7.0",
@@ -18,10 +20,13 @@
18
20
  "@types/supertest": "^6.0.2",
19
21
  "jest": "^29.7.0",
20
22
  "ts-jest": "^29.2.5",
23
+ "tsdown": "^0.16.6",
21
24
  "typescript": "^5.7.2"
22
25
  },
23
26
  "scripts": {
24
- "build": "rm -rf dist && tsc",
25
- "lint": "eslint --config ../../eslint.config.js"
27
+ "build": "tsdown",
28
+ "dev": "tsdown --watch",
29
+ "lint": "eslint --config ../../eslint.config.js",
30
+ "clean": "rm -rf dist"
26
31
  }
27
32
  }
@@ -0,0 +1,17 @@
1
+ import { defineConfig } from 'tsdown'
2
+
3
+ export default defineConfig({
4
+ entry: {
5
+ index: './src/index.ts',
6
+ },
7
+ format: 'esm',
8
+ platform: 'node',
9
+ external: ['@motiadev/core', 'motia', 'jest', 'redis', 'supertest'],
10
+ dts: {
11
+ build: true,
12
+ },
13
+ clean: true,
14
+ outDir: 'dist',
15
+ sourcemap: true,
16
+ unbundle: true,
17
+ })
package/dist/index.d.ts DELETED
@@ -1,4 +0,0 @@
1
- export * from './src/event-manager';
2
- export * from './src/helpers';
3
- export * from './src/tester';
4
- export * from './src/types';
package/dist/index.js DELETED
@@ -1,20 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./src/event-manager"), exports);
18
- __exportStar(require("./src/helpers"), exports);
19
- __exportStar(require("./src/tester"), exports);
20
- __exportStar(require("./src/types"), exports);
@@ -1,8 +0,0 @@
1
- import type { Event, EventAdapter } from '@motiadev/core';
2
- interface TestEventManager {
3
- emit: <TData>(event: Event<TData>, file?: string) => Promise<void>;
4
- waitEvents(): Promise<void>;
5
- subscribe: <TData>(topic: string, stepName: string, handler: (event: Event<TData>) => void | Promise<void>) => void;
6
- }
7
- export declare const createEventManager: (eventAdapter: EventAdapter) => TestEventManager;
8
- export {};
@@ -1,27 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createEventManager = void 0;
4
- const core_1 = require("@motiadev/core");
5
- const createEventManager = (eventAdapter) => {
6
- const waitEvents = async () => {
7
- await new Promise((resolve) => setTimeout(resolve, 200));
8
- if (eventAdapter instanceof core_1.DefaultQueueEventAdapter) {
9
- let hasWork = true;
10
- while (hasWork) {
11
- await new Promise((resolve) => setTimeout(resolve, 100));
12
- const metrics = eventAdapter.getAllMetrics();
13
- hasWork = Object.values(metrics).some((m) => m.queueDepth > 0 || m.processingCount > 0);
14
- }
15
- }
16
- await new Promise((resolve) => setTimeout(resolve, 100));
17
- };
18
- const subscribe = (topic, stepName, handler) => {
19
- eventAdapter.subscribe(topic, stepName, handler);
20
- };
21
- return {
22
- emit: eventAdapter.emit,
23
- waitEvents,
24
- subscribe,
25
- };
26
- };
27
- exports.createEventManager = createEventManager;
@@ -1,12 +0,0 @@
1
- import { Logger } from '@motiadev/core';
2
- import type { RedisClientType } from 'redis';
3
- import type { MockFlowContext } from './types';
4
- export declare const createMockLogger: () => jest.Mocked<Logger>;
5
- export declare const setupLoggerMock: () => void;
6
- export declare const createMockRedisClient: () => RedisClientType;
7
- export declare const createMockContext: (options?: {
8
- logger?: jest.Mocked<Logger>;
9
- emit?: jest.Mock;
10
- traceId?: string;
11
- state?: Partial<MockFlowContext["state"]>;
12
- }) => MockFlowContext;
@@ -1,67 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createMockContext = exports.createMockRedisClient = exports.setupLoggerMock = exports.createMockLogger = void 0;
4
- const core_1 = require("@motiadev/core");
5
- const createMockLogger = () => {
6
- const mockLogger = {
7
- info: jest.fn(),
8
- error: jest.fn(),
9
- warn: jest.fn(),
10
- debug: jest.fn(),
11
- log: jest.fn(),
12
- };
13
- return mockLogger;
14
- };
15
- exports.createMockLogger = createMockLogger;
16
- const setupLoggerMock = () => {
17
- ;
18
- core_1.Logger.mockImplementation(exports.createMockLogger);
19
- };
20
- exports.setupLoggerMock = setupLoggerMock;
21
- const createMockRedisClient = () => {
22
- return {
23
- connect: jest.fn().mockResolvedValue(undefined),
24
- quit: jest.fn().mockResolvedValue(undefined),
25
- disconnect: jest.fn().mockResolvedValue(undefined),
26
- isOpen: true,
27
- on: jest.fn(),
28
- get: jest.fn().mockResolvedValue(null),
29
- set: jest.fn().mockResolvedValue('OK'),
30
- del: jest.fn().mockResolvedValue(1),
31
- exists: jest.fn().mockResolvedValue(1),
32
- keys: jest.fn().mockResolvedValue([]),
33
- flushAll: jest.fn().mockResolvedValue('OK'),
34
- ping: jest.fn().mockResolvedValue('PONG'),
35
- xAdd: jest.fn().mockResolvedValue(''),
36
- xRead: jest.fn().mockResolvedValue([]),
37
- xReadGroup: jest.fn().mockResolvedValue([]),
38
- xGroupCreate: jest.fn().mockResolvedValue('OK'),
39
- xAck: jest.fn().mockResolvedValue(1),
40
- hGet: jest.fn().mockResolvedValue(null),
41
- hSet: jest.fn().mockResolvedValue(1),
42
- hGetAll: jest.fn().mockResolvedValue({}),
43
- hDel: jest.fn().mockResolvedValue(1),
44
- hExists: jest.fn().mockResolvedValue(0),
45
- expire: jest.fn().mockResolvedValue(1),
46
- ttl: jest.fn().mockResolvedValue(-1),
47
- publish: jest.fn().mockResolvedValue(0),
48
- };
49
- };
50
- exports.createMockRedisClient = createMockRedisClient;
51
- const createMockContext = (options) => {
52
- const { logger = (0, exports.createMockLogger)(), emit = jest.fn(), traceId = 'mock-trace-id', state } = options || {};
53
- return {
54
- logger,
55
- emit,
56
- traceId,
57
- state: {
58
- get: jest.fn(),
59
- set: jest.fn(),
60
- delete: jest.fn(),
61
- clear: jest.fn(),
62
- getGroup: jest.fn(),
63
- ...state,
64
- },
65
- };
66
- };
67
- exports.createMockContext = createMockContext;
@@ -1,2 +0,0 @@
1
- import type { MotiaTester } from './types';
2
- export declare const createMotiaTester: () => MotiaTester;
@@ -1,51 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.createMotiaTester = void 0;
7
- const core_1 = require("@motiadev/core");
8
- const motia_1 = require("motia");
9
- const path_1 = __importDefault(require("path"));
10
- const supertest_1 = __importDefault(require("supertest"));
11
- const event_manager_1 = require("./event-manager");
12
- const helpers_1 = require("./helpers");
13
- const createMotiaTester = () => {
14
- const eventAdapter = new core_1.DefaultQueueEventAdapter();
15
- const eventManager = (0, event_manager_1.createEventManager)(eventAdapter);
16
- const logger = new core_1.Logger();
17
- const promise = (async () => {
18
- const lockedData = await (0, motia_1.generateLockedData)({
19
- projectDir: path_1.default.join(process.cwd()),
20
- streamAdapter: new core_1.MemoryStreamAdapterManager(),
21
- printerType: 'disabled',
22
- redisClient: (0, helpers_1.createMockRedisClient)(),
23
- });
24
- const state = (0, core_1.createStateAdapter)({ adapter: 'memory' });
25
- const { server, socketServer, close } = (0, core_1.createServer)(lockedData, state, { isVerbose: false }, { eventAdapter, cronAdapter: new core_1.DefaultCronAdapter() });
26
- return { server, socketServer, eventManager, state, close };
27
- })();
28
- return {
29
- logger,
30
- waitEvents: async () => promise.then(({ eventManager }) => eventManager.waitEvents()),
31
- post: async (path, options) => promise.then(({ server }) => (0, supertest_1.default)(server).post(path).send(options.body)),
32
- get: async (path, options) => promise.then(({ server }) => (0, supertest_1.default)(server).get(path).send(options.body)),
33
- emit: async (event) => eventManager.emit(event),
34
- watch: async (event) => {
35
- const events = [];
36
- eventManager.subscribe(event, '$watcher', async (event) => {
37
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
38
- const { logger, tracer, ...rest } = event;
39
- events.push(rest);
40
- });
41
- return {
42
- getCapturedEvents: () => events,
43
- getLastCapturedEvent: () => events[events.length - 1],
44
- getCapturedEvent: (index) => events[index],
45
- };
46
- },
47
- sleep: async (ms) => new Promise((resolve) => setTimeout(resolve, ms)),
48
- close: async () => promise.then(({ close }) => close()),
49
- };
50
- };
51
- exports.createMotiaTester = createMotiaTester;
@@ -1,36 +0,0 @@
1
- import type { Event, FlowContext, InternalStateManager, Logger } from '@motiadev/core';
2
- import type { Response } from 'supertest';
3
- export type Watcher<TData = unknown> = {
4
- getCapturedEvents(): CapturedEvent<TData>[];
5
- getLastCapturedEvent(): CapturedEvent<TData> | undefined;
6
- getCapturedEvent(index: number): CapturedEvent<TData> | undefined;
7
- };
8
- export interface MotiaTester {
9
- post(path: string, options: RequestOptions): Promise<Response>;
10
- get(path: string, options: RequestOptions): Promise<Response>;
11
- emit(event: Event): Promise<void>;
12
- watch<TData>(event: string): Promise<Watcher<TData>>;
13
- sleep(ms: number): Promise<void>;
14
- close(): Promise<void>;
15
- waitEvents(): Promise<void>;
16
- logger: Logger;
17
- }
18
- export type RequestOptions = {
19
- body?: Record<string, unknown>;
20
- headers?: Record<string, string>;
21
- cookies?: Record<string, string>;
22
- };
23
- export type CapturedEvent<TData = unknown> = Omit<Event<TData>, 'logger' | 'tracer'>;
24
- export type MockFlowContext = {
25
- logger: jest.Mocked<Logger>;
26
- emit: jest.Mock | FlowContext<unknown>['emit'];
27
- traceId: string;
28
- state: jest.Mocked<InternalStateManager>;
29
- };
30
- export interface MockLogger {
31
- info: (message: string) => void;
32
- debug: (message: string) => void;
33
- warn: (message: string) => void;
34
- error: (message: string) => void;
35
- log: (message: string) => void;
36
- }
package/dist/src/types.js DELETED
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });