Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 24 additions & 2 deletions biome.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"$schema": "https://biomejs.dev/schemas/2.2.2/schema.json",
"$schema": "https://biomejs.dev/schemas/2.2.4/schema.json",
"assist": { "actions": { "source": { "organizeImports": "on" } } },
"vcs": {
"enabled": true,
Expand Down Expand Up @@ -70,5 +70,27 @@
"useHookAtTopLevel": "off"
}
}
}
},
"overrides": [
{
"includes": ["e2e/mock/tests/mockHoist.test.ts"],
"assist": {
"actions": {
"source": {
"organizeImports": "off"
}
}
}
},
{
"includes": ["e2e/__mocks__/is-url.js", "e2e/__mocks__/redux-cjs.ts"],
"linter": {
"rules": {
"style": {
"useFilenamingConvention": "off"
}
}
}
}
]
}
4 changes: 4 additions & 0 deletions e2e/__mocks__/is-url.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
const { rs } = require('@rstest/core');

module.exports = () => 'is-url mock';
module.exports.fn = rs.fn();
6 changes: 6 additions & 0 deletions e2e/__mocks__/redux-cjs.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
const { rs } = require('@rstest/core');

module.exports = {
isAction: rs.fn(),
mocked: 'redux_yes',
};
6 changes: 3 additions & 3 deletions e2e/basic/test/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ describe('Index', () => {
});

