Skip to content

Commit 21fba6e

Browse files
committed
feat(integration-testing): enable providing framework plugins
1 parent fe7dcbc commit 21fba6e

11 files changed

Lines changed: 112 additions & 33 deletions

File tree

src/options/validator.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ export function validate(options) {
3232
}).default({registries: {}}),
3333
plugins: {
3434
unitTestFrameworks: pluginsSchema,
35+
integrationTestFrameworks: pluginsSchema,
3536
packageBundlers: pluginsSchema,
3637
applicationTypes: pluginsSchema,
3738
packageTypes: pluginsSchema,

src/options/validator.test.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ describe('options validator', () => {
6262
configs,
6363
plugins: {
6464
unitTestFrameworks: pluginsSchema,
65+
integrationTestFrameworks: pluginsSchema,
6566
packageBundlers: pluginsSchema,
6667
applicationTypes: pluginsSchema,
6768
packageTypes: pluginsSchema,

src/scaffolder.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ export default async function scaffoldJavascript(options) {
3737
monorepoTypes,
3838
packageBundlers,
3939
unitTestFrameworks,
40+
integrationTestFrameworks,
4041
hosts,
4142
ciServices
4243
}
@@ -94,6 +95,7 @@ export default async function scaffoldJavascript(options) {
9495
registries: configs.registries,
9596
tests,
9697
unitTestFrameworks,
98+
integrationTestFrameworks,
9799
decisions,
98100
pathWithinParent
99101
});

src/scaffolder.test.js

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ describe('javascript project scaffolder', () => {
8282
const monorepoTypes = any.simpleObject();
8383
const packageBundlers = any.simpleObject();
8484
const unitTestFrameworks = any.simpleObject();
85+
const integrationTestFrameworks = any.simpleObject();
8586
const testFilenamePattern = any.string();
8687
const buildDirectory = any.string();
8788
const packageResults = {...any.simpleObject(), packageName};
@@ -108,7 +109,16 @@ describe('javascript project scaffolder', () => {
108109
visibility,
109110
license,
110111
decisions,
111-
plugins: {ciServices, hosts, applicationTypes, packageTypes, monorepoTypes, packageBundlers, unitTestFrameworks}
112+
plugins: {
113+
ciServices,
114+
hosts,
115+
applicationTypes,
116+
packageTypes,
117+
monorepoTypes,
118+
packageBundlers,
119+
unitTestFrameworks,
120+
integrationTestFrameworks
121+
}
112122
});
113123
when(prompt)
114124
.calledWith(ciServices, hosts, visibility, vcs, decisions, configs, pathWithinParent)
@@ -161,7 +171,8 @@ describe('javascript project scaffolder', () => {
161171
tests,
162172
decisions,
163173
pathWithinParent,
164-
unitTestFrameworks
174+
unitTestFrameworks,
175+
integrationTestFrameworks
165176
})
166177
.thenResolve(verificationResults);
167178
when(scaffoldNodeVersion).calledWith({projectRoot, nodeVersionCategory}).thenResolve(nodeVersionResults);

src/testing/integration/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export {default as scaffold} from './scaffolder.js';
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export default function scaffoldIntegrationTesting() {
2+
return {};
3+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import {describe, it, expect} from 'vitest';
2+
3+
import scaffoldIntegrationTesting from './scaffolder.js';
4+
5+
describe('integration testing scaffolder', () => {
6+
it('should scaffold the chosen framework', async () => {
7+
expect(scaffoldIntegrationTesting()).toEqual({});
8+
});
9+
});

src/testing/scaffolder.js

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,26 @@
11
import deepmerge from 'deepmerge';
22

33
import {scaffold as scaffoldUnitTesting} from './unit/index.js';
4+
import {scaffold as scaffoldIntegrationTesting} from './integration/index.js';
45

56
export default async function scaffoldTesting({
67
projectRoot,
78
tests: {unit, integration},
89
unitTestFrameworks,
10+
integrationTestFrameworks,
911
decisions,
1012
dialect
1113
}) {
12-
const unitResults = unit
13-
? await scaffoldUnitTesting({projectRoot, frameworks: unitTestFrameworks, decisions, dialect})
14-
: {};
14+
const [unitResults, integrationResults] = await Promise.all([
15+
unit ? scaffoldUnitTesting({projectRoot, frameworks: unitTestFrameworks, decisions, dialect}) : {},
16+
integration
17+
? scaffoldIntegrationTesting({projectRoot, frameworks: integrationTestFrameworks, decisions, dialect})
18+
: {}
19+
]);
1520

16-
return deepmerge(
21+
return deepmerge.all([
1722
{dependencies: {javascript: {development: [...(unit || integration) ? ['@travi/any'] : []]}}, eslint: {}},
18-
unitResults
19-
);
23+
unitResults,
24+
integrationResults
25+
]);
2026
}

src/testing/scaffolder.test.js

Lines changed: 65 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,99 @@
1+
import deepmerge from 'deepmerge';
2+
13
import any from '@travi/any';
24
import {it, expect, describe, vi, beforeEach} from 'vitest';
35
import {when} from 'vitest-when';
46

57
import {scaffold as scaffoldUnitTesting} from './unit/index.js';
8+
import {scaffold as scaffoldIntegrationTesting} from './integration/index.js';
69
import scaffoldTesting from './scaffolder.js';
710

11+
vi.mock('deepmerge');
812
vi.mock('./unit/index.js');
13+
vi.mock('./integration/index.js');
914

1015
describe('testing scaffolder', () => {
1116
const projectRoot = any.string();
1217
const dialect = any.word();
13-
const unitTestingDevDependencies = any.listOf(any.string);
14-
const unitTestNextSteps = any.listOf(any.simpleObject);
15-
const unitTestScripts = any.simpleObject();
16-
const unitTestFilesToIgnoreFromVcs = any.listOf(any.string);
17-
const unitTestDirectoriesToIgnoreFromVcs = any.listOf(any.string);
1818
const unitTestFrameworks = any.simpleObject();
19+
const integrationTestFrameworks = any.simpleObject();
1920
const decisions = any.simpleObject();
21+
const unitTestScaffoldResults = any.simpleObject();
22+
const integrationTestScaffoldResults = any.simpleObject();
23+
const mergedResults = any.simpleObject();
2024

2125
beforeEach(() => {
2226
when(scaffoldUnitTesting)
2327
.calledWith({projectRoot, frameworks: unitTestFrameworks, decisions, dialect})
24-
.thenResolve({
25-
dependencies: {javascript: {development: unitTestingDevDependencies}},
26-
scripts: unitTestScripts,
27-
vcsIgnore: {files: unitTestFilesToIgnoreFromVcs, directories: unitTestDirectoriesToIgnoreFromVcs},
28-
nextSteps: unitTestNextSteps
29-
});
28+
.thenResolve(unitTestScaffoldResults);
29+
when(scaffoldIntegrationTesting)
30+
.calledWith({projectRoot, frameworks: integrationTestFrameworks, decisions, dialect})
31+
.thenResolve(integrationTestScaffoldResults);
3032
});
3133

3234
it('should scaffold unit testing if the project will be unit test', async () => {
35+
when(deepmerge.all)
36+
.calledWith([
37+
{dependencies: {javascript: {development: ['@travi/any']}}, eslint: {}},
38+
unitTestScaffoldResults,
39+
{}
40+
])
41+
.thenReturn(mergedResults);
42+
3343
expect(await scaffoldTesting({
3444
projectRoot,
35-
tests: {unit: true},
45+
tests: {unit: true, integration: false},
3646
unitTestFrameworks,
47+
integrationTestFrameworks,
3748
decisions,
3849
dialect
39-
})).toEqual({
40-
dependencies: {javascript: {development: ['@travi/any', ...unitTestingDevDependencies]}},
41-
scripts: unitTestScripts,
42-
vcsIgnore: {files: unitTestFilesToIgnoreFromVcs, directories: unitTestDirectoriesToIgnoreFromVcs},
43-
eslint: {},
44-
nextSteps: unitTestNextSteps
45-
});
50+
})).toEqual(mergedResults);
4651
});
4752

48-
it('should not scaffold unit testing if the project will not be unit tested', async () => {
49-
expect(await scaffoldTesting({projectRoot, tests: {unit: false, integration: true}}))
50-
.toEqual({dependencies: {javascript: {development: ['@travi/any']}}, eslint: {}});
53+
it('should scaffold integration testing if the project will be integration tested', async () => {
54+
when(deepmerge.all)
55+
.calledWith([
56+
{dependencies: {javascript: {development: ['@travi/any']}}, eslint: {}},
57+
{},
58+
integrationTestScaffoldResults
59+
])
60+
.thenReturn(mergedResults);
61+
62+
expect(await scaffoldTesting({
63+
projectRoot,
64+
tests: {unit: false, integration: true},
65+
unitTestFrameworks,
66+
integrationTestFrameworks,
67+
decisions,
68+
dialect
69+
})).toEqual(mergedResults);
70+
});
71+
72+
it('should scaffold both unit testing and integration testing if both layers are planned', async () => {
73+
when(deepmerge.all)
74+
.calledWith([
75+
{dependencies: {javascript: {development: ['@travi/any']}}, eslint: {}},
76+
unitTestScaffoldResults,
77+
integrationTestScaffoldResults
78+
])
79+
.thenReturn(mergedResults);
80+
81+
expect(await scaffoldTesting({
82+
projectRoot,
83+
tests: {unit: true, integration: true},
84+
unitTestFrameworks,
85+
integrationTestFrameworks,
86+
decisions,
87+
dialect
88+
})).toEqual(mergedResults);
5189
});
5290

5391
it('should not scaffold testing if the project will not be tested', async () => {
92+
when(deepmerge.all)
93+
.calledWith([{dependencies: {javascript: {development: []}}, eslint: {}}, {}, {}])
94+
.thenReturn(mergedResults);
95+
5496
expect(await scaffoldTesting({projectRoot, tests: {unit: false, integration: false}}))
55-
.toEqual({dependencies: {javascript: {development: []}}, eslint: {}});
97+
.toEqual(mergedResults);
5698
});
5799
});

src/verification/scaffolder.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,12 @@ export async function scaffoldVerification({
1212
registries,
1313
tests,
1414
unitTestFrameworks,
15+
integrationTestFrameworks,
1516
decisions,
1617
pathWithinParent
1718
}) {
1819
const [testingResults, lintingResults, huskyResults] = await Promise.all([
19-
scaffoldTesting({projectRoot, tests, unitTestFrameworks, decisions, dialect}),
20+
scaffoldTesting({projectRoot, tests, unitTestFrameworks, integrationTestFrameworks, decisions, dialect}),
2021
scaffoldLinting({projectRoot, packageManager, registries, vcs, pathWithinParent}),
2122
scaffoldHusky({projectRoot, packageManager, pathWithinParent})
2223
]);

0 commit comments

Comments
 (0)