@application-kit/testing 0.7.1 → 0.9.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 +15 -11
- package/dist/cjs/vitest/application-vitest-config-options.interface.d.ts +1 -0
- package/dist/cjs/vitest/application-vitest-config.d.ts +0 -1
- package/dist/cjs/vitest/application-vitest-config.js +5 -7
- package/dist/esm/vitest/application-vitest-config-options.interface.d.ts +1 -0
- package/dist/esm/vitest/application-vitest-config.d.ts +0 -1
- package/dist/esm/vitest/application-vitest-config.js +4 -5
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# @application-kit/testing
|
|
2
2
|
|
|
3
|
+
## 0.9.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 94062e4: `defineApplicationUnitConfig` принимает `serverSetupFiles` — setup-файлы только проекта `server`. Туда идёт `/vitest/fast-bcrypt`: в `setupFiles` проект `client` при `node_modules` вне корня падал на `Cannot find module '/@fs/…'`.
|
|
8
|
+
|
|
9
|
+
## 0.8.0
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- 32fb131: Фабрики `defineApplicationUnitConfig` и `defineApplicationEndToEndConfig` сами распознают прогон Stryker по
|
|
14
|
+
`STRYKER_MUTATOR_WORKER`: выключают кеш модулей и на vitest 5 изолируют файлы спек. Отдельный конфиг vitest для Stryker
|
|
15
|
+
больше не нужен: `defineApplicationMutationConfig` удалена, `vitestConfigFile` указывает на обычный `vitest.config`.
|
|
16
|
+
|
|
3
17
|
## 0.7.1
|
|
4
18
|
|
|
5
19
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -65,7 +65,8 @@ export default defineApplicationUnitConfig({
|
|
|
65
65
|
coverage: { exclude: ['**/*.module.ts'], include: ['src'], thresholds: { lines: 95 } },
|
|
66
66
|
excludeSpecs: E2E_SPECS,
|
|
67
67
|
root: import.meta.dirname,
|
|
68
|
-
|
|
68
|
+
serverSetupFiles: ['@application-kit/testing/vitest/fast-bcrypt'],
|
|
69
|
+
setupFiles: [],
|
|
69
70
|
specs: ['src/**/*.spec.ts'],
|
|
70
71
|
viteConfig,
|
|
71
72
|
})
|
|
@@ -80,7 +81,8 @@ export default defineApplicationEndToEndConfig({
|
|
|
80
81
|
})
|
|
81
82
|
```
|
|
82
83
|
|
|
83
|
-
Спеки, исходники клиента, покрытие (глобы, исключения, пороги), `setupFiles`
|
|
84
|
+
Спеки, исходники клиента, покрытие (глобы, исключения, пороги), `setupFiles` (`serverSetupFiles` — только проекту
|
|
85
|
+
`server`) и дополнительные пакеты для
|
|
84
86
|
`server.deps.inline` (`inlineDependencies`) — у приложения. Фабрики решают сами:
|
|
85
87
|
|
|
86
88
|
- оба профиля — `globals`, `isolate: false`, `testTimeout` 20 с (таймаут ловит зависший промис, а не медленный раннер),
|
|
@@ -92,20 +94,25 @@ export default defineApplicationEndToEndConfig({
|
|
|
92
94
|
ячейки шарда CI и `ProjectShardSequencer` (ниже);
|
|
93
95
|
- e2e — окружение `node` и алиас `graphql` на CJS-вход `node_modules/graphql/index.js` под `root`: Vite для SSR берёт
|
|
94
96
|
ESM-сборку `graphql`, внешний `mercurius` — CJS, и без алиаса схема и валидация запроса живут в разных realm;
|
|
95
|
-
- мутации —
|
|
96
|
-
(под Stryker он отдаёт тестам трансформ без активного мутанта)
|
|
97
|
-
vitest-runner Stryker собирает покрытие по тестам только с первого
|
|
98
|
-
|
|
97
|
+
- мутации — отдельного конфига не нужно: `vitestConfigFile` Stryker указывает на обычный `vitest.config`, а фабрики,
|
|
98
|
+
увидев `STRYKER_MUTATOR_WORKER`, выключают кеш модулей (под Stryker он отдаёт тестам трансформ без активного мутанта)
|
|
99
|
+
и на vitest 5 ставят `isolate: true`: без изоляции vitest-runner Stryker собирает покрытие по тестам только с первого
|
|
100
|
+
файла спек воркера.
|
|
99
101
|
|
|
100
102
|
## Вход `/vitest/fast-bcrypt`: дешёвый bcrypt
|
|
101
103
|
|
|
102
|
-
Setup-файл unit-профиля (`
|
|
104
|
+
Setup-файл unit-профиля (`serverSetupFiles: ['@application-kit/testing/vitest/fast-bcrypt']`): `vi.mock('bcrypt')` считает хеш
|
|
103
105
|
с cost 4 (≈ 1 мс против ≈ 300 мс у cost 12), а поле стоимости в строке переписывает на запрошенную — `getRounds` и
|
|
104
106
|
решение о перехешировании видят настоящую стоимость; `compare` перед сверкой возвращает поле на 4. Сверяются только хеши,
|
|
105
107
|
выпущенные подменой: литерал хеша с настоящим cost 12 не сойдётся. Подмена видна коду, прошедшему трансформ vitest
|
|
106
108
|
(исходники приложения); внешний пакет, импортирующий `bcrypt`, ускоряется только через `inlineDependencies`. E2e-профилю
|
|
107
109
|
файл не нужен.
|
|
108
110
|
|
|
111
|
+
Файл идёт в `serverSetupFiles`, а не в `setupFiles`: клиентскому коду bcrypt не нужен, а проект `client` грузит setup-файлы
|
|
112
|
+
через vite-сервер, который отдаёт только файлы из `server.fs.allow` (по умолчанию — корень проекта). При `node_modules` вне
|
|
113
|
+
корня (образ CI, git worktree со ссылкой на чужой `node_modules`) файл пакета в `setupFiles` роняет все спеки `client` на
|
|
114
|
+
`Cannot find module '/@fs/…'`.
|
|
115
|
+
|
|
109
116
|
## Ячейки CI по проектам
|
|
110
117
|
|
|
111
118
|
`vitest --shard=i/n` сам режет спеки хешем, и при двух проектах разных трансформов (`server` в `node`, `client` в
|
|
@@ -136,14 +143,11 @@ export default defineStrykerConfig({
|
|
|
136
143
|
ignorePatterns: ['docs', 'tasks'],
|
|
137
144
|
mutate: { exclude: ['src/**/*.spec.ts', 'src/**/*.vue', 'src/**/tests/**'], include: ['src/modules/**/*.ts', 'src/libs/**/*.ts'] },
|
|
138
145
|
thresholds: { break: 94, high: 100, low: 95 },
|
|
139
|
-
vitestConfigFile: 'vitest.
|
|
146
|
+
vitestConfigFile: 'vitest.config.mts',
|
|
140
147
|
})
|
|
141
148
|
|
|
142
149
|
// vitest.config.mts
|
|
143
150
|
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
151
|
```
|
|
148
152
|
|
|
149
153
|
`defineStrykerLayers` режет прогон на группы каталогов: ячейка CI мутирует одну группу со своим порогом `break` (общий
|
|
@@ -12,6 +12,7 @@ export interface ApplicationUnitConfigOptionsInterface extends ApplicationTestCo
|
|
|
12
12
|
clientSources: readonly string[];
|
|
13
13
|
clientSpecs: readonly string[];
|
|
14
14
|
excludeSpecs: readonly string[];
|
|
15
|
+
serverSetupFiles?: readonly string[];
|
|
15
16
|
}
|
|
16
17
|
export interface CoverageScopeInterface {
|
|
17
18
|
exclude?: readonly string[];
|
|
@@ -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,7 @@ 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
7
|
const node_module_1 = require("node:module");
|
|
8
8
|
const node_path_1 = __importDefault(require("node:path"));
|
|
9
9
|
const node_process_1 = __importDefault(require("node:process"));
|
|
@@ -35,10 +35,11 @@ const coverageOf = (scope) => ({
|
|
|
35
35
|
skipFull: true,
|
|
36
36
|
thresholds: scope.thresholds,
|
|
37
37
|
});
|
|
38
|
+
const isMutationRun = () => node_process_1.default.env.STRYKER_MUTATOR_WORKER !== undefined;
|
|
38
39
|
const sharedTestOptions = (options) => ({
|
|
39
|
-
...moduleCacheOf(
|
|
40
|
+
...moduleCacheOf(!isMutationRun()),
|
|
40
41
|
globals: true,
|
|
41
|
-
isolate:
|
|
42
|
+
isolate: isMutationRun() && IS_VITEST_5,
|
|
42
43
|
server: { deps: { inline: [...PACKAGES_THROUGH_VITE, ...(options.inlineDependencies ?? [])] } },
|
|
43
44
|
setupFiles: [...options.setupFiles],
|
|
44
45
|
testTimeout: TEST_TIMEOUT,
|
|
@@ -50,6 +51,7 @@ const serverProject = (options) => ({
|
|
|
50
51
|
exclude: [...options.excludeSpecs, ...options.clientSpecs],
|
|
51
52
|
include: [...options.specs],
|
|
52
53
|
name: 'server',
|
|
54
|
+
setupFiles: [...(options.serverSetupFiles ?? [])],
|
|
53
55
|
},
|
|
54
56
|
});
|
|
55
57
|
const clientProject = (options) => ({
|
|
@@ -104,7 +106,3 @@ const defineApplicationEndToEndConfig = (options) => {
|
|
|
104
106
|
});
|
|
105
107
|
};
|
|
106
108
|
exports.defineApplicationEndToEndConfig = defineApplicationEndToEndConfig;
|
|
107
|
-
const defineApplicationMutationConfig = (unitConfig) => (0, vite_1.mergeConfig)(unitConfig, {
|
|
108
|
-
test: { ...moduleCacheOf(false), ...(IS_VITEST_5 && { isolate: true }) },
|
|
109
|
-
});
|
|
110
|
-
exports.defineApplicationMutationConfig = defineApplicationMutationConfig;
|
|
@@ -12,6 +12,7 @@ export interface ApplicationUnitConfigOptionsInterface extends ApplicationTestCo
|
|
|
12
12
|
clientSources: readonly string[];
|
|
13
13
|
clientSpecs: readonly string[];
|
|
14
14
|
excludeSpecs: readonly string[];
|
|
15
|
+
serverSetupFiles?: readonly string[];
|
|
15
16
|
}
|
|
16
17
|
export interface CoverageScopeInterface {
|
|
17
18
|
exclude?: readonly string[];
|
|
@@ -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;
|
|
@@ -29,10 +29,11 @@ const coverageOf = (scope) => ({
|
|
|
29
29
|
skipFull: true,
|
|
30
30
|
thresholds: scope.thresholds,
|
|
31
31
|
});
|
|
32
|
+
const isMutationRun = () => process.env.STRYKER_MUTATOR_WORKER !== undefined;
|
|
32
33
|
const sharedTestOptions = (options) => ({
|
|
33
|
-
...moduleCacheOf(
|
|
34
|
+
...moduleCacheOf(!isMutationRun()),
|
|
34
35
|
globals: true,
|
|
35
|
-
isolate:
|
|
36
|
+
isolate: isMutationRun() && IS_VITEST_5,
|
|
36
37
|
server: { deps: { inline: [...PACKAGES_THROUGH_VITE, ...(options.inlineDependencies ?? [])] } },
|
|
37
38
|
setupFiles: [...options.setupFiles],
|
|
38
39
|
testTimeout: TEST_TIMEOUT,
|
|
@@ -44,6 +45,7 @@ const serverProject = (options) => ({
|
|
|
44
45
|
exclude: [...options.excludeSpecs, ...options.clientSpecs],
|
|
45
46
|
include: [...options.specs],
|
|
46
47
|
name: 'server',
|
|
48
|
+
setupFiles: [...(options.serverSetupFiles ?? [])],
|
|
47
49
|
},
|
|
48
50
|
});
|
|
49
51
|
const clientProject = (options) => ({
|
|
@@ -96,6 +98,3 @@ export const defineApplicationEndToEndConfig = (options) => {
|
|
|
96
98
|
},
|
|
97
99
|
});
|
|
98
100
|
};
|
|
99
|
-
export const defineApplicationMutationConfig = (unitConfig) => mergeConfig(unitConfig, {
|
|
100
|
-
test: { ...moduleCacheOf(false), ...(IS_VITEST_5 && { isolate: true }) },
|
|
101
|
-
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@application-kit/testing",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.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",
|