it('should use require.resolve correctly', async () => {
expect(
require.resolve('../src/index.ts').endsWith('index.ts'),
).toBeTruthy();
const resolved = require.resolve('../src/index.ts');
// TODO: can't write as require.resolve('../src/index.ts').endsWith('index.ts')
expect(resolved.endsWith('index.ts')).toBeTruthy();
});
});
2 changes: 1 addition & 1 deletion e2e/dom/fixtures/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
"react-dom": "^19.1.1"
},
"devDependencies": {
"@rsbuild/core": "1.5.0",
"@rsbuild/core": "1.6.0-beta.0",
"@rsbuild/plugin-react": "^1.4.0",
"@testing-library/jest-dom": "^6.8.0",
"@testing-library/dom": "^10.4.1",
Expand Down
2 changes: 1 addition & 1 deletion e2e/lifecycle/timeout.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ describe('test timeout', () => {
),
).toBeTruthy();
expect(
logs.find((log) => log.includes('timeout.test.ts:4:10')),
logs.find((log) => log.includes('timeout.test.ts:4:1')),
).toBeTruthy();
expect(
logs.find((log) => log.includes('Test Files 1 failed')),
Expand Down
1 change: 1 addition & 0 deletions e2e/mock/src/bar.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export const bar = 'bar';
1 change: 1 addition & 0 deletions e2e/mock/src/baz.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export const baz = 'baz';
4 changes: 3 additions & 1 deletion e2e/mock/src/d.ts
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
export const d: number = 4;
export const d1: number = 1;
export const d2: number = 2;
export const d3: number = 3;
1 change: 1 addition & 0 deletions e2e/mock/src/foo.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export const foo = 'foo';
4 changes: 2 additions & 2 deletions e2e/mock/src/readSomeFile.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { readFileSync } from 'node:fs';
import * as fs from 'node:fs';

export function readSomeFile(path: string) {
return readFileSync(path, 'utf-8');
return fs?.readFileSync?.(path, 'utf-8');
}
4 changes: 4 additions & 0 deletions e2e/mock/src/sum.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import { bar } from './bar';
import { foo } from './foo';

export const sum = foo + bar;
11 changes: 11 additions & 0 deletions e2e/mock/tests/barrel.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { expect, it, rs } from '@rstest/core';
import { baz } from '../src/baz';
import { sum } from '../src/sum';

rs.mock('../src/foo', () => {
return { foo: baz };
});

it('sum', () => {
expect(sum).toBe('bazbar');
});
7 changes: 2 additions & 5 deletions e2e/mock/tests/doMock.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { expect, rs, test } from '@rstest/core';
import { sleep } from '../../scripts/utils';

test('doMock works', async () => {
const { increment: incrementWith1 } = await import('../src/increment');
Expand Down Expand Up @@ -32,8 +31,7 @@ test('the second doMock can override the first doMock', async () => {
});

test('the third doMock can override the second doMock', async () => {
rs.doMock('../src/increment', async () => {
await sleep(500);
rs.doMock('../src/increment', () => {
return {
increment: (num: number) => num + 100,
};
Expand All @@ -43,8 +41,7 @@ test('the third doMock can override the second doMock', async () => {

expect(incrementWith1(1)).toBe(101);

rs.doMock('../src/increment', async () => {
await sleep(500);
rs.doMock('../src/increment', () => {
return {
increment: (num: number) => num + 200,
};
Expand Down
23 changes: 22 additions & 1 deletion e2e/mock/tests/doMockRequire.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ test('doMockRequire works', () => {
}));

const { increment: incrementWith10 } = require('../src/increment');

expect(incrementWith10(1)).toBe(11);
});

Expand All @@ -30,3 +29,25 @@ test('the second doMockRequire can override the first doMockRequire', () => {

expect(incrementWith20(1)).toBe(21);
});

test('the third doMockRequire can override the second doMockRequire', () => {
rs.doMockRequire('../src/increment', () => {
return {
increment: (num: number) => num + 100,
};
});

const { increment: incrementWith1 } = require('../src/increment');

expect(incrementWith1(1)).toBe(101);

rs.doMockRequire('../src/increment', () => {
return {
increment: (num: number) => num + 200,
};
});

const { increment: incrementWith20 } = require('../src/increment');

expect(incrementWith20(1)).toBe(201);
});
42 changes: 37 additions & 5 deletions e2e/mock/tests/importActual.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
import { expect, it, rs } from '@rstest/core';
import axiosActual from 'axios' with { rstest: 'importActual' };
import axios from 'axios';
import { b as bActual } from '../src/b' with { rstest: 'importActual' };
import { b } from '../src/b';

// #region axios
rs.mock('axios');

it('mocked axios (axios is externalized)', async () => {
Expand All @@ -11,10 +15,38 @@ it('mocked axios (axios is externalized)', async () => {
expect(axios.post).toBeUndefined();
});

it('use `importActual` to import actual axios', async () => {
const ax = await rs.importActual<typeof axios>('axios');
expect(rs.isMockFunction(ax.get)).toBe(false);
it('use `importActual` attributes to import actual axios', () => {
expect(rs.isMockFunction(axiosActual.get)).toBe(false);
// @ts-expect-error
expect(ax.mocked).toBeUndefined();
expect(typeof ax.AxiosHeaders).toBe('function');
expect(axiosActual.mocked).toBeUndefined();
expect(typeof axiosActual.AxiosHeaders).toBe('function');
});

it('use `rs.importActual` to import actual axios', async () => {
const axiosRsActual = await rs.importActual<typeof axios>('axios');
expect(rs.isMockFunction(axiosRsActual.get)).toBe(false);
// @ts-expect-error
expect(axiosRsActual.mocked).toBeUndefined();
expect(typeof axiosRsActual.AxiosHeaders).toBe('function');
});
// #endregion

// #region ../src/b
rs.mock('../src/b', () => {
return { b: 'b_mocked' };
});

it('mocked ../src/b', () => {
expect(b).toBe('b_mocked');
});

it('use `importActual` to import actual ../src/b', () => {
expect(bActual).toBe(2);
});

it('use `rs.importActual` to import actual ../src/b', async () => {
const { b: bRsActual } =
await rs.importActual<typeof import('../src/b')>('../src/b');
expect(bRsActual).toBe(2);
});
// #endregion
12 changes: 12 additions & 0 deletions e2e/mock/tests/importMock.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { expect, rs, test } from '@rstest/core';
import * as redux from 'redux';

test('importMock works', async () => {
const { default: redux } = await rs.importMock<any>('redux');
await redux.isAction('string');
expect(redux.isAction).toHaveBeenCalledWith('string');
});

test('actual redux is not mocked (ESM)', async () => {
expect(rs.isMockFunction(redux.isAction)).toBe(false);
});
23 changes: 0 additions & 23 deletions e2e/mock/tests/loadMock.test.ts

This file was deleted.

38 changes: 23 additions & 15 deletions e2e/mock/tests/mock.test.ts
Original file line number Diff line number Diff line change
@@ -1,45 +1,53 @@
import { expect, it, rs } from '@rstest/core';
import * as originalAxios from 'axios' with { rstest: 'importActual' };
import * as axios from 'axios';
import redux from 'redux';
import { sleep } from '../../scripts/utils';
import { d } from '../src/d';
import { d1, d2 } from '../src/d' with { rstest: 'importActual' };
import { d3 } from '../src/d';

// To test async mocking factory.
rs.mock('../src/d', async () => {
await sleep(1000);
rs.mock('../src/d', () => {
return {
d: rs.fn(),
d1,
d2,
d3: rs.fn(),
};
});

it('mocked d', async () => {
it('mocked d', () => {
// @ts-expect-error: It has been mocked.
d('string1');
expect(d).toHaveBeenCalledWith('string1');
d3('string1');
expect(d3).toHaveBeenCalledWith('string1');
expect(d1).toBe(1);
expect(d2).toBe(2);
});

// manual mock
rs.mock('redux');

it('mocked redux', async () => {
it('mocked redux', () => {
redux.isAction('string');
expect(redux.isAction).toHaveBeenCalledWith('string');
// @ts-expect-error: It has been mocked.
expect(redux.mocked).toBe('redux_yes');
});

// mock factory
rs.mock('axios', async () => {
const originalAxios = await rs.importActual('axios');
rs.mock('axios', () => {
// partial mock
return {
...originalAxios,
post: rs.fn(),
aaa: rs.fn(),
};
});

it('mocked axios', async () => {
const axios = await import('axios');
// @ts-expect-error
expect(rs.isMockFunction(axios.post)).toBe(true);
expect(rs.isMockFunction(axios.aaa)).toBe(true);
// @ts-expect-error
expect(rs.isMockFunction(axios.get)).toBe(false);
expect(rs.isMockFunction(axios.bbb)).toBe(false);
// @ts-expect-error
expect(originalAxios.aaa).toBeUndefined();
// @ts-expect-error
expect(originalAxios.bbb).toBeUndefined();
});
22 changes: 12 additions & 10 deletions e2e/mock/tests/mockHoist.test.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,19 @@
import { expect, it, rs } from '@rstest/core';
import { c } from '../src/c';
import { d } from '../src/d';
// NOTE: '../src/d' MUST imported ahead of '../src/c' to avoid circular dependency
import { d1 } from '../src/d';
// @ts-expect-error
import { c, dd } from '../src/c';

it('mocked c', async () => {
// @ts-expect-error
c('c');
expect(c).toHaveBeenCalledWith('c');
expect(dd).toBe(1);
});

rs.mock('../src/c', () => {
return {
c: rs.fn(),
d,
dd: d1,
};
});

it('mocked c', async () => {
// @ts-expect-error: It has been mocked.
c('c');
expect(c).toHaveBeenCalledWith('c');
expect(d).toBe(4);
});
12 changes: 6 additions & 6 deletions e2e/mock/tests/mockRequire.test.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { expect, it, rs } from '@rstest/core';

rs.mockRequire('redux');
rs.mockRequire('is-url');

it('mocked redux', () => {
const redux = require('redux').default;
redux.isAction('string');
expect(redux.isAction).toHaveBeenCalledWith('string');
expect(redux.mocked).toBe('redux_yes');
it('mocked is-url', () => {
const isUrl = require('is-url');
isUrl.fn('string');
expect(isUrl.fn).toHaveBeenCalledWith('string');
expect(isUrl()).toBe('is-url mock');
});
Loading
Loading