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.
Files changed (193) hide show
  1. package/README.md +2 -4
  2. package/dist/common/src/PM/base.js +4 -0
  3. package/dist/common/src/PM/main.js +11 -4
  4. package/dist/common/src/PM/node.js +1 -1
  5. package/dist/common/src/PM/web.js +3 -3
  6. package/dist/common/src/ReportServer.js +2 -126
  7. package/dist/common/src/ReportServer.test.ts/index.js +78 -0
  8. package/dist/common/src/ReportServerLib.js +135 -0
  9. package/dist/common/src/components/pure/ProjectPageView.test/implementation.js +1 -1
  10. package/dist/common/src/lib/abstractBase.js +2 -0
  11. package/dist/common/src/lib/baseBuilder.test/baseBuilder.test.implementation.js +10 -9
  12. package/dist/common/src/lib/baseBuilder.test/baseBuilder.test.specification.js +7 -7
  13. package/dist/common/src/lib/basebuilder.js +8 -2
  14. package/dist/common/src/lib/pmProxy.js +54 -150
  15. package/dist/common/testeranto.config.js +35 -20
  16. package/dist/common/tsconfig.common.tsbuildinfo +1 -1
  17. package/dist/module/src/PM/base.js +4 -0
  18. package/dist/module/src/PM/main.js +11 -4
  19. package/dist/module/src/PM/node.js +1 -1
  20. package/dist/module/src/PM/web.js +3 -3
  21. package/dist/module/src/ReportServer.js +2 -123
  22. package/dist/module/src/ReportServer.test.ts/index.js +73 -0
  23. package/dist/module/src/ReportServerLib.js +128 -0
  24. package/dist/module/src/TestPage.js +29 -17
  25. package/dist/module/src/components/pure/ProjectPageView.test/implementation.js +1 -1
  26. package/dist/module/src/components/pure/TestPageView.js +29 -17
  27. package/dist/module/src/lib/abstractBase.js +2 -0
  28. package/dist/module/src/lib/baseBuilder.test/baseBuilder.test.implementation.js +10 -9
  29. package/dist/module/src/lib/baseBuilder.test/baseBuilder.test.specification.js +7 -7
  30. package/dist/module/src/lib/basebuilder.js +8 -2
  31. package/dist/module/src/lib/pmProxy.js +54 -150
  32. package/dist/module/testeranto.config.js +35 -20
  33. package/dist/module/tsconfig.module.tsbuildinfo +1 -1
  34. package/dist/prebuild/App.js +3 -3
  35. package/dist/prebuild/ReportServer.mjs +15 -9
  36. package/dist/prebuild/run.mjs +14 -4
  37. package/dist/types/src/PM/node.d.ts +1 -1
  38. package/dist/types/src/PM/web.d.ts +1 -1
  39. package/dist/types/src/ReportServer.test.ts/index.d.ts +29 -0
  40. package/dist/types/src/ReportServerLib.d.ts +2 -0
  41. package/dist/types/src/Types.d.ts +0 -1
  42. package/dist/types/src/components/pure/ProjectPageView.test/index.d.ts +2 -1
  43. package/dist/types/src/lib/abstractBase.d.ts +1 -1
  44. package/dist/types/src/lib/baseBuilder.test/baseBuilder.test.types.d.ts +7 -4
  45. package/dist/types/tsconfig.types.tsbuildinfo +1 -1
  46. package/package.json +2 -2
  47. package/src/PM/base.ts +5 -0
  48. package/src/PM/main.ts +12 -4
  49. package/src/PM/node.ts +1 -1
  50. package/src/PM/web.ts +3 -3
  51. package/src/ReportServer.test.ts/index.ts +194 -0
  52. package/src/ReportServer.ts +2 -132
  53. package/src/ReportServerLib.ts +144 -0
  54. package/src/TestPage.tsx +65 -5
  55. package/src/Types.ts +0 -1
  56. package/src/components/pure/ProjectPageView.test/implementation.tsx +1 -1
  57. package/src/components/pure/TestPageView.tsx +65 -5
  58. package/src/lib/abstractBase.ts +4 -1
  59. package/src/lib/baseBuilder.test/baseBuilder.test.implementation.ts +22 -10
  60. package/src/lib/baseBuilder.test/baseBuilder.test.specification.ts +9 -9
  61. package/src/lib/baseBuilder.test/baseBuilder.test.types.ts +7 -4
  62. package/src/lib/basebuilder.ts +7 -4
  63. package/src/lib/pmProxy.ts +78 -155
  64. package/testeranto/App.js +3 -3
  65. package/testeranto/bundles/node/allTests/metafile.json +38 -781
  66. package/testeranto/bundles/node/allTests/src/lib/baseBuilder.test/baseBuilder.test.node.mjs +983 -24
  67. package/testeranto/bundles/node/core/metafile.json +486 -0
  68. package/testeranto/bundles/{pure/allTests/chunk-VMUSFSZM.mjs → node/core/src/lib/baseBuilder.test/baseBuilder.test.node.mjs} +797 -412
  69. package/testeranto/bundles/node/staticSite/metafile.json +593 -0
  70. package/testeranto/bundles/node/staticSite/src/ReportServer.test.ts/index.mjs +1594 -0
  71. package/testeranto/bundles/pure/allTests/metafile.json +122 -550
  72. package/testeranto/bundles/pure/allTests/src/lib/baseBuilder.test/baseBuilder.test.pure.mjs +740 -27
  73. package/testeranto/bundles/pure/core/metafile.json +626 -0
  74. package/testeranto/bundles/{node/allTests/chunk-E75CSRER.mjs → pure/core/src/lib/baseBuilder.test/baseBuilder.test.pure.mjs} +777 -483
  75. package/testeranto/bundles/pure/staticSite/metafile.json +8 -0
  76. package/testeranto/bundles/web/allTests/metafile.json +777 -22
  77. package/testeranto/bundles/web/allTests/src/lib/baseBuilder.test/baseBuilder.test.web.mjs +893 -45
  78. package/testeranto/bundles/web/core/metafile.json +780 -0
  79. package/testeranto/bundles/web/core/src/lib/baseBuilder.test/baseBuilder.test.web.html +19 -0
  80. package/testeranto/bundles/web/{allTests/chunk-U7AW26HL.mjs → core/src/lib/baseBuilder.test/baseBuilder.test.web.mjs} +506 -411
  81. package/testeranto/bundles/web/staticSite/metafile.json +8 -0
  82. package/testeranto/projects.json +2 -1
  83. package/testeranto/reports/allTests/config.json +0 -64
  84. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.node/node/lint_errors.txt +2 -0
  85. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.node/node/logs.txt +11 -13
  86. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.node/node/prompt.txt +10 -0
  87. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.node/node/suite-0/given-testInitialization/then-0/butThen/hello.txt +1 -0
  88. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.node/node/tests.json +10 -18
  89. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.node/node/type_errors.txt +25 -13
  90. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.pure/pure/lint_errors.txt +2 -0
  91. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.pure/pure/prompt.txt +8 -0
  92. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.pure/pure/type_errors.txt +24 -12
  93. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.web/web/lint_errors.txt +2 -0
  94. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.web/web/logs.txt +49 -55
  95. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.web/web/prompt.txt +12 -2
  96. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.web/web/suite-0/given-testInitialization/then-0/butThen/hello.txt +1 -0
  97. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.web/web/tests.json +10 -18
  98. package/testeranto/reports/allTests/src/lib/baseBuilder.test/baseBuilder.test.web/web/type_errors.txt +24 -12
  99. package/testeranto/reports/allTests/summary.json +6 -62
  100. package/testeranto/reports/core/config.json +24 -0
  101. package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.node/node/lint_errors.txt +2 -0
  102. package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.node/node/logs.txt +32 -0
  103. package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.node/node/message.txt +2 -0
  104. package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.node/node/prompt.txt +26 -0
  105. package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.node/node/suite-0/given-testInitialization/then-0/butThen/hello.txt +1 -0
  106. package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.node/node/tests.json +69 -0
  107. package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.node/node/type_errors.txt +74 -0
  108. package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.pure/pure/lint_errors.txt +2 -0
  109. package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.pure/pure/message.txt +2 -0
  110. package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.pure/pure/prompt.txt +26 -0
  111. package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.pure/pure/type_errors.txt +74 -0
  112. package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.web/web/lint_errors.txt +2 -0
  113. package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.web/web/logs.txt +61 -0
  114. package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.web/web/message.txt +2 -0
  115. package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.web/web/prompt.txt +26 -0
  116. package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.web/web/suite-0/given-testInitialization/then-0/butThen/hello.txt +1 -0
  117. package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.web/web/tests.json +69 -0
  118. package/testeranto/reports/core/src/lib/baseBuilder.test/baseBuilder.test.web/web/type_errors.txt +74 -0
  119. package/testeranto/reports/core/summary.json +23 -0
  120. package/testeranto/reports/staticSite/config.json +24 -0
  121. package/testeranto/reports/staticSite/src/ReportServer.test.ts/index/node/lint_errors.txt +5 -0
  122. package/testeranto/reports/staticSite/src/ReportServer.test.ts/index/node/logs.txt +44 -0
  123. package/testeranto/reports/staticSite/src/ReportServer.test.ts/index/node/message.txt +2 -0
  124. package/testeranto/reports/staticSite/src/ReportServer.test.ts/index/node/prompt.txt +23 -0
  125. package/testeranto/reports/{allTests/src/lib/core.test/core.test → staticSite/src/ReportServer.test.ts/index}/node/type_errors.txt +21 -32
  126. package/testeranto/reports/staticSite/summary.json +9 -0
  127. package/testeranto/reportsnode_build_errors +8 -11
  128. package/testeranto.config.ts +37 -20
  129. package/testeranto/bundles/node/allTests/chunk-3EUGBAOM.mjs +0 -113
  130. package/testeranto/bundles/node/allTests/chunk-M6DO7VMB.mjs +0 -252
  131. package/testeranto/bundles/node/allTests/src/lib/BaseSuite.test/node.test.mjs +0 -323
  132. package/testeranto/bundles/node/allTests/src/lib/classBuilder.test/classBuilder.test.mjs +0 -411
  133. package/testeranto/bundles/node/allTests/src/lib/core.test/core.test.mjs +0 -528
  134. package/testeranto/bundles/node/allTests/src/lib/pmProxy.test/index.mjs +0 -4752
  135. package/testeranto/bundles/pure/allTests/chunk-KHDVEHF7.mjs +0 -185
  136. package/testeranto/bundles/pure/allTests/src/Pure.test.mjs +0 -429
  137. package/testeranto/bundles/pure/allTests/src/lib/BaseSuite.test/pure.test.mjs +0 -425
  138. package/testeranto/bundles/web/allTests/chunk-HPYA4YZC.mjs +0 -2283
  139. package/testeranto/bundles/web/allTests/src/components/pure/ProjectPageView.test/index.html +0 -19
  140. package/testeranto/bundles/web/allTests/src/components/pure/ProjectPageView.test/index.mjs +0 -37524
  141. package/testeranto/bundles/web/allTests/src/lib/BaseSuite.test/web.test.html +0 -19
  142. package/testeranto/bundles/web/allTests/src/lib/BaseSuite.test/web.test.mjs +0 -440
  143. package/testeranto/reports/allTests/src/Pure.test/pure/lint_errors.txt +0 -0
  144. package/testeranto/reports/allTests/src/Pure.test/pure/message.txt +0 -2
  145. package/testeranto/reports/allTests/src/Pure.test/pure/prompt.txt +0 -13
  146. package/testeranto/reports/allTests/src/Pure.test/pure/type_errors.txt +0 -101
  147. package/testeranto/reports/allTests/src/components/pure/ProjectPageView.test/index/web/lint_errors.txt +0 -13
  148. package/testeranto/reports/allTests/src/components/pure/ProjectPageView.test/index/web/logs.txt +0 -50
  149. package/testeranto/reports/allTests/src/components/pure/ProjectPageView.test/index/web/message.txt +0 -2
  150. package/testeranto/reports/allTests/src/components/pure/ProjectPageView.test/index/web/prompt.txt +0 -17
  151. package/testeranto/reports/allTests/src/components/pure/ProjectPageView.test/index/web/tests.json +0 -32
  152. package/testeranto/reports/allTests/src/components/pure/ProjectPageView.test/index/web/type_errors.txt +0 -68
  153. package/testeranto/reports/allTests/src/lib/BaseSuite.test/node.test/node/lint_errors.txt +0 -0
  154. package/testeranto/reports/allTests/src/lib/BaseSuite.test/node.test/node/logs.txt +0 -52
  155. package/testeranto/reports/allTests/src/lib/BaseSuite.test/node.test/node/message.txt +0 -2
  156. package/testeranto/reports/allTests/src/lib/BaseSuite.test/node.test/node/prompt.txt +0 -13
  157. package/testeranto/reports/allTests/src/lib/BaseSuite.test/node.test/node/tests.json +0 -31
  158. package/testeranto/reports/allTests/src/lib/BaseSuite.test/node.test/node/type_errors.txt +0 -111
  159. package/testeranto/reports/allTests/src/lib/BaseSuite.test/pure.test/pure/bdd_errors.txt +0 -1
  160. package/testeranto/reports/allTests/src/lib/BaseSuite.test/pure.test/pure/lint_errors.txt +0 -0
  161. package/testeranto/reports/allTests/src/lib/BaseSuite.test/pure.test/pure/message.txt +0 -2
  162. package/testeranto/reports/allTests/src/lib/BaseSuite.test/pure.test/pure/prompt.txt +0 -14
  163. package/testeranto/reports/allTests/src/lib/BaseSuite.test/pure.test/pure/tests.json +0 -31
  164. package/testeranto/reports/allTests/src/lib/BaseSuite.test/pure.test/pure/type_errors.txt +0 -111
  165. package/testeranto/reports/allTests/src/lib/BaseSuite.test/web.test/web/bdd_errors.txt +0 -1
  166. package/testeranto/reports/allTests/src/lib/BaseSuite.test/web.test/web/lint_errors.txt +0 -0
  167. package/testeranto/reports/allTests/src/lib/BaseSuite.test/web.test/web/logs.txt +0 -108
  168. package/testeranto/reports/allTests/src/lib/BaseSuite.test/web.test/web/message.txt +0 -2
  169. package/testeranto/reports/allTests/src/lib/BaseSuite.test/web.test/web/prompt.txt +0 -14
  170. package/testeranto/reports/allTests/src/lib/BaseSuite.test/web.test/web/tests.json +0 -31
  171. package/testeranto/reports/allTests/src/lib/BaseSuite.test/web.test/web/type_errors.txt +0 -111
  172. package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/bdd_errors.txt +0 -1
  173. package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/lint_errors.txt +0 -0
  174. package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/logs.txt +0 -700
  175. package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/message.txt +0 -2
  176. package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/prompt.txt +0 -16
  177. package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/tests.json +0 -164
  178. package/testeranto/reports/allTests/src/lib/classBuilder.test/classBuilder.test/node/type_errors.txt +0 -138
  179. package/testeranto/reports/allTests/src/lib/core.test/core.test/node/lint_errors.txt +0 -21
  180. package/testeranto/reports/allTests/src/lib/core.test/core.test/node/logs.txt +0 -7
  181. package/testeranto/reports/allTests/src/lib/core.test/core.test/node/message.txt +0 -2
  182. package/testeranto/reports/allTests/src/lib/core.test/core.test/node/prompt.txt +0 -18
  183. package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/bdd_errors.txt +0 -1
  184. package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/lint_errors.txt +0 -20
  185. package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/logs.txt +0 -31
  186. package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/message.txt +0 -2
  187. package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/prompt.txt +0 -16
  188. package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/tests.json +0 -134
  189. package/testeranto/reports/allTests/src/lib/pmProxy.test/index/node/type_errors.txt +0 -76
  190. package/testeranto/reportspure_build_errors +0 -343
  191. package/testeranto/reportsweb_build_errors +0 -25
  192. /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
  193. /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
