@application-kit/testing 0.7.0 → 0.8.0
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.
- package/CHANGELOG.md +14 -0
- package/README.md +5 -8
- package/dist/cjs/vitest/application-vitest-config.d.ts +0 -1
- package/dist/cjs/vitest/application-vitest-config.js +18 -9
- package/dist/esm/vitest/application-vitest-config.d.ts +0 -1
- package/dist/esm/vitest/application-vitest-config.js +17 -7
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# @application-kit/testing
|
|
2
2
|
|
|
3
|
+
## 0.8.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 32fb131: Фабрики `defineApplicationUnitConfig` и `defineApplicationEndToEndConfig` сами распознают прогон Stryker по
|
|
8
|
+
`STRYKER_MUTATOR_WORKER`: выключают кеш модулей и на vitest 5 изолируют файлы спек. Отдельный конфиг vitest для Stryker
|
|
9
|
+
больше не нужен: `defineApplicationMutationConfig` удалена, `vitestConfigFile` указывает на обычный `vitest.config`.
|
|
10
|
+
|
|
11
|
+
## 0.7.1
|
|
12
|
+
|
|
13
|
+
### Patch Changes
|
|
14
|
+
|
|
15
|
+
- 7698ce1: Peer-зависимость `graphql` принимает 17. E2e-конфиг `@application-kit/testing` направляет алиас `graphql` на файл, который отдаёт `require` из корня приложения, а не на CJS-вход: с graphql 17 нативный `require` во внешнем `mercurius` получает ESM-сборку, и прежний алиас давал второй экземпляр — правило запрета introspection молча пропускало `__schema`. Приложению без `graphql` алиас не ставится.
|
|
16
|
+
|
|
3
17
|
## 0.7.0
|
|
4
18
|
|
|
5
19
|
### Minor Changes
|
package/README.md
CHANGED
|
@@ -92,10 +92,10 @@ export default defineApplicationEndToEndConfig({
|
|
|
92
92
|
ячейки шарда CI и `ProjectShardSequencer` (ниже);
|
|
93
93
|
- e2e — окружение `node` и алиас `graphql` на CJS-вход `node_modules/graphql/index.js` под `root`: Vite для SSR берёт
|
|
94
94
|
ESM-сборку `graphql`, внешний `mercurius` — CJS, и без алиаса схема и валидация запроса живут в разных realm;
|
|
95
|
-
- мутации —
|
|
96
|
-
(под Stryker он отдаёт тестам трансформ без активного мутанта)
|
|
97
|
-
vitest-runner Stryker собирает покрытие по тестам только с первого
|
|
98
|
-
|
|
95
|
+
- мутации — отдельного конфига не нужно: `vitestConfigFile` Stryker указывает на обычный `vitest.config`, а фабрики,
|
|
96
|
+
увидев `STRYKER_MUTATOR_WORKER`, выключают кеш модулей (под Stryker он отдаёт тестам трансформ без активного мутанта)
|
|
97
|
+
и на vitest 5 ставят `isolate: true`: без изоляции vitest-runner Stryker собирает покрытие по тестам только с первого
|
|
98
|
+
файла спек воркера.
|
|
99
99
|
|
|
100
100
|
## Вход `/vitest/fast-bcrypt`: дешёвый bcrypt
|
|
101
101
|
|
|
@@ -136,14 +136,11 @@ export default defineStrykerConfig({
|
|
|
136
136
|
ignorePatterns: ['docs', 'tasks'],
|
|
137
137
|
mutate: { exclude: ['src/**/*.spec.ts', 'src/**/*.vue', 'src/**/tests/**'], include: ['src/modules/**/*.ts', 'src/libs/**/*.ts'] },
|
|
138
138
|
thresholds: { break: 94, high: 100, low: 95 },
|
|
139
|
-
vitestConfigFile: 'vitest.
|
|
139
|
+
vitestConfigFile: 'vitest.config.mts',
|
|
140
140
|
})
|
|
141
141
|
|
|
142
142
|
// vitest.config.mts
|
|
143
143
|
coverage: { exclude: [...CODE_WITHOUT_LOGIC, '**/*.html'], include: ['src'], thresholds: { lines: 95 } }
|
|
144
|
-
|
|
145
|
-
// vitest.stryker.config.mts — defineApplicationMutationConfig из входа /vitest
|
|
146
|
-
export default defineApplicationMutationConfig(unitConfig)
|
|
147
144
|
```
|
|
148
145
|
|
|
149
146
|
`defineStrykerLayers` режет прогон на группы каталогов: ячейка CI мутирует одну группу со своим порогом `break` (общий
|
|
@@ -2,4 +2,3 @@ import type { ViteUserConfig } from 'vitest/config';
|
|
|
2
2
|
import type { ApplicationTestConfigOptionsInterface, ApplicationUnitConfigOptionsInterface } from './application-vitest-config-options.interface.js';
|
|
3
3
|
export declare const defineApplicationUnitConfig: (options: ApplicationUnitConfigOptionsInterface) => ViteUserConfig;
|
|
4
4
|
export declare const defineApplicationEndToEndConfig: (options: ApplicationTestConfigOptionsInterface) => ViteUserConfig;
|
|
5
|
-
export declare const defineApplicationMutationConfig: (unitConfig: ViteUserConfig) => ViteUserConfig;
|
|
@@ -3,7 +3,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
6
|
+
exports.defineApplicationEndToEndConfig = exports.defineApplicationUnitConfig = void 0;
|
|
7
|
+
const node_module_1 = require("node:module");
|
|
7
8
|
const node_path_1 = __importDefault(require("node:path"));
|
|
8
9
|
const node_process_1 = __importDefault(require("node:process"));
|
|
9
10
|
const vite_1 = require("vite");
|
|
@@ -34,10 +35,11 @@ const coverageOf = (scope) => ({
|
|
|
34
35
|
skipFull: true,
|
|
35
36
|
thresholds: scope.thresholds,
|
|
36
37
|
});
|
|
38
|
+
const isMutationRun = () => node_process_1.default.env.STRYKER_MUTATOR_WORKER !== undefined;
|
|
37
39
|
const sharedTestOptions = (options) => ({
|
|
38
|
-
...moduleCacheOf(
|
|
40
|
+
...moduleCacheOf(!isMutationRun()),
|
|
39
41
|
globals: true,
|
|
40
|
-
isolate:
|
|
42
|
+
isolate: isMutationRun() && IS_VITEST_5,
|
|
41
43
|
server: { deps: { inline: [...PACKAGES_THROUGH_VITE, ...(options.inlineDependencies ?? [])] } },
|
|
42
44
|
setupFiles: [...options.setupFiles],
|
|
43
45
|
testTimeout: TEST_TIMEOUT,
|
|
@@ -60,6 +62,17 @@ const PROJECTS_OF_CELL = {
|
|
|
60
62
|
client: [clientProject],
|
|
61
63
|
server: [serverProject],
|
|
62
64
|
};
|
|
65
|
+
const graphqlEntryOf = (root) => {
|
|
66
|
+
try {
|
|
67
|
+
return (0, node_module_1.createRequire)(node_path_1.default.resolve(root, 'package.json')).resolve('graphql');
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
if (Reflect.get(new Object(error), 'code') === 'MODULE_NOT_FOUND') {
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
throw error;
|
|
74
|
+
}
|
|
75
|
+
};
|
|
63
76
|
const unitCoverageScope = (cell, options) => ({
|
|
64
77
|
exclude: [...(cell === 'server' ? options.clientSources : []), ...(options.coverage.exclude ?? [])],
|
|
65
78
|
include: cell === 'client' ? options.clientSources : options.coverage.include,
|
|
@@ -79,9 +92,9 @@ const defineApplicationUnitConfig = (options) => {
|
|
|
79
92
|
};
|
|
80
93
|
exports.defineApplicationUnitConfig = defineApplicationUnitConfig;
|
|
81
94
|
const defineApplicationEndToEndConfig = (options) => {
|
|
82
|
-
const graphql =
|
|
95
|
+
const graphql = graphqlEntryOf(options.root);
|
|
83
96
|
return (0, vite_1.mergeConfig)(options.viteConfig, {
|
|
84
|
-
resolve: { alias: { graphql } },
|
|
97
|
+
...(graphql !== undefined && { resolve: { alias: { graphql } } }),
|
|
85
98
|
root: options.root,
|
|
86
99
|
test: {
|
|
87
100
|
...sharedTestOptions(options),
|
|
@@ -92,7 +105,3 @@ const defineApplicationEndToEndConfig = (options) => {
|
|
|
92
105
|
});
|
|
93
106
|
};
|
|
94
107
|
exports.defineApplicationEndToEndConfig = defineApplicationEndToEndConfig;
|
|
95
|
-
const defineApplicationMutationConfig = (unitConfig) => (0, vite_1.mergeConfig)(unitConfig, {
|
|
96
|
-
test: { ...moduleCacheOf(false), ...(IS_VITEST_5 && { isolate: true }) },
|
|
97
|
-
});
|
|
98
|
-
exports.defineApplicationMutationConfig = defineApplicationMutationConfig;
|
|
@@ -2,4 +2,3 @@ import type { ViteUserConfig } from 'vitest/config';
|
|
|
2
2
|
import type { ApplicationTestConfigOptionsInterface, ApplicationUnitConfigOptionsInterface } from './application-vitest-config-options.interface.js';
|
|
3
3
|
export declare const defineApplicationUnitConfig: (options: ApplicationUnitConfigOptionsInterface) => ViteUserConfig;
|
|
4
4
|
export declare const defineApplicationEndToEndConfig: (options: ApplicationTestConfigOptionsInterface) => ViteUserConfig;
|
|
5
|
-
export declare const defineApplicationMutationConfig: (unitConfig: ViteUserConfig) => ViteUserConfig;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
1
2
|
import path from 'node:path';
|
|
2
3
|
import process from 'node:process';
|
|
3
4
|
import { mergeConfig } from 'vite';
|
|
@@ -28,10 +29,11 @@ const coverageOf = (scope) => ({
|
|
|
28
29
|
skipFull: true,
|
|
29
30
|
thresholds: scope.thresholds,
|
|
30
31
|
});
|
|
32
|
+
const isMutationRun = () => process.env.STRYKER_MUTATOR_WORKER !== undefined;
|
|
31
33
|
const sharedTestOptions = (options) => ({
|
|
32
|
-
...moduleCacheOf(
|
|
34
|
+
...moduleCacheOf(!isMutationRun()),
|
|
33
35
|
globals: true,
|
|
34
|
-
isolate:
|
|
36
|
+
isolate: isMutationRun() && IS_VITEST_5,
|
|
35
37
|
server: { deps: { inline: [...PACKAGES_THROUGH_VITE, ...(options.inlineDependencies ?? [])] } },
|
|
36
38
|
setupFiles: [...options.setupFiles],
|
|
37
39
|
testTimeout: TEST_TIMEOUT,
|
|
@@ -54,6 +56,17 @@ const PROJECTS_OF_CELL = {
|
|
|
54
56
|
client: [clientProject],
|
|
55
57
|
server: [serverProject],
|
|
56
58
|
};
|
|
59
|
+
const graphqlEntryOf = (root) => {
|
|
60
|
+
try {
|
|
61
|
+
return createRequire(path.resolve(root, 'package.json')).resolve('graphql');
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
if (Reflect.get(new Object(error), 'code') === 'MODULE_NOT_FOUND') {
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
throw error;
|
|
68
|
+
}
|
|
69
|
+
};
|
|
57
70
|
const unitCoverageScope = (cell, options) => ({
|
|
58
71
|
exclude: [...(cell === 'server' ? options.clientSources : []), ...(options.coverage.exclude ?? [])],
|
|
59
72
|
include: cell === 'client' ? options.clientSources : options.coverage.include,
|
|
@@ -72,9 +85,9 @@ export const defineApplicationUnitConfig = (options) => {
|
|
|
72
85
|
});
|
|
73
86
|
};
|
|
74
87
|
export const defineApplicationEndToEndConfig = (options) => {
|
|
75
|
-
const graphql =
|
|
88
|
+
const graphql = graphqlEntryOf(options.root);
|
|
76
89
|
return mergeConfig(options.viteConfig, {
|
|
77
|
-
resolve: { alias: { graphql } },
|
|
90
|
+
...(graphql !== undefined && { resolve: { alias: { graphql } } }),
|
|
78
91
|
root: options.root,
|
|
79
92
|
test: {
|
|
80
93
|
...sharedTestOptions(options),
|
|
@@ -84,6 +97,3 @@ export const defineApplicationEndToEndConfig = (options) => {
|
|
|
84
97
|
},
|
|
85
98
|
});
|
|
86
99
|
};
|
|
87
|
-
export const defineApplicationMutationConfig = (unitConfig) => mergeConfig(unitConfig, {
|
|
88
|
-
test: { ...moduleCacheOf(false), ...(IS_VITEST_5 && { isolate: true }) },
|
|
89
|
-
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@application-kit/testing",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "Тестовая инфраструктура NestJS-приложений: шины CQRS, логгер, фейковый microservice, сборка web-приложения, Postgres в testcontainers, запуск e2e-приложения, изоляция окружения прогона, дешёвый bcrypt для unit-прогона, раскладка ячеек CI по проектам vitest и фабрики конфигов vitest",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cqrs",
|
|
@@ -81,7 +81,7 @@
|
|
|
81
81
|
"test:unit": "vitest run"
|
|
82
82
|
},
|
|
83
83
|
"dependencies": {
|
|
84
|
-
"@application-kit/bootstrap": "^0.2.
|
|
84
|
+
"@application-kit/bootstrap": "^0.2.3"
|
|
85
85
|
},
|
|
86
86
|
"devDependencies": {
|
|
87
87
|
"@nestjs/common": "^11.2.7",
|