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.
Files changed (130) hide show
  1. package/.aider.chat.history.md +9173 -0
  2. package/.aider.input.history +336 -0
  3. package/.aider.tags.cache.v3/{ad/3c/10f2ab1397f6d544e613d2a6acaf.val → 3d/81/8b6f0e9b98ec2952cdb8968ac386.val} +0 -0
  4. package/.aider.tags.cache.v3/63/f1/138061b0aadb868173d197c2a0e0.val +0 -0
  5. package/.aider.tags.cache.v3/be/72/19ee8e656d160afe9b31523245fe.val +0 -0
  6. package/.aider.tags.cache.v3/cache.db +0 -0
  7. package/.aider.tags.cache.v3/cache.db-shm +0 -0
  8. package/.aider.tags.cache.v3/cache.db-wal +0 -0
  9. package/.aider.tags.cache.v3/{a7/97/6d37fce350ad2d588f36729db0cd.val → d6/7d/1820c2d4b9330eab7017da4515e7.val} +0 -0
  10. package/docs/aiderTest.sh +1 -0
  11. package/docs/testing.ai.txt +98 -0
  12. package/docs/testing.prompt.txt +8 -0
  13. package/package.json +3 -3
  14. package/src/PM/PM_WithEslintAndTsc.ts +35 -21
  15. package/src/Pure.test.ts +299 -0
  16. package/src/lib/BaseSuite.test.ts +24 -5
  17. package/src/lib/abstractBase.test/MockGiven.ts +31 -0
  18. package/src/lib/abstractBase.test/MockThen.ts +20 -0
  19. package/src/lib/abstractBase.test/MockWhen.ts +17 -0
  20. package/src/lib/abstractBase.test/implementation.ts +51 -0
  21. package/src/lib/abstractBase.test/index.ts +19 -0
  22. package/src/lib/abstractBase.test/interface.ts +12 -0
  23. package/src/lib/abstractBase.test/specification.ts +49 -0
  24. package/src/lib/abstractBase.test/types.ts +19 -0
  25. package/src/lib/baseBuilder.test/TestBaseBuilder.ts +83 -0
  26. package/src/lib/baseBuilder.test/baseBuilder.test.implementation.ts +133 -0
  27. package/src/lib/baseBuilder.test/baseBuilder.test.interface.ts +18 -0
  28. package/src/lib/baseBuilder.test/baseBuilder.test.specification.ts +35 -0
  29. package/src/lib/baseBuilder.test/baseBuilder.test.ts +13 -0
  30. package/src/lib/baseBuilder.test/baseBuilder.test.types.ts +36 -0
  31. package/src/lib/classBuilder.test/TestClassBuilder.ts +88 -0
  32. package/src/lib/classBuilder.test/classBuilder.test.implementation.ts +200 -0
  33. package/src/lib/classBuilder.test/classBuilder.test.interface.ts +17 -0
  34. package/src/lib/classBuilder.test/classBuilder.test.specification.ts +112 -0
  35. package/src/lib/classBuilder.test/classBuilder.test.ts +14 -0
  36. package/src/lib/classBuilder.test/classBuilder.test.types.ts +72 -0
  37. package/src/lib/core.test/MockCore.ts +49 -0
  38. package/src/lib/core.test/core.test.implementation.ts +129 -0
  39. package/src/lib/core.test/core.test.interface.ts +18 -0
  40. package/src/lib/core.test/core.test.specification.ts +99 -0
  41. package/src/lib/core.test/core.test.ts +15 -0
  42. package/src/lib/core.test/core.test.types.ts +68 -0
  43. package/src/lib/core.ts +1 -1
  44. package/src/lib/pmProxy.test/implementation.ts +104 -0
  45. package/src/lib/pmProxy.test/index.ts +19 -0
  46. package/src/lib/pmProxy.test/interface.ts +47 -0
  47. package/src/lib/pmProxy.test/mockPM.ts +38 -0
  48. package/src/lib/pmProxy.test/mockPMBase.ts +136 -0
  49. package/src/lib/pmProxy.test/specification.ts +123 -0
  50. package/src/lib/pmProxy.test/types.ts +45 -0
  51. package/src/lib/pmProxy.ts +40 -193
  52. package/testeranto/bundles/node/allTests/chunk-2FXOXAKZ.mjs +800 -0
  53. package/testeranto/bundles/node/allTests/chunk-5MQGD4WC.mjs +251 -0
  54. package/testeranto/bundles/node/allTests/chunk-6CGAD2FD.mjs +800 -0
  55. package/testeranto/bundles/node/allTests/chunk-DWKHII32.mjs +800 -0
  56. package/testeranto/bundles/node/allTests/chunk-KYSOR62N.mjs +167 -0
  57. package/testeranto/bundles/node/allTests/chunk-PRPFVO6G.mjs +251 -0
  58. package/testeranto/bundles/node/allTests/chunk-RX4SUFXQ.mjs +251 -0
  59. package/testeranto/bundles/node/allTests/chunk-UED26IMH.mjs +802 -0
  60. package/testeranto/bundles/node/allTests/chunk-VAAIAWXC.mjs +117 -0
  61. package/testeranto/bundles/node/allTests/chunk-W44DUDBK.mjs +251 -0
  62. package/testeranto/bundles/node/allTests/chunk-YI3EGRMQ.mjs +167 -0
  63. package/testeranto/bundles/node/allTests/metafile.json +1072 -222
  64. package/testeranto/bundles/node/allTests/src/PM/__tests__/nodeSidecar.testeranto.mjs +2 -1
  65. package/testeranto/bundles/node/allTests/src/PM/__tests__/pureSidecar.testeranto.mjs +2 -1
  66. package/testeranto/bundles/node/allTests/src/PM/__tests__/webSidecar.testeranto.mjs +2 -1
  67. package/testeranto/bundles/node/allTests/src/Pure.test.mjs +261 -0
  68. package/testeranto/bundles/node/allTests/src/lib/BaseSuite.test.mjs +22 -4
  69. package/testeranto/bundles/node/allTests/src/lib/baseBuilder.test/baseBuilder.test.mjs +226 -0
  70. package/testeranto/bundles/node/allTests/src/lib/classBuilder.test/classBuilder.test.mjs +406 -0
  71. package/testeranto/bundles/node/allTests/src/lib/core.test/core.test.mjs +279 -0
  72. package/testeranto/bundles/node/allTests/src/lib/pmProxy.test/index.mjs +4479 -0
  73. package/testeranto/bundles/node/allTests/src/mothership/test.mjs +4 -2
  74. package/testeranto/reports/allTests/config.json +40 -1
  75. package/testeranto/reports/allTests/src/PM/__tests__/nodeSidecar.testeranto/node/console_log.txt +0 -0
  76. package/testeranto/reports/allTests/src/PM/__tests__/nodeSidecar.testeranto/node/log.txt +0 -0
  77. package/testeranto/reports/allTests/src/Pure.test/node/console_log.txt +17 -0
  78. package/testeranto/reports/allTests/src/Pure.test/node/dev.html +21 -0
  79. package/testeranto/reports/allTests/src/Pure.test/node/index.html +21 -0
  80. package/testeranto/reports/allTests/src/Pure.test/node/lint_errors.json +134 -0
  81. package/testeranto/reports/allTests/src/Pure.test/node/message +1 -0
  82. package/testeranto/reports/allTests/src/Pure.test/node/prompt.txt +7 -0
  83. package/testeranto/reports/allTests/src/Pure.test/node/type_errors.txt +26 -0
  84. package/testeranto/reports/allTests/src/lib/BaseGiven.test/node/dev.html +21 -0
  85. package/testeranto/reports/allTests/src/lib/BaseGiven.test/node/index.html +21 -0
  86. package/testeranto/reports/allTests/src/lib/BaseSuite.test/node/console_log.txt +27 -27
  87. package/testeranto/reports/allTests/src/lib/BaseSuite.test/node/lint_errors.json +104 -104
  88. package/testeranto/reports/allTests/src/lib/BaseSuite.test/node/type_errors.txt +47 -22
  89. package/testeranto/reports/allTests/src/lib/BaseThen.test/node/dev.html +21 -0
  90. package/testeranto/reports/allTests/src/lib/BaseThen.test/node/index.html +21 -0
  91. package/testeranto/reports/allTests/src/lib/BaseWhen.test/node/dev.html +21 -0
  92. package/testeranto/reports/allTests/src/lib/BaseWhen.test/node/index.html +21 -0
  93. package/testeranto/reports/allTests/src/lib/abstractBase/index/node/dev.html +21 -0
  94. package/testeranto/reports/allTests/src/lib/abstractBase/index/node/index.html +21 -0
  95. package/testeranto/reports/allTests/src/lib/baseBuilder/baseBuilder.test/node/dev.html +21 -0
  96. package/testeranto/reports/allTests/src/lib/baseBuilder/baseBuilder.test/node/index.html +21 -0
  97. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test/node/console_log.txt +12 -0
  98. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test/node/dev.html +21 -0
  99. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test/node/index.html +21 -0
  100. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test/node/lint_errors.json +966 -0
  101. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test/node/message +1 -0
  102. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test/node/prompt.txt +11 -0
  103. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test/node/type_errors.txt +52 -0
  104. package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/console_log.txt +17 -0
  105. package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/dev.html +21 -0
  106. package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/index.html +21 -0
  107. package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/lint_errors.json +771 -0
  108. package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/message +1 -0
  109. package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/prompt.txt +11 -0
  110. package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/type_errors.txt +67 -0
  111. package/testeranto/reports/allTests/src/lib/core.test/core.test/node/console_log.txt +17 -0
  112. package/testeranto/reports/allTests/src/lib/core.test/core.test/node/dev.html +21 -0
  113. package/testeranto/reports/allTests/src/lib/core.test/core.test/node/index.html +21 -0
  114. package/testeranto/reports/allTests/src/lib/core.test/core.test/node/lint_errors.json +416 -0
  115. package/testeranto/reports/allTests/src/lib/core.test/core.test/node/message +1 -0
  116. package/testeranto/reports/allTests/src/lib/core.test/core.test/node/prompt.txt +11 -0
  117. package/testeranto/reports/allTests/src/lib/core.test/core.test/node/type_errors.txt +54 -0
  118. package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/console_log.txt +43 -0
  119. package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/dev.html +21 -0
  120. package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/index.html +21 -0
  121. package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/lint_errors.json +319 -0
  122. package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/log.txt +0 -0
  123. package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/message +1 -0
  124. package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/prompt.txt +10 -0
  125. package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/type_errors.txt +64 -0
  126. package/testeranto/reports/allTests/src/mothership/test/node/console_log.txt +44 -0
  127. package/testeranto/reports/allTests/src/mothership/test/node/log.txt +0 -0
  128. package/testeranto/reports/allTests/summary.json +76 -6
  129. package/testeranto/reportsnode_build_errors +12 -0
  130. 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
+ );