testeranto 0.172.0 → 0.173.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/README.md +2 -4
- package/dist/common/src/PM/base.js +4 -0
- package/dist/common/src/PM/main.js +11 -4
- package/dist/common/src/PM/node.js +1 -1
- package/dist/common/src/PM/web.js +3 -3
- package/dist/common/src/ReportServer.js +2 -126
- package/dist/common/src/ReportServer.test.ts/index.js +78 -0
- package/dist/common/src/ReportServerLib.js +135 -0
- package/dist/common/src/components/pure/ProjectPageView.test/implementation.js +1 -1
- package/dist/common/src/lib/abstractBase.js +2 -0
- package/dist/common/src/lib/baseBuilder.test/baseBuilder.test.implementation.js +10 -9
- package/dist/common/src/lib/baseBuilder.test/baseBuilder.test.specification.js +7 -7
- package/dist/common/src/lib/basebuilder.js +8 -2
- package/dist/common/src/lib/pmProxy.js +54 -150
- package/dist/common/testeranto.config.js +35 -20
- package/dist/common/tsconfig.common.tsbuildinfo +1 -1
- package/dist/module/src/PM/base.js +4 -0
- package/dist/module/src/PM/main.js +11 -4
- package/dist/module/src/PM/node.js +1 -1
- package/dist/module/src/PM/web.js +3 -3
- package/dist/module/src/ReportServer.js +2 -123
- package/dist/module/src/ReportServer.test.ts/index.js +73 -0
- package/dist/module/src/ReportServerLib.js +128 -0
- package/dist/module/src/TestPage.js +29 -17
- package/dist/module/src/components/pure/ProjectPageView.test/implementation.js +1 -1
- package/dist/module/src/components/pure/TestPageView.js +29 -17
- package/dist/module/src/lib/abstractBase.js +2 -0
- package/dist/module/src/lib/baseBuilder.test/baseBuilder.test.implementation.js +10 -9
- package/dist/module/src/lib/baseBuilder.test/baseBuilder.test.specification.js +7 -7
- package/dist/module/src/lib/basebuilder.js +8 -2
- package/dist/module/src/lib/pmProxy.js +54 -150
- package/dist/module/testeranto.config.js +35 -20
- package/dist/module/tsconfig.module.tsbuildinfo +1 -1
- package/dist/prebuild/App.js +3 -3
- package/dist/prebuild/ReportServer.mjs +15 -9
- package/dist/prebuild/run.mjs +14 -4
- package/dist/types/src/PM/node.d.ts +1 -1
- package/dist/types/src/PM/web.d.ts +1 -1
- package/dist/types/src/ReportServer.test.ts/index.d.ts +29 -0
- package/dist/types/src/ReportServerLib.d.ts +2 -0
- package/dist/types/src/Types.d.ts +0 -1
- package/dist/types/src/components/pure/ProjectPageView.test/index.d.ts +2 -1
- package/dist/types/src/lib/abstractBase.d.ts +1 -1
- package/dist/types/src/lib/baseBuilder.test/baseBuilder.test.types.d.ts +7 -4
- package/dist/types/tsconfig.types.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/src/PM/base.ts +5 -0
- package/src/PM/main.ts +12 -4
- package/src/PM/node.ts +1 -1
- package/src/PM/web.ts +3 -3
- package/src/ReportServer.test.ts/index.ts +194 -0
- package/src/ReportServer.ts +2 -132
- package/src/ReportServerLib.ts +144 -0
- package/src/TestPage.tsx +65 -5
- package/src/Types.ts +0 -1
- package/src/components/pure/ProjectPageView.test/implementation.tsx +1 -1
- package/src/components/pure/TestPageView.tsx +65 -5
- package/src/lib/abstractBase.ts +4 -1
- package/src/lib/baseBuilder.test/baseBuilder.test.implementation.ts +22 -10
- package/src/lib/baseBuilder.test/baseBuilder.test.specification.ts +9 -9
- package/src/lib/baseBuilder.test/baseBuilder.test.types.ts +7 -4
- package/src/lib/basebuilder.ts +7 -4
- package/src/lib/pmProxy.ts +78 -155
- package/testeranto/App.js +3 -3
- package/testeranto/bundles/node/allTests/metafile.json +38 -781
- package/testeranto/bundles/node/allTests/src/lib/baseBuilder.test/baseBuilder.test.node.mjs +983 -24
- package/testeranto/bundles/node/core/metafile.json +486 -0
- package/testeranto/bundles/{pure/allTests/chunk-VMUSFSZM.mjs → node/core/src/lib/baseBuilder.test/baseBuilder.test.node.mjs} +797 -412
- package/testeranto/bundles/node/staticSite/metafile.json +593 -0
- package/testeranto/bundles/node/staticSite/src/ReportServer.test.ts/index.mjs +1594 -0
- package/testeranto/bundles/pure/allTests/metafile.json +122 -550
- package/testeranto/bundles/pure/allTests/src/lib/baseBuilder.test/baseBuilder.test.pure.mjs +740 -27
- package/testeranto/bundles/pure/core/metafile.json +626 -0
- package/testeranto/bundles/{node/allTests/chunk-E75CSRER.mjs → pure/core/src/lib/baseBuilder.test/baseBuilder.test.pure.mjs} +777 -483
- package/testeranto/bundles/pure/staticSite/metafile.json +8 -0
- package/testeranto/bundles/web/allTests/metafile.json +777 -22
- package/testeranto/bundles/web/allTests/src/lib/baseBuilder.test/baseBuilder.test.web.mjs +893 -45
- package/testeranto/bundles/web/core/metafile.json +780 -0
- package/testeranto/bundles/web/core/src/lib/baseBuilder.test/baseBuilder.test.web.html +19 -0
- package/testeranto/bundles/web/{allTests/chunk-U7AW26HL.mjs → core/src/lib/baseBuilder.test/baseBuilder.test.web.mjs} +506 -411
- package/testeranto/bundles/web/staticSite/metafile.json +8 -0
- package/testeranto/projects.json +2 -1
- package/testeranto/reports/allTests/config.json +0 -64
- package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.node/node/lint_errors.txt +2 -0
- package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.node/node/logs.txt +11 -13
- package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.node/node/prompt.txt +10 -0
- package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.node/node/suite-0/given-testInitialization/then-0/butThen/hello.txt +1 -0
- package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.node/node/tests.json +10 -18
- package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.node/node/type_errors.txt +25 -13
- package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.pure/pure/lint_errors.txt +2 -0
- package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.pure/pure/prompt.txt +8 -0
- package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.pure/pure/type_errors.txt +24 -12
- package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.web/web/lint_errors.txt +2 -0
- package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.web/web/logs.txt +49 -55
- package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.web/web/prompt.txt +12 -2
- package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.web/web/suite-0/given-testInitialization/then-0/butThen/hello.txt +1 -0
- package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.web/web/tests.json +10 -18
- package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.web/web/type_errors.txt +24 -12
- package/testeranto/reports/allTests/summary.json +6 -62
- package/testeranto/reports/core/config.json +24 -0
- package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.node/node/lint_errors.txt +2 -0
- package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.node/node/logs.txt +32 -0
- package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.node/node/message.txt +2 -0
- package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.node/node/prompt.txt +26 -0
- package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.node/node/suite-0/given-testInitialization/then-0/butThen/hello.txt +1 -0
- package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.node/node/tests.json +69 -0
- package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.node/node/type_errors.txt +74 -0
- package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.pure/pure/lint_errors.txt +2 -0
- package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.pure/pure/message.txt +2 -0
- package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.pure/pure/prompt.txt +26 -0
- package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.pure/pure/type_errors.txt +74 -0
- package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.web/web/lint_errors.txt +2 -0
- package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.web/web/logs.txt +61 -0
- package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.web/web/message.txt +2 -0
- package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.web/web/prompt.txt +26 -0
- package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.web/web/suite-0/given-testInitialization/then-0/butThen/hello.txt +1 -0
- package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.web/web/tests.json +69 -0
- package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.web/web/type_errors.txt +74 -0
- package/testeranto/reports/core/summary.json +23 -0
- package/testeranto/reports/staticSite/config.json +24 -0
- package/testeranto/reports/staticSite/src/ReportServer.test.ts/index/node/lint_errors.txt +5 -0
- package/testeranto/reports/staticSite/src/ReportServer.test.ts/index/node/logs.txt +44 -0
- package/testeranto/reports/staticSite/src/ReportServer.test.ts/index/node/message.txt +2 -0
- package/testeranto/reports/staticSite/src/ReportServer.test.ts/index/node/prompt.txt +23 -0
- package/testeranto/reports/{allTests/src/lib/core.test/core.test → staticSite/src/ReportServer.test.ts/index}/node/type_errors.txt +21 -32
- package/testeranto/reports/staticSite/summary.json +9 -0
- package/testeranto/reportsnode_build_errors +8 -11
- package/testeranto.config.ts +37 -20
- package/testeranto/bundles/node/allTests/chunk-3EUGBAOM.mjs +0 -113
- package/testeranto/bundles/node/allTests/chunk-M6DO7VMB.mjs +0 -252
- package/testeranto/bundles/node/allTests/src/lib/BaseSuite.test/node.test.mjs +0 -323
- package/testeranto/bundles/node/allTests/src/lib/classBuilder.test/classBuilder.test.mjs +0 -411
- package/testeranto/bundles/node/allTests/src/lib/core.test/core.test.mjs +0 -528
- package/testeranto/bundles/node/allTests/src/lib/pmProxy.test/index.mjs +0 -4752
- package/testeranto/bundles/pure/allTests/chunk-KHDVEHF7.mjs +0 -185
- package/testeranto/bundles/pure/allTests/src/Pure.test.mjs +0 -429
- package/testeranto/bundles/pure/allTests/src/lib/BaseSuite.test/pure.test.mjs +0 -425
- package/testeranto/bundles/web/allTests/chunk-HPYA4YZC.mjs +0 -2283
- package/testeranto/bundles/web/allTests/src/components/pure/ProjectPageView.test/index.html +0 -19
- package/testeranto/bundles/web/allTests/src/components/pure/ProjectPageView.test/index.mjs +0 -37524
- package/testeranto/bundles/web/allTests/src/lib/BaseSuite.test/web.test.html +0 -19
- package/testeranto/bundles/web/allTests/src/lib/BaseSuite.test/web.test.mjs +0 -440
- package/testeranto/reports/allTests/src/Pure.test/pure/lint_errors.txt +0 -0
- package/testeranto/reports/allTests/src/Pure.test/pure/message.txt +0 -2
- package/testeranto/reports/allTests/src/Pure.test/pure/prompt.txt +0 -13
- package/testeranto/reports/allTests/src/Pure.test/pure/type_errors.txt +0 -101
- package/testeranto/reports/allTests/src/components/pure/ProjectPageView.test/index/web/lint_errors.txt +0 -13
- package/testeranto/reports/allTests/src/components/pure/ProjectPageView.test/index/web/logs.txt +0 -50
- package/testeranto/reports/allTests/src/components/pure/ProjectPageView.test/index/web/message.txt +0 -2
- package/testeranto/reports/allTests/src/components/pure/ProjectPageView.test/index/web/prompt.txt +0 -17
- package/testeranto/reports/allTests/src/components/pure/ProjectPageView.test/index/web/tests.json +0 -32
- package/testeranto/reports/allTests/src/components/pure/ProjectPageView.test/index/web/type_errors.txt +0 -68
- package/testeranto/reports/allTests/src/lib/BaseSuite.test/node.test/node/lint_errors.txt +0 -0
- package/testeranto/reports/allTests/src/lib/BaseSuite.test/node.test/node/logs.txt +0 -52
- package/testeranto/reports/allTests/src/lib/BaseSuite.test/node.test/node/message.txt +0 -2
- package/testeranto/reports/allTests/src/lib/BaseSuite.test/node.test/node/prompt.txt +0 -13
- package/testeranto/reports/allTests/src/lib/BaseSuite.test/node.test/node/tests.json +0 -31
- package/testeranto/reports/allTests/src/lib/BaseSuite.test/node.test/node/type_errors.txt +0 -111
- package/testeranto/reports/allTests/src/lib/BaseSuite.test/pure.test/pure/bdd_errors.txt +0 -1
- package/testeranto/reports/allTests/src/lib/BaseSuite.test/pure.test/pure/lint_errors.txt +0 -0
- package/testeranto/reports/allTests/src/lib/BaseSuite.test/pure.test/pure/message.txt +0 -2
- package/testeranto/reports/allTests/src/lib/BaseSuite.test/pure.test/pure/prompt.txt +0 -14
- package/testeranto/reports/allTests/src/lib/BaseSuite.test/pure.test/pure/tests.json +0 -31
- package/testeranto/reports/allTests/src/lib/BaseSuite.test/pure.test/pure/type_errors.txt +0 -111
- package/testeranto/reports/allTests/src/lib/BaseSuite.test/web.test/web/bdd_errors.txt +0 -1
- package/testeranto/reports/allTests/src/lib/BaseSuite.test/web.test/web/lint_errors.txt +0 -0
- package/testeranto/reports/allTests/src/lib/BaseSuite.test/web.test/web/logs.txt +0 -108
- package/testeranto/reports/allTests/src/lib/BaseSuite.test/web.test/web/message.txt +0 -2
- package/testeranto/reports/allTests/src/lib/BaseSuite.test/web.test/web/prompt.txt +0 -14
- package/testeranto/reports/allTests/src/lib/BaseSuite.test/web.test/web/tests.json +0 -31
- package/testeranto/reports/allTests/src/lib/BaseSuite.test/web.test/web/type_errors.txt +0 -111
- package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/bdd_errors.txt +0 -1
- package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/lint_errors.txt +0 -0
- package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/logs.txt +0 -700
- package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/message.txt +0 -2
- package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/prompt.txt +0 -16
- package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/tests.json +0 -164
- package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/type_errors.txt +0 -138
- package/testeranto/reports/allTests/src/lib/core.test/core.test/node/lint_errors.txt +0 -21
- package/testeranto/reports/allTests/src/lib/core.test/core.test/node/logs.txt +0 -7
- package/testeranto/reports/allTests/src/lib/core.test/core.test/node/message.txt +0 -2
- package/testeranto/reports/allTests/src/lib/core.test/core.test/node/prompt.txt +0 -18
- package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/bdd_errors.txt +0 -1
- package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/lint_errors.txt +0 -20
- package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/logs.txt +0 -31
- package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/message.txt +0 -2
- package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/prompt.txt +0 -16
- package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/tests.json +0 -134
- package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/type_errors.txt +0 -76
- package/testeranto/reportspure_build_errors +0 -343
- package/testeranto/reportsweb_build_errors +0 -25
- /package/testeranto/reports/{allTests/src/components/pure/ProjectPageView.test/index/web → core/src/lib/baseBuilder.test/baseBuilder.test.node/node}/bdd_errors.txt +0 -0
- /package/testeranto/reports/{allTests/src/lib/BaseSuite.test/node.test/node → core/src/lib/baseBuilder.test/baseBuilder.test.web/web}/bdd_errors.txt +0 -0
package/README.md
CHANGED
|
@@ -34,6 +34,8 @@
|
|
|
34
34
|
|
|
35
35
|
## Quick Start
|
|
36
36
|
|
|
37
|
+
0. Install Aider and signup for a LLM service.
|
|
38
|
+
|
|
37
39
|
1. Install testeranto:
|
|
38
40
|
|
|
39
41
|
```bash
|
|
@@ -92,7 +94,6 @@ yarn t-build rectangle.test.ts yourProject once && yarn t-run rectangle.test.ts
|
|
|
92
94
|
| `yarn t-build <YOUR_TESTS> dev\|once` | Build test bundles (watch or single-run mode) |
|
|
93
95
|
| `yarn t-run <YOUR_TESTS> dev\|once` | Run tests (watch or single-run mode) |
|
|
94
96
|
| `yarn t-report` | Launch test report server |
|
|
95
|
-
| `yarn t-aider` | Fix failing tests with AI |
|
|
96
97
|
|
|
97
98
|
## Example workflow:
|
|
98
99
|
|
|
@@ -111,9 +112,6 @@ yarn t-run test/rectangle.test.ts dev
|
|
|
111
112
|
# Or for single-run mode:
|
|
112
113
|
yarn t-build test/rectangle.test.ts once
|
|
113
114
|
yarn t-run test/rectangle.test.ts once
|
|
114
|
-
|
|
115
|
-
# Get AI help with failures
|
|
116
|
-
yarn t-aider
|
|
117
115
|
```
|
|
118
116
|
|
|
119
117
|
## Aider
|
|
@@ -119,6 +119,10 @@ class PM_Base {
|
|
|
119
119
|
return false;
|
|
120
120
|
}
|
|
121
121
|
async writeFileSync(filepath, contents, testName) {
|
|
122
|
+
console.log("writeFileSync");
|
|
123
|
+
console.log("filepath", filepath);
|
|
124
|
+
console.log("contents", contents);
|
|
125
|
+
console.log("testName", testName);
|
|
122
126
|
return new Promise(async (res) => {
|
|
123
127
|
fs_1.default.mkdirSync(path_1.default.dirname(filepath), {
|
|
124
128
|
recursive: true,
|
|
@@ -108,10 +108,12 @@ function isValidUrl(string) {
|
|
|
108
108
|
}
|
|
109
109
|
// Wait for file to exist, checks every 2 seconds by default
|
|
110
110
|
async function pollForFile(path, timeout = 2000) {
|
|
111
|
+
console.log(`pollForFile: ${path}...`);
|
|
111
112
|
const intervalObj = setInterval(function () {
|
|
112
113
|
const file = path;
|
|
113
114
|
const fileExists = fs_1.default.existsSync(file);
|
|
114
115
|
if (fileExists) {
|
|
116
|
+
console.log(`metafile found: ${path}!`);
|
|
115
117
|
clearInterval(intervalObj);
|
|
116
118
|
}
|
|
117
119
|
}, timeout);
|
|
@@ -320,7 +322,12 @@ class PM_Main extends PM_WithEslintAndTsc_js_1.PM_WithEslintAndTsc {
|
|
|
320
322
|
const ipcfile = "/tmp/tpipe_" + Math.random();
|
|
321
323
|
const child = (0, node_child_process_1.spawn)("node",
|
|
322
324
|
// "node",
|
|
323
|
-
[
|
|
325
|
+
[
|
|
326
|
+
// "--inspect-brk",
|
|
327
|
+
builtfile,
|
|
328
|
+
testResources,
|
|
329
|
+
ipcfile,
|
|
330
|
+
], {
|
|
324
331
|
stdio: ["pipe", "pipe", "pipe", "ipc"],
|
|
325
332
|
});
|
|
326
333
|
let buffer = new Buffer("");
|
|
@@ -797,7 +804,7 @@ class PM_Main extends PM_WithEslintAndTsc_js_1.PM_WithEslintAndTsc {
|
|
|
797
804
|
close();
|
|
798
805
|
});
|
|
799
806
|
page.on("console", (log) => {
|
|
800
|
-
console.log("console message: ", log.text());
|
|
807
|
+
// console.log("console message: ", log.text());
|
|
801
808
|
if (oStream.closed) {
|
|
802
809
|
console.log("missed console message: ", log.text());
|
|
803
810
|
return;
|
|
@@ -1034,9 +1041,9 @@ class PM_Main extends PM_WithEslintAndTsc_js_1.PM_WithEslintAndTsc {
|
|
|
1034
1041
|
slowMo: 1,
|
|
1035
1042
|
waitForInitialPage: false,
|
|
1036
1043
|
executablePath,
|
|
1037
|
-
headless:
|
|
1044
|
+
headless: true,
|
|
1038
1045
|
dumpio: false,
|
|
1039
|
-
devtools:
|
|
1046
|
+
devtools: false,
|
|
1040
1047
|
args: [
|
|
1041
1048
|
"--disable-features=site-per-process",
|
|
1042
1049
|
"--allow-file-access-from-files",
|
|
@@ -114,7 +114,7 @@ class PM_Node extends _1.PM {
|
|
|
114
114
|
async write(uid, contents) {
|
|
115
115
|
return await this.send("write", ...arguments);
|
|
116
116
|
}
|
|
117
|
-
async writeFileSync(filepath, contents) {
|
|
117
|
+
async writeFileSync([filepath, contents]) {
|
|
118
118
|
return await this.send("writeFileSync", this.testResourceConfiguration.fs + "/" + filepath, contents, this.testResourceConfiguration.name);
|
|
119
119
|
}
|
|
120
120
|
async createWriteStream(filepath) {
|
|
@@ -70,8 +70,8 @@ class PM_Web extends _1.PM {
|
|
|
70
70
|
customScreenShot(x, y) {
|
|
71
71
|
const opts = x[0];
|
|
72
72
|
const page = x[1];
|
|
73
|
-
console.log("customScreenShot 2 opts", opts);
|
|
74
|
-
console.log("customScreenShot 2 page", page);
|
|
73
|
+
// console.log("customScreenShot 2 opts", opts);
|
|
74
|
+
// console.log("customScreenShot 2 page", page);
|
|
75
75
|
return window["customScreenShot"](Object.assign(Object.assign({}, opts), { path: this.testResourceConfiguration.fs + "/" + opts.path }), this.testResourceConfiguration.name, page);
|
|
76
76
|
}
|
|
77
77
|
existsSync(destFolder) {
|
|
@@ -83,7 +83,7 @@ class PM_Web extends _1.PM {
|
|
|
83
83
|
write(uid, contents) {
|
|
84
84
|
return window["write"](uid, contents);
|
|
85
85
|
}
|
|
86
|
-
writeFileSync(filepath, contents) {
|
|
86
|
+
writeFileSync([filepath, contents]) {
|
|
87
87
|
return window["writeFileSync"](this.testResourceConfiguration.fs + "/" + filepath, contents, this.testResourceConfiguration.name);
|
|
88
88
|
}
|
|
89
89
|
createWriteStream(filepath) {
|
|
@@ -1,129 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
// simple http server to preview reports
|
|
3
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
-
};
|
|
6
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
const
|
|
8
|
-
|
|
9
|
-
const path_1 = __importDefault(require("path"));
|
|
10
|
-
const fs_1 = __importDefault(require("fs"));
|
|
11
|
-
const fileServer = new node_static_1.default.Server("./", {
|
|
12
|
-
cache: false,
|
|
13
|
-
headers: {
|
|
14
|
-
"Cache-Control": "no-cache, no-store, must-revalidate",
|
|
15
|
-
"Pragma": "no-cache",
|
|
16
|
-
"Expires": "0"
|
|
17
|
-
}
|
|
18
|
-
});
|
|
19
|
-
const server = http_1.default.createServer((req, res) => {
|
|
20
|
-
// Handle potential double responses
|
|
21
|
-
let responded = false;
|
|
22
|
-
const safeResponse = (handler) => {
|
|
23
|
-
if (responded)
|
|
24
|
-
return;
|
|
25
|
-
responded = true;
|
|
26
|
-
try {
|
|
27
|
-
handler();
|
|
28
|
-
}
|
|
29
|
-
catch (err) {
|
|
30
|
-
console.error('Error handling request:', err);
|
|
31
|
-
if (!res.headersSent) {
|
|
32
|
-
res.writeHead(500);
|
|
33
|
-
}
|
|
34
|
-
res.end('Internal Server Error');
|
|
35
|
-
}
|
|
36
|
-
};
|
|
37
|
-
req.on('error', (err) => {
|
|
38
|
-
console.error('Request error:', err);
|
|
39
|
-
safeResponse(() => {
|
|
40
|
-
if (!res.headersSent) {
|
|
41
|
-
res.writeHead(400);
|
|
42
|
-
}
|
|
43
|
-
res.end('Bad Request');
|
|
44
|
-
});
|
|
45
|
-
});
|
|
46
|
-
req.on('end', () => {
|
|
47
|
-
safeResponse(() => {
|
|
48
|
-
const filePath = path_1.default.join(process.cwd(), req.url || '');
|
|
49
|
-
// First check if file exists
|
|
50
|
-
fs_1.default.stat(filePath, (err, stats) => {
|
|
51
|
-
if (err || !stats.isFile()) {
|
|
52
|
-
// Check if directory exists
|
|
53
|
-
fs_1.default.stat(filePath, (dirErr, dirStats) => {
|
|
54
|
-
if (!dirErr && dirStats.isDirectory()) {
|
|
55
|
-
// Serve directory listing
|
|
56
|
-
fs_1.default.readdir(filePath, (readErr, files) => {
|
|
57
|
-
if (readErr) {
|
|
58
|
-
res.writeHead(500);
|
|
59
|
-
return res.end('Error reading directory');
|
|
60
|
-
}
|
|
61
|
-
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
62
|
-
res.write(`
|
|
63
|
-
<html>
|
|
64
|
-
<head>
|
|
65
|
-
<title>Directory Listing: ${req.url}</title>
|
|
66
|
-
<style>
|
|
67
|
-
body { font-family: sans-serif; margin: 2rem; }
|
|
68
|
-
h1 { color: #333; }
|
|
69
|
-
ul { list-style: none; padding: 0; }
|
|
70
|
-
li { padding: 0.5rem; }
|
|
71
|
-
li a { color: #0366d6; text-decoration: none; }
|
|
72
|
-
li a:hover { text-decoration: underline; }
|
|
73
|
-
</style>
|
|
74
|
-
</head>
|
|
75
|
-
<body>
|
|
76
|
-
<h1>Directory: ${req.url}</h1>
|
|
77
|
-
<ul>
|
|
78
|
-
${files.map(file => `
|
|
79
|
-
<li>
|
|
80
|
-
<a href="${path_1.default.join(req.url || '', file)}">
|
|
81
|
-
${file}${file.endsWith('/') ? '/' : ''}
|
|
82
|
-
</a>
|
|
83
|
-
</li>
|
|
84
|
-
`).join('')}
|
|
85
|
-
</ul>
|
|
86
|
-
</body>
|
|
87
|
-
</html>
|
|
88
|
-
`);
|
|
89
|
-
res.end();
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
else {
|
|
93
|
-
// Neither file nor directory exists - send 404
|
|
94
|
-
if (!res.headersSent) {
|
|
95
|
-
res.writeHead(404, { 'Content-Type': 'text/plain' });
|
|
96
|
-
res.end('File not found');
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
});
|
|
100
|
-
return;
|
|
101
|
-
}
|
|
102
|
-
// File exists - serve it through node-static
|
|
103
|
-
const serve = () => {
|
|
104
|
-
fileServer.serve(req, res, (err) => {
|
|
105
|
-
if (err && !res.headersSent) {
|
|
106
|
-
res.writeHead(err.status || 500);
|
|
107
|
-
res.end(err.message);
|
|
108
|
-
}
|
|
109
|
-
});
|
|
110
|
-
};
|
|
111
|
-
// Ensure we don't double-serve
|
|
112
|
-
if (!res.headersSent) {
|
|
113
|
-
serve();
|
|
114
|
-
}
|
|
115
|
-
});
|
|
116
|
-
});
|
|
117
|
-
});
|
|
118
|
-
req.resume();
|
|
119
|
-
});
|
|
120
|
-
server.listen(8080, () => {
|
|
121
|
-
console.log('Server running on http://localhost:8080');
|
|
122
|
-
console.log('Serving files from:', process.cwd());
|
|
123
|
-
});
|
|
124
|
-
server.on('error', (err) => {
|
|
125
|
-
console.error('Server error:', err);
|
|
126
|
-
});
|
|
127
|
-
process.on('uncaughtException', (err) => {
|
|
128
|
-
console.error('Uncaught exception:', err);
|
|
129
|
-
});
|
|
4
|
+
const ReportServerLib_1 = require("./ReportServerLib");
|
|
5
|
+
(0, ReportServerLib_1.ReportServerOfPort)(process.argv[2]);
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
4
|
+
/* eslint-disable @typescript-eslint/no-empty-object-type */
|
|
5
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
const Node_1 = __importDefault(require("../Node"));
|
|
10
|
+
const ReportServerLib_1 = require("../ReportServerLib");
|
|
11
|
+
const specification = (Suite, Given, When, Then) => [
|
|
12
|
+
Suite.Default("the http server which is used in development", {
|
|
13
|
+
initialization: Given["the http server which is used in development"](["It should serve the front page", "It should serve the ReportApp"], [], [
|
|
14
|
+
Then["the frontpage looks good"](),
|
|
15
|
+
// Then["the projects page looks good"](),
|
|
16
|
+
// Then["a project page looks good"](),
|
|
17
|
+
// Then["a test page looks good"](),
|
|
18
|
+
]),
|
|
19
|
+
}),
|
|
20
|
+
];
|
|
21
|
+
const implementation = {
|
|
22
|
+
suites: {
|
|
23
|
+
Default: "the http server which is used in development",
|
|
24
|
+
},
|
|
25
|
+
givens: {
|
|
26
|
+
"the http server which is used in development": function (subject) {
|
|
27
|
+
// throw new Error("Function not implemented.");
|
|
28
|
+
return subject;
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
// There are no "whens", it is a stateless server.
|
|
32
|
+
whens: {},
|
|
33
|
+
thens: {
|
|
34
|
+
"the frontpage looks good": async (port, utils) => {
|
|
35
|
+
// throw new Error("Function not implemented.");
|
|
36
|
+
// utils.newPage(`localhost:${port}`);
|
|
37
|
+
debugger;
|
|
38
|
+
const page = await utils.newPage();
|
|
39
|
+
utils.goto(page, `localhost:${port}`);
|
|
40
|
+
utils.customScreenShot({ path: `frontpage.png` }, page);
|
|
41
|
+
return;
|
|
42
|
+
},
|
|
43
|
+
"the projects page looks good": function () {
|
|
44
|
+
throw new Error("Function not implemented.");
|
|
45
|
+
},
|
|
46
|
+
"a project page looks good": function () {
|
|
47
|
+
throw new Error("Function not implemented.");
|
|
48
|
+
},
|
|
49
|
+
"a test page looks good": function () {
|
|
50
|
+
throw new Error("Function not implemented.");
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
const adapter = {
|
|
55
|
+
assertThis: function (x) {
|
|
56
|
+
throw new Error("Function not implemented.");
|
|
57
|
+
},
|
|
58
|
+
andWhen: function (store, whenCB, testResource, pm) {
|
|
59
|
+
throw new Error("Function not implemented.");
|
|
60
|
+
},
|
|
61
|
+
butThen: function (store, thenCB, testResource, pm) {
|
|
62
|
+
throw new Error("Function not implemented.");
|
|
63
|
+
},
|
|
64
|
+
afterAll: function (store, pm) {
|
|
65
|
+
throw new Error("Function not implemented.");
|
|
66
|
+
},
|
|
67
|
+
afterEach: function (store, key, pm) {
|
|
68
|
+
throw new Error("Function not implemented.");
|
|
69
|
+
},
|
|
70
|
+
beforeAll: async function (input, testResource, pm) {
|
|
71
|
+
await new Promise((res, rej) => input(testResource.ports[0]));
|
|
72
|
+
return testResource.ports[0];
|
|
73
|
+
},
|
|
74
|
+
beforeEach: function (subject, initializer, testResource, initialValues, pm) {
|
|
75
|
+
throw new Error("Function not implemented.");
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
exports.default = (0, Node_1.default)(ReportServerLib_1.ReportServerOfPort, specification, implementation, adapter);
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// simple http server to preview reports
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.ReportServerOfPort = void 0;
|
|
8
|
+
const node_static_1 = __importDefault(require("node-static"));
|
|
9
|
+
const http_1 = __importDefault(require("http"));
|
|
10
|
+
const path_1 = __importDefault(require("path"));
|
|
11
|
+
const fs_1 = __importDefault(require("fs"));
|
|
12
|
+
const fileServer = new node_static_1.default.Server("./", {
|
|
13
|
+
cache: false,
|
|
14
|
+
headers: {
|
|
15
|
+
"Cache-Control": "no-cache, no-store, must-revalidate",
|
|
16
|
+
Pragma: "no-cache",
|
|
17
|
+
Expires: "0",
|
|
18
|
+
},
|
|
19
|
+
});
|
|
20
|
+
const server = http_1.default.createServer((req, res) => {
|
|
21
|
+
// Handle potential double responses
|
|
22
|
+
let responded = false;
|
|
23
|
+
const safeResponse = (handler) => {
|
|
24
|
+
if (responded)
|
|
25
|
+
return;
|
|
26
|
+
responded = true;
|
|
27
|
+
try {
|
|
28
|
+
handler();
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
console.error("Error handling request:", err);
|
|
32
|
+
if (!res.headersSent) {
|
|
33
|
+
res.writeHead(500);
|
|
34
|
+
}
|
|
35
|
+
res.end("Internal Server Error");
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
req.on("error", (err) => {
|
|
39
|
+
console.error("Request error:", err);
|
|
40
|
+
safeResponse(() => {
|
|
41
|
+
if (!res.headersSent) {
|
|
42
|
+
res.writeHead(400);
|
|
43
|
+
}
|
|
44
|
+
res.end("Bad Request");
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
req.on("end", () => {
|
|
48
|
+
safeResponse(() => {
|
|
49
|
+
const filePath = path_1.default.join(process.cwd(), req.url || "");
|
|
50
|
+
// First check if file exists
|
|
51
|
+
fs_1.default.stat(filePath, (err, stats) => {
|
|
52
|
+
if (err || !stats.isFile()) {
|
|
53
|
+
// Check if directory exists
|
|
54
|
+
fs_1.default.stat(filePath, (dirErr, dirStats) => {
|
|
55
|
+
if (!dirErr && dirStats.isDirectory()) {
|
|
56
|
+
// Serve directory listing
|
|
57
|
+
fs_1.default.readdir(filePath, (readErr, files) => {
|
|
58
|
+
if (readErr) {
|
|
59
|
+
res.writeHead(500);
|
|
60
|
+
return res.end("Error reading directory");
|
|
61
|
+
}
|
|
62
|
+
res.writeHead(200, { "Content-Type": "text/html" });
|
|
63
|
+
res.write(`
|
|
64
|
+
<html>
|
|
65
|
+
<head>
|
|
66
|
+
<title>Directory Listing: ${req.url}</title>
|
|
67
|
+
<style>
|
|
68
|
+
body { font-family: sans-serif; margin: 2rem; }
|
|
69
|
+
h1 { color: #333; }
|
|
70
|
+
ul { list-style: none; padding: 0; }
|
|
71
|
+
li { padding: 0.5rem; }
|
|
72
|
+
li a { color: #0366d6; text-decoration: none; }
|
|
73
|
+
li a:hover { text-decoration: underline; }
|
|
74
|
+
</style>
|
|
75
|
+
</head>
|
|
76
|
+
<body>
|
|
77
|
+
<h1>Directory: ${req.url}</h1>
|
|
78
|
+
<ul>
|
|
79
|
+
${files
|
|
80
|
+
.map((file) => `
|
|
81
|
+
<li>
|
|
82
|
+
<a href="${path_1.default.join(req.url || "", file)}">
|
|
83
|
+
${file}${file.endsWith("/") ? "/" : ""}
|
|
84
|
+
</a>
|
|
85
|
+
</li>
|
|
86
|
+
`)
|
|
87
|
+
.join("")}
|
|
88
|
+
</ul>
|
|
89
|
+
</body>
|
|
90
|
+
</html>
|
|
91
|
+
`);
|
|
92
|
+
res.end();
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
// Neither file nor directory exists - send 404
|
|
97
|
+
if (!res.headersSent) {
|
|
98
|
+
res.writeHead(404, { "Content-Type": "text/plain" });
|
|
99
|
+
res.end("File not found");
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
// File exists - serve it through node-static
|
|
106
|
+
const serve = () => {
|
|
107
|
+
fileServer.serve(req, res, (err) => {
|
|
108
|
+
if (err && !res.headersSent) {
|
|
109
|
+
res.writeHead(err.status || 500);
|
|
110
|
+
res.end(err.message);
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
};
|
|
114
|
+
// Ensure we don't double-serve
|
|
115
|
+
if (!res.headersSent) {
|
|
116
|
+
serve();
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
req.resume();
|
|
122
|
+
});
|
|
123
|
+
server.on("error", (err) => {
|
|
124
|
+
console.error("Server error:", err);
|
|
125
|
+
});
|
|
126
|
+
process.on("uncaughtException", (err) => {
|
|
127
|
+
console.error("Uncaught exception:", err);
|
|
128
|
+
});
|
|
129
|
+
const start = (port) => server.listen(port, () => {
|
|
130
|
+
console.log(`Server running on http://localhost:${port}`);
|
|
131
|
+
console.log("Serving files from:", process.cwd());
|
|
132
|
+
});
|
|
133
|
+
const ReportServerOfPort = (port) => start(port);
|
|
134
|
+
exports.ReportServerOfPort = ReportServerOfPort;
|
|
135
|
+
// export default () => start(process.argv[2]);
|
|
@@ -38,7 +38,7 @@ exports.implementation = {
|
|
|
38
38
|
thens: {
|
|
39
39
|
happyPath: () => async ({ container, html }, pm) => {
|
|
40
40
|
console.group('[Test] Verifying render output');
|
|
41
|
-
debugger
|
|
41
|
+
// debugger
|
|
42
42
|
const p = await pm.page();
|
|
43
43
|
await pm.customScreenShot({ path: "happyPath.png" }, p);
|
|
44
44
|
chai_1.assert.equal(1, 1);
|
|
@@ -7,6 +7,8 @@ const pmProxy_js_1 = require("./pmProxy.js");
|
|
|
7
7
|
class BaseGiven {
|
|
8
8
|
addArtifact(path) {
|
|
9
9
|
console.log(`[Artifact] Adding to ${this.constructor.name}:`, path);
|
|
10
|
+
// console.log("mark111");
|
|
11
|
+
// process.exit();
|
|
10
12
|
this.artifacts.push(path);
|
|
11
13
|
}
|
|
12
14
|
constructor(name, features, whens, thens, givenCB, initialValues) {
|
|
@@ -8,7 +8,7 @@ exports.implementation = {
|
|
|
8
8
|
Default: "BaseBuilder test suite",
|
|
9
9
|
},
|
|
10
10
|
givens: {
|
|
11
|
-
|
|
11
|
+
"the default BaseBuilder": () => {
|
|
12
12
|
return new baseBuilder_test_mock_1.MockBaseBuilder({}, // input
|
|
13
13
|
{}, // suitesOverrides
|
|
14
14
|
{}, // givenOverrides
|
|
@@ -18,11 +18,11 @@ exports.implementation = {
|
|
|
18
18
|
() => [] // testSpecification
|
|
19
19
|
);
|
|
20
20
|
},
|
|
21
|
-
|
|
22
|
-
return new baseBuilder_test_mock_1.MockBaseBuilder(input, {}, {}, {}, {}, {
|
|
21
|
+
"a BaseBuilder with TestInput": (input) => {
|
|
22
|
+
return new baseBuilder_test_mock_1.MockBaseBuilder(input, {}, {}, {}, {}, { ports: [] }, () => []);
|
|
23
23
|
},
|
|
24
|
-
|
|
25
|
-
return new baseBuilder_test_mock_1.MockBaseBuilder({}, {}, {}, {}, {},
|
|
24
|
+
"a BaseBuilder with Test Resource Requirements": (requirements) => {
|
|
25
|
+
return new baseBuilder_test_mock_1.MockBaseBuilder({}, {}, {}, {}, {}, requirements, () => []);
|
|
26
26
|
},
|
|
27
27
|
},
|
|
28
28
|
whens: {
|
|
@@ -36,8 +36,9 @@ exports.implementation = {
|
|
|
36
36
|
},
|
|
37
37
|
},
|
|
38
38
|
thens: {
|
|
39
|
-
|
|
39
|
+
"it is initialized": () => (builder, utils) => {
|
|
40
40
|
var _a;
|
|
41
|
+
utils.writeFileSync("hello.txt", "world");
|
|
41
42
|
if (!(builder instanceof basebuilder_1.BaseBuilder)) {
|
|
42
43
|
console.error("Builder instance:", builder);
|
|
43
44
|
throw new Error(`Builder was not properly initialized - expected BaseBuilder instance but got ${(_a = builder === null || builder === void 0 ? void 0 : builder.constructor) === null || _a === void 0 ? void 0 : _a.name}`);
|
|
@@ -58,19 +59,19 @@ exports.implementation = {
|
|
|
58
59
|
});
|
|
59
60
|
return builder;
|
|
60
61
|
},
|
|
61
|
-
|
|
62
|
+
"it generates TestSpecifications": () => (builder) => {
|
|
62
63
|
if (!Array.isArray(builder.specs)) {
|
|
63
64
|
throw new Error("Specs were not generated");
|
|
64
65
|
}
|
|
65
66
|
return builder;
|
|
66
67
|
},
|
|
67
|
-
|
|
68
|
+
"it creates jobs": () => (builder) => {
|
|
68
69
|
if (!Array.isArray(builder.testJobs)) {
|
|
69
70
|
throw new Error("Test jobs were not created");
|
|
70
71
|
}
|
|
71
72
|
return builder;
|
|
72
73
|
},
|
|
73
|
-
|
|
74
|
+
"it tracks artifacts": () => (builder) => {
|
|
74
75
|
if (!Array.isArray(builder.artifacts)) {
|
|
75
76
|
throw new Error("Artifacts array not initialized");
|
|
76
77
|
}
|
|
@@ -4,14 +4,14 @@ exports.specification = void 0;
|
|
|
4
4
|
const specification = (Suite, Given, When, Then) => {
|
|
5
5
|
return [
|
|
6
6
|
Suite.Default("Testing BaseBuilder functionality", {
|
|
7
|
-
testInitialization: Given
|
|
8
|
-
Then
|
|
9
|
-
Then
|
|
10
|
-
Then
|
|
11
|
-
Then
|
|
7
|
+
testInitialization: Given["the default BaseBuilder"](["BaseBuilder should initialize correctly"], [], [
|
|
8
|
+
Then["it is initialized"](),
|
|
9
|
+
Then["it tracks artifacts"](),
|
|
10
|
+
// Then["it creates jobs"](),
|
|
11
|
+
// Then["it generates TestSpecifications"](),
|
|
12
12
|
]),
|
|
13
|
-
testSpecsGeneration: Given
|
|
14
|
-
testJobsCreation: Given
|
|
13
|
+
testSpecsGeneration: Given["the default BaseBuilder"](["BaseBuilder should generate specs from test specification"], [], [Then["it generates TestSpecifications"]()]),
|
|
14
|
+
testJobsCreation: Given["the default BaseBuilder"](["BaseBuilder should create test jobs"], [], [Then["it creates jobs"]()]),
|
|
15
15
|
}),
|
|
16
16
|
];
|
|
17
17
|
};
|
|
@@ -45,8 +45,14 @@ class BaseBuilder {
|
|
|
45
45
|
// res(true);
|
|
46
46
|
// });
|
|
47
47
|
const fails = suiteDone.fails;
|
|
48
|
-
await puppetMaster.writeFileSync(
|
|
49
|
-
|
|
48
|
+
await puppetMaster.writeFileSync([
|
|
49
|
+
`bdd_errors.txt`,
|
|
50
|
+
fails.toString(),
|
|
51
|
+
]);
|
|
52
|
+
await puppetMaster.writeFileSync([
|
|
53
|
+
`tests.json`,
|
|
54
|
+
JSON.stringify(this.toObj(), null, 2),
|
|
55
|
+
]);
|
|
50
56
|
return {
|
|
51
57
|
failed: fails > 0,
|
|
52
58
|
fails,
|