testeranto 0.172.0 → 0.177.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 (203) hide show
  1. package/README.md +2 -4
  2. package/dist/common/src/PM/base.js +5 -1
  3. package/dist/common/src/PM/main.js +57 -54
  4. package/dist/common/src/PM/node.js +4 -1
  5. package/dist/common/src/PM/pure.js +4 -1
  6. package/dist/common/src/PM/web.js +6 -3
  7. package/dist/common/src/Pure.js +0 -4
  8. package/dist/common/src/Pure.test.js +1 -1
  9. package/dist/common/src/ReportServer.js +2 -126
  10. package/dist/common/src/ReportServer.test.ts/index.js +78 -0
  11. package/dist/common/src/ReportServerLib.js +141 -0
  12. package/dist/common/src/components/pure/ProjectPageView.test/implementation.js +1 -1
  13. package/dist/common/src/esbuildConfigs/node.js +1 -3
  14. package/dist/common/src/lib/BaseSuite.js +13 -11
  15. package/dist/common/src/lib/abstractBase.js +39 -40
  16. package/dist/common/src/lib/baseBuilder.test/baseBuilder.test.implementation.js +10 -9
  17. package/dist/common/src/lib/baseBuilder.test/baseBuilder.test.specification.js +7 -7
  18. package/dist/common/src/lib/basebuilder.js +13 -2
  19. package/dist/common/src/lib/core.js +1 -0
  20. package/dist/common/src/lib/pmProxy.js +215 -201
  21. package/dist/common/src/lib/pmProxy.test/adapter.js +2 -2
  22. package/dist/common/src/lib/pmProxy.test/implementation.js +1 -1
  23. package/dist/common/testeranto.config.js +47 -32
  24. package/dist/common/tsconfig.common.tsbuildinfo +1 -1
  25. package/dist/module/src/PM/base.js +5 -1
  26. package/dist/module/src/PM/main.js +22 -19
  27. package/dist/module/src/PM/node.js +4 -1
  28. package/dist/module/src/PM/pure.js +4 -1
  29. package/dist/module/src/PM/web.js +6 -3
  30. package/dist/module/src/Pure.js +0 -4
  31. package/dist/module/src/Pure.test.js +1 -1
  32. package/dist/module/src/ReportServer.js +2 -123
  33. package/dist/module/src/ReportServer.test.ts/index.js +73 -0
  34. package/dist/module/src/ReportServerLib.js +134 -0
  35. package/dist/module/src/TestPage.js +29 -17
  36. package/dist/module/src/components/pure/ProjectPageView.test/implementation.js +1 -1
  37. package/dist/module/src/components/pure/TestPageView.js +29 -17
  38. package/dist/module/src/esbuildConfigs/node.js +1 -3
  39. package/dist/module/src/lib/BaseSuite.js +13 -11
  40. package/dist/module/src/lib/abstractBase.js +39 -40
  41. package/dist/module/src/lib/baseBuilder.test/baseBuilder.test.implementation.js +10 -9
  42. package/dist/module/src/lib/baseBuilder.test/baseBuilder.test.specification.js +7 -7
  43. package/dist/module/src/lib/basebuilder.js +13 -2
  44. package/dist/module/src/lib/core.js +1 -0
  45. package/dist/module/src/lib/pmProxy.js +215 -201
  46. package/dist/module/src/lib/pmProxy.test/adapter.js +2 -2
  47. package/dist/module/src/lib/pmProxy.test/implementation.js +1 -1
  48. package/dist/module/testeranto.config.js +47 -32
  49. package/dist/module/tsconfig.module.tsbuildinfo +1 -1
  50. package/dist/prebuild/App.js +3 -3
  51. package/dist/prebuild/ReportServer.mjs +21 -9
  52. package/dist/prebuild/build.mjs +1 -1
  53. package/dist/prebuild/run.mjs +27 -20
  54. package/dist/types/src/PM/base.d.ts +1 -1
  55. package/dist/types/src/PM/node.d.ts +1 -1
  56. package/dist/types/src/PM/pure.d.ts +1 -1
  57. package/dist/types/src/PM/web.d.ts +1 -1
  58. package/dist/types/src/ReportServer.test.ts/index.d.ts +29 -0
  59. package/dist/types/src/ReportServerLib.d.ts +1 -0
  60. package/dist/types/src/Types.d.ts +0 -1
  61. package/dist/types/src/components/pure/ProjectPageView.test/index.d.ts +2 -1
  62. package/dist/types/src/lib/BaseSuite.d.ts +2 -0
  63. package/dist/types/src/lib/abstractBase.d.ts +5 -7
  64. package/dist/types/src/lib/baseBuilder.test/baseBuilder.test.types.d.ts +7 -4
  65. package/dist/types/src/lib/pmProxy.d.ts +3 -3
  66. package/dist/types/tsconfig.types.tsbuildinfo +1 -1
  67. package/package.json +3 -3
  68. package/src/PM/base.ts +7 -5
  69. package/src/PM/main.ts +26 -21
  70. package/src/PM/node.ts +6 -1
  71. package/src/PM/pure.ts +6 -1
  72. package/src/PM/web.ts +7 -3
  73. package/src/Pure.test.ts +6 -6
  74. package/src/Pure.ts +0 -8
  75. package/src/ReportServer.test.ts/index.ts +194 -0
  76. package/src/ReportServer.ts +2 -132
  77. package/src/ReportServerLib.ts +147 -0
  78. package/src/TestPage.tsx +65 -5
  79. package/src/Types.ts +0 -1
  80. package/src/components/pure/ProjectPageView.test/implementation.tsx +1 -1
  81. package/src/components/pure/TestPageView.tsx +65 -5
  82. package/src/esbuildConfigs/node.ts +1 -1
  83. package/src/lib/BaseSuite.ts +16 -21
  84. package/src/lib/abstractBase.ts +59 -48
  85. package/src/lib/baseBuilder.test/baseBuilder.test.implementation.ts +22 -10
  86. package/src/lib/baseBuilder.test/baseBuilder.test.specification.ts +9 -9
  87. package/src/lib/baseBuilder.test/baseBuilder.test.types.ts +7 -4
  88. package/src/lib/basebuilder.ts +13 -4
  89. package/src/lib/core.ts +1 -0
  90. package/src/lib/pmProxy.test/adapter.ts +2 -2
  91. package/src/lib/pmProxy.test/implementation.ts +3 -3
  92. package/src/lib/pmProxy.test/types.ts +0 -2
  93. package/src/lib/pmProxy.ts +135 -80
  94. package/testeranto/App.js +3 -3
  95. package/testeranto/bundles/node/core/metafile.json +8 -0
  96. package/testeranto/bundles/pure/core/metafile.json +8 -0
  97. package/testeranto/bundles/web/core/metafile.json +15086 -0
  98. package/testeranto/bundles/web/{allTests → core}/src/components/pure/ProjectPageView.test/index.html +1 -1
  99. package/testeranto/bundles/web/{allTests → core}/src/components/pure/ProjectPageView.test/index.mjs +4109 -1642
  100. package/testeranto/projects.json +1 -1
  101. package/testeranto/reports/core/config.json +24 -0
  102. package/testeranto/reports/{allTests → core}/src/components/pure/ProjectPageView.test/index/web/lint_errors.txt +6 -1
  103. package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/logs.txt +59 -0
  104. package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/message.txt +2 -0
  105. package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/prompt.txt +27 -0
  106. package/testeranto/reports/core/src/components/pure/ProjectPageView.test/index/web/suite-0/given-basicRender/then-0/butThen/happyPath.png +0 -0
  107. package/testeranto/reports/{allTests → core}/src/components/pure/ProjectPageView.test/index/web/type_errors.txt +15 -33
  108. package/testeranto/reports/core/summary.json +9 -0
  109. package/testeranto.config.ts +49 -32
  110. package/tsc.log +78 -92
  111. package/testeranto/bundles/node/allTests/chunk-3EUGBAOM.mjs +0 -113
  112. package/testeranto/bundles/node/allTests/chunk-E75CSRER.mjs +0 -800
  113. package/testeranto/bundles/node/allTests/chunk-M6DO7VMB.mjs +0 -252
  114. package/testeranto/bundles/node/allTests/metafile.json +0 -1229
  115. package/testeranto/bundles/node/allTests/src/lib/BaseSuite.test/node.test.mjs +0 -323
  116. package/testeranto/bundles/node/allTests/src/lib/baseBuilder.test/baseBuilder.test.node.mjs +0 -223
  117. package/testeranto/bundles/node/allTests/src/lib/classBuilder.test/classBuilder.test.mjs +0 -411
  118. package/testeranto/bundles/node/allTests/src/lib/core.test/core.test.mjs +0 -528
  119. package/testeranto/bundles/node/allTests/src/lib/pmProxy.test/index.mjs +0 -4752
  120. package/testeranto/bundles/pure/allTests/chunk-KHDVEHF7.mjs +0 -185
  121. package/testeranto/bundles/pure/allTests/chunk-VMUSFSZM.mjs +0 -797
  122. package/testeranto/bundles/pure/allTests/metafile.json +0 -1054
  123. package/testeranto/bundles/pure/allTests/src/Pure.test.mjs +0 -429
  124. package/testeranto/bundles/pure/allTests/src/lib/BaseSuite.test/pure.test.mjs +0 -425
  125. package/testeranto/bundles/pure/allTests/src/lib/baseBuilder.test/baseBuilder.test.pure.mjs +0 -381
  126. package/testeranto/bundles/web/allTests/chunk-HPYA4YZC.mjs +0 -2283
  127. package/testeranto/bundles/web/allTests/chunk-U7AW26HL.mjs +0 -997
  128. package/testeranto/bundles/web/allTests/metafile.json +0 -25
  129. package/testeranto/bundles/web/allTests/src/lib/BaseSuite.test/web.test.html +0 -19
  130. package/testeranto/bundles/web/allTests/src/lib/BaseSuite.test/web.test.mjs +0 -440
  131. package/testeranto/bundles/web/allTests/src/lib/baseBuilder.test/baseBuilder.test.web.html +0 -19
  132. package/testeranto/bundles/web/allTests/src/lib/baseBuilder.test/baseBuilder.test.web.mjs +0 -244
  133. package/testeranto/reports/allTests/config.json +0 -104
  134. package/testeranto/reports/allTests/src/Pure.test/pure/lint_errors.txt +0 -0
  135. package/testeranto/reports/allTests/src/Pure.test/pure/message.txt +0 -2
  136. package/testeranto/reports/allTests/src/Pure.test/pure/prompt.txt +0 -13
  137. package/testeranto/reports/allTests/src/Pure.test/pure/type_errors.txt +0 -101
  138. package/testeranto/reports/allTests/src/components/pure/ProjectPageView.test/index/web/bdd_errors.txt +0 -1
  139. package/testeranto/reports/allTests/src/components/pure/ProjectPageView.test/index/web/logs.txt +0 -50
  140. package/testeranto/reports/allTests/src/components/pure/ProjectPageView.test/index/web/message.txt +0 -2
  141. package/testeranto/reports/allTests/src/components/pure/ProjectPageView.test/index/web/prompt.txt +0 -17
  142. package/testeranto/reports/allTests/src/components/pure/ProjectPageView.test/index/web/tests.json +0 -32
  143. package/testeranto/reports/allTests/src/lib/BaseSuite.test/node.test/node/bdd_errors.txt +0 -1
  144. package/testeranto/reports/allTests/src/lib/BaseSuite.test/node.test/node/lint_errors.txt +0 -0
  145. package/testeranto/reports/allTests/src/lib/BaseSuite.test/node.test/node/logs.txt +0 -52
  146. package/testeranto/reports/allTests/src/lib/BaseSuite.test/node.test/node/message.txt +0 -2
  147. package/testeranto/reports/allTests/src/lib/BaseSuite.test/node.test/node/prompt.txt +0 -13
  148. package/testeranto/reports/allTests/src/lib/BaseSuite.test/node.test/node/tests.json +0 -31
  149. package/testeranto/reports/allTests/src/lib/BaseSuite.test/node.test/node/type_errors.txt +0 -111
  150. package/testeranto/reports/allTests/src/lib/BaseSuite.test/pure.test/pure/bdd_errors.txt +0 -1
  151. package/testeranto/reports/allTests/src/lib/BaseSuite.test/pure.test/pure/lint_errors.txt +0 -0
  152. package/testeranto/reports/allTests/src/lib/BaseSuite.test/pure.test/pure/message.txt +0 -2
  153. package/testeranto/reports/allTests/src/lib/BaseSuite.test/pure.test/pure/prompt.txt +0 -14
  154. package/testeranto/reports/allTests/src/lib/BaseSuite.test/pure.test/pure/tests.json +0 -31
  155. package/testeranto/reports/allTests/src/lib/BaseSuite.test/pure.test/pure/type_errors.txt +0 -111
  156. package/testeranto/reports/allTests/src/lib/BaseSuite.test/web.test/web/bdd_errors.txt +0 -1
  157. package/testeranto/reports/allTests/src/lib/BaseSuite.test/web.test/web/lint_errors.txt +0 -0
  158. package/testeranto/reports/allTests/src/lib/BaseSuite.test/web.test/web/logs.txt +0 -108
  159. package/testeranto/reports/allTests/src/lib/BaseSuite.test/web.test/web/message.txt +0 -2
  160. package/testeranto/reports/allTests/src/lib/BaseSuite.test/web.test/web/prompt.txt +0 -14
  161. package/testeranto/reports/allTests/src/lib/BaseSuite.test/web.test/web/tests.json +0 -31
  162. package/testeranto/reports/allTests/src/lib/BaseSuite.test/web.test/web/type_errors.txt +0 -111
  163. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.node/node/bdd_errors.txt +0 -1
  164. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.node/node/lint_errors.txt +0 -0
  165. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.node/node/logs.txt +0 -35
  166. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.node/node/message.txt +0 -2
  167. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.node/node/prompt.txt +0 -16
  168. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.node/node/tests.json +0 -77
  169. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.node/node/type_errors.txt +0 -62
  170. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.pure/pure/lint_errors.txt +0 -0
  171. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.pure/pure/message.txt +0 -2
  172. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.pure/pure/prompt.txt +0 -18
  173. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.pure/pure/type_errors.txt +0 -62
  174. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.web/web/bdd_errors.txt +0 -1
  175. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.web/web/lint_errors.txt +0 -0
  176. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.web/web/logs.txt +0 -69
  177. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.web/web/message.txt +0 -2
  178. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.web/web/prompt.txt +0 -16
  179. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.web/web/tests.json +0 -77
  180. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.web/web/type_errors.txt +0 -62
  181. package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/bdd_errors.txt +0 -1
  182. package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/lint_errors.txt +0 -0
  183. package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/logs.txt +0 -700
  184. package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/message.txt +0 -2
  185. package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/prompt.txt +0 -16
  186. package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/tests.json +0 -164
  187. package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/type_errors.txt +0 -138
  188. package/testeranto/reports/allTests/src/lib/core.test/core.test/node/lint_errors.txt +0 -21
  189. package/testeranto/reports/allTests/src/lib/core.test/core.test/node/logs.txt +0 -7
  190. package/testeranto/reports/allTests/src/lib/core.test/core.test/node/message.txt +0 -2
  191. package/testeranto/reports/allTests/src/lib/core.test/core.test/node/prompt.txt +0 -18
  192. package/testeranto/reports/allTests/src/lib/core.test/core.test/node/type_errors.txt +0 -63
  193. package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/bdd_errors.txt +0 -1
  194. package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/lint_errors.txt +0 -20
  195. package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/logs.txt +0 -31
  196. package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/message.txt +0 -2
  197. package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/prompt.txt +0 -16
  198. package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/tests.json +0 -134
  199. package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/type_errors.txt +0 -76
  200. package/testeranto/reports/allTests/summary.json +0 -79
  201. package/testeranto/reportsnode_build_errors +0 -20
  202. package/testeranto/reportspure_build_errors +0 -343
  203. package/testeranto/reportsweb_build_errors +0 -25