@@ -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">
@@ -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
 
@@ -29,6 +30,8 @@ export abstract class BaseGiven<I extends Ibdd_in_any> {
29
30
  artifacts: string[] = [];
30
31
  protected addArtifact(path: string) {
31
32
  console.log(`[Artifact] Adding to ${this.constructor.name}:`, path);
33
+ // console.log("mark111");
34
+ // process.exit();
32
35
  this.artifacts.push(path);
33
36
  }
34
37
 
@@ -4,7 +4,7 @@ import { ITestImplementation } from "../../CoreTypes";
4
4
  import { MockBaseBuilder } from "./baseBuilder.test.mock";
5
5
 
6
6
  import { I, O } from "./baseBuilder.test.types";
7
- import { ITTestResourceRequest } from "..";
7
+ import { ITestJob, ITTestResourceRequest } from "..";
8
8
  import { BaseBuilder } from "../basebuilder";
9
9
 
10
10
  // Define our test subject type
@@ -16,7 +16,7 @@ export const implementation: ITestImplementation<I, O, {}> = {
16
16
  },
17
17
 
18
18
  givens: {
19
- Default: () => {
19
+ "the default BaseBuilder": () => {
20
20
  return new MockBaseBuilder(
21
21
  {}, // input
22
22
  {}, // suitesOverrides
@@ -27,11 +27,21 @@ export const implementation: ITestImplementation<I, O, {}> = {
27
27
  () => [] // testSpecification
28
28
  );
29
29
  },
30
- WithCustomInput: (input: any) => {
31
- return new MockBaseBuilder(input, {}, {}, {}, {}, {}, { ports: [] });
30
+ "a BaseBuilder with TestInput": (input: any) => {
31
+ return new MockBaseBuilder(
32
+ input,
33
+ {},
34
+ {},
35
+ {},
36
+ {},
37
+ { ports: [] },
38
+ () => []
39
+ );
32
40
  },
33
- WithResourceRequirements: (requirements: ITTestResourceRequest) => {
34
- return new MockBaseBuilder({}, {}, {}, {}, {}, {}, requirements);
41
+ "a BaseBuilder with Test Resource Requirements": (
42
+ requirements: ITTestResourceRequest
43
+ ) => {
44
+ return new MockBaseBuilder({}, {}, {}, {}, {}, requirements, () => []);
35
45
  },
36
46
  },
37
47
 
@@ -47,7 +57,9 @@ export const implementation: ITestImplementation<I, O, {}> = {
47
57
  },
48
58
 
49
59
  thens: {
50
- initializedProperly: () => (builder: TestSubject) => {
60
+ "it is initialized": () => (builder, utils) => {
61
+ utils.writeFileSync("hello.txt", "world");
62
+
51
63
  if (!(builder instanceof BaseBuilder)) {
52
64
  console.error("Builder instance:", builder);
53
65
  throw new Error(
@@ -72,19 +84,19 @@ export const implementation: ITestImplementation<I, O, {}> = {
72
84
 
73
85
  return builder;
74
86
  },
75
- specsGenerated: () => (builder: TestSubject) => {
87
+ "it generates TestSpecifications": () => (builder: TestSubject) => {
76
88
  if (!Array.isArray(builder.specs)) {
77
89
  throw new Error("Specs were not generated");
78
90
  }
79
91
  return builder;
80
92
  },
81
- jobsCreated: () => (builder: TestSubject) => {
93
+ "it creates jobs": () => (builder: TestSubject) => {
82
94
  if (!Array.isArray(builder.testJobs)) {
83
95
  throw new Error("Test jobs were not created");
84
96
  }
85
97
  return builder;
86
98
  },
87
- artifactsTracked: () => (builder: TestSubject) => {
99
+ "it tracks artifacts": () => (builder: TestSubject) => {
88
100
  if (!Array.isArray(builder.artifacts)) {
89
101
  throw new Error("Artifacts array not initialized");
90
102
  }
@@ -10,25 +10,25 @@ export const specification: ITestSpecification<I, O> = (
10
10
  ) => {
11
11
  return [
12
12
  Suite.Default("Testing BaseBuilder functionality", {
13
- testInitialization: Given.Default(
13
+ testInitialization: Given["the default BaseBuilder"](
14
14
  ["BaseBuilder should initialize correctly"],
15
15
  [],
16
16
  [
17
- Then.initializedProperly(),
18
- Then.artifactsTracked(),
19
- Then.jobsCreated(),
20
- Then.specsGenerated(),
17
+ Then["it is initialized"](),
18
+ Then["it tracks artifacts"](),
19
+ // Then["it creates jobs"](),
20
+ // Then["it generates TestSpecifications"](),
21
21
  ]
22
22
  ),
23
- testSpecsGeneration: Given.Default(
23
+ testSpecsGeneration: Given["the default BaseBuilder"](
24
24
  ["BaseBuilder should generate specs from test specification"],
25
25
  [],
26
- [Then.specsGenerated()]
26
+ [Then["it generates TestSpecifications"]()]
27
27
  ),
28
- testJobsCreation: Given.Default(
28
+ testJobsCreation: Given["the default BaseBuilder"](
29
29
  ["BaseBuilder should create test jobs"],
30
30
  [],
31
- [Then.jobsCreated()]
31
+ [Then["it creates jobs"]()]
32
32
  ),
33
33
  }),
34
34
  ];
@@ -20,14 +20,17 @@ export type O = Ibdd_out<
20
20
  },
21
21
  // Givens
22
22
  {
23
- Default: [];
23
+ "the default BaseBuilder": [];
24
+ "a BaseBuilder with TestInput": [];
25
+ "a BaseBuilder with Test Resource Requirements": [];
24
26
  },
25
27
  // Whens
26
28
  {}, // No whens in these tests
27
29
  // Thens
28
30
  {
29
- initializedProperly: [];
30
- specsGenerated: [];
31
- jobsCreated: [];
31
+ "it is initialized": [];
32
+ "it generates TestSpecifications": [];
33
+ "it creates jobs": [];
34
+ "it tracks artifacts": [];
32
35
  }
33
36
  >;
@@ -122,12 +122,15 @@ export abstract class BaseBuilder<
122
122
 
123
123
  const fails = suiteDone.fails;
124
124
 
125
- await puppetMaster.writeFileSync(`bdd_errors.txt`, fails.toString());
125
+ await puppetMaster.writeFileSync([
126
+ `bdd_errors.txt`,
127
+ fails.toString(),
128
+ ]);
126
129
 
127
- await puppetMaster.writeFileSync(
130
+ await puppetMaster.writeFileSync([
128
131
  `tests.json`,
129
- JSON.stringify(this.toObj(), null, 2)
130
- );
132
+ JSON.stringify(this.toObj(), null, 2),
133
+ ]);
131
134
 
132
135
  return {
133
136
  failed: fails > 0,
@@ -44,12 +44,7 @@ export const butThenProxy: IProxy = (pm: IPM, filepath: string) => {
44
44
  "screencast",
45
45
  (opts, p) => {
46
46
  const path = `${filepath}/butThen/${opts.path}`;
47
- console.log(`[Proxy] Captured artifact path for butThen:`, path);
48
- if ((pm as any).currentStep?.addArtifact) {
49
- (pm as any).currentStep.addArtifact(path);
50
- } else {
51
- console.warn('No currentStep or addArtifact method found');
52
- }
47
+ (pm as any).currentStep?.artifacts?.push(path);
53
48
  return [
54
49
  {
55
50
  ...opts,
@@ -60,16 +55,14 @@ export const butThenProxy: IProxy = (pm: IPM, filepath: string) => {
60
55
  },
61
56
  ],
62
57
 
63
- ["createWriteStream", (fp) => {
64
- const path = `${filepath}/butThen/${fp}`;
65
- console.log(`[Proxy] Captured artifact path for butThen:`, path);
66
- if ((pm as any).currentStep?.addArtifact) {
67
- (pm as any).currentStep.addArtifact(path);
68
- } else {
69
- console.warn('No currentStep or addArtifact method found');
70
- }
71
- return [path];
72
- }],
58
+ [
59
+ "createWriteStream",
60
+ (fp) => {
61
+ const path = `${filepath}/butThen/${fp}`;
62
+ (pm as any).currentStep?.artifacts?.push(path);
63
+ return [path];
64
+ },
65
+ ],
73
66
 
74
67
  [
75
68
  "writeFileSync",
@@ -101,44 +94,28 @@ export const andWhenProxy: IProxy = (pm: IPM, filepath: string) =>
101
94
  baseProxy(pm, [
102
95
  [
103
96
  "screencast",
104
- (opts, p) => {
105
- const path = `${filepath}/andWhen/${opts.path}`;
106
- (pm as any).currentStep?.artifacts?.push(path);
107
- return [
108
- {
109
- ...opts,
110
- path,
111
- },
112
- p,
113
- ];
114
- },
97
+ (opts, p) => [
98
+ {
99
+ ...opts,
100
+ path: `${filepath}/andWhen/${opts.path}`,
101
+ },
102
+ p,
103
+ ],
115
104
  ],
116
105
 
117
- ["createWriteStream", (fp) => {
118
- const path = `${filepath}/andWhen/${fp}`;
119
- (pm as any).currentStep?.artifacts?.push(path);
120
- return [path];
121
- }],
106
+ ["createWriteStream", (fp) => [`${filepath}/andWhen/${fp}`]],
122
107
 
123
- ["writeFileSync", (fp, contents) => {
124
- const path = `${filepath}/andWhen/${fp}`;
125
- (pm as any).currentStep?.artifacts?.push(path);
126
- return [path, contents];
127
- }],
108
+ ["writeFileSync", (fp, contents) => [`${filepath}/andWhen${fp}`, contents]],
128
109
 
129
110
  [
130
111
  "customScreenShot",
131
- (opts, p) => {
132
- const path = `${filepath}/andWhen/${opts.path}`;
133
- (pm as any).currentStep?.artifacts?.push(path);
134
- return [
135
- {
136
- ...opts,
137
- path,
138
- },
139
- p,
140
- ];
141
- },
112
+ (opts, p) => [
113
+ {
114
+ ...opts,
115
+ path: `${filepath}/andWhen${opts.path}`,
116
+ },
117
+ p,
118
+ ],
142
119
  ],
143
120
  ]);
144
121
 
@@ -150,47 +127,33 @@ export const afterEachProxy: IProxyAfterEach = (
150
127
  baseProxy(pm, [
151
128
  [
152
129
  "screencast",
153
- (opts, p) => {
154
- const path = `suite-${suite}/given-${given}/afterEach/${opts.path}`;
155
- (pm as any).currentStep?.artifacts?.push(path);
156
- return [
157
- {
158
- ...opts,
159
- path,
160
- },
161
- p,
162
- ];
163
- },
130
+ (opts, p) => [
131
+ {
132
+ ...opts,
133
+ path: `suite-${suite}/given-${given}/afterEach/${opts.path}`,
134
+ },
135
+ p,
136
+ ],
164
137
  ],
165
138
 
166
- ["createWriteStream", (fp) => {
167
- const path = `suite-${suite}/afterEach/${fp}`;
168
- (pm as any).currentStep?.artifacts?.push(path);
169
- return [path];
170
- }],
171
-
139
+ ["createWriteStream", (fp) => [`suite-${suite}/afterEach/${fp}`]],
172
140
  [
173
141
  "writeFileSync",
174
- (fp, contents) => {
175
- const path = `suite-${suite}/given-${given}/afterEach/${fp}`;
176
- (pm as any).currentStep?.artifacts?.push(path);
177
- return [path, contents];
178
- },
142
+ (fp, contents) => [
143
+ `suite-${suite}/given-${given}/afterEach/${fp}`,
144
+ contents,
145
+ ],
179
146
  ],
180
147
 
181
148
  [
182
149
  "customScreenShot",
183
- (opts, p) => {
184
- const path = `suite-${suite}/given-${given}/afterEach/${opts.path}`;
185
- (pm as any).currentStep?.artifacts?.push(path);
186
- return [
187
- {
188
- ...opts,
189
- path,
190
- },
191
- p,
192
- ];
193
- },
150
+ (opts, p) => [
151
+ {
152
+ ...opts,
153
+ path: `suite-${suite}/given-${given}/afterEach/${opts.path}`,
154
+ },
155
+ p,
156
+ ],
194
157
  ],
195
158
  ]);
196
159
 
@@ -201,112 +164,72 @@ export const beforeEachProxy: IProxyBeforeEach = (
201
164
  baseProxy(pm, [
202
165
  [
203
166
  "screencast",
204
- (opts, p) => {
205
- const path = `suite-${suite}/beforeEach/${opts.path}`;
206
- (pm as any).currentStep?.artifacts?.push(path);
207
- return [
208
- {
209
- ...opts,
210
- path,
211
- },
212
- p,
213
- ];
214
- },
167
+ (opts, p) => [
168
+ {
169
+ ...opts,
170
+ path: `suite-${suite}/beforeEach/${opts.path}`,
171
+ },
172
+ p,
173
+ ],
215
174
  ],
216
175
 
217
176
  [
218
177
  "writeFileSync",
219
- (fp, contents) => {
220
- const path = `suite-${suite}/beforeEach/${fp}`;
221
- (pm as any).currentStep?.artifacts?.push(path);
222
- return [path, contents];
223
- },
178
+ (fp, contents) => [`suite-${suite}/beforeEach/${fp}`, contents],
224
179
  ],
225
180
 
226
181
  [
227
182
  "customScreenShot",
228
- (opts, p) => {
229
- const path = `suite-${suite}/beforeEach/${opts.path}`;
230
- (pm as any).currentStep?.artifacts?.push(path);
231
- return [
232
- {
233
- ...opts,
234
- path,
235
- },
236
- p,
237
- ];
238
- },
183
+ (opts, p) => [
184
+ {
185
+ ...opts,
186
+ path: `suite-${suite}/beforeEach/${opts.path}`,
187
+ },
188
+ p,
189
+ ],
239
190
  ],
240
191
 
241
- ["createWriteStream", (fp) => {
242
- const path = `suite-${suite}/beforeEach/${fp}`;
243
- (pm as any).currentStep?.artifacts?.push(path);
244
- return [path];
245
- }],
192
+ ["createWriteStream", (fp) => [`suite-${suite}/beforeEach/${fp}`]],
246
193
  ]);
247
194
 
248
195
  export const beforeAllProxy: IProxy = (pm: IPM, suite: string): IPM =>
249
196
  baseProxy(pm, [
250
197
  [
251
198
  "writeFileSync",
252
- (fp, contents) => {
253
- const path = `suite-${suite}/beforeAll/${fp}`;
254
- (pm as any).currentStep?.artifacts?.push(path);
255
- return [path, contents];
256
- },
199
+ (fp, contents) => [`suite-${suite}/beforeAll/${fp}`, contents],
257
200
  ],
258
201
 
259
202
  [
260
203
  "customScreenShot",
261
- (opts, p) => {
262
- const path = `suite-${suite}/beforeAll/${opts.path}`;
263
- (pm as any).currentStep?.artifacts?.push(path);
264
- return [
265
- {
266
- ...opts,
267
- path,
268
- },
269
- p,
270
- ];
271
- },
204
+ (opts, p) => [
205
+ {
206
+ ...opts,
207
+ path: `suite-${suite}/beforeAll/${opts.path}`,
208
+ },
209
+ p,
210
+ ],
272
211
  ],
273
212
 
274
- ["createWriteStream", (fp) => {
275
- const path = `suite-${suite}/beforeAll/${fp}`;
276
- (pm as any).currentStep?.artifacts?.push(path);
277
- return [path];
278
- }],
213
+ ["createWriteStream", (fp) => [`suite-${suite}/beforeAll/${fp}`]],
279
214
  ]);
280
215
 
281
216
  export const afterAllProxy: IProxy = (pm: IPM, suite: string): IPM =>
282
217
  baseProxy(pm, [
283
- ["createWriteStream", (fp) => {
284
- const path = `suite-${suite}/afterAll/${fp}`;
285
- (pm as any).currentStep?.artifacts?.push(path);
286
- return [path];
287
- }],
218
+ ["createWriteStream", (fp) => [`suite-${suite}/afterAll/${fp}`]],
288
219
 
289
220
  [
290
221
  "writeFileSync",
291
- (fp, contents) => {
292
- const path = `suite-${suite}/afterAll/${fp}`;
293
- (pm as any).currentStep?.artifacts?.push(path);
294
- return [path, contents];
295
- },
222
+ (fp, contents) => [`suite-${suite}/afterAll/${fp}`, contents],
296
223
  ],
297
224
 
298
225
  [
299
226
  "customScreenShot",
300
- (opts, p) => {
301
- const path = `suite-${suite}/afterAll/${opts.path}`;
302
- (pm as any).currentStep?.artifacts?.push(path);
303
- return [
304
- {
305
- ...opts,
306
- path,
307
- },
308
- p,
309
- ];
310
- },
227
+ (opts, p) => [
228
+ {
229
+ ...opts,
230
+ path: `suite-${suite}/afterAll/${opts.path}`,
231
+ },
232
+ p,
233
+ ],
311
234
  ],
312
235
  ]);
package/testeranto/App.js CHANGED
@@ -32271,7 +32271,7 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
32271
32271
  onClick: () => navigate(`/projects/${projectName}#${runtime}`)
32272
32272
  },
32273
32273
  "View Build Logs"
32274
- ))) : testData ? /* @__PURE__ */ import_react58.default.createElement("div", { className: "test-results" }, testData.givens.map((given, i) => /* @__PURE__ */ import_react58.default.createElement("div", { key: i, className: "mb-4 card" }, /* @__PURE__ */ import_react58.default.createElement("div", { className: "card-header bg-primary text-white" }, /* @__PURE__ */ import_react58.default.createElement("div", { className: "d-flex justify-content-between align-items-center" }, /* @__PURE__ */ import_react58.default.createElement("h4", null, "Given: ", given.name), given.artifacts?.length > 0 && /* @__PURE__ */ import_react58.default.createElement("div", { className: "dropdown" }, /* @__PURE__ */ import_react58.default.createElement(
32274
+ ))) : testData ? /* @__PURE__ */ import_react58.default.createElement("div", { className: "test-results" }, testData.givens.map((given, i) => /* @__PURE__ */ import_react58.default.createElement("div", { key: i, className: "mb-4 card" }, /* @__PURE__ */ import_react58.default.createElement("div", { className: "card-header bg-primary text-white" }, /* @__PURE__ */ import_react58.default.createElement("div", { className: "d-flex justify-content-between align-items-center" }, /* @__PURE__ */ import_react58.default.createElement("div", null, /* @__PURE__ */ import_react58.default.createElement("h4", null, "Given: ", given.name), given.features?.length > 0 && /* @__PURE__ */ import_react58.default.createElement("div", { className: "mt-1" }, /* @__PURE__ */ import_react58.default.createElement("small", null, "Features:"), /* @__PURE__ */ import_react58.default.createElement("ul", { className: "list-unstyled" }, given.features.map((feature, fi) => /* @__PURE__ */ import_react58.default.createElement("li", { key: fi }, feature.startsWith("http") ? /* @__PURE__ */ import_react58.default.createElement("a", { href: feature, target: "_blank", rel: "noopener noreferrer", className: "text-white" }, new URL(feature).hostname) : /* @__PURE__ */ import_react58.default.createElement("span", { className: "text-white" }, feature)))))), given.artifacts?.length > 0 && /* @__PURE__ */ import_react58.default.createElement("div", { className: "dropdown" }, /* @__PURE__ */ import_react58.default.createElement(
32275
32275
  "button",
32276
32276
  {
32277
32277
  className: "btn btn-sm btn-light dropdown-toggle",
@@ -32290,7 +32290,7 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
32290
32290
  rel: "noopener noreferrer"
32291
32291
  },
32292
32292
  artifact.split("/").pop()
32293
- ))))))), /* @__PURE__ */ import_react58.default.createElement("div", { className: "card-body" }, given.whens.map((when, j) => /* @__PURE__ */ import_react58.default.createElement("div", { key: `w-${j}`, className: `p-3 mb-2 ${when.error ? "bg-danger text-white" : "bg-success text-white"}` }, /* @__PURE__ */ import_react58.default.createElement("div", { className: "d-flex justify-content-between align-items-start" }, /* @__PURE__ */ import_react58.default.createElement("div", null, /* @__PURE__ */ import_react58.default.createElement("strong", null, "When:"), " ", when.name, when.error && /* @__PURE__ */ import_react58.default.createElement("pre", { className: "mt-2" }, when.error)), when.artifacts?.length > 0 && /* @__PURE__ */ import_react58.default.createElement("div", { className: "ms-3" }, /* @__PURE__ */ import_react58.default.createElement("strong", null, "Artifacts:"), /* @__PURE__ */ import_react58.default.createElement("ul", { className: "list-unstyled" }, when.artifacts.map((artifact, ai) => /* @__PURE__ */ import_react58.default.createElement("li", { key: ai }, /* @__PURE__ */ import_react58.default.createElement(
32293
+ ))))))), /* @__PURE__ */ import_react58.default.createElement("div", { className: "card-body" }, given.whens.map((when, j) => /* @__PURE__ */ import_react58.default.createElement("div", { key: `w-${j}`, className: `p-3 mb-2 ${when.error ? "bg-danger text-white" : "bg-success text-white"}` }, /* @__PURE__ */ import_react58.default.createElement("div", { className: "d-flex justify-content-between align-items-start" }, /* @__PURE__ */ import_react58.default.createElement("div", null, /* @__PURE__ */ import_react58.default.createElement("div", null, /* @__PURE__ */ import_react58.default.createElement("strong", null, "When:"), " ", when.name, when.features?.length > 0 && /* @__PURE__ */ import_react58.default.createElement("div", { className: "mt-2" }, /* @__PURE__ */ import_react58.default.createElement("small", null, "Features:"), /* @__PURE__ */ import_react58.default.createElement("ul", { className: "list-unstyled" }, when.features.map((feature, fi) => /* @__PURE__ */ import_react58.default.createElement("li", { key: fi }, feature.startsWith("http") ? /* @__PURE__ */ import_react58.default.createElement("a", { href: feature, target: "_blank", rel: "noopener noreferrer" }, new URL(feature).hostname) : feature)))), when.error && /* @__PURE__ */ import_react58.default.createElement("pre", { className: "mt-2" }, when.error))), when.artifacts?.length > 0 && /* @__PURE__ */ import_react58.default.createElement("div", { className: "ms-3" }, /* @__PURE__ */ import_react58.default.createElement("strong", null, "Artifacts:"), /* @__PURE__ */ import_react58.default.createElement("ul", { className: "list-unstyled" }, when.artifacts.map((artifact, ai) => /* @__PURE__ */ import_react58.default.createElement("li", { key: ai }, /* @__PURE__ */ import_react58.default.createElement(
32294
32294
  "a",
32295
32295
  {
32296
32296
  href: `/testeranto/reports/${projectName}/${testName2.split(".").slice(0, -1).join(".")}/${runtime}/${artifact}`,
@@ -32299,7 +32299,7 @@ Please change the parent <Route path="${parentPath}"> to <Route path="${parentPa
32299
32299
  rel: "noopener noreferrer"
32300
32300
  },
32301
32301
  artifact.split("/").pop()
32302
- )))))))), given.thens.map((then, k) => /* @__PURE__ */ import_react58.default.createElement("div", { key: `t-${k}`, className: `p-3 mb-2 ${then.error ? "bg-danger text-white" : "bg-success text-white"}` }, /* @__PURE__ */ import_react58.default.createElement("div", { className: "d-flex justify-content-between align-items-start" }, /* @__PURE__ */ import_react58.default.createElement("div", null, /* @__PURE__ */ import_react58.default.createElement("strong", null, "Then:"), " ", then.name, then.error && /* @__PURE__ */ import_react58.default.createElement("pre", { className: "mt-2" }, then.error)), then.artifacts?.length > 0 && /* @__PURE__ */ import_react58.default.createElement("div", { className: "ms-3" }, /* @__PURE__ */ import_react58.default.createElement("strong", null, "Artifacts:"), /* @__PURE__ */ import_react58.default.createElement("ul", { className: "list-unstyled" }, then.artifacts.map((artifact, ai) => /* @__PURE__ */ import_react58.default.createElement("li", { key: ai }, /* @__PURE__ */ import_react58.default.createElement(
32302
+ )))))))), given.thens.map((then, k) => /* @__PURE__ */ import_react58.default.createElement("div", { key: `t-${k}`, className: `p-3 mb-2 ${then.error ? "bg-danger text-white" : "bg-success text-white"}` }, /* @__PURE__ */ import_react58.default.createElement("div", { className: "d-flex justify-content-between align-items-start" }, /* @__PURE__ */ import_react58.default.createElement("div", null, /* @__PURE__ */ import_react58.default.createElement("div", null, /* @__PURE__ */ import_react58.default.createElement("strong", null, "Then:"), " ", then.name, then.features?.length > 0 && /* @__PURE__ */ import_react58.default.createElement("div", { className: "mt-2" }, /* @__PURE__ */ import_react58.default.createElement("small", null, "Features:"), /* @__PURE__ */ import_react58.default.createElement("ul", { className: "list-unstyled" }, then.features.map((feature, fi) => /* @__PURE__ */ import_react58.default.createElement("li", { key: fi }, feature.startsWith("http") ? /* @__PURE__ */ import_react58.default.createElement("a", { href: feature, target: "_blank", rel: "noopener noreferrer" }, new URL(feature).hostname) : feature)))), then.error && /* @__PURE__ */ import_react58.default.createElement("pre", { className: "mt-2" }, then.error))), then.artifacts?.length > 0 && /* @__PURE__ */ import_react58.default.createElement("div", { className: "ms-3" }, /* @__PURE__ */ import_react58.default.createElement("strong", null, "Artifacts:"), /* @__PURE__ */ import_react58.default.createElement("ul", { className: "list-unstyled" }, then.artifacts.map((artifact, ai) => /* @__PURE__ */ import_react58.default.createElement("li", { key: ai }, /* @__PURE__ */ import_react58.default.createElement(
32303
32303
  "a",
32304
32304
  {
32305
32305
  href: `/testeranto/reports/${projectName}/${testName2.split(".").slice(0, -1).join(".")}/${runtime}/${artifact}`,