ml-testing-toolkit 18.13.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 (319) hide show
  1. package/.dockerignore +10 -0
  2. package/.grype.yaml +16 -0
  3. package/.ncurc.yaml +9 -0
  4. package/.nvmrc +1 -0
  5. package/.versionrc.js +16 -0
  6. package/CHANGELOG.md +504 -0
  7. package/CODEOWNERS +30 -0
  8. package/Dockerfile +42 -0
  9. package/Dockerfile-newman +13 -0
  10. package/LICENSE.md +9 -0
  11. package/README.md +119 -0
  12. package/assets/diagrams/architectural/architectural-diagram.svg +3 -0
  13. package/assets/diagrams/flow/flow-diagram.svg +3 -0
  14. package/assets/images/Sample-Response-Failure.png +0 -0
  15. package/assets/images/Screenshot 2020-04-16 at 22.58.04.png +0 -0
  16. package/assets/images/TLS-Enabled-on-Environment.png +0 -0
  17. package/assets/images/adapter-mutual-tls-enabled.png +0 -0
  18. package/assets/images/add-additional-input-values.png +0 -0
  19. package/assets/images/add-condition-button.png +0 -0
  20. package/assets/images/add-new-assertion.png +0 -0
  21. package/assets/images/add-new-input-value.png +0 -0
  22. package/assets/images/add-new-input-variable.png +0 -0
  23. package/assets/images/additional-transfers.png +0 -0
  24. package/assets/images/api-provisioning-add-new-api-confirmation.png +0 -0
  25. package/assets/images/api-provisioning-file-input-window.png +0 -0
  26. package/assets/images/api-provisioning-list-apis-view.png +0 -0
  27. package/assets/images/api-provisioning-menu-item.png +0 -0
  28. package/assets/images/apply_and_restart.jpg +0 -0
  29. package/assets/images/assess-request-or-response.png +0 -0
  30. package/assets/images/assess-response-equation-save.png +0 -0
  31. package/assets/images/assess-response-equation.png +0 -0
  32. package/assets/images/assess-response-status.png +0 -0
  33. package/assets/images/building-new-rules-file.png +0 -0
  34. package/assets/images/callback-rules-screen.png +0 -0
  35. package/assets/images/configurable-parameter-assertion.png +0 -0
  36. package/assets/images/configurable-parameter-currency.png +0 -0
  37. package/assets/images/configurable-parameter.png +0 -0
  38. package/assets/images/connection-manager-ui-opening.png +0 -0
  39. package/assets/images/create-inbound-user-simulator.png +0 -0
  40. package/assets/images/creating-new-rule-file.png +0 -0
  41. package/assets/images/dfsp-client-cacert.png +0 -0
  42. package/assets/images/dfsp-client-submit.png +0 -0
  43. package/assets/images/dfsp-client.png +0 -0
  44. package/assets/images/dfsp-p2p-happy-path.png +0 -0
  45. package/assets/images/dfsp-server-cacert.png +0 -0
  46. package/assets/images/dfsp-server-cert.png +0 -0
  47. package/assets/images/download-report.png +0 -0
  48. package/assets/images/drive_have_not_been_shared.jpg +0 -0
  49. package/assets/images/event-response-options.png +0 -0
  50. package/assets/images/expand-monitoring-messages.png +0 -0
  51. package/assets/images/fixed-response-sample.png +0 -0
  52. package/assets/images/header-selection.png +0 -0
  53. package/assets/images/heap_error_windows.jpg +0 -0
  54. package/assets/images/hosted-mode-docker-compose-intro.png +0 -0
  55. package/assets/images/hub-client-cert.png +0 -0
  56. package/assets/images/import-template.png +0 -0
  57. package/assets/images/inbound-requests-environment.png +0 -0
  58. package/assets/images/inbound-requests-scripts.png +0 -0
  59. package/assets/images/jws-certificate-submit.png +0 -0
  60. package/assets/images/jws-certificate.png +0 -0
  61. package/assets/images/jws-certs-keys.png +0 -0
  62. package/assets/images/jws-hub-certs-keys.png +0 -0
  63. package/assets/images/local-enable-jws-publickey.png +0 -0
  64. package/assets/images/local-mutual-tls-enabled.png +0 -0
  65. package/assets/images/local_drives_to_be_available.jpg +0 -0
  66. package/assets/images/mcm-environment-opening.png +0 -0
  67. package/assets/images/menu-items.png +0 -0
  68. package/assets/images/mock-response-sample.png +0 -0
  69. package/assets/images/monitoring-initial-state.png +0 -0
  70. package/assets/images/monitoring-messages.png +0 -0
  71. package/assets/images/new-empty-assertion.png +0 -0
  72. package/assets/images/opened-imported-template.png +0 -0
  73. package/assets/images/opening-default-settings.png +0 -0
  74. package/assets/images/opening-sync-response-rules.png +0 -0
  75. package/assets/images/opening-view.png +0 -0
  76. package/assets/images/outbound-display-opening-hub.png +0 -0
  77. package/assets/images/outbound-display-opening.png +0 -0
  78. package/assets/images/override-with-environment-variable.png +0 -0
  79. package/assets/images/populate-with-sample-body.png +0 -0
  80. package/assets/images/resource-selection.png +0 -0
  81. package/assets/images/rule-builder-select-api.png +0 -0
  82. package/assets/images/sample-condition-add-configurable-params.png +0 -0
  83. package/assets/images/sample-condition.png +0 -0
  84. package/assets/images/sample-editor.png +0 -0
  85. package/assets/images/sample-request.png +0 -0
  86. package/assets/images/sample-test-assertion.png +0 -0
  87. package/assets/images/send-transfer.png +0 -0
  88. package/assets/images/sending-single-test-case-1.png +0 -0
  89. package/assets/images/sending-single-test-case-2.png +0 -0
  90. package/assets/images/sending-test-cases.png +0 -0
  91. package/assets/images/server-certificates-submitted.png +0 -0
  92. package/assets/images/simulator-response.png +0 -0
  93. package/assets/images/simulator-scheme-adapter-endpoint.png +0 -0
  94. package/assets/images/summarized-view-of-rule.png +0 -0
  95. package/assets/images/template-window.png +0 -0
  96. package/assets/images/test-case-editor-console-log.png +0 -0
  97. package/assets/images/test-case-editor-environment-state.png +0 -0
  98. package/assets/images/test-case-editor-scripts.png +0 -0
  99. package/assets/images/test-case-editor.png +0 -0
  100. package/assets/images/testcase-definition-download.png +0 -0
  101. package/assets/images/testcase-definition-edit-meta-info.png +0 -0
  102. package/assets/images/testing-toolkit-mojaloop-testing-toolkit-endpoint.png +0 -0
  103. package/assets/images/tls-hub-certs-keys.png +0 -0
  104. package/assets/images/tls-jws-enabled-on-environment.png +0 -0
  105. package/assets/images/updated-sample-body-data.png +0 -0
  106. package/assets/images/using-configurable-parameter.png +0 -0
  107. package/assets/images/validation-rules-screen.png +0 -0
  108. package/assets/images/view-response.png +0 -0
  109. package/audit-ci.jsonc +7 -0
  110. package/connection-manager/docker-compose.yml +55 -0
  111. package/database/docker-compose.yml +16 -0
  112. package/docker/hosted-mode/docker-compose.yaml +107 -0
  113. package/docker/hosted-mode/keycloak/keycloak-realm.json +2298 -0
  114. package/docker/hosted-mode/mongo-init.sh +1 -0
  115. package/docker/hosted-mode-tls/docker-compose.yaml +171 -0
  116. package/docker/hosted-mode-tls/keycloak/keycloak-realm.json +2298 -0
  117. package/docker/hosted-mode-tls/mongo-init.sh +1 -0
  118. package/docker-compose.yml +62 -0
  119. package/documents/Mojaloop-Testing-Toolkit.md +296 -0
  120. package/documents/RULES_ENGINE.md +403 -0
  121. package/documents/User-Guide-API-Provisioning.md +121 -0
  122. package/documents/User-Guide-CLI.md +218 -0
  123. package/documents/User-Guide-Connection-Manager.md +282 -0
  124. package/documents/User-Guide-Frequently-Asked-Questions.md +39 -0
  125. package/documents/User-Guide-Hosted-Mode-Docker-Compose.md +110 -0
  126. package/documents/User-Guide-Installation.md +163 -0
  127. package/documents/User-Guide-Mojaloop-Testing-Toolkit.md +642 -0
  128. package/documents/User-Guide-OAuth-Server-Deployment.md +283 -0
  129. package/documents/User-Guide-Onboarding-DFSP.md +197 -0
  130. package/documents/User-Guide-Onboarding-HUB.md +191 -0
  131. package/documents/User-Guide.md +53 -0
  132. package/examples/collections/dfsp/p2p_failed_tests.json +7161 -0
  133. package/examples/collections/dfsp/p2p_fx_happy_path.json +502 -0
  134. package/examples/collections/dfsp/p2p_happy_path.json +350 -0
  135. package/examples/collections/dfsp/p2p_happy_path_extended.json +6106 -0
  136. package/examples/collections/dfsp/p2p_happy_path_jws.json +511 -0
  137. package/examples/collections/dfsp/p2p_payee_assertions_websocket.json +441 -0
  138. package/examples/collections/dfsp/sample.json +5029 -0
  139. package/examples/collections/dfsp/transaction_request_service.json +240 -0
  140. package/examples/collections/fxp/FXP.json +264 -0
  141. package/examples/collections/fxp/SDK_backend.json +98 -0
  142. package/examples/collections/fxp/SDK_outbound.json +163 -0
  143. package/examples/collections/hub/hub_01_p2p_happy_path/hub_p2p_receive_quote.json +400 -0
  144. package/examples/collections/hub/hub_01_p2p_happy_path/hub_p2p_send_quote.json +395 -0
  145. package/examples/collections/hub/hub_02_block_transfer/hub_block_transfer.json +393 -0
  146. package/examples/collections/hub/hub_03_funds_in_out/hub_funds_in.json +224 -0
  147. package/examples/collections/hub/hub_03_funds_in_out/hub_funds_out.json +780 -0
  148. package/examples/collections/hub/hub_04_settlements/hub_settlements.json +3138 -0
  149. package/examples/collections/hub/hub_05_transfer_negative_scenarios/hub_transfer_negative_payee_abort.json +475 -0
  150. package/examples/collections/hub/hub_05_transfer_negative_scenarios/hub_transfer_negative_payee_invalid_fulfillment.json +370 -0
  151. package/examples/collections/hub/hub_05_transfer_negative_scenarios/hub_transfer_negative_transfer_timeout.json +262 -0
  152. package/examples/collections/hub/hub_06_transaction_requests_service/hub_trs_authorizations.json +117 -0
  153. package/examples/collections/hub/hub_06_transaction_requests_service/hub_trs_error_framework.json +591 -0
  154. package/examples/collections/hub/hub_06_transaction_requests_service/hub_trs_received_state.json +379 -0
  155. package/examples/collections/hub/hub_06_transaction_requests_service/hub_trs_reject_state.json +361 -0
  156. package/examples/collections/hub/hub_07_quoting_service.json +525 -0
  157. package/examples/collections/hub/hub_08_participant_inactive_stop_transfers.json +706 -0
  158. package/examples/collections/hub/hub_09_duplicate_handling_transfers.json +1377 -0
  159. package/examples/collections/hub/hub_10_on_us_transfers.json +245 -0
  160. package/examples/collections/hub/hub_11_accented_and_spl_chars.json +629 -0
  161. package/examples/collections/hub/hub_12_fspiop_version_1.1.json +646 -0
  162. package/examples/collections/hub/hub_13_bulk_transfers.json +1857 -0
  163. package/examples/collections/iso20022/self_referencing_iso20022.json +926 -0
  164. package/examples/collections/provisioning/testingtoolkitdfsp.json +904 -0
  165. package/examples/environments/dfsp_local_environment.json +46 -0
  166. package/examples/environments/hub_local_environment.json +57 -0
  167. package/jest.config.js +17 -0
  168. package/package.json +199 -0
  169. package/sbom-v18.12.4.csv +1553 -0
  170. package/secrets/keygen.sh +5 -0
  171. package/secrets/privatekey.pem +27 -0
  172. package/secrets/publickey.cer +21 -0
  173. package/secrets/tls/01.pem +132 -0
  174. package/secrets/tls/createSecrets.sh +20 -0
  175. package/secrets/tls/hub_client.csr +32 -0
  176. package/secrets/tls/hub_client_cacert.pem +35 -0
  177. package/secrets/tls/hub_client_cakey.pem +52 -0
  178. package/secrets/tls/hub_client_key.key +52 -0
  179. package/secrets/tls/hub_server.csr +31 -0
  180. package/secrets/tls/hub_server_cacert.pem +35 -0
  181. package/secrets/tls/hub_server_cakey.pem +52 -0
  182. package/secrets/tls/hub_server_cert.pem +132 -0
  183. package/secrets/tls/hub_server_key.key +52 -0
  184. package/secrets/tls/index.txt +1 -0
  185. package/secrets/tls/index.txt.attr +1 -0
  186. package/secrets/tls/openssl-client.cnf +36 -0
  187. package/secrets/tls/openssl-clientca.cnf +71 -0
  188. package/secrets/tls/openssl-server.cnf +39 -0
  189. package/secrets/tls/openssl-serverca.cnf +71 -0
  190. package/secrets/tls/serial.txt +1 -0
  191. package/spec_files/api_definitions/als_admin_1.1/api_spec.yaml +804 -0
  192. package/spec_files/api_definitions/central_admin_1.0/api_spec.yaml +1850 -0
  193. package/spec_files/api_definitions/central_admin_1.0/response_map.json +96 -0
  194. package/spec_files/api_definitions/central_admin_old_9.3/api_spec.yaml +2467 -0
  195. package/spec_files/api_definitions/central_admin_old_9.3/response_map.json +96 -0
  196. package/spec_files/api_definitions/fspiop_1.0/api_spec.yaml +4187 -0
  197. package/spec_files/api_definitions/fspiop_1.0/callback_map.json +568 -0
  198. package/spec_files/api_definitions/fspiop_1.0/mockRef.json +79 -0
  199. package/spec_files/api_definitions/fspiop_1.0/trigger_templates/transaction_request_followup.json +126 -0
  200. package/spec_files/api_definitions/fspiop_1.0/trigger_templates/transaction_request_followup_quotes_only.json +97 -0
  201. package/spec_files/api_definitions/fspiop_1.1/api_spec.yaml +3778 -0
  202. package/spec_files/api_definitions/fspiop_1.1/callback_map.json +568 -0
  203. package/spec_files/api_definitions/fspiop_1.1/mockRef.json +79 -0
  204. package/spec_files/api_definitions/fspiop_1.1/trigger_templates/transaction_request_followup.json +125 -0
  205. package/spec_files/api_definitions/fspiop_2.0/api_spec.yaml +4839 -0
  206. package/spec_files/api_definitions/fspiop_2.0/callback_map.json +716 -0
  207. package/spec_files/api_definitions/fspiop_2.0/mockRef.json +79 -0
  208. package/spec_files/api_definitions/fspiop_2.0/trigger_templates/transaction_request_followup.json +125 -0
  209. package/spec_files/api_definitions/fspiop_2.0_iso20022/api_spec.yaml +8331 -0
  210. package/spec_files/api_definitions/fspiop_2.0_iso20022/callback_map.json +508 -0
  211. package/spec_files/api_definitions/fspiop_2.0_iso20022/mockRef.json +66 -0
  212. package/spec_files/api_definitions/fx-api_2.0/api_spec.yaml +1768 -0
  213. package/spec_files/api_definitions/fx-api_2.0/callback_map.json +188 -0
  214. package/spec_files/api_definitions/fx-api_2.0/mockRef.json +83 -0
  215. package/spec_files/api_definitions/mojaloop_sdk_outbound_scheme_adapter_1.0/api_spec.yaml +2612 -0
  216. package/spec_files/api_definitions/mojaloop_sdk_outbound_scheme_adapter_1.0/mockRef.json +22 -0
  217. package/spec_files/api_definitions/mojaloop_sdk_outbound_scheme_adapter_1.0/response_map.json +35 -0
  218. package/spec_files/api_definitions/mojaloop_simulator_0.1/api_spec.yaml +225 -0
  219. package/spec_files/api_definitions/mojaloop_simulator_sim_1.4/api_spec.yaml +1087 -0
  220. package/spec_files/api_definitions/mojaloop_simulator_sim_1.4/mockRef.json +75 -0
  221. package/spec_files/api_definitions/mojaloop_simulator_sim_1.4/response_map.json +55 -0
  222. package/spec_files/api_definitions/payment_manager_1.4/api_spec.yaml +1389 -0
  223. package/spec_files/api_definitions/sdk-scheme-adapter-backend-v2_1_0-openapi3-snippets_2.1/api_spec.yaml +2834 -0
  224. package/spec_files/api_definitions/sdk-scheme-adapter-outbound-v2_1_0-openapi3-snippets_2.1/api_spec.yaml +3449 -0
  225. package/spec_files/api_definitions/settlements_1.0/api_spec.yaml +983 -0
  226. package/spec_files/api_definitions/settlements_1.0/mockRef.json +38 -0
  227. package/spec_files/api_definitions/settlements_1.0/response_map.json +34 -0
  228. package/spec_files/api_definitions/settlements_2.0/api_spec.yaml +1001 -0
  229. package/spec_files/api_definitions/settlements_2.0/mockRef.json +38 -0
  230. package/spec_files/api_definitions/settlements_2.0/response_map.json +34 -0
  231. package/spec_files/api_definitions/thirdparty_sdk_outbound_0.1/api_spec.yaml +2139 -0
  232. package/spec_files/reports/templates/newman/html_template.html +1202 -0
  233. package/spec_files/reports/templates/newman/pdf_template.html +790 -0
  234. package/spec_files/reports/templates/testcase_definition/table_view.html +1602 -0
  235. package/spec_files/rules_callback/config.json +3 -0
  236. package/spec_files/rules_callback/default.json +2698 -0
  237. package/spec_files/rules_callback/p2p-limit.json +129 -0
  238. package/spec_files/rules_forward/config.json +3 -0
  239. package/spec_files/rules_forward/default.json +482 -0
  240. package/spec_files/rules_response/config.json +3 -0
  241. package/spec_files/rules_response/default.json +295 -0
  242. package/spec_files/rules_validation/config.json +3 -0
  243. package/spec_files/rules_validation/default.json +1 -0
  244. package/spec_files/rules_validation/p2p-limit.json +55 -0
  245. package/spec_files/system_config.json +175 -0
  246. package/spec_files/user_config.json +109 -0
  247. package/src/index.js +67 -0
  248. package/src/lib/MyEventEmitter.js +54 -0
  249. package/src/lib/api-management.js +143 -0
  250. package/src/lib/api-routes/config.js +83 -0
  251. package/src/lib/api-routes/history.js +139 -0
  252. package/src/lib/api-routes/keycloak.js +54 -0
  253. package/src/lib/api-routes/longpolling.js +70 -0
  254. package/src/lib/api-routes/oauth2.js +149 -0
  255. package/src/lib/api-routes/objectstore.js +53 -0
  256. package/src/lib/api-routes/openapi.js +224 -0
  257. package/src/lib/api-routes/outbound.js +134 -0
  258. package/src/lib/api-routes/reports.js +72 -0
  259. package/src/lib/api-routes/rules.js +356 -0
  260. package/src/lib/api-routes/samples.js +92 -0
  261. package/src/lib/api-routes/server-logs.js +44 -0
  262. package/src/lib/api-routes/settings.js +71 -0
  263. package/src/lib/api-server.js +135 -0
  264. package/src/lib/arrayStore.js +101 -0
  265. package/src/lib/callbackHandler.js +201 -0
  266. package/src/lib/config.js +177 -0
  267. package/src/lib/configuration-providers/mb-connection-manager.js +625 -0
  268. package/src/lib/db/adapters/dbAdapter.js +184 -0
  269. package/src/lib/db/dfspMockUsers.js +64 -0
  270. package/src/lib/db/models/mongoDBWrapper.js +78 -0
  271. package/src/lib/eventListenerClient/inboundEventListener.js +176 -0
  272. package/src/lib/fileAdapter.js +57 -0
  273. package/src/lib/httpAgentStore.js +135 -0
  274. package/src/lib/importExport.js +186 -0
  275. package/src/lib/jws/JwsSigning.js +141 -0
  276. package/src/lib/loadSamples.js +128 -0
  277. package/src/lib/logger.js +20 -0
  278. package/src/lib/longpollingEmitter.js +56 -0
  279. package/src/lib/metrics.js +51 -0
  280. package/src/lib/mocking/custom-functions/generic.js +57 -0
  281. package/src/lib/mocking/middleware-functions/ilpModel.js +238 -0
  282. package/src/lib/mocking/middleware-functions/quotesAssociation.js +75 -0
  283. package/src/lib/mocking/middleware-functions/transactionRequestsService.js +78 -0
  284. package/src/lib/mocking/openApiDefinitionsModel.js +64 -0
  285. package/src/lib/mocking/openApiMockHandler.js +466 -0
  286. package/src/lib/mocking/openApiRulesEngine.js +492 -0
  287. package/src/lib/mocking/openApiVersionTools.js +136 -0
  288. package/src/lib/mocking/transformers/fspiopToISO20022.js +230 -0
  289. package/src/lib/mocking/transformers/index.js +41 -0
  290. package/src/lib/notificationEmitter.js +64 -0
  291. package/src/lib/oauth/KeycloakHelper.js +220 -0
  292. package/src/lib/oauth/LoginService.js +133 -0
  293. package/src/lib/oauth/OAuthHelper.js +181 -0
  294. package/src/lib/oauth/OAuthValidator.js +118 -0
  295. package/src/lib/oauth/Wso2Client.js +64 -0
  296. package/src/lib/objectStore/inMemoryImpl.js +50 -0
  297. package/src/lib/objectStore/objectStoreInterface.js +51 -0
  298. package/src/lib/objectStore.js +122 -0
  299. package/src/lib/report-generator/generator.js +126 -0
  300. package/src/lib/report-generator/helpers.js +154 -0
  301. package/src/lib/requestLogger.js +190 -0
  302. package/src/lib/resources/wso2carbon-publickey.cert +20 -0
  303. package/src/lib/rulesEngine.js +95 -0
  304. package/src/lib/rulesEngineModel.js +463 -0
  305. package/src/lib/scripting-engines/postman-sandbox.js +142 -0
  306. package/src/lib/scripting-engines/vm-javascript-sandbox.js +294 -0
  307. package/src/lib/server-logs/adapters/elastic-search.js +102 -0
  308. package/src/lib/server-logs/adapters/grafana.js +0 -0
  309. package/src/lib/server-logs/index.js +75 -0
  310. package/src/lib/socket-server.js +55 -0
  311. package/src/lib/storageAdapter.js +109 -0
  312. package/src/lib/test-outbound/TestCaseRunner.js +173 -0
  313. package/src/lib/test-outbound/getTracing.js +19 -0
  314. package/src/lib/test-outbound/outbound-initiator.js +1107 -0
  315. package/src/lib/uniqueIdGenerator.js +35 -0
  316. package/src/lib/utils.js +89 -0
  317. package/src/lib/utilsInternal.js +56 -0
  318. package/src/lib/webSocketClient/WebSocketClientManager.js +197 -0
  319. package/src/server.js +218 -0