@@ -0,0 +1,147 @@
1
+ // simple http server to preview reports
2
+
3
+ import staticServer from "node-static";
4
+ import http from "http";
5
+ import path from "path";
6
+ import fs from "fs";
7
+
8
+ const fileServer = new staticServer.Server("./", {
9
+ cache: false,
10
+ headers: {
11
+ "Cache-Control": "no-cache, no-store, must-revalidate",
12
+ Pragma: "no-cache",
13
+ Expires: "0",
14
+ },
15
+ });
16
+
17
+ const server = http.createServer((req, res) => {
18
+ // Handle potential double responses
19
+ let responded = false;
20
+
21
+ const safeResponse = (handler: () => void) => {
22
+ if (responded) return;
23
+ responded = true;
24
+ try {
25
+ handler();
26
+ } catch (err) {
27
+ console.error("Error handling request:", err);
28
+ if (!res.headersSent) {
29
+ res.writeHead(500);
30
+ }
31
+ res.end("Internal Server Error");
32
+ }
33
+ };
34
+
35
+ req.on("error", (err) => {
36
+ console.error("Request error:", err);
37
+ safeResponse(() => {
38
+ if (!res.headersSent) {
39
+ res.writeHead(400);
40
+ }
41
+ res.end("Bad Request");
42
+ });
43
+ });
44
+
45
+ req.on("end", () => {
46
+ safeResponse(() => {
47
+ const filePath = path.join(process.cwd(), req.url || "");
48
+
49
+ // First check if file exists
50
+ fs.stat(filePath, (err, stats) => {
51
+ if (err || !stats.isFile()) {
52
+ // Check if directory exists
53
+ fs.stat(filePath, (dirErr, dirStats) => {
54
+ if (!dirErr && dirStats.isDirectory()) {
55
+ // Serve directory listing
56
+ fs.readdir(filePath, (readErr, files) => {
57
+ if (readErr) {
58
+ res.writeHead(500);
59
+ return res.end("Error reading directory");
60
+ }
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(
81
+ (file) => `
82
+ <li>
83
+ <a href="${path.join(req.url || "", file)}">
84
+ ${file}${file.endsWith("/") ? "/" : ""}
85
+ </a>
86
+ </li>
87
+ `
88
+ )
89
+ .join("")}
90
+ </ul>
91
+ </body>
92
+ </html>
93
+ `);
94
+ res.end();
95
+ });
96
+ } else {
97
+ // Neither file nor directory exists - send 404
98
+ if (!res.headersSent) {
99
+ res.writeHead(404, { "Content-Type": "text/plain" });
100
+ res.end("File not found");
101
+ }
102
+ }
103
+ });
104
+ return;
105
+ }
106
+
107
+ // File exists - serve it through node-static
108
+ const serve = () => {
109
+ fileServer.serve(req, res, (err) => {
110
+ if (err && !res.headersSent) {
111
+ res.writeHead(err.status || 500);
112
+ res.end(err.message);
113
+ }
114
+ });
115
+ };
116
+
117
+ // Ensure we don't double-serve
118
+ if (!res.headersSent) {
119
+ serve();
120
+ }
121
+ });
122
+ });
123
+ });
124
+
125
+ req.resume();
126
+ });
127
+
128
+ server.on("error", (err) => {
129
+ console.error("Server error:", err);
130
+ });
131
+
132
+ process.on("uncaughtException", (err) => {
133
+ console.error("Uncaught exception:", err);
134
+ });
135
+
136
+ const start = (port: number) => {
137
+ if (port) {
138
+ server.listen(port, () => {
139
+ console.log(`Server running on http://localhost:${port}`);
140
+ console.log("Serving files from:", process.cwd());
141
+ });
142
+ } else {
143
+ console.log("you need to specify a port");
144
+ }
145
+ };
146
+
147
+ export const ReportServerOfPort = (port: number) => start(port);
package/src/TestPage.tsx CHANGED
@@ -254,7 +254,27 @@ export const TestPage = () => {
254
254
  <div key={i} className="mb-4 card">
255
255
  <div className="card-header bg-primary text-white">
256
256
  <div className="d-flex justify-content-between align-items-center">
257
- <h4>Given: {given.name}</h4>
257
+ <div>
258
+ <h4>Given: {given.name}</h4>
259
+ {given.features?.length > 0 && (
260
+ <div className="mt-1">
261
+ <small>Features:</small>
262
+ <ul className="list-unstyled">
263
+ {given.features.map((feature, fi) => (
264
+ <li key={fi}>
265
+ {feature.startsWith('http') ? (
266
+ <a href={feature} target="_blank" rel="noopener noreferrer" className="text-white">
267
+ {new URL(feature).hostname}
268
+ </a>
269
+ ) : (
270
+ <span className="text-white">{feature}</span>
271
+ )}
272
+ </li>
273
+ ))}
274
+ </ul>
275
+ </div>
276
+ )}
277
+ </div>
258
278
  {given.artifacts?.length > 0 && (
259
279
  <div className="dropdown">
260
280
  <button
@@ -287,8 +307,28 @@ export const TestPage = () => {
287
307
  <div key={`w-${j}`} className={`p-3 mb-2 ${when.error ? 'bg-danger text-white' : 'bg-success text-white'}`}>
288
308
  <div className="d-flex justify-content-between align-items-start">
289
309
  <div>
290
- <strong>When:</strong> {when.name}
291
- {when.error && <pre className="mt-2">{when.error}</pre>}
310
+ <div>
311
+ <strong>When:</strong> {when.name}
312
+ {when.features?.length > 0 && (
313
+ <div className="mt-2">
314
+ <small>Features:</small>
315
+ <ul className="list-unstyled">
316
+ {when.features.map((feature, fi) => (
317
+ <li key={fi}>
318
+ {feature.startsWith('http') ? (
319
+ <a href={feature} target="_blank" rel="noopener noreferrer">
320
+ {new URL(feature).hostname}
321
+ </a>
322
+ ) : (
323
+ feature
324
+ )}
325
+ </li>
326
+ ))}
327
+ </ul>
328
+ </div>
329
+ )}
330
+ {when.error && <pre className="mt-2">{when.error}</pre>}
331
+ </div>
292
332
  </div>
293
333
  {when.artifacts?.length > 0 && (
294
334
  <div className="ms-3">
@@ -316,8 +356,28 @@ export const TestPage = () => {
316
356
  <div key={`t-${k}`} className={`p-3 mb-2 ${then.error ? 'bg-danger text-white' : 'bg-success text-white'}`}>
317
357
  <div className="d-flex justify-content-between align-items-start">
318
358
  <div>
319
- <strong>Then:</strong> {then.name}
320
- {then.error && <pre className="mt-2">{then.error}</pre>}
359
+ <div>
360
+ <strong>Then:</strong> {then.name}
361
+ {then.features?.length > 0 && (
362
+ <div className="mt-2">
363
+ <small>Features:</small>
364
+ <ul className="list-unstyled">
365
+ {then.features.map((feature, fi) => (
366
+ <li key={fi}>
367
+ {feature.startsWith('http') ? (
368
+ <a href={feature} target="_blank" rel="noopener noreferrer">
369
+ {new URL(feature).hostname}
370
+ </a>
371
+ ) : (
372
+ feature
373
+ )}
374
+ </li>
375
+ ))}
376
+ </ul>
377
+ </div>
378
+ )}
379
+ {then.error && <pre className="mt-2">{then.error}</pre>}
380
+ </div>
321
381
  </div>
322
382
  {then.artifacts?.length > 0 && (
323
383
  <div className="ms-3">
package/src/Types.ts CHANGED
@@ -197,5 +197,4 @@ export type IBuiltConfig = { buildDir: string } & ITestconfig;
197
197
 
198
198
  export type IProject = {
199
199
  projects: Record<string, ITestconfig>;
200
- reportDomain: string;
201
200
  };
@@ -44,7 +44,7 @@ export const implementation: ITestImplementation<I, O, M> = {
44
44
  () =>
45
45
  async ({ container, html }, pm) => {
46
46
  console.group('[Test] Verifying render output');
47
- debugger
47
+ // debugger
48
48
  const p = await pm.page();
49
49
  await pm.customScreenShot({ path: "happyPath.png" }, p);
50
50
 
@@ -125,7 +125,27 @@ export const TestPageView = ({
125
125
  <div key={i} className="mb-4 card">
126
126
  <div className="card-header bg-primary text-white">
127
127
  <div className="d-flex justify-content-between align-items-center">
128
- <h4>Given: {given.name}</h4>
128
+ <div>
129
+ <h4>Given: {given.name}</h4>
130
+ {given.features?.length > 0 && (
131
+ <div className="mt-1">
132
+ <small>Features:</small>
133
+ <ul className="list-unstyled">
134
+ {given.features.map((feature, fi) => (
135
+ <li key={fi}>
136
+ {feature.startsWith('http') ? (
137
+ <a href={feature} target="_blank" rel="noopener noreferrer" className="text-white">
138
+ {new URL(feature).hostname}
139
+ </a>
140
+ ) : (
141
+ <span className="text-white">{feature}</span>
142
+ )}
143
+ </li>
144
+ ))}
145
+ </ul>
146
+ </div>
147
+ )}
148
+ </div>
129
149
  {given.artifacts?.length > 0 && (
130
150
  <div className="dropdown">
131
151
  <button
@@ -158,8 +178,28 @@ export const TestPageView = ({
158
178
  <div key={`w-${j}`} className={`p-3 mb-2 ${when.error ? 'bg-danger text-white' : 'bg-success text-white'}`}>
159
179
  <div className="d-flex justify-content-between align-items-start">
160
180
  <div>
161
- <strong>When:</strong> {when.name}
162
- {when.error && <pre className="mt-2">{when.error}</pre>}
181
+ <div>
182
+ <strong>When:</strong> {when.name}
183
+ {when.features?.length > 0 && (
184
+ <div className="mt-2">
185
+ <small>Features:</small>
186
+ <ul className="list-unstyled">
187
+ {when.features.map((feature, fi) => (
188
+ <li key={fi}>
189
+ {feature.startsWith('http') ? (
190
+ <a href={feature} target="_blank" rel="noopener noreferrer">
191
+ {new URL(feature).hostname}
192
+ </a>
193
+ ) : (
194
+ feature
195
+ )}
196
+ </li>
197
+ ))}
198
+ </ul>
199
+ </div>
200
+ )}
201
+ {when.error && <pre className="mt-2">{when.error}</pre>}
202
+ </div>
163
203
  </div>
164
204
  {when.artifacts?.length > 0 && (
165
205
  <div className="ms-3">
@@ -187,8 +227,28 @@ export const TestPageView = ({
187
227
  <div key={`t-${k}`} className={`p-3 mb-2 ${then.error ? 'bg-danger text-white' : 'bg-success text-white'}`}>
188
228
  <div className="d-flex justify-content-between align-items-start">
189
229
  <div>
190
- <strong>Then:</strong> {then.name}
191
- {then.error && <pre className="mt-2">{then.error}</pre>}
230
+ <div>
231
+ <strong>Then:</strong> {then.name}
232
+ {then.features?.length > 0 && (
233
+ <div className="mt-2">
234
+ <small>Features:</small>
235
+ <ul className="list-unstyled">
236
+ {then.features.map((feature, fi) => (
237
+ <li key={fi}>
238
+ {feature.startsWith('http') ? (
239
+ <a href={feature} target="_blank" rel="noopener noreferrer">
240
+ {new URL(feature).hostname}
241
+ </a>
242
+ ) : (
243
+ feature
244
+ )}
245
+ </li>
246
+ ))}
247
+ </ul>
248
+ </div>
249
+ )}
250
+ {then.error && <pre className="mt-2">{then.error}</pre>}
251
+ </div>
192
252
  </div>
193
253
  {then.artifacts?.length > 0 && (
194
254
  <div className="ms-3">
@@ -23,7 +23,7 @@ export default (
23
23
 
24
24
  outdir: `testeranto/bundles/node/${testName}/`,
25
25
 
26
- // inject: [`./node_modules/testeranto/dist/cjs-shim.js`],
26
+ inject: [`./node_modules/testeranto/dist/cjs-shim.js`],
27
27
  metafile: true,
28
28
  supported: {
29
29
  "dynamic-import": true,
@@ -14,23 +14,24 @@ export abstract class BaseSuite<I extends Ibdd_in_any, O extends Ibdd_out_any> {
14
14
  failed: boolean;
15
15
  fails: number;
16
16
 
17
+ artifacts: string[] = [];
18
+
19
+ addArtifact(path: string) {
20
+ console.log("Suite addArtifact", path);
21
+ const normalizedPath = path.replace(/\\/g, "/"); // Normalize path separators
22
+ this.artifacts.push(normalizedPath);
23
+ }
24
+
17
25
  constructor(name: string, index: number, givens: IGivens<I> = {}) {
18
26
  const suiteName = name || "testSuite"; // Ensure name is never undefined
19
27
  if (!suiteName) {
20
28
  throw new Error("BaseSuite requires a non-empty name");
21
29
  }
22
- console.log(
23
- "[DEBUG] BaseSuite constructor - name:",
24
- suiteName,
25
- "index:",
26
- index
27
- );
30
+
28
31
  this.name = suiteName;
29
32
  this.index = index;
30
33
  this.givens = givens;
31
34
  this.fails = 0;
32
- console.log("[DEBUG] BaseSuite initialized:", this.name, this.index);
33
- console.log("[DEBUG] BaseSuite givens:", Object.keys(givens).toString());
34
35
  }
35
36
 
36
37
  public features() {
@@ -41,10 +42,9 @@ export abstract class BaseSuite<I extends Ibdd_in_any, O extends Ibdd_out_any> {
41
42
  .filter((value, index, array) => {
42
43
  return array.indexOf(value) === index;
43
44
  });
44
- console.debug("[DEBUG] Features extracted:", features.toString());
45
45
  return features || [];
46
46
  } catch (e) {
47
- console.error("[ERROR] Failed to extract features:", e);
47
+ console.error("[ERROR] Failed to extract features:", JSON.stringify(e));
48
48
  return [];
49
49
  }
50
50
  }
@@ -92,15 +92,14 @@ export abstract class BaseSuite<I extends Ibdd_in_any, O extends Ibdd_out_any> {
92
92
  artifactory(`suite-${this.index}-${this.name}/${fPath}`, value);
93
93
 
94
94
  // console.log("\nSuite:", this.index, this.name);
95
- tLog("\nSuite:", this.index, this.name);
95
+ // tLog("\nSuite:", this.index, this.name);
96
96
  const sNdx = this.index;
97
- // const sName = this.name;
98
-
97
+ const proxiedPm = beforeAllProxy(pm, sNdx.toString(), this);
99
98
  const subject = await this.setup(
100
99
  input,
101
100
  suiteArtifactory,
102
101
  testResourceConfiguration,
103
- beforeAllProxy(pm, sNdx.toString())
102
+ proxiedPm
104
103
  );
105
104
 
106
105
  for (const [gKey, g] of Object.entries(this.givens)) {
@@ -119,19 +118,15 @@ export abstract class BaseSuite<I extends Ibdd_in_any, O extends Ibdd_out_any> {
119
118
  .catch((e) => {
120
119
  this.failed = true;
121
120
  this.fails = this.fails + 1;
122
- // console.error("Given error 1:", e.toString());
123
121
  throw e;
124
122
  });
125
123
  }
126
124
 
127
125
  try {
128
- this.afterAll(
129
- this.store,
130
- artifactory,
131
- afterAllProxy(pm, sNdx.toString())
132
- );
126
+ const afterAllPm = afterAllProxy(pm, sNdx.toString(), this);
127
+ this.afterAll(this.store, artifactory, afterAllPm);
133
128
  } catch (e) {
134
- console.error(e);
129
+ console.error(JSON.stringify(e));
135
130
  // this.fails.push(this);
136
131
  // return this;
137
132
  }
@@ -1,6 +1,8 @@
1
1
  /* eslint-disable @typescript-eslint/no-unused-vars */
2
2
  /* eslint-disable @typescript-eslint/no-explicit-any */
3
3
 
4
+ import type { Ibdd_in_any } from "../CoreTypes";
5
+
4
6
  import { ITestArtifactory, ITLog, ITTestResourceConfiguration } from ".";
5
7
  import { IPM } from "./types.js";
6
8
  import {
@@ -9,7 +11,6 @@ import {
9
11
  beforeEachProxy,
10
12
  butThenProxy,
11
13
  } from "./pmProxy.js";
12
- import type { Ibdd_in_any } from "../CoreTypes";
13
14
 
14
15
  export type IGivens<I extends Ibdd_in_any> = Record<string, BaseGiven<I>>;
15
16
 
@@ -27,9 +28,11 @@ export abstract class BaseGiven<I extends Ibdd_in_any> {
27
28
  key: string;
28
29
  failed: boolean;
29
30
  artifacts: string[] = [];
30
- protected addArtifact(path: string) {
31
- console.log(`[Artifact] Adding to ${this.constructor.name}:`, path);
32
- this.artifacts.push(path);
31
+
32
+ addArtifact(path: string) {
33
+ console.log("Given addArtifact", path);
34
+ const normalizedPath = path.replace(/\\/g, "/"); // Normalize path separators
35
+ this.artifacts.push(normalizedPath);
33
36
  }
34
37
 
35
38
  constructor(
@@ -59,7 +62,7 @@ export abstract class BaseGiven<I extends Ibdd_in_any> {
59
62
  whens: this.whens.map((w) => {
60
63
  if (w && w.toObj) return w.toObj();
61
64
 
62
- console.error("w is not as expected!", w.toString());
65
+ console.error("w is not as expected!", JSON.stringify(w));
63
66
  return {};
64
67
  }),
65
68
  thens: this.thens.map((t) => t.toObj()),
@@ -115,9 +118,11 @@ export abstract class BaseGiven<I extends Ibdd_in_any> {
115
118
  });
116
119
 
117
120
  try {
118
- const proxiedPm = beforeEachProxy(pm, suiteNdx.toString());
119
- console.log(`[Given] Setting currentStep for beforeEach:`, this.name);
120
- (proxiedPm as any).currentStep = this;
121
+ const proxiedPm = beforeEachProxy(
122
+ pm,
123
+ suiteNdx.toString(),
124
+ this.addArtifact.bind(this)
125
+ );
121
126
  this.store = await this.givenThat(
122
127
  subject,
123
128
  testResourceConfiguration,
@@ -127,9 +132,9 @@ export abstract class BaseGiven<I extends Ibdd_in_any> {
127
132
  proxiedPm
128
133
  );
129
134
  } catch (e) {
130
- console.error("Given failure: ", e.toString());
131
- this.error = e;
132
- throw e;
135
+ // console.error("Given failure: ", e.stack);
136
+ this.error = e.stack;
137
+ // throw e;
133
138
  }
134
139
 
135
140
  try {
@@ -154,9 +159,6 @@ export abstract class BaseGiven<I extends Ibdd_in_any> {
154
159
  `suite-${suiteNdx}/given-${key}/then-${thenNdx}`
155
160
  );
156
161
  tester(t);
157
- // ((t) => {
158
- // return tester(t);
159
- // })();
160
162
  }
161
163
  } catch (e) {
162
164
  this.failed = true;
@@ -164,21 +166,22 @@ export abstract class BaseGiven<I extends Ibdd_in_any> {
164
166
  throw e;
165
167
  } finally {
166
168
  try {
167
- await this.afterEach(
168
- this.store,
169
- this.key,
170
- givenArtifactory,
171
-
172
- afterEachProxy(pm, suiteNdx.toString(), key)
169
+ const proxiedPm = afterEachProxy(
170
+ pm,
171
+ suiteNdx.toString(),
172
+ key,
173
+ this.addArtifact.bind(this)
173
174
  );
175
+ // (proxiedPm as any).currentStep = this;
176
+ await this.afterEach(this.store, this.key, givenArtifactory, proxiedPm);
174
177
  } catch (e) {
175
- console.error("afterEach failed!", e.toString());
176
178
  this.failed = e;
177
179
  throw e;
178
180
 
179
181
  // this.error = e.message;
180
182
  }
181
183
  }
184
+
182
185
  return this.store;
183
186
  }
184
187
  }
@@ -187,8 +190,15 @@ export abstract class BaseWhen<I extends Ibdd_in_any> {
187
190
  public name: string;
188
191
  whenCB: (x: I["iselection"]) => I["then"];
189
192
  error: Error;
193
+
190
194
  artifacts: string[] = [];
191
195
 
196
+ addArtifact(path: string) {
197
+ console.log("When addArtifact", path);
198
+ const normalizedPath = path.replace(/\\/g, "/"); // Normalize path separators
199
+ this.artifacts.push(normalizedPath);
200
+ }
201
+
192
202
  constructor(name: string, whenCB: (xyz: I["iselection"]) => I["then"]) {
193
203
  this.name = name;
194
204
  this.whenCB = whenCB;
@@ -202,20 +212,18 @@ export abstract class BaseWhen<I extends Ibdd_in_any> {
202
212
  ): Promise<any>;
203
213
 
204
214
  toObj() {
205
- console.log("toObj error", this.error);
206
-
207
- if (this.error) {
208
- return {
209
- name: this.name,
210
- error: this.error && this.error.name + this.error.stack,
211
- artifacts: this.artifacts,
212
- };
213
- } else {
214
- return {
215
- name: this.name,
216
- artifacts: this.artifacts,
217
- };
218
- }
215
+ const obj = {
216
+ name: this.name,
217
+ error: this.error
218
+ ? `${this.error.name}: ${this.error.message}\n${this.error.stack}`
219
+ : null,
220
+ artifacts: this.artifacts || [],
221
+ };
222
+ console.log(
223
+ `[TOOBJ] Serializing ${this.constructor.name} with artifacts:`,
224
+ obj.artifacts
225
+ );
226
+ return obj;
219
227
  }
220
228
 
221
229
  async test(
@@ -226,12 +234,10 @@ export abstract class BaseWhen<I extends Ibdd_in_any> {
226
234
  filepath: string
227
235
  ) {
228
236
  try {
229
- tLog(" When:", this.name);
230
- console.debug("[DEBUG] Executing When step:", this.name.toString());
237
+ // tLog(" When:", this.name);
238
+ const proxiedPm = andWhenProxy(pm, filepath, this.addArtifact.bind(this));
231
239
 
232
- const proxiedPm = andWhenProxy(pm, filepath);
233
- console.log(`[When] Setting currentStep for andWhen:`, this.name);
234
- (proxiedPm as any).currentStep = this;
240
+ // (proxiedPm as any).currentStep = this;
235
241
  const result = await this.andWhen(
236
242
  store,
237
243
  this.whenCB,
@@ -239,9 +245,8 @@ export abstract class BaseWhen<I extends Ibdd_in_any> {
239
245
  proxiedPm
240
246
  );
241
247
 
242
- console.debug("[DEBUG] When step completed:", this.name.toString());
243
248
  return result;
244
- } catch (e: Error) {
249
+ } catch (e: any) {
245
250
  console.error(
246
251
  "[ERROR] When step failed:",
247
252
  this.name.toString(),
@@ -266,14 +271,22 @@ export abstract class BaseThen<I extends Ibdd_in_any> {
266
271
  this.name = name;
267
272
  this.thenCB = thenCB;
268
273
  this.error = false;
274
+ this.artifacts = [];
275
+ }
276
+
277
+ addArtifact(path: string) {
278
+ console.log("Then addArtifact", path);
279
+ const normalizedPath = path.replace(/\\/g, "/"); // Normalize path separators
280
+ this.artifacts.push(normalizedPath);
269
281
  }
270
282
 
271
283
  toObj() {
272
- return {
284
+ const obj = {
273
285
  name: this.name,
274
286
  error: this.error,
275
287
  artifacts: this.artifacts,
276
288
  };
289
+ return obj;
277
290
  }
278
291
 
279
292
  abstract butThen(
@@ -291,9 +304,7 @@ export abstract class BaseThen<I extends Ibdd_in_any> {
291
304
  pm: IPM,
292
305
  filepath: string
293
306
  ): Promise<I["then"] | undefined> {
294
- const proxiedPm = butThenProxy(pm, filepath);
295
- console.log(`[Then] Setting currentStep for butThen:`, this.name);
296
- (proxiedPm as any).currentStep = this;
307
+ const proxiedPm = butThenProxy(pm, filepath, this.addArtifact.bind(this));
297
308
  return this.butThen(
298
309
  store,
299
310
  async (s: I["iselection"]) => {
@@ -304,9 +315,9 @@ export abstract class BaseThen<I extends Ibdd_in_any> {
304
315
  }
305
316
  },
306
317
  testResourceConfiguration,
307
- butThenProxy(pm, filepath)
318
+ proxiedPm
308
319
  ).catch((e) => {
309
- this.error = e.toString();
320
+ this.error = e.stack;
310
321
  // throw e;
311
322
  });
312
323
  }