Skip to content

Commit 6e90cda

Browse files
authored
Merge pull request #7539 from QwikDev/add-unit-tests-on-ci-for-windows
chore: add unit tests on ci for Windows
2 parents 584271f + b6ee935 commit 6e90cda

File tree

5 files changed

+99
-47
lines changed

5 files changed

+99
-47
lines changed

.github/workflows/ci.yml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -592,7 +592,13 @@ jobs:
592592
test-unit:
593593
name: Unit Tests
594594
if: always() && needs.changes.outputs.build-unit == 'true'
595-
runs-on: ubuntu-latest
595+
strategy:
596+
matrix:
597+
settings:
598+
- host: ubuntu-latest
599+
- host: windows-latest
600+
601+
runs-on: ${{ matrix.settings.host }}
596602
needs:
597603
- changes
598604
- build-other-packages

packages/qwik/src/cli/add/update-files.unit.ts

Lines changed: 37 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,47 @@
11
import { fs } from 'memfs';
22
import { join } from 'path';
3-
import { describe, expect, test, vi } from 'vitest';
3+
import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest';
4+
import { normalizePath } from '../../testing/util';
45
import type { FsUpdates, UpdateAppOptions } from '../types';
56
import { mergeIntegrationDir } from './update-files';
67

78
vi.mock('node:fs', () => ({
89
default: fs,
910
}));
1011