@@ -0,0 +1,790 @@
1
+
2
+ {{!-- {{#each items}}
3
+ <tr class="item">
4
+ <td>
5
+ {{name}}
6
+ </td>
7
+ <td>
8
+ $ {{price}}
9
+ </td>
10
+ </tr>
11
+ {{/each}}
12
+ <tr class="total ">
13
+ <td></td>
14
+ <td>
15
+ Total: ${{total items}}
16
+ </td>
17
+ </tr> --}}
18
+
19
+
20
+
21
+
22
+ <!DOCTYPE html>
23
+ <html lang="en">
24
+ <head>
25
+ <meta charset="UTF-8">
26
+ <title>Testing Toolkit Assertions Report</title>
27
+ <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css">
28
+ <link rel="stylesheet prefetch" href='https://use.fontawesome.com/releases/v5.0.10/css/all.css'>
29
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.13.1/styles/github-gist.min.css">
30
+ <link rel="stylesheet" href="https://cdn.datatables.net/v/bs4/dt-1.10.18/datatables.min.css"/>
31
+
32
+ <style>
33
+ .theme-dark {
34
+ --background-color: #222;
35
+ --bg-card-deck: #444444;
36
+ --text-color: #ccd2d8;
37
+ --tab-border: solid 1px #444;
38
+ --success: #3c9372;
39
+ --failure: #c24a3f;
40
+ --warning: #d28c23;
41
+ --info: #4083b6;
42
+ --badge-outline: #3c9372;
43
+ --badge-bg: #cdd3db;
44
+ --badge-text: #ccd2d9;
45
+ --failure-row: #c24a3f;
46
+ --warning-row: #d28c23;
47
+ --card-bg: #444;
48
+ --card-footer: #4f5758;
49
+ --form-input: #ececb5;
50
+ --hov-text: #d2dae5;
51
+ --h4-text: #ccd1d9;
52
+ }
53
+
54
+ .theme-light {
55
+ --tab-border: solid 1px #fff;
56
+ --text-color: #000000;
57
+ --success: #42a745;
58
+ --failure: #dc3544;
59
+ --warning: #f4c10b;
60
+ --info: #49a1b8;
61
+ --badge-outline: #040411;
62
+ --badge-bg: #f8f9fa;
63
+ --badge-text: #fff;
64
+ --failure-row: #f5c6cb;
65
+ --warning-row: #ffeeba;
66
+ --card-bg: #f7f7f7;
67
+ --hov-text: #fff;
68
+ --h4-text: #ffffff;
69
+ }
70
+
71
+ body {
72
+ padding-top:30px;
73
+ background-color: var(--background-color);
74
+ color: var(--text-color);
75
+ }
76
+
77
+ #execution-data {
78
+ padding: 10px;
79
+ border: var(--tab-border);
80
+ border-top: none;
81
+ }
82
+
83
+ .nav-tabs {
84
+ padding-top: 10px;
85
+ height: 105px;
86
+ overflow-y: auto;
87
+ }
88
+
89
+ .card-header {
90
+ background-color: var(--card-bg)!important;
91
+ }
92
+
93
+ .card-body {
94
+ background-color: var(--card-bg)!important;
95
+ }
96
+
97
+ .card-footer {
98
+ padding: .75rem 1.25rem;
99
+ background-color: var(--card-footer);
100
+ }
101
+
102
+ .card-deck {
103
+ background-color: var(--bg-card-deck)!important;
104
+ }
105
+ .form-control {
106
+ background: var(--form-input);
107
+ }
108
+
109
+ .custom-tab {
110
+ padding: 10px 15px;
111
+ margin-right: 0px;
112
+ height: 46px;
113
+ width: 59px;
114
+ text-align: center;
115
+ border: var(--tab-border);
116
+ border-bottom: none;
117
+ cursor:pointer;
118
+ }
119
+
120
+ body.theme-dark .text-white {
121
+ color: #ccd2d9!important;
122
+ }
123
+ h4 {
124
+ color: var(--h4-text);
125
+ }
126
+
127
+ body.theme-dark h1 {
128
+ color: #ccd2da;
129
+ }
130
+
131
+ body.theme-dark .bg-light>td {
132
+ background: #4f5858!important;
133
+ }
134
+
135
+ body.theme-dark .hljs {
136
+ background: #0f0f0f82!important;
137
+ color: #8d8787!important;
138
+ }
139
+
140
+ .bg-info {
141
+ background-color: var(--info)!important;
142
+ }
143
+ .bg-success {
144
+ background-color: var(--success)!important;
145
+ }
146
+
147
+ .alert-success {
148
+ background-color: var(--success)!important;
149
+ }
150
+
151
+ .alert-warning {
152
+ background-color: var(--warning)!important;
153
+ }
154
+
155
+ .alert-info {
156
+ background-color: var(--info)!important;
157
+ }
158
+
159
+ .bg-warning {
160
+ background-color: var(--warning)!important;
161
+ }
162
+
163
+ .badge-warning {
164
+ color: var(--badge-text)!important;
165
+ background-color: var(--warning)!important;
166
+ }
167
+
168
+ .table-warning>td {
169
+ background-color: var(--warning-row);
170
+ }
171
+
172
+ .alert-danger {
173
+ background-color: var(--failure)!important;
174
+ }
175
+
176
+ body.theme-dark .alert-dark {
177
+ background-color: #636467!important;
178
+ }
179
+
180
+ body.theme-dark .text-dark {
181
+ color: #d1dae4!important;
182
+ }
183
+
184
+ .badge-light {
185
+ color: #212529;
186
+ background-color: var(--badge-bg);
187
+ }
188
+
189
+ .bg-danger {
190
+ background-color: var(--failure)!important;
191
+ }
192
+
193
+ .table-danger>td {
194
+ background-color: var(--failure-row);
195
+ }
196
+
197
+ body.theme-dark .table .thead-light th {
198
+ background-color: #4f5858!important;
199
+ border-color: #dee2e6!important;
200
+ color: #ccd2d8!important;
201
+ }
202
+
203
+ .itPassed {
204
+ background: var(--success);
205
+ color: white;
206
+ }
207
+ .itFailed {
208
+ background: var(--failure);
209
+ color: white;
210
+ }
211
+
212
+ .resultsInfoPass {
213
+ color: var(--success);
214
+ padding-top: 4px;
215
+ }
216
+
217
+ .resultsInfoFail {
218
+ color: var(--failure);
219
+ padding-top: 4px;
220
+ }
221
+
222
+ .badge-outline-success {
223
+ color: var(--success);
224
+ border: 1px solid var(--success);
225
+ background-color: transparent;
226
+ }
227
+
228
+ .badge-outline {
229
+ color: var(--badge-outline);
230
+ border: 1px solid var(--badge-outline);
231
+ background-color: transparent;
232
+ }
233
+
234
+ .btn-outline-success {
235
+ color: var(--success)!important;
236
+ border-color: var(--success)!important;
237
+ }
238
+
239
+ .backToTop:hover {
240
+ background-color: var(--success);
241
+ border-color: var(--success);
242
+ color: var(--hov-text)!important;
243
+ }
244
+
245
+ .btn-outline-success:hover {
246
+ background-color: var(--success);
247
+ border-color: var(--success);
248
+ color: var(--hov-text)!important;
249
+ }
250
+
251
+ .btn-outline-secondary {
252
+ background-color: var(--success)!important;
253
+ color: var(--hov-text)!important;
254
+ }
255
+
256
+ body, html {
257
+ height:100%;
258
+ }
259
+
260
+ .card {
261
+ overflow:hidden;
262
+ }
263
+
264
+ .card-body .rotate {
265
+ z-index: 8;
266
+ float: right;
267
+ height: 100%;
268
+ }
269
+
270
+ .card-body .rotate i {
271
+ color: rgba(20, 20, 20, 0.15);
272
+ position: absolute;
273
+ left: 0;
274
+ left: auto;
275
+ right: -10px;
276
+ bottom: 0;
277
+ display: block;
278
+ -webkit-transform: rotate(-44deg);
279
+ -moz-transform: rotate(-44deg);
280
+ -o-transform: rotate(-44deg);
281
+ -ms-transform: rotate(-44deg);
282
+ transform: rotate(-44deg);
283
+ }
284
+ .dyn-height {
285
+ max-height:350px;
286
+ overflow-y:auto;
287
+ }
288
+
289
+ .nav-pills .nav-link.active {
290
+ background-color: transparent!important;
291
+ }
292
+
293
+ .backToTop {
294
+ display: none;
295
+ position: fixed;
296
+ bottom: 20px;
297
+ right: 30px;
298
+ z-index: 99;
299
+ font-size: 18px;
300
+ outline: none;
301
+ cursor: pointer;
302
+ padding: 15px;
303
+ border-radius: 4px;
304
+ }
305
+
306
+ .card-header .fa {
307
+ transition: .3s transform ease-in-out;
308
+ }
309
+ .card-header .show .fa {
310
+ transform: rotate(90deg);
311
+ }
312
+
313
+ .single-line-tabs {
314
+ padding-top: 10px;
315
+ height: 60px;
316
+ }
317
+
318
+ ::-webkit-scrollbar {
319
+ width: 5px;
320
+ }
321
+
322
+ ::-webkit-scrollbar-track {
323
+ background: #f1f1f1;
324
+ }
325
+
326
+ ::-webkit-scrollbar-thumb {
327
+ background: #888;
328
+ }
329
+
330
+ ::-webkit-scrollbar-thumb:hover {
331
+ background: #555;
332
+ }
333
+
334
+ /* The switch - the box around the slider */
335
+ .switch {
336
+ position: relative;
337
+ display: inline-block;
338
+ width: 44px;
339
+ height: 20px;
340
+ }
341
+
342
+ /* Hide default HTML checkbox */
343
+ .switch input {
344
+ opacity: 0;
345
+ width: 0;
346
+ height: 0;
347
+ }
348
+
349
+ /* The slider */
350
+ .slider {
351
+ position: absolute;
352
+ cursor: pointer;
353
+ top: 0;
354
+ left: 0;
355
+ right: 0;
356
+ bottom: 0;
357
+ background-color: #ccc;
358
+ -webkit-transition: 0.4s;
359
+ transition: 0.4s;
360
+ }
361
+
362
+ .slider:before {
363
+ position: absolute;
364
+ content: "";
365
+ height: 20px;
366
+ width: 20px;
367
+ left: 0px;
368
+ bottom: 4px;
369
+ top: 0;
370
+ bottom: 0;
371
+ margin: auto 0;
372
+ -webkit-transition: 0.4s;
373
+ transition: 0.4s;
374
+ box-shadow: 0 0px 15px #2020203d;
375
+ background: white;
376
+ background-repeat: no-repeat;
377
+ background-position: center;
378
+ }
379
+
380
+ input:checked + .slider {
381
+ background-color: #4083b6;
382
+ }
383
+
384
+ input:focus + .slider {
385
+ box-shadow: 0 0 1px #4083b6;
386
+ }
387
+
388
+ input:checked + .slider:before {
389
+ -webkit-transform: translateX(24px);
390
+ -ms-transform: translateX(24px);
391
+ transform: translateX(24px);
392
+ background: white;
393
+ background-repeat: no-repeat;
394
+ background-position: center;
395
+ }
396
+
397
+ /* Rounded sliders */
398
+ .slider.round {
399
+ border-radius: 34px;
400
+ }
401
+
402
+ .slider.round:before {
403
+ border-radius: 50%;
404
+ }
405
+
406
+ </style>
407
+ </head>
408
+ <body class="theme-light">
409
+ <div class="container">
410
+ <div class="card">
411
+ <div class="card-header">
412
+
413
+ <div class="tab-content" id="pills-tabContent">
414
+ <div class="tab-pane fade show active" id="pills-summary" role="tabcard" aria-labelledby="pills-summary-tab">
415
+ <div class="row">
416
+ <div class="col-md-12 col-lg-12 main">
417
+ <br /> <br /> <br />
418
+ <h1 class="display-4 text-center">Testing Toolkit Report</h1>
419
+ <h5 class="text-center">{{runtimeInformation.completedTime}}</h5>
420
+ <br /> <br /> <br />
421
+ <div class="row">
422
+ <div class="col-lg-4 col-md-4">
423
+ <div class="card text-white card-danger">
424
+ <div class="card-body bg-success">
425
+ <div class="rotate">
426
+ <i class="fa fa-list fa-4x"></i>
427
+ </div>
428
+ <h6 class="text-uppercase">Total Assertions</h6>
429
+ <h1 class="display-2">{{totalAssertions test_cases}}</h1>
430
+ </div>
431
+ </div>
432
+ </div>
433
+ <div class="col-lg-4 col-md-4">
434
+ <div class="card text-white card-warning">
435
+ <div class="card-body bg-success">
436
+ <div class="rotate">
437
+ <i class="fa fa-share fa-5x"></i>
438
+ </div>
439
+ <h6 class="text-uppercase">Total Passed Tests</h6>
440
+ <h1 class="display-2">{{totalPassedAssertions test_cases}}</h1>
441
+ </div>
442
+ </div>
443
+ </div>
444
+ <div class="col-lg-4 col-md-4">
445
+ <div class="card text-white card-info">
446
+ <div class="card-body bg-danger">
447
+ <div class="rotate">
448
+ <i class="fa fa-plus-circle fa-5x"></i>
449
+ </div>
450
+ <h6 class="text-uppercase">Total Failed Tests</h6>
451
+ <h1 class="display-2">{{totalFailedAssertions test_cases}}</h1>
452
+ </div>
453
+ </div>
454
+ </div>
455
+ </div>
456
+ <hr>
457
+ <div class="row">
458
+ <div class="col">
459
+ <br /> <br /> <br />
460
+ <div class="row">
461
+ <div class="col-sm-12 mb-3">
462
+ <div class="card border-info">
463
+ <div class="card-body">
464
+ <h5 class="card-title text-uppercase text-white text-center bg-info">Runtime Information</h5>
465
+ <span><i class="fas fa-file-code"></i></span><strong> Template Name:</strong> {{name}}<br>
466
+ {{#if runtimeInformation}}
467
+ <span><i class="fas fa-stopwatch"></i></span><strong> Total run duration:</strong> {{runtimeInformation.runDurationMs}} ms<br>
468
+ {{/if}}
469
+ </div>
470
+ </div>
471
+ </div>
472
+ </div>
473
+ <br /> <br /> <br />
474
+ <div class="row">
475
+ <div class="col-sm-12 mb-3">
476
+ <div class="table-responsive">
477
+ <table class="table table-striped table-bordered">
478
+ <thead class="thead-inverse">
479
+ <tr class="text-center">
480
+ <th class="text-uppercase">Summary Item</th>
481
+ <th class="text-uppercase">Total</th>
482
+ <th class="text-uppercase">Failed</th>
483
+ </tr>
484
+ </thead>
485
+ <tbody>
486
+ <tr>
487
+ <td>Test Cases</td>
488
+ <td class="text-center">{{totalTestCases test_cases}}</td>
489
+ <td class="text-center">{{failedTestCases test_cases}}</td>
490
+ </tr>
491
+ <tr>
492
+ <td>Requests</td>
493
+ <td class="text-center">{{totalRequests test_cases}}</td>
494
+ <td class="text-center">{{failedRequests test_cases}}</td>
495
+ </tr>
496
+ <tr class="">
497
+ <td>Assertions</td>
498
+ <td class="text-center">{{totalAssertions test_cases}}</td>
499
+ <td class="text-center">{{totalFailedAssertions test_cases}}</td>
500
+ </tr>
501
+ </tbody>
502
+ </table>
503
+ </div>
504
+ </div>
505
+ </div>
506
+ <hr>
507
+ </div>
508
+ </div>
509
+ </div>
510
+ </div>
511
+ </div>
512
+ <br /> <br /> <br /> <br /> <br /> <br /><br /> <br /> <br /> <br /> <br /> <br /><br /> <br /> <br /> <br /> <br /> <br />
513
+ <br /> <br /> <br />
514
+ <div>
515
+
516
+
517
+ <div class="text-uppercase" id="execution-menu">
518
+ <nav class="table-responsive">
519
+ <ul class="nav single-line-tabs d-none" id="iterationList">
520
+ </ul>
521
+ </nav>
522
+ </div>
523
+ <h6 class="text-uppercase text-muted" id="iterationSelected" style="padding-top: 10px;"></h6>
524
+ {{#each test_cases}}
525
+ <div class="tab-content" id="execution-data">
526
+
527
+ <div class="alert alert-dark text-uppercase text-center iteration-0">
528
+ <a data-toggle="collapse" href="#" data-target="#folder-collapse-{{id}}" aria-expanded="false" aria-controls="collapse" id="folder-{{id}}" class="show text-dark z-block">
529
+ {{#if (ifFailedTestCase this)}}
530
+ <i class="fas fa-info-circle float-left resultsInfoFail" ></i>
531
+ {{/if}}
532
+ {{name}} <i class="float-lg-right fa fa-chevron-down" style="padding-top: 4px;"></i>
533
+ </a>
534
+ </div>
535
+ <div id="folder-collapse-{{id}}" class="show" aria-labelledby="folder-{{id}}">
536
+ <div class="card border-info" style="width: 100%;">
537
+ <div class="card-body">
538
+ <span><i class="fas fa-stopwatch"></i></span><strong> Testcase Duration:</strong> <span class="badge-outline badge badge-success"> {{testResult.runDurationMs}} ms</span><br>
539
+ </div>
540
+ </div>
541
+ <br>
542
+ {{#each requests}}
543
+ <div id="folder-{{../id}}-{{request.id}}" class="card-deck iteration-0">
544
+ <div class="row iteration-0">
545
+ <div class="col-sm-12 mb-3 iteration-0">
546
+ <div class="card iteration-0">
547
+ {{#if (ifAllTestsPassedInRequest request)}}
548
+ <div class="card-header bg-success iteration-0">
549
+ {{else}}
550
+ <div class="card-header bg-danger iteration-0">
551
+ {{/if}}
552
+ <a data-toggle="collapse" href="#" data-target="#collapse-{{../id}}-{{request.id}}" aria-expanded="false" aria-controls="collapse" id="requests-{{../id}}-{{request.id}}" class="show text-white z-block">
553
+ {{request.description}} <i class="float-lg-right fa fa-chevron-down"></i>
554
+ </a>
555
+ </div>
556
+ <div id="collapse-{{../id}}-{{request.id}}" class="show" aria-labelledby="requests-{{../id}}-{{request.id}}">
557
+ <div class="card-body">
558
+ <div class="row">
559
+ <div class="col-sm-12 mb-3">
560
+ <div class="card-deck">
561
+ <div class="card border-info" style="width: 50rem;">
562
+ <div class="card-body">
563
+ <h5 class="card-title text-uppercase text-white text-center bg-info">Request Information</h5>
564
+ <span><i class="fas fa-info-circle"></i></span><strong> Request Method:</strong> <span class="badge-outline-success badge badge-success"> {{request.method}}</span><br>
565
+ <span><i class="fas fa-info-circle"></i></span><strong> Request URL:</strong> {{request.path}} <br>
566
+ <span><i class="fas fa-info-circle"></i></span><strong> trace-id:</strong> <a href="{{traceUrl}}">{{traceId}}</a><br>
567
+ </div>
568
+ </div>
569
+ <div class="card border-info" style="width: 50rem;">
570
+ <div class="card-body">
571
+ <h5 class="card-title text-uppercase text-white text-center bg-info">Response Information</h5>
572
+ <span><i class="fas fa-info-circle"></i></span><strong> Response Code:</strong> <span class="float-right badge-outline badge badge-success"> {{response.status}} - {{response.statusText}} </span><br>
573
+ <span><i class="fas fa-stopwatch"></i></span><strong> Request Duration:</strong> <span class="float-right badge-outline badge badge-success"> {{testResult.runDurationMs}} ms</span><br>
574
+ <hr>
575
+ <h5 class="card-title text-uppercase text-white text-center bg-info">Test Pass Percentage</h5>
576
+ <div>
577
+ <div class="progress" style="height: 40px;">
578
+ {{#if (ifAllTestsPassedInRequest request)}}
579
+ <div class="progress-bar bg-success" style="width: 100%" role="progressbar">
580
+ {{else}}
581
+ <div class="progress-bar bg-danger" style="width: 100%" role="progressbar">
582
+ {{/if}}
583
+ <h5><strong>{{testPassPercentage request.tests}} %</strong></h5>
584
+ </div>
585
+ </div>
586
+ </div>
587
+ </div>
588
+ </div>
589
+ </div>
590
+ </div>
591
+ </div>
592
+ {{#if request.headers}}
593
+ <div class="row">
594
+ <div class="col-sm-12 mb-3">
595
+ <div class="card-deck">
596
+ <div class="card border-info" style="width: 50rem;">
597
+ <div class="card-body">
598
+ <h5 class="card-title text-uppercase text-white text-center bg-info">Request Headers</h5>
599
+ <div class="table-responsive">
600
+ <table class="table table-bordered">
601
+ <thead class="thead-light text-center"><tr><th>Header Name</th><th>Header Value</th></tr></thead>
602
+ <tbody>
603
+ {{#each request.headers}}
604
+ <tr>
605
+ <td class="text-nowrap">{{@key}}</td>
606
+ <td>{{this}}</td>
607
+ </tr>
608
+ {{/each}}
609
+ </tbody>
610
+ </table>
611
+ </div>
612
+ </div>
613
+ </div>
614
+ </div>
615
+ </div>
616
+ </div>
617
+ {{/if}}
618
+ {{#if request.body}}
619
+ <div class="row">
620
+ <div class="col-sm-12 mb-3">
621
+ <div class="card-deck">
622
+ <div class="card border-info" style="width: 50rem;">
623
+ <div class="card-body">
624
+ <h5 class="card-title text-uppercase text-white text-center bg-info">Request Body</h5>
625
+ <div class="dyn-height">
626
+ <pre><code id="copyText-requestBody-{{../id}}-{{request.id}}" class="prettyPrint">{{jsonStringify request.body}}</code></pre>
627
+ </div>
628
+ </div>
629
+ </div>
630
+ </div>
631
+ </div>
632
+ </div>
633
+ {{/if}}
634
+ {{#if response.headers}}
635
+ <div class="row">
636
+ <div class="col-sm-12 mb-3">
637
+ <div class="card-deck">
638
+ <div class="card border-info" style="width: 50rem;">
639
+ <div class="card-body">
640
+ <h5 class="card-title text-uppercase text-white text-center bg-info">Response Headers</h5>
641
+ <div class="dyn-height">
642
+ <pre><code id="copyText-responseHeaders-{{../id}}-{{request.id}}" class="prettyPrint">{{jsonStringify response.headers}}</code></pre>
643
+ </div>
644
+ </div>
645
+ </div>
646
+ </div>
647
+ </div>
648
+ </div>
649
+ {{/if}}
650
+ {{#if response.body}}
651
+ <div class="row">
652
+ <div class="col-sm-12 mb-3">
653
+ <div class="card-deck">
654
+ <div class="card border-info" style="width: 50rem;">
655
+ <div class="card-body">
656
+ <h5 class="card-title text-uppercase text-white text-center bg-info">Response Body</h5>
657
+ <div class="dyn-height">
658
+ <pre><code id="copyText-responseBody-{{../id}}-{{request.id}}" class="prettyPrint">{{jsonStringify response.body}}</code></pre>
659
+ </div>
660
+ </div>
661
+ </div>
662
+ </div>
663
+ </div>
664
+ </div>
665
+ {{/if}}
666
+ {{#if callback.headers}}
667
+ <div class="row">
668
+ <div class="col-sm-12 mb-3">
669
+ <div class="card-deck">
670
+ <div class="card border-info" style="width: 50rem;">
671
+ <div class="card-body">
672
+ <h5 class="card-title text-uppercase text-white text-center bg-info">Callback Headers</h5>
673
+ <div class="table-responsive">
674
+ <table class="table table-bordered">
675
+ <thead class="thead-light text-center"><tr><th>Header Name</th><th>Header Value</th></tr></thead>
676
+ <tbody>
677
+ {{#each callback.headers}}
678
+ <tr>
679
+ <td class="text-nowrap">{{@key}}</td>
680
+ <td>{{this}}</td>
681
+ </tr>
682
+ {{/each}}
683
+ </tbody>
684
+ </table>
685
+ </div>
686
+ </div>
687
+ </div>
688
+ </div>
689
+ </div>
690
+ </div>
691
+ {{/if}}
692
+ {{#if callback.body}}
693
+ <div class="row">
694
+ <div class="col-sm-12 mb-3">
695
+ <div class="card-deck">
696
+ <div class="card border-info" style="width: 50rem;">
697
+ <div class="card-body">
698
+ <h5 class="card-title text-uppercase text-white text-center bg-info">Callback Body</h5>
699
+ <div class="dyn-height">
700
+ <pre><code id="copyText-callbackBody-{{../id}}-{{request.id}}" class="prettyPrint">{{jsonStringify callback.body}}</code></pre>
701
+ </div>
702
+ </div>
703
+ </div>
704
+ </div>
705
+ </div>
706
+ </div>
707
+ {{/if}}
708
+
709
+ <div class="row">
710
+ <div class="card border-info">
711
+ <div class="card-body">
712
+ <h5 class="card-title text-uppercase text-white text-center bg-info">Test Information</h5>
713
+ <div class="table-responsive text-nowrap">
714
+ <table id="myTable-0ec92bb5-8001-4566-bd7a-917f7a4df5a4" class="table table-hover">
715
+ <thead><tr class="text-center"><th>Name</th><th>Result</th></tr></thead>
716
+ <tbody>
717
+ {{#each request.tests.assertions}}
718
+ <tr>
719
+ <td>{{description}}</td>
720
+ {{#if (isAssertionSkipped resultStatus.status)}}
721
+ <td class="text-center bg-warning">
722
+ SKIPPED
723
+ </td>
724
+ {{else if (isAssertionPassed resultStatus.status)}}
725
+ <td class="text-center bg-success">
726
+ PASSED
727
+ </td>
728
+ {{else}}
729
+ <td class="text-center bg-danger">
730
+ FAILED
731
+ </td>
732
+ </tr><tr><td colspan="2" class="text-center bg-danger">({{resultStatus.message}})</td>
733
+ {{/if}}
734
+ </tr>
735
+ {{/each}}
736
+ </tbody>
737
+ <tfoot>
738
+ <tr class="bg-light">
739
+ <td><strong>Total</strong></td>
740
+ <td class="text-center"><strong>{{request.tests.passedAssertionsCount}} / {{request.tests.assertions.length}}</strong></td>
741
+ </tr>
742
+ </tfoot>
743
+ </table>
744
+ </div>
745
+ <div class="row d-none">
746
+ <div class="col-sm-12 mb-3">
747
+ <div class="card-deck">
748
+ <div class="card border-danger" style="width: 50rem;">
749
+ <div class="card-body">
750
+ <h5 class="card-title text-uppercase text-white text-center bg-danger">Test Failure</h5>
751
+ <div class="table-responsive">
752
+ <table class="table table-hover">
753
+ <thead><tr class="text-nowrap"><th>Test Name</th><th>Assertion Error</th></tr></thead>
754
+ <tbody>
755
+ </tbody>
756
+ </table>
757
+ </div>
758
+ </div>
759
+ </div>
760
+ </div>
761
+ </div>
762
+ </div>
763
+ </div>
764
+ </div>
765
+ </div>
766
+ </div>
767
+ </div>
768
+ </div>
769
+ </div>
770
+ </div>
771
+ </div>
772
+ {{/each}}
773
+ </div>
774
+
775
+ </div>
776
+ {{/each}}
777
+ </div>
778
+ </div>
779
+ </div>
780
+ </div>
781
+ </div>
782
+ </body>
783
+ </html>
784
+
785
+
786
+
787
+ <script>
788
+ document.body.className = 'theme-light';
789
+ </script>
790
+