Skip to content

Commit a2553dc

Browse files
jtomaszewskiclaude
andcommitted
refactor(test): standardize on Vitest across all packages
- Migrate core package from Jest to Vitest - Replace jest.fn() with vi.fn() in all mock files - Replace jest.useFakeTimers/advanceTimersByTime with vi equivalents - Add vitest.config.ts to core package (matches mikroorm-driver config) - Remove jest.config.js and Jest dependencies - Exclude test directories from tsconfig.json build in both packages 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent b0f1690 commit a2553dc

11 files changed

+624
-3173
lines changed

package-lock.json

Lines changed: 555 additions & 3121 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/core/jest.config.js

Lines changed: 0 additions & 7 deletions
This file was deleted.

packages/core/package.json

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
"scripts": {
1010
"build": "tsc",
1111
"tsc:publish": "tsc && npm publish",
12-
"test": "jest"
12+
"test": "vitest run",
13+
"test:watch": "vitest"
1314
},
1415
"publishConfig": {
1516
"access": "public"
@@ -24,17 +25,17 @@
2425
},
2526
"devDependencies": {
2627
"@nestjs/testing": "^10.4.1",
27-
"@types/jest": "^29.5.13",
28+
"@swc/core": "^1.7.42",
2829
"@types/node": "^20.16.5",
2930
"@typescript-eslint/eslint-plugin": "^8.5.0",
3031
"@typescript-eslint/parser": "^8.5.0",
3132
"eslint": "^9.10.0",
3233
"eslint-config-prettier": "^9.1.0",
33-
"jest": "^29.7.0",
3434
"prettier": "^3.3.3",
3535
"rxjs": "^7.8.1",
36-
"ts-jest": "^29.2.5",
37-
"typescript": "^5.6.2"
36+
"typescript": "^5.6.2",
37+
"unplugin-swc": "^1.5.1",
38+
"vitest": "^2.1.1"
3839
},
3940
"gitHead": "010c167e60c596cb1aabf28186242a095c351e59"
4041
}

packages/core/src/test/unit/inbox-outbox-event-processor.spec.ts

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { vi } from 'vitest';
12
import { DatabaseDriverFactory } from "../../driver/database-driver.factory";
23
import { DatabaseDriver } from "../../driver/database.driver";
34
import { InboxOutboxModuleOptions } from "../../inbox-outbox.module-definition";
@@ -28,11 +29,11 @@ describe('InboxOutboxEventProcessor', () => {
2829
mockedInboxOutboxEventProcessor = createMockedInboxOutboxEventProcessor();
2930
mockedEventConfigurationResolver = createMockedEventConfigurationResolver();
3031
mockLogger = {
31-
error: jest.fn(),
32-
log: jest.fn(),
33-
warn: jest.fn(),
34-
debug: jest.fn(),
35-
info: jest.fn(),
32+
error: vi.fn(),
33+
log: vi.fn(),
34+
warn: vi.fn(),
35+
debug: vi.fn(),
36+
info: vi.fn(),
3637
};
3738
});
3839

