Skip to content

Commit a5db71a

Browse files
authored
refactor: use vitest (#702)
1 parent cca8583 commit a5db71a

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

79 files changed

+570
-2966
lines changed

packages/browser/FixJsdomEnvironment.js

-16
This file was deleted.

packages/browser/jest.config.js

-10
This file was deleted.

packages/browser/jest.setup.js

-15
This file was deleted.

packages/browser/package.json

+6-10
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@
2626
"check": "tsc --noEmit",
2727
"build": "rm -rf lib/ && tsc -p tsconfig.build.json --noEmit && rollup -c",
2828
"lint": "eslint --ext .ts src",
29-
"test": "jest",
30-
"test:coverage": "jest --silent --coverage",
29+
"test": "vitest",
30+
"test:coverage": "vitest --silent --coverage",
3131
"prepack": "pnpm build && pnpm test"
3232
},
3333
"dependencies": {
@@ -38,17 +38,13 @@
3838
"devDependencies": {
3939
"@silverhand/eslint-config": "^5.0.0",
4040
"@silverhand/ts-config": "^5.0.0",
41-
"@swc/core": "^1.3.50",
42-
"@swc/jest": "^0.2.24",
43-
"@types/jest": "^29.5.0",
41+
"@vitest/coverage-v8": "^1.4.0",
4442
"eslint": "^8.57.0",
45-
"jest": "^29.5.0",
46-
"jest-environment-jsdom": "^29.5.0",
47-
"jest-matcher-specific-error": "^1.0.0",
43+
"happy-dom": "^14.0.0",
4844
"lint-staged": "^15.0.0",
4945
"prettier": "^3.0.0",
50-
"text-encoder": "^0.0.4",
51-
"typescript": "^5.3.3"
46+
"typescript": "^5.3.3",
47+
"vitest": "^1.4.0"
5248
},
5349
"eslintConfig": {
5450
"extends": "@silverhand"

packages/browser/src/utils/generators.test.ts

-14
Original file line numberDiff line numberDiff line change
@@ -40,20 +40,6 @@ describe('generateCodeVerifier', () => {
4040
});
4141

4242
describe('generateCodeChallenge', () => {
43-
test('should throw optimized error message when crypto.subtle is unavailable', async () => {
44-
const originalSubtle = crypto.subtle;
45-
// @ts-expect-error make it undefined on purpose
46-
// eslint-disable-next-line @silverhand/fp/no-mutation
47-
crypto.subtle = undefined;
48-
49-
const codeVerifier = generateCodeVerifier();
50-
await expect(generateCodeChallenge(codeVerifier)).rejects.toThrow();
51-
52-
// @ts-expect-error revert it to the original value
53-
// eslint-disable-next-line @silverhand/fp/no-mutation
54-
crypto.subtle = originalSubtle;
55-
});
56-
5743
test('dealing with different code verifiers should not be equal', async () => {
5844
const codeVerifier1 = generateCodeVerifier();
5945
const codeChallenge1 = await generateCodeChallenge(codeVerifier1);

packages/browser/tsconfig.json

+2-4
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,11 @@
33
"compilerOptions": {
44
"outDir": "lib",
55
"types": [
6-
"jest",
7-
"jest-matcher-specific-error"
6+
"vitest/globals"
87
]
98
},
109
"include": [
1110
"src",
12-
"jest.config.ts",
13-
"FixJsdomEnvironment.ts",
11+
"vitest.config.ts",
1412
]
1513
}

packages/browser/vitest.config.ts

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { defineConfig } from 'vitest/config';
2+
3+
export default defineConfig({
4+
test: {
5+
globals: true,
6+
environment: 'happy-dom',
7+
},
8+
});

packages/capacitor/FixJsdomEnvironment.js

-16
This file was deleted.

packages/capacitor/jest.config.js

-10
This file was deleted.

packages/capacitor/jest.setup.js

-15
This file was deleted.

packages/capacitor/package.json

+6-10
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@
2626
"check": "tsc --noEmit",
2727
"build": "rm -rf lib/ && tsc -p tsconfig.build.json --noEmit && rollup -c",
2828
"lint": "eslint --ext .ts src",
29-
"test": "jest",
30-
"test:coverage": "jest --silent --coverage",
29+
"test": "vitest",
30+
"test:coverage": "vitest --silent --coverage",
3131
"prepack": "pnpm build && pnpm test"
3232
},
3333
"dependencies": {
@@ -39,17 +39,13 @@
3939
"@capacitor/preferences": "^5.0.6",
4040
"@silverhand/eslint-config": "^5.0.0",
4141
"@silverhand/ts-config": "^5.0.0",
42-
"@swc/core": "^1.3.50",
43-
"@swc/jest": "^0.2.24",
44-
"@types/jest": "^29.5.0",
42+
"@vitest/coverage-v8": "^1.4.0",
4543
"eslint": "^8.57.0",
46-
"jest": "^29.5.0",
47-
"jest-environment-jsdom": "^29.5.0",
48-
"jest-matcher-specific-error": "^1.0.0",
44+
"happy-dom": "^14.0.0",
4945
"lint-staged": "^15.0.0",
5046
"prettier": "^3.0.0",
51-
"text-encoder": "^0.0.4",
52-
"typescript": "^5.3.3"
47+
"typescript": "^5.3.3",
48+
"vitest": "^1.4.0"
5349
},
5450
"eslintConfig": {
5551
"extends": "@silverhand"

packages/capacitor/src/index.test.ts

+3-4
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ import { Browser } from '@capacitor/browser';
22

33
import CapacitorLogtoClient from './index.js';
44

5-
jest.mock('@capacitor/browser', () => ({
5+
vi.mock('@capacitor/browser', () => ({
66
Browser: {
7-
open: jest.fn(),
7+
open: vi.fn(),
88
},
99
}));
1010

@@ -25,8 +25,7 @@ describe('CapacitorLogtoClient', () => {
2525
expect(client.getAdapter().navigate).toBeDefined();
2626
await client.getAdapter().navigate('https://example.com', { for: 'sign-in' });
2727

28-
const spy = jest.spyOn(Browser, 'open');
29-
expect(spy).toHaveBeenCalledWith({
28+
expect(Browser.open).toHaveBeenCalledWith({
3029
url: 'https://example.com',
3130
windowName: '_self',
3231
presentationStyle: 'popover',

packages/capacitor/tsconfig.json

+2-4
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,11 @@
33
"compilerOptions": {
44
"outDir": "lib",
55
"types": [
6-
"jest",
7-
"jest-matcher-specific-error"
6+
"vitest/globals"
87
]
98
},
109
"include": [
1110
"src",
12-
"jest.config.ts",
13-
"FixJsdomEnvironment.ts",
11+
"vitest.config.ts",
1412
]
1513
}

packages/capacitor/vitest.config.ts

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { defineConfig } from 'vitest/config';
2+
3+
export default defineConfig({
4+
test: {
5+
globals: true,
6+
environment: 'happy-dom',
7+
},
8+
});

packages/client/jest.config.js

-9
This file was deleted.

packages/client/jest.setup.js

-17
This file was deleted.

packages/client/package.json

+8-12
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,9 @@
3434
"check": "tsc --noEmit",
3535
"build": "rm -rf lib/ && tsc -p tsconfig.build.json --noEmit && rollup -c",
3636
"lint": "eslint --ext .ts src",
37-
"test": "jest",
38-
"test:coverage": "jest --silent --env=jsdom && jest --silent --coverage",
37+
"test": "vitest",
38+
"test:dom": "vitest --config=vitest.config.dom.ts",
39+
"test:coverage": "pnpm test:dom --silent --no-watch && pnpm run test --no-watch --silent --coverage",
3940
"prepack": "pnpm build && pnpm test"
4041
},
4142
"dependencies": {
@@ -45,22 +46,17 @@
4546
"jose": "^5.2.2"
4647
},
4748
"devDependencies": {
48-
"@peculiar/webcrypto": "^1.4.5",
4949
"@silverhand/eslint-config": "^5.0.0",
5050
"@silverhand/ts-config": "^5.0.0",
51-
"@swc/core": "^1.3.50",
52-
"@swc/jest": "^0.2.24",
53-
"@types/jest": "^29.5.0",
5451
"@types/node": "^20.11.19",
52+
"@vitest/coverage-v8": "^1.4.0",
5553
"eslint": "^8.57.0",
56-
"jest": "^29.5.0",
57-
"jest-matcher-specific-error": "^1.0.0",
54+
"happy-dom": "^14.0.0",
5855
"lint-staged": "^15.0.0",
59-
"nock": "^13.3.0",
56+
"nock": "14.0.0-beta.5",
6057
"prettier": "^3.0.0",
61-
"text-encoder": "^0.0.4",
62-
"type-fest": "^4.0.0",
63-
"typescript": "^5.3.3"
58+
"typescript": "^5.3.3",
59+
"vitest": "^1.4.0"
6460
},
6561
"eslintConfig": {
6662
"extends": "@silverhand"

packages/client/src/adapter/defaults.test.ts

+5-6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { LogtoError } from '@logto/js';
22
import { createRemoteJWKSet, exportJWK, generateKeyPair, SignJWT } from 'jose';
3-
import nock from 'nock';
3+
4+
import { nocked } from '../mock.js';
45

56
import { verifyIdToken } from './defaults.js';
67

@@ -10,14 +11,12 @@ const mockJwkResponse = (key: unknown) => {
1011
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
1112
if (global.window === undefined) {
1213
// Mock in Node env
13-
nock('https://logto.dev', { allowUnmocked: true })
14-
.get('/oidc/jwks')
15-
.reply(200, { keys: [key] });
14+
nocked.get('/oidc/jwks').reply(200, { keys: [key] });
1615
} else {
1716
// Mock in JSDOM env
1817
// @ts-expect-error for testing
1918
// eslint-disable-next-line @silverhand/fp/no-mutation
20-
global.fetch = jest.fn(async () => ({
19+
global.fetch = vi.fn(async () => ({
2120
status: 200,
2221
json: async () => ({ keys: [key] }),
2322
}));
@@ -171,7 +170,7 @@ describe('verifyIdToken', () => {
171170

172171
const jwks = createDefaultJwks();
173172

174-
await expect(verifyIdToken(idToken, 'qux', 'foo', jwks)).rejects.toMatchError(
173+
await expect(verifyIdToken(idToken, 'qux', 'foo', jwks)).rejects.toMatchObject(
175174
new LogtoError('id_token.invalid_iat')
176175
);
177176
});

packages/client/src/adapter/index.test.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ describe('ClientAdapterInstance', () => {
2727

2828
it('should be able get with cache and directly return the cached value when needed', async () => {
2929
const adapterInstance = new ClientAdapterInstance(createAdapters(true));
30-
const spy = jest.spyOn(adapterInstance, 'getWithCache');
31-
const getter = jest.fn().mockResolvedValue({ test: 'test' });
30+
const spy = vi.spyOn(adapterInstance, 'getWithCache');
31+
const getter = vi.fn().mockResolvedValue({ test: 'test' });
3232

3333
expect(await adapterInstance.getWithCache(CacheKey.OpenidConfig, getter)).toEqual({
3434
test: 'test',

packages/client/src/index.cache.test.ts

+3-6
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
1-
import { createClient, mockFetchOidcConfig } from './mock.js';
1+
import { mockFetchOidcConfig } from './mock.js';
22

3-
const fetchOidcConfig = mockFetchOidcConfig(1);
3+
const { createClient, fetchOidcConfig } = await import('./mock.js');
44

5-
jest.mock('@logto/js', () => ({
6-
...jest.requireActual('@logto/js'),
7-
fetchOidcConfig: async () => fetchOidcConfig(),
8-
}));
5+
fetchOidcConfig.mockImplementation(mockFetchOidcConfig(1));
96

107
describe('LogtoClient cache', () => {
118
it('should memoize fetch promise and cache OpenID config', async () => {

0 commit comments

Comments
 (0)