11-
function setup() {
12-
const fakeSrcDir = 'srcDir/subSrcDir';
12+
let fakeSrcDir: string;
13+
let fakeDestDir: string;
14+
let fakeFileUpdates: FsUpdates;
15+
let fakeOpts: UpdateAppOptions;
16+
17+
beforeEach(() => {
18+
// Reset the mock filesystem before each test
19+
fs.mkdirSync(join('srcDir', 'subSrcDir'), { recursive: true });
20+
fs.mkdirSync(join('destDir', 'subDestDir'), { recursive: true });
21+
22+
fakeSrcDir = join('srcDir', 'subSrcDir');
1323
createFakeFiles(fakeSrcDir);
1424

15-
const fakeDestDir = 'destDir/subDestDir';
25+
fakeDestDir = join('destDir', 'subDestDir');
1626

17-
const fakeFileUpdates: FsUpdates = {
27+
fakeFileUpdates = {
1828
files: [],
1929
installedDeps: {},
2030
installedScripts: [],
2131
};
2232

23-
const fakeOpts: UpdateAppOptions = {
33+
fakeOpts = {
2434
rootDir: fakeDestDir,
2535
integration: 'integration',
2636
};
37+
});
2738

28-
return {
29-
fakeSrcDir,
30-
fakeDestDir,
31-
fakeFileUpdates,
32-
fakeOpts,
33-
};
34-
}
39+
afterEach(() => {
40+
vi.clearAllMocks();
41+
// Clean up the mock filesystem
42+
fs.rmSync(join('srcDir'), { recursive: true, force: true });
43+
fs.rmSync(join('destDir'), { recursive: true, force: true });
44+
});
3545

3646
function createFakeFiles(dir: string) {
3747
// Create fake src files
@@ -43,23 +53,19 @@ function createFakeFiles(dir: string) {
4353

4454
describe('mergeIntegrationDir', () => {
4555
test('should merge integration directory', async () => {
46-
const { fakeSrcDir, fakeDestDir, fakeFileUpdates, fakeOpts } = setup();
47-
4856
await mergeIntegrationDir(fakeFileUpdates, fakeOpts, fakeSrcDir, fakeDestDir);
4957

50-
const actualResults = fakeFileUpdates.files.map((f) => f.path);
58+
const actualResults = fakeFileUpdates.files.map((f) => normalizePath(f.path));
5159
const expectedResults = [
52-
'destDir/subDestDir/fake.ts',
53-
'destDir/subDestDir/package.json',
54-
'destDir/subDestDir/src/global.css',
60+
normalizePath(join('destDir', 'subDestDir', 'fake.ts')),
61+
normalizePath(join('destDir', 'subDestDir', 'package.json')),
62+
normalizePath(join('destDir', 'subDestDir', 'src', 'global.css')),
5563
];
5664

5765
expect(actualResults).toEqual(expectedResults);
5866
});
5967

6068
test('should merge integration directory in a monorepo', async () => {
61-
const { fakeSrcDir, fakeDestDir, fakeFileUpdates, fakeOpts } = setup();
62-
6369
// Create a global file in the destination director
6470
const monorepoSubDir = join(fakeDestDir, 'apps', 'subpackage', 'src');
6571
fs.mkdirSync(monorepoSubDir, { recursive: true });
@@ -72,25 +78,27 @@ describe('mergeIntegrationDir', () => {
7278
fs.mkdirSync(join(fakeSrcDir, 'should-stay'), { recursive: true });
7379
fs.writeFileSync(join(fakeSrcDir, 'should-stay', 'should-also-stay.ts'), 'fake file');
7480

75-
fakeOpts.projectDir = 'apps/subpackage';
81+
fakeOpts.projectDir = join('apps', 'subpackage');
7682
fakeOpts.installDeps = true;
7783
const fakeAlwaysInRoot = ['should-stay-in-root.ts', 'should-stay'];
7884

7985
await mergeIntegrationDir(fakeFileUpdates, fakeOpts, fakeSrcDir, fakeDestDir, fakeAlwaysInRoot);
8086

81-
const actualResults = fakeFileUpdates.files.map((f) => f.path);
87+
const actualResults = fakeFileUpdates.files.map((f) => normalizePath(f.path));
8288
const expectedResults = [
83-
`destDir/subDestDir/apps/subpackage/fake.ts`,
84-
`destDir/subDestDir/should-stay-in-root.ts`,
85-
`destDir/subDestDir/package.json`,
86-
`destDir/subDestDir/should-stay/should-also-stay.ts`,
87-
`destDir/subDestDir/apps/subpackage/src/global.css`,
89+
normalizePath(join('destDir', 'subDestDir', 'apps', 'subpackage', 'fake.ts')),
90+
normalizePath(join('destDir', 'subDestDir', 'should-stay-in-root.ts')),
91+
normalizePath(join('destDir', 'subDestDir', 'package.json')),
92+
normalizePath(join('destDir', 'subDestDir', 'should-stay', 'should-also-stay.ts')),
93+
normalizePath(join('destDir', 'subDestDir', 'apps', 'subpackage', 'src', 'global.css')),
8894
];
8995

9096
expect(actualResults).toEqual(expectedResults);
9197

9298
const actualGlobalCssContent = fakeFileUpdates.files.find(
93-
(f) => f.path === `destDir/subDestDir/apps/subpackage/src/global.css`
99+
(f) =>
100+
normalizePath(f.path) ===
101+
normalizePath(join('destDir', 'subDestDir', 'apps', 'subpackage', 'src', 'global.css'))
94102
)?.content;
95103

96104
expect(actualGlobalCssContent).toBe('p{color: red}\n\n/* CSS */\n');

packages/qwik/src/optimizer/src/plugins/plugin.unit.ts

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@ test('defaults', async () => {
2222
assert.deepEqual(opts.debug, false);
2323
assert.deepEqual(opts.rootDir, normalizePath(cwd));
2424
assert.deepEqual(opts.tsconfigFileNames, ['./tsconfig.json']);
25-
assert.deepEqual(opts.input, [normalizePath(resolve(cwd, 'src', 'root'))]);
25+
assert.deepEqual((opts.input as string[]).map(normalizePath), [
26+
normalizePath(resolve(cwd, 'src', 'root')),
27+
]);
2628
assert.deepEqual(opts.outDir, normalizePath(resolve(cwd, 'dist')));
2729
assert.deepEqual(opts.manifestInput, null);
2830
assert.deepEqual(opts.manifestOutput, null);
@@ -39,7 +41,9 @@ test('defaults (buildMode: production)', async () => {
3941
assert.deepEqual(opts.debug, false);
4042
assert.deepEqual(opts.rootDir, normalizePath(cwd));
4143
assert.deepEqual(opts.tsconfigFileNames, ['./tsconfig.json']);
42-
assert.deepEqual(opts.input, [normalizePath(resolve(cwd, 'src', 'root'))]);
44+
assert.deepEqual((opts.input as string[]).map(normalizePath), [
45+
normalizePath(resolve(cwd, 'src', 'root')),
46+
]);
4347
assert.deepEqual(opts.outDir, normalizePath(resolve(cwd, 'dist')));
4448
assert.deepEqual(opts.manifestInput, null);
4549
assert.deepEqual(opts.manifestOutput, null);
@@ -57,7 +61,9 @@ test('defaults (target: ssr)', async () => {
5761
assert.deepEqual(opts.debug, false);
5862
assert.deepEqual(opts.rootDir, normalizePath(cwd));
5963
assert.deepEqual(opts.tsconfigFileNames, ['./tsconfig.json']);
60-
assert.deepEqual(opts.input, [normalizePath(resolve(cwd, 'src', 'entry.ssr'))]);
64+
assert.deepEqual((opts.input as string[]).map(normalizePath), [
65+
normalizePath(resolve(cwd, 'src', 'entry.ssr')),
66+
]);
6167
assert.deepEqual(opts.outDir, normalizePath(resolve(cwd, 'server')));
6268
assert.deepEqual(opts.manifestInput, null);
6369
assert.deepEqual(opts.manifestOutput, null);
@@ -74,7 +80,9 @@ test('defaults (buildMode: production, target: ssr)', async () => {
7480
assert.deepEqual(opts.debug, false);
7581
assert.deepEqual(opts.rootDir, normalizePath(cwd));
7682
assert.deepEqual(opts.tsconfigFileNames, ['./tsconfig.json']);
77-
assert.deepEqual(opts.input, [normalizePath(resolve(cwd, 'src', 'entry.ssr'))]);
83+
assert.deepEqual((opts.input as string[]).map(normalizePath), [
84+
normalizePath(resolve(cwd, 'src', 'entry.ssr')),
85+
]);
7886
assert.deepEqual(opts.outDir, normalizePath(resolve(cwd, 'server')));
7987
assert.deepEqual(opts.manifestInput, null);
8088
assert.deepEqual(opts.manifestOutput, null);

packages/qwik/src/optimizer/src/plugins/rollup.unit.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@ test('rollup default input options, client', async () => {
3030
const rollupInputOpts: Rollup.InputOptions = await plugin.options!({});
3131

3232
assert.deepEqual(typeof rollupInputOpts.onwarn, 'function');
33-
assert.deepEqual(rollupInputOpts.input, [normalizePath(resolve(cwd, 'src', 'root'))]);
33+
assert.deepEqual((rollupInputOpts.input as string[]).map(normalizePath), [
34+
normalizePath(resolve(cwd, 'src', 'root')),
35+
]);
3436
});
3537

3638
test('rollup default input options, ssr', async () => {
@@ -44,8 +46,12 @@ test('rollup default input options, ssr', async () => {
4446

4547
assert.deepEqual(typeof rollupInputOpts.onwarn, 'function');
4648
assert.deepEqual(rollupInputOpts.treeshake, undefined);
47-
assert.deepEqual(rollupInputOpts.input, [normalizePath(resolve(cwd, 'src', 'entry.ssr'))]);
48-
assert.deepEqual(opts.input, [normalizePath(resolve(cwd, 'src', 'entry.ssr'))]);
49+
assert.deepEqual((rollupInputOpts.input as string[]).map(normalizePath), [
50+
normalizePath(resolve(cwd, 'src', 'entry.ssr')),
51+
]);
52+
assert.deepEqual((opts.input as string[]).map(normalizePath), [
53+
normalizePath(resolve(cwd, 'src', 'entry.ssr')),
54+
]);
4955
});
5056

5157
test('rollup default set input options, ssr', async () => {

packages/qwik/src/optimizer/src/plugins/vite.unit.ts

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,14 @@ test('command: serve, mode: development', async () => {
9696
assert.deepEqual(outputOptions.assetFileNames, 'assets/[hash]-[name].[ext]');
9797
assert.deepEqual(chunkFileNames(chunkInfoMocks[0]), `build/chunk.tsx.js`);
9898
assert.deepEqual(entryFileNames(chunkInfoMocks[0]), `build/chunk.tsx.js`);
99-
assert.deepEqual(chunkFileNames(chunkInfoMocks[1]), 'build/app-chunk.tsx.js');
100-
assert.deepEqual(entryFileNames(chunkInfoMocks[1]), 'build/app-chunk.tsx.js');
99+
const relDev = path.relative(cwd, chunkInfoMocks[1].name);
100+
const sanitizedDev = relDev
101+
.replace(/^\(\.\.\/\)+/, '')
102+
.replace(/^\/+/, '')
103+
.replace(/\//g, '-');
104+
const expectedDevChunk = `build/${sanitizedDev}.js`;
105+
assert.deepEqual(chunkFileNames(chunkInfoMocks[1]), expectedDevChunk);
106+
assert.deepEqual(entryFileNames(chunkInfoMocks[1]), expectedDevChunk);
101107
assert.deepEqual(outputOptions.format, 'es');
102108

103109
assert.deepEqual(build.dynamicImportVarsOptions?.exclude, [/./]);
@@ -180,13 +186,21 @@ test('command: build, mode: development', async () => {
180186
assert.deepEqual(plugin.enforce, 'pre');
181187
assert.deepEqual(build.outDir, normalizePath(resolve(cwd, 'dist')));
182188
assert.deepEqual(build.emptyOutDir, undefined);
183-
assert.deepEqual(rollupOptions.input, [normalizePath(resolve(cwd, 'src', 'root'))]);
189+
assert.deepEqual((rollupOptions.input as string[]).map(normalizePath), [
190+
normalizePath(resolve(cwd, 'src', 'root')),
191+
]);
184192

185193
assert.deepEqual(outputOptions.assetFileNames, 'assets/[hash]-[name].[ext]');
186194
assert.deepEqual(chunkFileNames(chunkInfoMocks[0]), `build/chunk.tsx.js`);
187195
assert.deepEqual(entryFileNames(chunkInfoMocks[0]), `build/chunk.tsx.js`);
188-
assert.deepEqual(chunkFileNames(chunkInfoMocks[1]), 'build/app-chunk.tsx.js');
189-
assert.deepEqual(entryFileNames(chunkInfoMocks[1]), 'build/app-chunk.tsx.js');
196+
const relBuildDev = path.relative(cwd, chunkInfoMocks[1].name);
197+
const sanitizedBuildDev = relBuildDev
198+
.replace(/^\(\.\.\/\)+/, '')
199+
.replace(/^\/+/, '')
200+
.replace(/\//g, '-');
201+
const expectedBuildDevChunk = `build/${sanitizedBuildDev}.js`;
202+
assert.deepEqual(chunkFileNames(chunkInfoMocks[1]), expectedBuildDevChunk);
203+
assert.deepEqual(entryFileNames(chunkInfoMocks[1]), expectedBuildDevChunk);
190204

191205
assert.deepEqual(build.dynamicImportVarsOptions?.exclude, [/./]);
192206
assert.deepEqual(build.ssr, undefined);
@@ -225,7 +239,9 @@ test('command: build, mode: production', async () => {
225239
assert.deepEqual(plugin.enforce, 'pre');
226240
assert.deepEqual(build.outDir, normalizePath(resolve(cwd, 'dist')));
227241
assert.deepEqual(build.emptyOutDir, undefined);
228-
assert.deepEqual(rollupOptions.input, [normalizePath(resolve(cwd, 'src', 'root'))]);
242+
assert.deepEqual((rollupOptions.input as string[]).map(normalizePath), [
243+
normalizePath(resolve(cwd, 'src', 'root')),
244+
]);
229245

230246
assert.deepEqual(outputOptions.assetFileNames, 'assets/[hash]-[name].[ext]');
231247
assert.deepEqual(outputOptions.chunkFileNames, 'build/q-[hash].js');
@@ -267,7 +283,9 @@ test('command: build, --mode production (client)', async () => {
267283

268284
assert.deepEqual(opts.target, 'client');
269285
assert.deepEqual(opts.buildMode, 'production');
270-
assert.deepEqual(rollupOptions.input, [normalizePath(resolve(cwd, 'src', 'root'))]);
286+
assert.deepEqual((rollupOptions.input as string[]).map(normalizePath), [
287+
normalizePath(resolve(cwd, 'src', 'root')),
288+
]);
271289
assert.deepEqual(build.outDir, normalizePath(resolve(cwd, 'client-dist')));
272290
assert.deepEqual(build.emptyOutDir, undefined);
273291
});
@@ -296,7 +314,9 @@ test('command: build, --ssr entry.server.tsx', async () => {
296314
assert.deepEqual(plugin.enforce, 'pre');
297315
assert.deepEqual(build.outDir, normalizePath(resolve(cwd, 'server')));
298316
assert.deepEqual(build.emptyOutDir, undefined);
299-
assert.deepEqual(rollupOptions.input, [normalizePath(resolve(cwd, 'src', 'entry.server.tsx'))]);
317+
assert.deepEqual((rollupOptions.input as string[]).map(normalizePath), [
318+
normalizePath(resolve(cwd, 'src', 'entry.server.tsx')),
319+
]);
300320

301321
assert.deepEqual(outputOptions.assetFileNames, 'assets/[hash]-[name].[ext]');
302322
assert.isFunction(outputOptions.chunkFileNames);
@@ -337,7 +357,9 @@ test('command: serve, --mode ssr', async () => {
337357
assert.deepEqual(opts.buildMode, 'development');
338358
assert.deepEqual(build.minify, undefined);
339359
assert.deepEqual(build.ssr, undefined);
340-
assert.deepEqual(rollupOptions.input, [normalizePath(resolve(cwd, 'src', 'renderz.tsx'))]);
360+
assert.deepEqual((rollupOptions.input as string[]).map(normalizePath), [
361+
normalizePath(resolve(cwd, 'src', 'renderz.tsx')),
362+
]);
341363
assert.deepEqual(c.build.outDir, normalizePath(resolve(cwd, 'ssr-dist')));
342364
assert.deepEqual(build.emptyOutDir, undefined);
343365
assert.deepEqual(c.publicDir, undefined);
@@ -366,7 +388,9 @@ test('command: serve, --mode ssr with build.assetsDir', async () => {
366388
assert.deepEqual(opts.buildMode, 'development');
367389
assert.deepEqual(build.minify, undefined);
368390
assert.deepEqual(build.ssr, undefined);
369-
assert.deepEqual(rollupOptions.input, [normalizePath(resolve(cwd, 'src', 'renderz.tsx'))]);
391+
assert.deepEqual((rollupOptions.input as string[]).map(normalizePath), [
392+
normalizePath(resolve(cwd, 'src', 'renderz.tsx')),
393+
]);
370394
assert.deepEqual(c.build.outDir, normalizePath(resolve(cwd, 'ssr-dist')));
371395
assert.deepEqual(build.emptyOutDir, undefined);
372396
assert.deepEqual(c.publicDir, undefined);

0 commit comments

Comments
 (0)