@@ -50,13 +51,13 @@ describe('InboxOutboxEventProcessor', () => {
5051
];
5152

5253
const firstListener : IListener<any> = {
53-
handle: jest.fn().mockReturnValue({}),
54-
getName: jest.fn().mockReturnValue('listener'),
54+
handle: vi.fn().mockReturnValue({}),
55+
getName: vi.fn().mockReturnValue('listener'),
5556
};
5657

5758
const secondListener : IListener<any> = {
58-
handle: jest.fn().mockReturnValue({}),
59-
getName: jest.fn().mockReturnValue('listener'),
59+
handle: vi.fn().mockReturnValue({}),
60+
getName: vi.fn().mockReturnValue('listener'),
6061
};
6162

6263

@@ -98,13 +99,13 @@ describe('InboxOutboxEventProcessor', () => {
9899
];
99100

100101
const firstListener : IListener<any> = {
101-
handle: jest.fn().mockReturnValue({}),
102-
getName: jest.fn().mockReturnValue('listener'),
102+
handle: vi.fn().mockReturnValue({}),
103+
getName: vi.fn().mockReturnValue('listener'),
103104
};
104105

105106
const secondListener : IListener<any> = {
106-
handle: jest.fn().mockRejectedValue({}),
107-
getName: jest.fn().mockReturnValue('listener'),
107+
handle: vi.fn().mockRejectedValue({}),
108+
getName: vi.fn().mockReturnValue('listener'),
108109
};
109110

110111

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1+
import { vi } from 'vitest';
2+
13
export const createMockedDriver = () => {
24
return {
3-
persist: jest.fn(),
4-
remove: jest.fn(),
5-
flush: jest.fn(),
6-
createInboxOutboxTransportEvent: jest.fn(),
7-
findAndExtendReadyToRetryEvents: jest.fn()
5+
persist: vi.fn(),
6+
remove: vi.fn(),
7+
flush: vi.fn(),
8+
createInboxOutboxTransportEvent: vi.fn(),
9+
findAndExtendReadyToRetryEvents: vi.fn()
810
}
911
}
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
import { vi } from 'vitest';
2+
13
export const createMockedEventConfigurationResolver = () => {
24
return {
3-
resolve: jest.fn(),
5+
resolve: vi.fn(),
46
}
5-
}
7+
}
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1+
import { vi } from 'vitest';
12

23
export const createMockedInboxOutboxEventProcessor = () => {
34
return {
4-
process: jest.fn(),
5+
process: vi.fn(),
56
}
67
}

packages/core/src/test/unit/retryable-inbox-outbox-event-poller.spec.ts

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { vi, Mock } from 'vitest';
12
import { Logger } from '@nestjs/common';
23
import { DatabaseDriverFactory } from '../../driver/database-driver.factory';
34
import { DatabaseDriver } from '../../driver/database.driver';
@@ -20,7 +21,7 @@ describe('RetryableInboxOutboxEventPoller', () => {
2021
let mockInboxOutboxEventProcessor: InboxOutboxEventProcessorContract;
2122

2223
beforeEach(() => {
23-
jest.useFakeTimers();
24+
vi.useFakeTimers();
2425
mockedDriver = createMockedDriver();
2526
mockedDriverFactory = createMockedDriverFactory(mockedDriver);
2627
inboxOutboxOptions = createMockedInboxOutboxOptionsFactory(mockedDriverFactory, [
@@ -34,25 +35,25 @@ describe('RetryableInboxOutboxEventPoller', () => {
3435
},
3536
]);
3637
mockLogger = {
37-
log: jest.fn(),
38-
error: jest.fn(),
39-
warn: jest.fn(),
40-
debug: jest.fn(),
38+
log: vi.fn(),
39+
error: vi.fn(),
40+
warn: vi.fn(),
41+
debug: vi.fn(),
4142
} as unknown as Logger;
4243

4344
mockTransactionalEventEmitter = {
44-
getListeners: jest.fn().mockReturnValue([]),
45+
getListeners: vi.fn().mockReturnValue([]),
4546
} as unknown as TransactionalEventEmitter;
4647

4748
mockEventConfigurationResolver = {} as EventConfigurationResolver;
4849

4950
mockInboxOutboxEventProcessor = {
50-
process: jest.fn().mockResolvedValue(undefined),
51+
process: vi.fn().mockResolvedValue(undefined),
5152
};
5253
});
5354

5455
afterEach(() => {
55-
jest.useRealTimers();
56+
vi.useRealTimers();
5657
});
5758

5859
function createPoller() {
@@ -78,21 +79,21 @@ describe('RetryableInboxOutboxEventPoller', () => {
7879
});
7980

8081
it('should stop polling after shutdown is initiated', async () => {
81-
(mockedDriver.findAndExtendReadyToRetryEvents as jest.Mock).mockResolvedValue([]);
82+
(mockedDriver.findAndExtendReadyToRetryEvents as Mock).mockResolvedValue([]);
8283
const poller = createPoller();
8384
await poller.onModuleInit();
8485

85-
jest.advanceTimersByTime(inboxOutboxOptions.retryEveryMilliseconds);
86+
vi.advanceTimersByTime(inboxOutboxOptions.retryEveryMilliseconds);
8687
await Promise.resolve();
8788

88-
const callCountBeforeShutdown = (mockedDriver.findAndExtendReadyToRetryEvents as jest.Mock).mock.calls.length;
89+
const callCountBeforeShutdown = (mockedDriver.findAndExtendReadyToRetryEvents as Mock).mock.calls.length;
8990

9091
await poller.onModuleDestroy();
9192

92-
jest.advanceTimersByTime(inboxOutboxOptions.retryEveryMilliseconds * 5);
93+
vi.advanceTimersByTime(inboxOutboxOptions.retryEveryMilliseconds * 5);
9394
await Promise.resolve();
9495

95-
const callCountAfterShutdown = (mockedDriver.findAndExtendReadyToRetryEvents as jest.Mock).mock.calls.length;
96+
const callCountAfterShutdown = (mockedDriver.findAndExtendReadyToRetryEvents as Mock).mock.calls.length;
9697
expect(callCountAfterShutdown).toBe(callCountBeforeShutdown);
9798
});
9899

@@ -102,7 +103,7 @@ describe('RetryableInboxOutboxEventPoller', () => {
102103
resolveProcessing = resolve;
103104
});
104105

105-
(mockInboxOutboxEventProcessor.process as jest.Mock).mockReturnValue(processingPromise);
106+
(mockInboxOutboxEventProcessor.process as Mock).mockReturnValue(processingPromise);
106107

107108
const mockEvent = {
108109
id: 1,
@@ -113,12 +114,12 @@ describe('RetryableInboxOutboxEventPoller', () => {
113114
expireAt: Date.now() + 1000,
114115
insertedAt: Date.now(),
115116
};
116-
(mockedDriver.findAndExtendReadyToRetryEvents as jest.Mock).mockResolvedValue([mockEvent]);
117+
(mockedDriver.findAndExtendReadyToRetryEvents as Mock).mockResolvedValue([mockEvent]);
117118

118119
const poller = createPoller();
119120
await poller.onModuleInit();
120121

121-
jest.advanceTimersByTime(inboxOutboxOptions.retryEveryMilliseconds);
122+
vi.advanceTimersByTime(inboxOutboxOptions.retryEveryMilliseconds);
122123
await Promise.resolve();
123124
await Promise.resolve();
124125

@@ -143,7 +144,7 @@ describe('RetryableInboxOutboxEventPoller', () => {
143144
});
144145

145146
it('should handle shutdown when no in-flight processing exists', async () => {
146-
(mockedDriver.findAndExtendReadyToRetryEvents as jest.Mock).mockResolvedValue([]);
147+
(mockedDriver.findAndExtendReadyToRetryEvents as Mock).mockResolvedValue([]);
147148
const poller = createPoller();
148149
await poller.onModuleInit();
149150

packages/core/tsconfig.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,6 @@
1818
"forceConsistentCasingInFileNames": false,
1919
"noFallthroughCasesInSwitch": false
2020
},
21-
"exclude": ["node_modules", "dist"]
21+
"include": ["src/**/*"],
22+
"exclude": ["node_modules", "dist", "src/test"]
2223
}

packages/core/vitest.config.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { defineConfig } from 'vitest/config';
2+
import swc from 'unplugin-swc';
3+
4+
export default defineConfig({
5+
test: {
6+
globals: true,
7+
environment: 'node',
8+
include: ['src/**/*.spec.ts'],
9+
},
10+
plugins: [
11+
swc.vite({
12+
module: { type: 'es6' },
13+
}),
14+
],
15+
});

0 commit comments

Comments
 (0)