testeranto 0.140.2 → 0.143.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/.aider.chat.history.md +9173 -0
- package/.aider.input.history +336 -0
- package/.aider.tags.cache.v3/{ad/3c/10f2ab1397f6d544e613d2a6acaf.val → 3d/81/8b6f0e9b98ec2952cdb8968ac386.val} +0 -0
- package/.aider.tags.cache.v3/63/f1/138061b0aadb868173d197c2a0e0.val +0 -0
- package/.aider.tags.cache.v3/be/72/19ee8e656d160afe9b31523245fe.val +0 -0
- package/.aider.tags.cache.v3/cache.db +0 -0
- package/.aider.tags.cache.v3/cache.db-shm +0 -0
- package/.aider.tags.cache.v3/cache.db-wal +0 -0
- package/.aider.tags.cache.v3/{a7/97/6d37fce350ad2d588f36729db0cd.val → d6/7d/1820c2d4b9330eab7017da4515e7.val} +0 -0
- package/docs/aiderTest.sh +1 -0
- package/docs/testing.ai.txt +98 -0
- package/docs/testing.prompt.txt +8 -0
- package/package.json +3 -3
- package/src/PM/PM_WithEslintAndTsc.ts +35 -21
- package/src/Pure.test.ts +299 -0
- package/src/lib/BaseSuite.test.ts +24 -5
- package/src/lib/abstractBase.test/MockGiven.ts +31 -0
- package/src/lib/abstractBase.test/MockThen.ts +20 -0
- package/src/lib/abstractBase.test/MockWhen.ts +17 -0
- package/src/lib/abstractBase.test/implementation.ts +51 -0
- package/src/lib/abstractBase.test/index.ts +19 -0
- package/src/lib/abstractBase.test/interface.ts +12 -0
- package/src/lib/abstractBase.test/specification.ts +49 -0
- package/src/lib/abstractBase.test/types.ts +19 -0
- package/src/lib/baseBuilder.test/TestBaseBuilder.ts +83 -0
- package/src/lib/baseBuilder.test/baseBuilder.test.implementation.ts +133 -0
- package/src/lib/baseBuilder.test/baseBuilder.test.interface.ts +18 -0
- package/src/lib/baseBuilder.test/baseBuilder.test.specification.ts +35 -0
- package/src/lib/baseBuilder.test/baseBuilder.test.ts +13 -0
- package/src/lib/baseBuilder.test/baseBuilder.test.types.ts +36 -0
- package/src/lib/classBuilder.test/TestClassBuilder.ts +88 -0
- package/src/lib/classBuilder.test/classBuilder.test.implementation.ts +200 -0
- package/src/lib/classBuilder.test/classBuilder.test.interface.ts +17 -0
- package/src/lib/classBuilder.test/classBuilder.test.specification.ts +112 -0
- package/src/lib/classBuilder.test/classBuilder.test.ts +14 -0
- package/src/lib/classBuilder.test/classBuilder.test.types.ts +72 -0
- package/src/lib/core.test/MockCore.ts +49 -0
- package/src/lib/core.test/core.test.implementation.ts +129 -0
- package/src/lib/core.test/core.test.interface.ts +18 -0
- package/src/lib/core.test/core.test.specification.ts +99 -0
- package/src/lib/core.test/core.test.ts +15 -0
- package/src/lib/core.test/core.test.types.ts +68 -0
- package/src/lib/core.ts +1 -1
- package/src/lib/pmProxy.test/implementation.ts +104 -0
- package/src/lib/pmProxy.test/index.ts +19 -0
- package/src/lib/pmProxy.test/interface.ts +47 -0
- package/src/lib/pmProxy.test/mockPM.ts +38 -0
- package/src/lib/pmProxy.test/mockPMBase.ts +136 -0
- package/src/lib/pmProxy.test/specification.ts +123 -0
- package/src/lib/pmProxy.test/types.ts +45 -0
- package/src/lib/pmProxy.ts +40 -193
- package/testeranto/bundles/node/allTests/chunk-2FXOXAKZ.mjs +800 -0
- package/testeranto/bundles/node/allTests/chunk-5MQGD4WC.mjs +251 -0
- package/testeranto/bundles/node/allTests/chunk-6CGAD2FD.mjs +800 -0
- package/testeranto/bundles/node/allTests/chunk-DWKHII32.mjs +800 -0
- package/testeranto/bundles/node/allTests/chunk-KYSOR62N.mjs +167 -0
- package/testeranto/bundles/node/allTests/chunk-PRPFVO6G.mjs +251 -0
- package/testeranto/bundles/node/allTests/chunk-RX4SUFXQ.mjs +251 -0
- package/testeranto/bundles/node/allTests/chunk-UED26IMH.mjs +802 -0
- package/testeranto/bundles/node/allTests/chunk-VAAIAWXC.mjs +117 -0
- package/testeranto/bundles/node/allTests/chunk-W44DUDBK.mjs +251 -0
- package/testeranto/bundles/node/allTests/chunk-YI3EGRMQ.mjs +167 -0
- package/testeranto/bundles/node/allTests/metafile.json +1072 -222
- package/testeranto/bundles/node/allTests/src/PM/__tests__/nodeSidecar.testeranto.mjs +2 -1
- package/testeranto/bundles/node/allTests/src/PM/__tests__/pureSidecar.testeranto.mjs +2 -1
- package/testeranto/bundles/node/allTests/src/PM/__tests__/webSidecar.testeranto.mjs +2 -1
- package/testeranto/bundles/node/allTests/src/Pure.test.mjs +261 -0
- package/testeranto/bundles/node/allTests/src/lib/BaseSuite.test.mjs +22 -4
- package/testeranto/bundles/node/allTests/src/lib/baseBuilder.test/baseBuilder.test.mjs +226 -0
- package/testeranto/bundles/node/allTests/src/lib/classBuilder.test/classBuilder.test.mjs +406 -0
- package/testeranto/bundles/node/allTests/src/lib/core.test/core.test.mjs +279 -0
- package/testeranto/bundles/node/allTests/src/lib/pmProxy.test/index.mjs +4479 -0
- package/testeranto/bundles/node/allTests/src/mothership/test.mjs +4 -2
- package/testeranto/reports/allTests/config.json +40 -1
- package/testeranto/reports/allTests/src/PM/__tests__/nodeSidecar.testeranto/node/console_log.txt +0 -0
- package/testeranto/reports/allTests/src/PM/__tests__/nodeSidecar.testeranto/node/log.txt +0 -0
- package/testeranto/reports/allTests/src/Pure.test/node/console_log.txt +17 -0
- package/testeranto/reports/allTests/src/Pure.test/node/dev.html +21 -0
- package/testeranto/reports/allTests/src/Pure.test/node/index.html +21 -0
- package/testeranto/reports/allTests/src/Pure.test/node/lint_errors.json +134 -0
- package/testeranto/reports/allTests/src/Pure.test/node/message +1 -0
- package/testeranto/reports/allTests/src/Pure.test/node/prompt.txt +7 -0
- package/testeranto/reports/allTests/src/Pure.test/node/type_errors.txt +26 -0
- package/testeranto/reports/allTests/src/lib/BaseGiven.test/node/dev.html +21 -0
- package/testeranto/reports/allTests/src/lib/BaseGiven.test/node/index.html +21 -0
- package/testeranto/reports/allTests/src/lib/BaseSuite.test/node/console_log.txt +27 -27
- package/testeranto/reports/allTests/src/lib/BaseSuite.test/node/lint_errors.json +104 -104
- package/testeranto/reports/allTests/src/lib/BaseSuite.test/node/type_errors.txt +47 -22
- package/testeranto/reports/allTests/src/lib/BaseThen.test/node/dev.html +21 -0
- package/testeranto/reports/allTests/src/lib/BaseThen.test/node/index.html +21 -0
- package/testeranto/reports/allTests/src/lib/BaseWhen.test/node/dev.html +21 -0
- package/testeranto/reports/allTests/src/lib/BaseWhen.test/node/index.html +21 -0
- package/testeranto/reports/allTests/src/lib/abstractBase/index/node/dev.html +21 -0
- package/testeranto/reports/allTests/src/lib/abstractBase/index/node/index.html +21 -0
- package/testeranto/reports/allTests/src/lib/baseBuilder/baseBuilder.test/node/dev.html +21 -0
- package/testeranto/reports/allTests/src/lib/baseBuilder/baseBuilder.test/node/index.html +21 -0
- package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test/node/console_log.txt +12 -0
- package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test/node/dev.html +21 -0
- package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test/node/index.html +21 -0
- package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test/node/lint_errors.json +966 -0
- package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test/node/message +1 -0
- package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test/node/prompt.txt +11 -0
- package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test/node/type_errors.txt +52 -0
- package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/console_log.txt +17 -0
- package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/dev.html +21 -0
- package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/index.html +21 -0
- package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/lint_errors.json +771 -0
- package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/message +1 -0
- package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/prompt.txt +11 -0
- package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/type_errors.txt +67 -0
- package/testeranto/reports/allTests/src/lib/core.test/core.test/node/console_log.txt +17 -0
- package/testeranto/reports/allTests/src/lib/core.test/core.test/node/dev.html +21 -0
- package/testeranto/reports/allTests/src/lib/core.test/core.test/node/index.html +21 -0
- package/testeranto/reports/allTests/src/lib/core.test/core.test/node/lint_errors.json +416 -0
- package/testeranto/reports/allTests/src/lib/core.test/core.test/node/message +1 -0
- package/testeranto/reports/allTests/src/lib/core.test/core.test/node/prompt.txt +11 -0
- package/testeranto/reports/allTests/src/lib/core.test/core.test/node/type_errors.txt +54 -0
- package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/console_log.txt +43 -0
- package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/dev.html +21 -0
- package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/index.html +21 -0
- package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/lint_errors.json +319 -0
- package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/log.txt +0 -0
- package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/message +1 -0
- package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/prompt.txt +10 -0
- package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/type_errors.txt +64 -0
- package/testeranto/reports/allTests/src/mothership/test/node/console_log.txt +44 -0
- package/testeranto/reports/allTests/src/mothership/test/node/log.txt +0 -0
- package/testeranto/reports/allTests/summary.json +76 -6
- package/testeranto/reportsnode_build_errors +12 -0
- package/testeranto.config.ts +19 -2
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { PassThrough } from "stream";
|
|
2
|
+
|
|
3
|
+
import { ITestImplementation } from "../../CoreTypes";
|
|
4
|
+
import { TestBaseBuilder } from "./TestBaseBuilder";
|
|
5
|
+
|
|
6
|
+
import { I, O } from "./baseBuilder.test.types";
|
|
7
|
+
import { TestBaseBuilder } from "./TestBaseBuilder";
|
|
8
|
+
|
|
9
|
+
// Define our test subject type
|
|
10
|
+
type TestSubject = TestBaseBuilder<any, any, any, any, any, any>;
|
|
11
|
+
|
|
12
|
+
export const implementation: ITestImplementation<I, O, {}> = {
|
|
13
|
+
suites: {
|
|
14
|
+
Default: "BaseBuilder test suite",
|
|
15
|
+
},
|
|
16
|
+
|
|
17
|
+
givens: {
|
|
18
|
+
Default: () => {
|
|
19
|
+
return new TestBaseBuilder(
|
|
20
|
+
{},
|
|
21
|
+
{},
|
|
22
|
+
{},
|
|
23
|
+
{},
|
|
24
|
+
{},
|
|
25
|
+
{},
|
|
26
|
+
{ ports: [] },
|
|
27
|
+
() => []
|
|
28
|
+
);
|
|
29
|
+
},
|
|
30
|
+
WithCustomInput: (input: any) => {
|
|
31
|
+
return new TestBaseBuilder(
|
|
32
|
+
input,
|
|
33
|
+
{},
|
|
34
|
+
{},
|
|
35
|
+
{},
|
|
36
|
+
{},
|
|
37
|
+
{},
|
|
38
|
+
{ ports: [] },
|
|
39
|
+
() => []
|
|
40
|
+
);
|
|
41
|
+
},
|
|
42
|
+
WithResourceRequirements: (requirements: ITTestResourceRequest) => {
|
|
43
|
+
return new TestBaseBuilder(
|
|
44
|
+
{},
|
|
45
|
+
{},
|
|
46
|
+
{},
|
|
47
|
+
{},
|
|
48
|
+
{},
|
|
49
|
+
{},
|
|
50
|
+
requirements,
|
|
51
|
+
() => []
|
|
52
|
+
);
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
|
|
56
|
+
whens: {
|
|
57
|
+
addArtifact: (artifact: Promise<any>) => (builder: TestSubject) => {
|
|
58
|
+
builder.artifacts.push(artifact);
|
|
59
|
+
return builder;
|
|
60
|
+
},
|
|
61
|
+
setTestJobs: (jobs: ITestJob[]) => (builder: TestSubject) => {
|
|
62
|
+
builder.testJobs = jobs;
|
|
63
|
+
return builder;
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
|
|
67
|
+
thens: {
|
|
68
|
+
initializedProperly: () => (builder: TestSubject) => {
|
|
69
|
+
if (!(builder instanceof BaseBuilder)) {
|
|
70
|
+
throw new Error("Builder was not properly initialized");
|
|
71
|
+
}
|
|
72
|
+
return builder;
|
|
73
|
+
},
|
|
74
|
+
specsGenerated: () => (builder: TestSubject) => {
|
|
75
|
+
if (!Array.isArray(builder.specs)) {
|
|
76
|
+
throw new Error("Specs were not generated");
|
|
77
|
+
}
|
|
78
|
+
return builder;
|
|
79
|
+
},
|
|
80
|
+
jobsCreated: () => (builder: TestSubject) => {
|
|
81
|
+
if (!Array.isArray(builder.testJobs)) {
|
|
82
|
+
throw new Error("Test jobs were not created");
|
|
83
|
+
}
|
|
84
|
+
return builder;
|
|
85
|
+
},
|
|
86
|
+
artifactsTracked: () => (builder: TestSubject) => {
|
|
87
|
+
if (!Array.isArray(builder.artifacts)) {
|
|
88
|
+
throw new Error("Artifacts array not initialized");
|
|
89
|
+
}
|
|
90
|
+
return builder;
|
|
91
|
+
},
|
|
92
|
+
resourceRequirementsSet: () => (builder: TestSubject) => {
|
|
93
|
+
if (!builder.testResourceRequirement) {
|
|
94
|
+
throw new Error("Resource requirements not set");
|
|
95
|
+
}
|
|
96
|
+
return builder;
|
|
97
|
+
},
|
|
98
|
+
suitesOverridesConfigured: () => (builder: TestSubject) => {
|
|
99
|
+
if (!builder.suitesOverrides) {
|
|
100
|
+
throw new Error("Suites overrides not configured");
|
|
101
|
+
}
|
|
102
|
+
return builder;
|
|
103
|
+
},
|
|
104
|
+
givensOverridesConfigured: () => (builder: TestSubject) => {
|
|
105
|
+
if (!builder.givenOverides) {
|
|
106
|
+
throw new Error("Givens overrides not configured");
|
|
107
|
+
}
|
|
108
|
+
return builder;
|
|
109
|
+
},
|
|
110
|
+
whensOverridesConfigured: () => (builder: TestSubject) => {
|
|
111
|
+
if (!builder.whenOverides) {
|
|
112
|
+
throw new Error("Whens overrides not configured");
|
|
113
|
+
}
|
|
114
|
+
return builder;
|
|
115
|
+
},
|
|
116
|
+
thensOverridesConfigured: () => (builder: TestSubject) => {
|
|
117
|
+
if (!builder.thenOverides) {
|
|
118
|
+
throw new Error("Thens overrides not configured");
|
|
119
|
+
}
|
|
120
|
+
return builder;
|
|
121
|
+
},
|
|
122
|
+
checksOverridesConfigured: () => (builder: TestSubject) => {
|
|
123
|
+
if (!builder.checkOverides) {
|
|
124
|
+
throw new Error("Checks overrides not configured");
|
|
125
|
+
}
|
|
126
|
+
return builder;
|
|
127
|
+
},
|
|
128
|
+
},
|
|
129
|
+
|
|
130
|
+
checks: {
|
|
131
|
+
Default: () => new PassThrough(), // Not used in these tests
|
|
132
|
+
},
|
|
133
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ITestInterface } from "../../CoreTypes";
|
|
2
|
+
|
|
3
|
+
import { I } from "./baseBuilder.test.types";
|
|
4
|
+
|
|
5
|
+
export const testInterface: ITestInterface<I> = {
|
|
6
|
+
beforeEach: async (subject, initializer) => {
|
|
7
|
+
return initializer();
|
|
8
|
+
},
|
|
9
|
+
andWhen: async (store, whenCB, testResource, utils) => {
|
|
10
|
+
return whenCB(store, utils);
|
|
11
|
+
},
|
|
12
|
+
butThen: async (store, thenCB, testResource, pm) => {
|
|
13
|
+
return thenCB(store, pm);
|
|
14
|
+
},
|
|
15
|
+
afterEach: (store) => store,
|
|
16
|
+
afterAll: () => {},
|
|
17
|
+
assertThis: (x: any) => {},
|
|
18
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { ITestSpecification } from "../../CoreTypes";
|
|
2
|
+
|
|
3
|
+
import { I, O } from "./baseBuilder.test.types";
|
|
4
|
+
|
|
5
|
+
export const specification: ITestSpecification<I, O> = (
|
|
6
|
+
Suite,
|
|
7
|
+
Given,
|
|
8
|
+
When,
|
|
9
|
+
Then,
|
|
10
|
+
Check
|
|
11
|
+
) => {
|
|
12
|
+
return [
|
|
13
|
+
Suite.Default(
|
|
14
|
+
"Testing BaseBuilder functionality",
|
|
15
|
+
{
|
|
16
|
+
testInitialization: Given.Default(
|
|
17
|
+
["BaseBuilder should initialize correctly"],
|
|
18
|
+
[],
|
|
19
|
+
[Then.initializedProperly()]
|
|
20
|
+
),
|
|
21
|
+
testSpecsGeneration: Given.Default(
|
|
22
|
+
["BaseBuilder should generate specs from test specification"],
|
|
23
|
+
[],
|
|
24
|
+
[Then.specsGenerated()]
|
|
25
|
+
),
|
|
26
|
+
testJobsCreation: Given.Default(
|
|
27
|
+
["BaseBuilder should create test jobs"],
|
|
28
|
+
[],
|
|
29
|
+
[Then.jobsCreated()]
|
|
30
|
+
),
|
|
31
|
+
},
|
|
32
|
+
[]
|
|
33
|
+
),
|
|
34
|
+
];
|
|
35
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import Testeranto from "../../Node";
|
|
2
|
+
|
|
3
|
+
import { specification } from "./baseBuilder.test.specification";
|
|
4
|
+
import { implementation } from "./baseBuilder.test.implementation";
|
|
5
|
+
import { testInterface } from "./baseBuilder.test.interface";
|
|
6
|
+
import { I, O } from "./baseBuilder.test.types";
|
|
7
|
+
|
|
8
|
+
export default Testeranto<I, O, {}>(
|
|
9
|
+
BaseBuilder.prototype,
|
|
10
|
+
specification,
|
|
11
|
+
implementation,
|
|
12
|
+
testInterface
|
|
13
|
+
);
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Ibdd_in, Ibdd_out } from "../../CoreTypes";
|
|
2
|
+
|
|
3
|
+
import { TestBaseBuilder } from "./TestBaseBuilder";
|
|
4
|
+
|
|
5
|
+
export type I = Ibdd_in<
|
|
6
|
+
{}, // iinput
|
|
7
|
+
BaseBuilder<any, any, any, any, any, any>, // isubject
|
|
8
|
+
BaseBuilder<any, any, any, any, any, any>, // istore
|
|
9
|
+
BaseBuilder<any, any, any, any, any, any>, // iselection
|
|
10
|
+
() => BaseBuilder<any, any, any, any, any, any>, // given
|
|
11
|
+
(store: any) => any, // when
|
|
12
|
+
(store: any) => any // then
|
|
13
|
+
>;
|
|
14
|
+
|
|
15
|
+
export type O = Ibdd_out<
|
|
16
|
+
// Suites
|
|
17
|
+
{
|
|
18
|
+
Default: [string];
|
|
19
|
+
},
|
|
20
|
+
// Givens
|
|
21
|
+
{
|
|
22
|
+
Default: [];
|
|
23
|
+
},
|
|
24
|
+
// Whens
|
|
25
|
+
{}, // No whens in these tests
|
|
26
|
+
// Thens
|
|
27
|
+
{
|
|
28
|
+
initializedProperly: [];
|
|
29
|
+
specsGenerated: [];
|
|
30
|
+
jobsCreated: [];
|
|
31
|
+
},
|
|
32
|
+
// Checks
|
|
33
|
+
{
|
|
34
|
+
Default: [];
|
|
35
|
+
}
|
|
36
|
+
>;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { BaseBuilder } from "../basebuilder";
|
|
2
|
+
import {
|
|
3
|
+
Ibdd_in_any,
|
|
4
|
+
Ibdd_out_any,
|
|
5
|
+
ITestImplementation,
|
|
6
|
+
ITestSpecification,
|
|
7
|
+
} from "../../CoreTypes";
|
|
8
|
+
import {
|
|
9
|
+
ISuiteKlasser,
|
|
10
|
+
IGivenKlasser,
|
|
11
|
+
IWhenKlasser,
|
|
12
|
+
IThenKlasser,
|
|
13
|
+
ICheckKlasser,
|
|
14
|
+
} from "../types";
|
|
15
|
+
import { ITTestResourceRequest } from "..";
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Concrete implementation of BaseBuilder for testing ClassBuilder
|
|
19
|
+
*/
|
|
20
|
+
export class TestClassBuilder<
|
|
21
|
+
I extends Ibdd_in_any,
|
|
22
|
+
O extends Ibdd_out_any,
|
|
23
|
+
M = unknown
|
|
24
|
+
> extends BaseBuilder<
|
|
25
|
+
I,
|
|
26
|
+
O,
|
|
27
|
+
Record<string, unknown>,
|
|
28
|
+
Record<string, unknown>,
|
|
29
|
+
Record<string, unknown>,
|
|
30
|
+
Record<string, unknown>,
|
|
31
|
+
Record<string, unknown>
|
|
32
|
+
> {
|
|
33
|
+
public summary: Record<string, any> = {};
|
|
34
|
+
|
|
35
|
+
constructor(
|
|
36
|
+
testImplementation: ITestImplementation<I, O, M> & {
|
|
37
|
+
suites: Record<string, any>;
|
|
38
|
+
givens: Record<string, any>;
|
|
39
|
+
whens: Record<string, any>;
|
|
40
|
+
thens: Record<string, any>;
|
|
41
|
+
checks: Record<string, any>;
|
|
42
|
+
},
|
|
43
|
+
testSpecification: ITestSpecification<I, O>,
|
|
44
|
+
input: I["iinput"],
|
|
45
|
+
suiteKlasser: ISuiteKlasser<I, O>,
|
|
46
|
+
givenKlasser: IGivenKlasser<I>,
|
|
47
|
+
whenKlasser: IWhenKlasser<I>,
|
|
48
|
+
thenKlasser: IThenKlasser<I>,
|
|
49
|
+
checkKlasser: ICheckKlasser<I>,
|
|
50
|
+
testResourceRequirement: ITTestResourceRequest
|
|
51
|
+
) {
|
|
52
|
+
super(
|
|
53
|
+
input,
|
|
54
|
+
{}, // suitesOverrides
|
|
55
|
+
{}, // givenOverides
|
|
56
|
+
{}, // whenOverides
|
|
57
|
+
{}, // thenOverides
|
|
58
|
+
{}, // checkOverides
|
|
59
|
+
testResourceRequirement,
|
|
60
|
+
testSpecification
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
this.summary = {};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Simplified test run for verification
|
|
68
|
+
*/
|
|
69
|
+
public testRun(puppetMaster: any): Promise<any> {
|
|
70
|
+
this.summary = {
|
|
71
|
+
[puppetMaster.testResourceConfiguration.name]: {
|
|
72
|
+
typeErrors: 0,
|
|
73
|
+
staticErrors: 0,
|
|
74
|
+
runTimeError: "",
|
|
75
|
+
prompt: "",
|
|
76
|
+
failingFeatures: {},
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
return Promise.resolve({
|
|
81
|
+
failed: false,
|
|
82
|
+
fails: 0,
|
|
83
|
+
artifacts: [],
|
|
84
|
+
logPromise: Promise.resolve(),
|
|
85
|
+
features: [],
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { ITestImplementation } from "../../CoreTypes";
|
|
2
|
+
import { TestClassBuilder } from "./TestClassBuilder";
|
|
3
|
+
import { I, O, M } from "./classBuilder.test.types";
|
|
4
|
+
import { PassThrough } from "stream";
|
|
5
|
+
import { ITTestResourceRequest } from "..";
|
|
6
|
+
|
|
7
|
+
export const implementation: ITestImplementation<I, O, M> = {
|
|
8
|
+
suites: {
|
|
9
|
+
Default: "ClassBuilder test suite",
|
|
10
|
+
},
|
|
11
|
+
|
|
12
|
+
givens: {
|
|
13
|
+
Default: () => {
|
|
14
|
+
return new TestClassBuilder(
|
|
15
|
+
implementation, // Use the current implementation
|
|
16
|
+
specification, // Use the current specification
|
|
17
|
+
{}, // Default input
|
|
18
|
+
class {}, // suiteKlasser
|
|
19
|
+
class {}, // givenKlasser
|
|
20
|
+
class {}, // whenKlasser
|
|
21
|
+
class {}, // thenKlasser
|
|
22
|
+
class {}, // checkKlasser
|
|
23
|
+
{ ports: [] } // Default resource requirements
|
|
24
|
+
);
|
|
25
|
+
},
|
|
26
|
+
WithCustomInput: (input: any) => {
|
|
27
|
+
return new TestClassBuilder(
|
|
28
|
+
implementation,
|
|
29
|
+
specification,
|
|
30
|
+
input,
|
|
31
|
+
class {},
|
|
32
|
+
class {},
|
|
33
|
+
class {},
|
|
34
|
+
class {},
|
|
35
|
+
class {},
|
|
36
|
+
{ ports: [] }
|
|
37
|
+
);
|
|
38
|
+
},
|
|
39
|
+
WithResourceRequirements: (requirements: ITTestResourceRequest) => {
|
|
40
|
+
return new TestClassBuilder(
|
|
41
|
+
implementation,
|
|
42
|
+
specification,
|
|
43
|
+
{},
|
|
44
|
+
class {},
|
|
45
|
+
class {},
|
|
46
|
+
class {},
|
|
47
|
+
class {},
|
|
48
|
+
class {},
|
|
49
|
+
requirements
|
|
50
|
+
);
|
|
51
|
+
},
|
|
52
|
+
WithCustomImplementation: (impl: ITestImplementation<any, any>) => {
|
|
53
|
+
return new TestClassBuilder(
|
|
54
|
+
impl,
|
|
55
|
+
specification,
|
|
56
|
+
{},
|
|
57
|
+
class {},
|
|
58
|
+
class {},
|
|
59
|
+
class {},
|
|
60
|
+
class {},
|
|
61
|
+
class {},
|
|
62
|
+
{ ports: [] }
|
|
63
|
+
);
|
|
64
|
+
},
|
|
65
|
+
WithCustomSpecification: (spec: ITestSpecification<any, any>) => {
|
|
66
|
+
return new TestClassBuilder(
|
|
67
|
+
implementation,
|
|
68
|
+
spec,
|
|
69
|
+
{},
|
|
70
|
+
class {},
|
|
71
|
+
class {},
|
|
72
|
+
class {},
|
|
73
|
+
class {},
|
|
74
|
+
class {},
|
|
75
|
+
{ ports: [] }
|
|
76
|
+
);
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
|
|
80
|
+
whens: {
|
|
81
|
+
addArtifact: (artifact: Promise<any>) => (builder) => {
|
|
82
|
+
builder.artifacts.push(artifact);
|
|
83
|
+
return builder;
|
|
84
|
+
},
|
|
85
|
+
setTestJobs: (jobs: any[]) => (builder) => {
|
|
86
|
+
builder.testJobs = jobs;
|
|
87
|
+
return builder;
|
|
88
|
+
},
|
|
89
|
+
modifySpecs: (modifier: (specs: any[]) => any[]) => (builder) => {
|
|
90
|
+
builder.specs = modifier(builder.specs || []);
|
|
91
|
+
return builder;
|
|
92
|
+
},
|
|
93
|
+
modifyJobs: (modifier: (jobs: any[]) => any[]) => (builder) => {
|
|
94
|
+
builder.testJobs = modifier(builder.testJobs || []);
|
|
95
|
+
return builder;
|
|
96
|
+
},
|
|
97
|
+
triggerError: (message: string) => (builder) => {
|
|
98
|
+
throw new Error(message);
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
|
|
102
|
+
thens: {
|
|
103
|
+
initializedProperly: () => (builder) => {
|
|
104
|
+
if (!(builder instanceof TestClassBuilder)) {
|
|
105
|
+
throw new Error("Builder was not properly initialized");
|
|
106
|
+
}
|
|
107
|
+
return builder;
|
|
108
|
+
},
|
|
109
|
+
specsGenerated: () => (builder) => {
|
|
110
|
+
if (!Array.isArray(builder.specs)) {
|
|
111
|
+
throw new Error("Specs were not generated");
|
|
112
|
+
}
|
|
113
|
+
return builder;
|
|
114
|
+
},
|
|
115
|
+
jobsCreated: () => (builder) => {
|
|
116
|
+
if (!Array.isArray(builder.testJobs)) {
|
|
117
|
+
throw new Error("Test jobs were not created");
|
|
118
|
+
}
|
|
119
|
+
return builder;
|
|
120
|
+
},
|
|
121
|
+
artifactsTracked: () => (builder) => {
|
|
122
|
+
if (!Array.isArray(builder.artifacts)) {
|
|
123
|
+
throw new Error("Artifacts array not initialized");
|
|
124
|
+
}
|
|
125
|
+
return builder;
|
|
126
|
+
},
|
|
127
|
+
resourceRequirementsSet: () => (builder) => {
|
|
128
|
+
if (!builder.testResourceRequirement) {
|
|
129
|
+
throw new Error("Resource requirements not set");
|
|
130
|
+
}
|
|
131
|
+
return builder;
|
|
132
|
+
},
|
|
133
|
+
suitesOverridesConfigured: () => (builder) => {
|
|
134
|
+
if (!builder.suitesOverrides) {
|
|
135
|
+
throw new Error("Suites overrides not configured");
|
|
136
|
+
}
|
|
137
|
+
return builder;
|
|
138
|
+
},
|
|
139
|
+
givensOverridesConfigured: () => (builder) => {
|
|
140
|
+
if (!builder.givenOverides) {
|
|
141
|
+
throw new Error("Givens overrides not configured");
|
|
142
|
+
}
|
|
143
|
+
return builder;
|
|
144
|
+
},
|
|
145
|
+
whensOverridesConfigured: () => (builder) => {
|
|
146
|
+
if (!builder.whenOverides) {
|
|
147
|
+
throw new Error("Whens overrides not configured");
|
|
148
|
+
}
|
|
149
|
+
return builder;
|
|
150
|
+
},
|
|
151
|
+
thensOverridesConfigured: () => (builder) => {
|
|
152
|
+
if (!builder.thenOverides) {
|
|
153
|
+
throw new Error("Thens overrides not configured");
|
|
154
|
+
}
|
|
155
|
+
return builder;
|
|
156
|
+
},
|
|
157
|
+
checksOverridesConfigured: () => (builder) => {
|
|
158
|
+
if (!builder.checkOverides) {
|
|
159
|
+
throw new Error("Checks overrides not configured");
|
|
160
|
+
}
|
|
161
|
+
return builder;
|
|
162
|
+
},
|
|
163
|
+
specsModified: (expectedCount: number) => (builder) => {
|
|
164
|
+
if (builder.specs.length <= expectedCount) {
|
|
165
|
+
throw new Error(`Expected at least ${expectedCount} modified specs`);
|
|
166
|
+
}
|
|
167
|
+
return builder;
|
|
168
|
+
},
|
|
169
|
+
jobsModified: (expectedCount: number) => (builder) => {
|
|
170
|
+
if (builder.testJobs.length <= expectedCount) {
|
|
171
|
+
throw new Error(`Expected at least ${expectedCount} modified jobs`);
|
|
172
|
+
}
|
|
173
|
+
return builder;
|
|
174
|
+
},
|
|
175
|
+
errorThrown: (expectedMessage: string) => (builder) => {
|
|
176
|
+
// This is handled by the test runner
|
|
177
|
+
return builder;
|
|
178
|
+
},
|
|
179
|
+
testRunSuccessful: () => async (builder) => {
|
|
180
|
+
try {
|
|
181
|
+
await builder.testRun({
|
|
182
|
+
testResourceConfiguration: {
|
|
183
|
+
name: "test",
|
|
184
|
+
fs: "/tmp",
|
|
185
|
+
ports: [],
|
|
186
|
+
},
|
|
187
|
+
});
|
|
188
|
+
return builder;
|
|
189
|
+
} catch (e) {
|
|
190
|
+
throw new Error(`Test run failed: ${e.message}`);
|
|
191
|
+
}
|
|
192
|
+
},
|
|
193
|
+
},
|
|
194
|
+
|
|
195
|
+
checks: {
|
|
196
|
+
Default: () => new PassThrough(),
|
|
197
|
+
ImplementationCheck: (validator) => validator(implementation),
|
|
198
|
+
SpecificationCheck: (validator) => validator(specification),
|
|
199
|
+
},
|
|
200
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ITestInterface } from "../../CoreTypes";
|
|
2
|
+
import { I } from "../baseBuilder.test/baseBuilder.test.types";
|
|
3
|
+
|
|
4
|
+
export const testInterface: ITestInterface<I> = {
|
|
5
|
+
beforeEach: async (subject, initializer) => {
|
|
6
|
+
return initializer();
|
|
7
|
+
},
|
|
8
|
+
andWhen: async (store, whenCB, testResource, utils) => {
|
|
9
|
+
return whenCB(store, utils);
|
|
10
|
+
},
|
|
11
|
+
butThen: async (store, thenCB, testResource, pm) => {
|
|
12
|
+
return thenCB(store, pm);
|
|
13
|
+
},
|
|
14
|
+
afterEach: (store) => store,
|
|
15
|
+
afterAll: () => {},
|
|
16
|
+
assertThis: (x: any) => {},
|
|
17
|
+
};
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { ITestSpecification } from "../../CoreTypes";
|
|
2
|
+
import { I, O } from "./classBuilder.test.types";
|
|
3
|
+
|
|
4
|
+
export const specification: ITestSpecification<I, O> = (
|
|
5
|
+
Suite,
|
|
6
|
+
Given,
|
|
7
|
+
When,
|
|
8
|
+
Then,
|
|
9
|
+
Check
|
|
10
|
+
) => {
|
|
11
|
+
return [
|
|
12
|
+
Suite.Default(
|
|
13
|
+
"Basic ClassBuilder Functionality",
|
|
14
|
+
{
|
|
15
|
+
// Basic initialization tests
|
|
16
|
+
initialization: Given.Default(
|
|
17
|
+
["ClassBuilder should initialize with default values"],
|
|
18
|
+
[],
|
|
19
|
+
[Then.initializedProperly()]
|
|
20
|
+
),
|
|
21
|
+
customInput: Given.WithCustomInput(
|
|
22
|
+
{ custom: "input" },
|
|
23
|
+
[],
|
|
24
|
+
[Then.initializedProperly()]
|
|
25
|
+
),
|
|
26
|
+
resourceRequirements: Given.WithResourceRequirements(
|
|
27
|
+
{ ports: [3000, 3001] },
|
|
28
|
+
[],
|
|
29
|
+
[Then.resourceRequirementsSet()]
|
|
30
|
+
),
|
|
31
|
+
|
|
32
|
+
// Core functionality tests
|
|
33
|
+
specGeneration: Given.Default(
|
|
34
|
+
["Should generate specs from test specification"],
|
|
35
|
+
[],
|
|
36
|
+
[Then.specsGenerated()]
|
|
37
|
+
),
|
|
38
|
+
jobCreation: Given.Default(
|
|
39
|
+
["Should create test jobs from specs"],
|
|
40
|
+
[],
|
|
41
|
+
[Then.jobsCreated()]
|
|
42
|
+
),
|
|
43
|
+
artifactTracking: Given.Default(
|
|
44
|
+
["Should track artifacts"],
|
|
45
|
+
[When.addArtifact(Promise.resolve("test"))],
|
|
46
|
+
[Then.artifactsTracked()]
|
|
47
|
+
),
|
|
48
|
+
|
|
49
|
+
// Configuration tests
|
|
50
|
+
overridesConfiguration: Given.Default(
|
|
51
|
+
["Should properly configure all overrides"],
|
|
52
|
+
[],
|
|
53
|
+
[
|
|
54
|
+
Then.suitesOverridesConfigured(),
|
|
55
|
+
Then.givensOverridesConfigured(),
|
|
56
|
+
Then.whensOverridesConfigured(),
|
|
57
|
+
Then.thensOverridesConfigured(),
|
|
58
|
+
Then.checksOverridesConfigured()
|
|
59
|
+
]
|
|
60
|
+
),
|
|
61
|
+
},
|
|
62
|
+
[]
|
|
63
|
+
),
|
|
64
|
+
|
|
65
|
+
Suite.ExtendedSuite(
|
|
66
|
+
"Advanced ClassBuilder Functionality",
|
|
67
|
+
{
|
|
68
|
+
// Custom implementations
|
|
69
|
+
customImplementation: Given.WithCustomImplementation(
|
|
70
|
+
implementation,
|
|
71
|
+
[],
|
|
72
|
+
[Then.specsGenerated(), Then.jobsCreated()]
|
|
73
|
+
),
|
|
74
|
+
customSpecification: Given.WithCustomSpecification(
|
|
75
|
+
specification,
|
|
76
|
+
[],
|
|
77
|
+
[Then.specsGenerated(), Then.jobsCreated()]
|
|
78
|
+
),
|
|
79
|
+
|
|
80
|
+
// Dynamic modification tests
|
|
81
|
+
modifySpecs: Given.Default(
|
|
82
|
+
["Should allow modifying specs"],
|
|
83
|
+
[When.modifySpecs((specs) => [...specs, "extra"])],
|
|
84
|
+
[Then.specsModified(1)]
|
|
85
|
+
),
|
|
86
|
+
modifyJobs: Given.Default(
|
|
87
|
+
["Should allow modifying jobs"],
|
|
88
|
+
[When.modifyJobs((jobs) => [...jobs, {} as ITestJob])],
|
|
89
|
+
[Then.jobsModified(1)]
|
|
90
|
+
),
|
|
91
|
+
|
|
92
|
+
// Error handling
|
|
93
|
+
errorHandling: Given.Default(
|
|
94
|
+
["Should properly handle errors"],
|
|
95
|
+
[When.triggerError("test error")],
|
|
96
|
+
[Then.errorThrown("test error")]
|
|
97
|
+
),
|
|
98
|
+
|
|
99
|
+
// Full test run
|
|
100
|
+
testRun: Given.Default(
|
|
101
|
+
["Should complete a full test run successfully"],
|
|
102
|
+
[],
|
|
103
|
+
[Then.testRunSuccessful()]
|
|
104
|
+
)
|
|
105
|
+
},
|
|
106
|
+
[
|
|
107
|
+
Check.ImplementationCheck((impl) => impl !== null),
|
|
108
|
+
Check.SpecificationCheck((spec) => spec !== null)
|
|
109
|
+
]
|
|
110
|
+
)
|
|
111
|
+
];
|
|
112
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import Testeranto from "../../Node";
|
|
2
|
+
|
|
3
|
+
import { ClassBuilder } from "../classBuilder";
|
|
4
|
+
import { specification } from "./classBuilder.test.specification";
|
|
5
|
+
import { implementation } from "./classBuilder.test.implementation";
|
|
6
|
+
import { testInterface } from "./classBuilder.test.interface";
|
|
7
|
+
import { I, O, M } from "./classBuilder.test.types";
|
|
8
|
+
|
|
9
|
+
export default Testeranto<I, O, M>(
|
|
10
|
+
ClassBuilder.prototype,
|
|
11
|
+
specification,
|
|
12
|
+
implementation,
|
|
13
|
+
testInterface
|
|
14
|
+
);
|