@getjones/test-infra 5.2.10 → 5.2.12

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 (288) hide show
  1. package/eslint.config.mjs +156 -156
  2. package/package.json +43 -42
  3. package/src/common/commonFlows/auth/auth.js +95 -95
  4. package/src/common/commonFlows/index.js +5 -5
  5. package/src/common/commonFlows/records/records.js +457 -423
  6. package/src/common/commonFlows/users/users.js +15 -15
  7. package/src/common/consts/accountSettings.js +112 -112
  8. package/src/common/consts/activationStatuses.js +6 -6
  9. package/src/common/consts/analysisStatuses.js +7 -7
  10. package/src/common/consts/autocomplete.js +10 -10
  11. package/src/common/consts/constantsForRecordsSortingAndFilters.js +49 -49
  12. package/src/common/consts/dashboardCharts.js +18 -18
  13. package/src/common/consts/homepage/AttentionTab.js +6 -6
  14. package/src/common/consts/homepage/sortOptions.js +19 -19
  15. package/src/common/consts/projectSettings.js +28 -28
  16. package/src/common/consts/recordTypes.js +5 -5
  17. package/src/common/consts/requirementActions.js +10 -10
  18. package/src/common/consts/s3FileTypes.js +12 -12
  19. package/src/common/consts/userRoles.js +21 -21
  20. package/src/common/consts/userTypes.js +16 -16
  21. package/src/common/errorCodes.js +12 -11
  22. package/src/common/httpResponseStatusCodes.json +19 -19
  23. package/src/common/httpResponseTypes.json +2 -2
  24. package/src/common/requests/apiKeyAuth/requests.js +45 -45
  25. package/src/common/requests/cookieAuth/requests.js +40 -40
  26. package/src/common/requests/internalAuth/requests.js +48 -48
  27. package/src/common/requests/requestHandlers.js +112 -112
  28. package/src/common/utils/arrayUtils.js +19 -19
  29. package/src/common/utils/complianceUtil.js +114 -114
  30. package/src/common/utils/configsUtil.js +22 -22
  31. package/src/common/utils/dataTypeUtils.js +41 -41
  32. package/src/common/utils/numberUtils.js +22 -22
  33. package/src/common/utils/objectUtils.js +102 -102
  34. package/src/common/utils/timeUtils.js +195 -195
  35. package/src/common/validations/typeValidations.js +36 -36
  36. package/src/defaults/configs/attributes.js +170 -170
  37. package/src/defaults/configs/auditConfigs.js +129 -129
  38. package/src/defaults/configs/coverage.js +144 -144
  39. package/src/defaults/configs/polices.js +28 -28
  40. package/src/defaults/configs/requirement.js +218 -218
  41. package/src/defaults/index.js +7 -7
  42. package/src/env.js +58 -58
  43. package/src/factory/globalRecord/globalRecord.js +43 -43
  44. package/src/factory/index.js +8 -8
  45. package/src/factory/records/records.js +295 -295
  46. package/src/factory/users/users.js +70 -70
  47. package/src/index.js +114 -114
  48. package/src/reporters/mochaReporter.js +273 -273
  49. package/src/resources/agreements/agreement.pdf +0 -0
  50. package/src/saas/internal-api/accountDirectory/api/accountDirectory.api.js +152 -152
  51. package/src/saas/internal-api/accountDirectory/api/accountDirectory.service.js +576 -576
  52. package/src/saas/internal-api/accountDirectory/consts/accountDirectory.consts.js +75 -75
  53. package/src/saas/internal-api/accountDirectory/index.js +5 -5
  54. package/src/saas/internal-api/accountDirectory/models/accountDirectory.models.js +172 -172
  55. package/src/saas/internal-api/accounts/api/core/accounts.core.api.js +48 -48
  56. package/src/saas/internal-api/accounts/api/core/accounts.core.service.js +104 -104
  57. package/src/saas/internal-api/accounts/api/emailCustomization/accounts.email.customizations.api.js +29 -29
  58. package/src/saas/internal-api/accounts/api/emailCustomization/accounts.email.customizations.service.js +60 -60
  59. package/src/saas/internal-api/accounts/api/emailCustomization/consts.js +8 -8
  60. package/src/saas/internal-api/accounts/api/openapi/accounts.openapi.api.js +54 -54
  61. package/src/saas/internal-api/accounts/api/openapi/accounts.openapi.service.js +67 -67
  62. package/src/saas/internal-api/accounts/api/settings/settings.api.js +21 -21
  63. package/src/saas/internal-api/accounts/api/settings/settings.service.js +58 -58
  64. package/src/saas/internal-api/accounts/consts/consts.js +8 -8
  65. package/src/saas/internal-api/accounts/index.js +22 -22
  66. package/src/saas/internal-api/accounts/models/core/create.account.model.js +16 -16
  67. package/src/saas/internal-api/accounts/models/settings/update.settings.model.js +110 -110
  68. package/src/saas/internal-api/accounts/utils/utils.js +60 -60
  69. package/src/saas/internal-api/agreement/api/agreement.api.js +39 -39
  70. package/src/saas/internal-api/agreement/api/agreement.service.js +121 -121
  71. package/src/saas/internal-api/agreement/consts/consts.js +11 -11
  72. package/src/saas/internal-api/agreement/index.js +12 -12
  73. package/src/saas/internal-api/agreement/models/create.agreement.model.js +12 -12
  74. package/src/saas/internal-api/agreement/models/createAgreementByAuditorModel.js +11 -11
  75. package/src/saas/internal-api/agreement/models/createAgreementByPMModel.js +13 -13
  76. package/src/saas/internal-api/auditCustomerRules/api/customer.rules.api.js +49 -49
  77. package/src/saas/internal-api/auditCustomerRules/api/customer.rules.service.js +121 -121
  78. package/src/saas/internal-api/auditCustomerRules/consts/customer.rule.js +40 -40
  79. package/src/saas/internal-api/auditCustomerRules/index.js +7 -7
  80. package/src/saas/internal-api/auditCustomerRules/models/customer.rule.model.js +55 -55
  81. package/src/saas/internal-api/auditCustomerRules/utils/customer.rule.util.js +70 -70
  82. package/src/saas/internal-api/auditNotes/api/audit.notes.api.js +40 -40
  83. package/src/saas/internal-api/auditNotes/api/audit.notes.service.js +116 -116
  84. package/src/saas/internal-api/auditNotes/index.js +4 -4
  85. package/src/saas/internal-api/auditNotes/models/audit.note.model.js +32 -32
  86. package/src/saas/internal-api/auditorComments/api/auditor.comments.api.js +20 -20
  87. package/src/saas/internal-api/auditorComments/api/auditor.comments.service.js +27 -27
  88. package/src/saas/internal-api/auditorComments/consts/auditor.comment.js +16 -16
  89. package/src/saas/internal-api/auditorComments/index.js +5 -5
  90. package/src/saas/internal-api/auditorComments/models/auditor.comment.model.js +40 -40
  91. package/src/saas/internal-api/auth/api/auth.api.js +78 -78
  92. package/src/saas/internal-api/auth/api/auth.service.js +206 -172
  93. package/src/saas/internal-api/auth/index.js +3 -3
  94. package/src/saas/internal-api/coi/api/coi.api.js +76 -76
  95. package/src/saas/internal-api/coi/api/coi.service.js +104 -104
  96. package/src/saas/internal-api/coi/consts/duplicateHandling.js +7 -7
  97. package/src/saas/internal-api/coi/consts/hashes.js +5 -5
  98. package/src/saas/internal-api/coi/consts/uploaderTypes.js +3 -3
  99. package/src/saas/internal-api/coi/index.js +16 -16
  100. package/src/saas/internal-api/coi/models/Combine.last.two.cois.model.js +25 -25
  101. package/src/saas/internal-api/coi/models/submit.coi.batch.model.js +23 -23
  102. package/src/saas/internal-api/coi/models/submit.coi.model.js +23 -23
  103. package/src/saas/internal-api/coi/utils/utils.js +185 -185
  104. package/src/saas/internal-api/compliance/api/amBestRating/am.best.rating.api.js +12 -12
  105. package/src/saas/internal-api/compliance/api/amBestRating/am.best.rating.service.js +14 -14
  106. package/src/saas/internal-api/compliance/api/audit/aiAudit/aiAudit.api.js +63 -63
  107. package/src/saas/internal-api/compliance/api/audit/aiAudit/aiAudit.service.js +99 -99
  108. package/src/saas/internal-api/compliance/api/audit/audit.api.js +124 -124
  109. package/src/saas/internal-api/compliance/api/audit/audit.service.js +390 -390
  110. package/src/saas/internal-api/compliance/api/complianceSnapshot/compliance.snapshot.api.js +32 -32
  111. package/src/saas/internal-api/compliance/api/complianceSnapshot/compliance.snapshot.service.js +73 -73
  112. package/src/saas/internal-api/compliance/api/convert/convert.api.js +12 -12
  113. package/src/saas/internal-api/compliance/api/convert/convert.service.js +7 -7
  114. package/src/saas/internal-api/compliance/api/coverage/coverage.api.js +33 -33
  115. package/src/saas/internal-api/compliance/api/coverage/coverage.service.js +46 -46
  116. package/src/saas/internal-api/compliance/api/overrideGap/override.gap.api.js +86 -86
  117. package/src/saas/internal-api/compliance/api/overrideGap/override.gap.service.js +300 -300
  118. package/src/saas/internal-api/compliance/consts/audit.js +130 -130
  119. package/src/saas/internal-api/compliance/consts/overrideGapRequest/override.gap.request.js +7 -7
  120. package/src/saas/internal-api/compliance/index.js +41 -41
  121. package/src/saas/internal-api/compliance/models/audit/audit.model.js +109 -109
  122. package/src/saas/internal-api/compliance/models/overrideGapRequest/override.gap.request.model.js +16 -16
  123. package/src/saas/internal-api/compliance/models/waive/waive.model.js +112 -112
  124. package/src/saas/internal-api/compliance/utils/auditUtil.js +308 -308
  125. package/src/saas/internal-api/compliance/utils/coverageUtil.js +45 -45
  126. package/src/saas/internal-api/contractors/api/contractors.service.js +482 -482
  127. package/src/saas/internal-api/contractors/consts/consts.js +6 -6
  128. package/src/saas/internal-api/contractors/index.js +8 -8
  129. package/src/saas/internal-api/contractors/models/assign.requirement.model.js +11 -11
  130. package/src/saas/internal-api/contractors/models/edit.contractor.model.js +73 -73
  131. package/src/saas/internal-api/contractors/models/link.request.model.js +10 -10
  132. package/src/saas/internal-api/contractors/models/verification.contractor.model.js +29 -29
  133. package/src/saas/internal-api/contractors/utils.js +25 -25
  134. package/src/saas/internal-api/customTags/api/customTags.api.js +47 -47
  135. package/src/saas/internal-api/customTags/api/customTags.service.js +96 -96
  136. package/src/saas/internal-api/customTags/index.js +4 -4
  137. package/src/saas/internal-api/customTags/models/customTagsModels.js +17 -17
  138. package/src/saas/internal-api/dashboard/api/recordList.api.js +38 -38
  139. package/src/saas/internal-api/dashboard/api/recordList.service.js +60 -60
  140. package/src/saas/internal-api/dashboard/index.js +5 -5
  141. package/src/saas/internal-api/dashboard/models/dashboard.filter.criteria.model.js +38 -38
  142. package/src/saas/internal-api/dbEmails/api/db.emails.api.js +25 -25
  143. package/src/saas/internal-api/dbEmails/api/db.emails.service.js +178 -178
  144. package/src/saas/internal-api/dbEmails/consts/consts.js +66 -66
  145. package/src/saas/internal-api/dbEmails/index.js +6 -6
  146. package/src/saas/internal-api/dbEmails/models/db.emails.model.js +22 -22
  147. package/src/saas/internal-api/dbEmails/utils/util.js +82 -82
  148. package/src/saas/internal-api/emailCustomization/api/email.customization.api.js +26 -26
  149. package/src/saas/internal-api/emailCustomization/api/email.customization.service.js +50 -50
  150. package/src/saas/internal-api/emailCustomization/index.js +3 -3
  151. package/src/saas/internal-api/fileScan/api/file.scan.api.js +14 -14
  152. package/src/saas/internal-api/fileScan/api/file.scan.service.js +35 -35
  153. package/src/saas/internal-api/fileScan/index.js +3 -3
  154. package/src/saas/internal-api/fileScan/models/update.scan.status.model.js +13 -13
  155. package/src/saas/internal-api/globalRecord/api/global.record.api.js +95 -95
  156. package/src/saas/internal-api/globalRecord/api/global.record.service.js +112 -112
  157. package/src/saas/internal-api/globalRecord/consts.js +20 -20
  158. package/src/saas/internal-api/globalRecord/index.js +6 -6
  159. package/src/saas/internal-api/globalRecord/models/global.record.model.js +60 -60
  160. package/src/saas/internal-api/globalRecord/utils/util.js +161 -161
  161. package/src/saas/internal-api/homepageCharts/api/charts.api.js +12 -12
  162. package/src/saas/internal-api/homepageCharts/api/charts.service.js +7 -7
  163. package/src/saas/internal-api/homepageCharts/index.js +3 -3
  164. package/src/saas/internal-api/notificationCenter/api/notification.center.api.js +32 -32
  165. package/src/saas/internal-api/notificationCenter/api/notification.center.service.js +49 -49
  166. package/src/saas/internal-api/notificationCenter/consts.js +9 -9
  167. package/src/saas/internal-api/notificationCenter/index.js +4 -4
  168. package/src/saas/internal-api/outlook/api/outlook.api.js +14 -14
  169. package/src/saas/internal-api/outlook/api/outlook.service.js +14 -14
  170. package/src/saas/internal-api/outlook/index.js +3 -3
  171. package/src/saas/internal-api/policyFile/api/policy.file.api.js +43 -43
  172. package/src/saas/internal-api/policyFile/api/policy.file.service.js +117 -117
  173. package/src/saas/internal-api/policyFile/consts.js +21 -21
  174. package/src/saas/internal-api/policyFile/index.js +11 -11
  175. package/src/saas/internal-api/policyFile/models/create.policy.file.model.js +11 -11
  176. package/src/saas/internal-api/policyFile/models/set.publish.flag.to.policy.model.js +13 -13
  177. package/src/saas/internal-api/projects/api/core/projects.api.js +39 -39
  178. package/src/saas/internal-api/projects/api/core/projects.service.js +77 -77
  179. package/src/saas/internal-api/projects/api/settings/project.settings.api.js +18 -18
  180. package/src/saas/internal-api/projects/api/settings/project.settings.service.js +35 -35
  181. package/src/saas/internal-api/projects/consts/defaultProject.js +3 -3
  182. package/src/saas/internal-api/projects/index.js +24 -24
  183. package/src/saas/internal-api/projects/models/core/create.project.model.js +41 -41
  184. package/src/saas/internal-api/projects/models/core/update.project.model.js +47 -47
  185. package/src/saas/internal-api/projects/models/settings/update.project.settings.model.js +48 -48
  186. package/src/saas/internal-api/projects/utils/utils.js +159 -159
  187. package/src/saas/internal-api/recordHub/api/record.hub.api.js +20 -20
  188. package/src/saas/internal-api/recordHub/api/record.hub.service.js +86 -86
  189. package/src/saas/internal-api/recordHub/index.js +3 -3
  190. package/src/saas/internal-api/recordNotes/api/record.notes.api.js +38 -38
  191. package/src/saas/internal-api/recordNotes/api/record.notes.service.js +56 -56
  192. package/src/saas/internal-api/recordNotes/api/record.notes.utils.js +12 -12
  193. package/src/saas/internal-api/recordNotes/index.js +3 -3
  194. package/src/saas/internal-api/relatedDocs/api/related.docs.api.js +98 -98
  195. package/src/saas/internal-api/relatedDocs/api/related.docs.service.js +180 -180
  196. package/src/saas/internal-api/relatedDocs/index.js +4 -4
  197. package/src/saas/internal-api/relatedDocs/models/related.doc.model.js +36 -36
  198. package/src/saas/internal-api/reports/api/reports.api.js +56 -56
  199. package/src/saas/internal-api/reports/api/reports.service.js +68 -68
  200. package/src/saas/internal-api/reports/consts/consts.js +71 -71
  201. package/src/saas/internal-api/reports/index.js +15 -15
  202. package/src/saas/internal-api/reports/models/report.model.js +27 -27
  203. package/src/saas/internal-api/requests/api/requests.api.js +132 -132
  204. package/src/saas/internal-api/requests/api/requests.service.js +315 -315
  205. package/src/saas/internal-api/requests/index.js +21 -21
  206. package/src/saas/internal-api/requests/models/create.request.model.js +39 -39
  207. package/src/saas/internal-api/requests/models/draft.request.criteria.model.js +18 -18
  208. package/src/saas/internal-api/requests/models/draft.request.report.model.js +14 -14
  209. package/src/saas/internal-api/requests/models/edit.request.model.js +31 -31
  210. package/src/saas/internal-api/requests/models/homepageRequestCriteriaModel.js +19 -19
  211. package/src/saas/internal-api/requests/models/requestListCriteriaModel.js +17 -17
  212. package/src/saas/internal-api/requests/models/tenant.request.model.js +9 -9
  213. package/src/saas/internal-api/requests/utils.js +16 -16
  214. package/src/saas/internal-api/requestsTable/api/requests.table.api.js +20 -20
  215. package/src/saas/internal-api/requestsTable/api/requests.table.service.js +14 -14
  216. package/src/saas/internal-api/requestsTable/index.js +3 -3
  217. package/src/saas/internal-api/requirements/api/lease/lease.api.js +74 -56
  218. package/src/saas/internal-api/requirements/api/lease/lease.service.js +167 -123
  219. package/src/saas/internal-api/requirements/api/requirements.api.js +65 -65
  220. package/src/saas/internal-api/requirements/api/requirements.service.js +198 -198
  221. package/src/saas/internal-api/requirements/consts/attributeTypes.json +8 -8
  222. package/src/saas/internal-api/requirements/consts/consts.js +22 -15
  223. package/src/saas/internal-api/requirements/index.js +22 -21
  224. package/src/saas/internal-api/requirements/models/create.requirement.model.js +17 -17
  225. package/src/saas/internal-api/requirements/models/extraction.request.model.js +16 -16
  226. package/src/saas/internal-api/requirements/models/policy.model.js +35 -35
  227. package/src/saas/internal-api/requirements/models/tab.extraction.request.model.js +14 -0
  228. package/src/saas/internal-api/requirements/models/update.requirement.model.js +19 -19
  229. package/src/saas/internal-api/requirements/utils/utils.js +129 -129
  230. package/src/saas/internal-api/sampleCoi/api/sample.coi.api.js +15 -15
  231. package/src/saas/internal-api/sampleCoi/api/sample.coi.service.js +48 -48
  232. package/src/saas/internal-api/sampleCoi/consts/consts.js +22 -22
  233. package/src/saas/internal-api/sampleCoi/index.js +4 -4
  234. package/src/saas/internal-api/serviceArea/api/coordinates.api.js +12 -12
  235. package/src/saas/internal-api/serviceArea/api/coordinates.service.js +7 -7
  236. package/src/saas/internal-api/serviceArea/index.js +4 -4
  237. package/src/saas/internal-api/serviceArea/utils/utils.js +8 -8
  238. package/src/saas/internal-api/tableOfContents/api/table.of.contents.api.js +37 -37
  239. package/src/saas/internal-api/tableOfContents/api/table.of.contents.service.js +19 -19
  240. package/src/saas/internal-api/tableOfContents/index.js +3 -3
  241. package/src/saas/internal-api/tabs/api/tabs.api.js +32 -32
  242. package/src/saas/internal-api/tabs/api/tabs.service.js +60 -60
  243. package/src/saas/internal-api/tabs/index.js +3 -3
  244. package/src/saas/internal-api/tabs/models/tabs.model.js +19 -19
  245. package/src/saas/internal-api/thread-scheduler/runner.js +69 -69
  246. package/src/saas/internal-api/thread-scheduler/schedulerJobs.js +8 -8
  247. package/src/saas/internal-api/uploadFiles/api/upload.file.api.js +49 -49
  248. package/src/saas/internal-api/uploadFiles/api/upload.file.service.js +162 -162
  249. package/src/saas/internal-api/uploadFiles/consts.js +36 -36
  250. package/src/saas/internal-api/uploadFiles/index.js +5 -5
  251. package/src/saas/internal-api/uploadFiles/utils.js +34 -34
  252. package/src/saas/internal-api/users/api/tenantApp/tenant.app.api.js +38 -38
  253. package/src/saas/internal-api/users/api/tenantApp/tenant.app.service.js +109 -109
  254. package/src/saas/internal-api/users/api/users.api.js +158 -158
  255. package/src/saas/internal-api/users/api/users.service.js +363 -363
  256. package/src/saas/internal-api/users/index.js +17 -17
  257. package/src/saas/internal-api/users/models/create.inner.system.user.model.js +18 -18
  258. package/src/saas/internal-api/users/models/notification.settings.model.js +15 -14
  259. package/src/saas/internal-api/users/models/tenant.user.model.js +11 -11
  260. package/src/saas/internal-api/users/models/users.model.js +43 -43
  261. package/src/saas/internal-api/users/utils/util.js +50 -49
  262. package/src/saas/internal-api/vendorProfile/api/vendor.profile.api.js +26 -26
  263. package/src/saas/internal-api/vendorProfile/api/vendor.profile.service.js +19 -19
  264. package/src/saas/internal-api/vendorProfile/index.js +3 -3
  265. package/src/saas/openapi/accounts/accounts.api.js +17 -17
  266. package/src/saas/openapi/accounts/accounts.service.js +11 -11
  267. package/src/saas/openapi/coi/coi.api.js +35 -35
  268. package/src/saas/openapi/coi/coi.service.js +53 -53
  269. package/src/saas/openapi/projects/projects.api.js +83 -83
  270. package/src/saas/openapi/projects/projects.service.js +71 -71
  271. package/src/saas/openapi/relatedDocs/related.docs.api.js +30 -30
  272. package/src/saas/openapi/relatedDocs/related.docs.service.js +55 -55
  273. package/src/saas/openapi/requests/index.js +7 -7
  274. package/src/saas/openapi/requests/models/invite.request.model.js +42 -42
  275. package/src/saas/openapi/requests/models/update.request.model.js +37 -37
  276. package/src/saas/openapi/requests/requests.api.js +93 -93
  277. package/src/saas/openapi/requests/requests.service.js +94 -94
  278. package/src/saas/openapi/requirements/index.js +6 -6
  279. package/src/saas/openapi/requirements/models/copy.requirement.model.js +10 -10
  280. package/src/saas/openapi/requirements/requirements.api.js +41 -41
  281. package/src/saas/openapi/requirements/requirements.service.js +55 -55
  282. package/src/saas/openapi/tabs/index.js +6 -6
  283. package/src/saas/openapi/tabs/models/create.tab.model.js +6 -6
  284. package/src/saas/openapi/tabs/tabs.api.js +27 -27
  285. package/src/saas/openapi/tabs/tabs.service.js +19 -19
  286. package/src/saas/openapi/users/user.model.js +10 -10
  287. package/src/saas/openapi/users/users.api.js +33 -33
  288. package/src/saas/openapi/users/users.service.js +51 -51
@@ -1,273 +1,273 @@
1
- const fs = require('fs');
2
- const path = require('path');
3
- const Spec = require('mocha/lib/reporters/spec');
4
-
5
- class CustomMochaReporter extends Spec {
6
- constructor(runner, options) {
7
- // Spec used for reporter log and err functionality
8
- super(runner, options);
9
-
10
- // Clean previous test scores before running
11
- try {
12
- const scoresFile = path.resolve(process.cwd(), 'test-scores.json');
13
-
14
- if (fs.existsSync(scoresFile)) {
15
- fs.unlinkSync(scoresFile);
16
- }
17
- } catch (e) {
18
- console.warn('test-scores.json delete was unsuccessful:', e.message);
19
- }
20
-
21
- this.runner = runner;
22
- this.options = options;
23
- this.reportGenerated = false;
24
-
25
- this.allTests = [];
26
- this.passedTests = [];
27
- this.failedTests = [];
28
- this.pendingTests = [];
29
- this.testStates = {};
30
- this.testErrors = {};
31
-
32
- global.testMatchScores = global.testMatchScores || {};
33
-
34
- this.loadSavedScores();
35
-
36
- runner.on('test', test => {
37
- this.allTests.push(test);
38
- });
39
-
40
- runner.on('pass', test => {
41
- this.testStates[getFullTitle(test)] = 'passed';
42
- this.passedTests.push(test);
43
- });
44
-
45
- runner.on('fail', (test, err) => {
46
- const testKey = getFullTitle(test);
47
- this.testStates[testKey] = 'failed';
48
- this.failedTests.push(test);
49
- this.testErrors[testKey] = err;
50
- });
51
-
52
- runner.on('pending', test => {
53
- this.testStates[getFullTitle(test)] = 'pending';
54
- this.pendingTests.push(test);
55
- });
56
-
57
- runner.on('end', () => {
58
- this.generateReport();
59
- });
60
-
61
- process.on('exit', () => {
62
- this.generateReport();
63
- });
64
-
65
- process.on('SIGINT', () => {
66
- this.generateReport();
67
- process.exit(0);
68
- });
69
-
70
- process.on('SIGTERM', () => {
71
- this.generateReport();
72
- process.exit(0);
73
- });
74
-
75
- process.on('uncaughtException', err => {
76
- console.error('Uncaught Exception:', err);
77
- this.generateReport();
78
- process.exit(1);
79
- });
80
-
81
- process.on('unhandledRejection', (reason, promise) => {
82
- console.error('Unhandled Rejection at:', promise, 'reason:', reason);
83
- this.generateReport();
84
- process.exit(1);
85
- });
86
- }
87
-
88
- loadSavedScores() {
89
- try {
90
- const scoresFile = path.resolve(process.cwd(), 'test-scores.json');
91
-
92
- if (fs.existsSync(scoresFile)) {
93
- const persistedScores = JSON.parse(fs.readFileSync(scoresFile, 'utf8'));
94
- global.testMatchScores = { ... persistedScores, ... global.testMatchScores };
95
- }
96
- } catch (e) {
97
- console.warn('Failed to load test scores:', e.message);
98
- }
99
- }
100
-
101
- generateReport() {
102
- if (this.reportGenerated) {
103
- return;
104
- }
105
-
106
- this.reportGenerated = true;
107
-
108
- let report = null;
109
- try {
110
- this.loadSavedScores();
111
-
112
- const suiteGroups = this.groupTestsBySuite();
113
-
114
- const tests = this.allTests.map(test => this.processTest(test));
115
- const passes = this.passedTests.map(test => this.processTest(test));
116
- const failures = this.failedTests.map(test => this.processTest(test));
117
- const pending = this.pendingTests.map(test => this.processTest(test));
118
-
119
- const stats = this.runner.stats || {};
120
-
121
- report = {
122
- stats: {
123
- suites: Object.keys(suiteGroups).length,
124
- tests: this.allTests.length,
125
- passes: this.passedTests.length,
126
- pending: this.pendingTests.length,
127
- failures: this.failedTests.length,
128
- start: stats.start || new Date().toISOString(),
129
- end: stats.end || new Date().toISOString(),
130
- duration: stats.duration || 0
131
- },
132
- suites: this.generateSuitesFromGroups(suiteGroups),
133
- tests,
134
- passes,
135
- failures,
136
- pending
137
- };
138
- } catch (error) {
139
- console.error('Error generating report:', error);
140
- report = {
141
- stats: {
142
- suites: 0,
143
- tests: 0,
144
- passes: 0,
145
- pending: 0,
146
- failures: 0,
147
- start: new Date().toISOString(),
148
- end: new Date().toISOString(),
149
- duration: 0
150
- },
151
- suites: [],
152
- tests: [],
153
- passes: [],
154
- failures: [],
155
- pending: []
156
- };
157
- } finally {
158
- this.writeReport(report);
159
- }
160
- }
161
-
162
- groupTestsBySuite() {
163
- const suiteGroups = {};
164
-
165
- for (const test of this.allTests) {
166
- const fullTitle = getFullTitle(test);
167
- const testTitle = test.title;
168
- const suiteTitle = fullTitle.replace(testTitle, '').trim();
169
-
170
- if (!suiteGroups[suiteTitle]) {
171
- suiteGroups[suiteTitle] = [];
172
- }
173
-
174
- suiteGroups[suiteTitle].push(test);
175
- }
176
-
177
- return suiteGroups;
178
- }
179
-
180
- generateSuitesFromGroups(suiteGroups) {
181
- const suites = [];
182
-
183
- for (const [suiteTitle, tests] of Object.entries(suiteGroups)) {
184
- const suiteData = {
185
- title: suiteTitle,
186
- tests: tests.map(test => this.processTest(test))
187
- };
188
-
189
- suites.push(suiteData);
190
- }
191
-
192
- return suites;
193
- }
194
-
195
- processTest(test) {
196
- return {
197
- fullTitle: getFullTitle(test),
198
- title: test.title,
199
- duration: test.duration,
200
- result: this.getTestResult(test),
201
- err: this.getTestError(test),
202
- successRate: this.getSuccessRate(test)
203
- };
204
- }
205
-
206
- getTestResult(test) {
207
- const fullTitle = getFullTitle(test);
208
- return this.testStates[fullTitle] || 'unknown';
209
- }
210
-
211
- getTestError(test) {
212
- const testKey = getFullTitle(test);
213
- const err = this.testErrors[testKey] || test.err;
214
-
215
- return !err ?
216
- {} :
217
- {
218
- message: err.message || '',
219
- name: err.name || 'Error',
220
- stack: err.stack || '',
221
- showDiff: err.showDiff,
222
- actual: err.actual,
223
- expected: err.expected,
224
- operator: err.operator
225
- };
226
- }
227
-
228
- getSuccessRate(test) {
229
- const fullTitle = getFullTitle(test);
230
-
231
- if (global.testMatchScores && typeof global.testMatchScores[fullTitle] !== 'undefined') {
232
- return global.testMatchScores[fullTitle];
233
- }
234
-
235
- const status = this.testStates[fullTitle];
236
-
237
- if (status === 'failed') {
238
- return 0;
239
- }
240
-
241
- if (status === 'passed') {
242
- return 100;
243
- }
244
-
245
- return 0;
246
- }
247
-
248
- writeReport(report) {
249
- try {
250
- const fileName = (this.options.reporterOptions && this.options.reporterOptions.fileName) || 'report.json';
251
- const filePath = path.resolve(process.cwd(), fileName);
252
-
253
- fs.writeFileSync(filePath, JSON.stringify(report, null, 2));
254
- console.log(`Report written to: ${filePath}`);
255
- } catch (error) {
256
- console.error('Error writing report:', error);
257
- try {
258
- const backupPath = path.resolve(process.cwd(), 'report-backup.json');
259
- fs.writeFileSync(backupPath, JSON.stringify(report, null, 2));
260
- console.log(`Backup report written to: ${backupPath}`);
261
- } catch (backupError) {
262
- console.error('Failed to write backup report:', backupError);
263
- }
264
- }
265
- }
266
- }
267
-
268
- function getFullTitle(test) {
269
- const title = test && (typeof test.fullTitle === 'function' ? test.fullTitle() : test.fullTitle);
270
- return title?.trim() || '';
271
- }
272
-
273
- module.exports = CustomMochaReporter;
1
+ const fs = require('fs');
2
+ const path = require('path');
3
+ const Spec = require('mocha/lib/reporters/spec');
4
+
5
+ class CustomMochaReporter extends Spec {
6
+ constructor(runner, options) {
7
+ // Spec used for reporter log and err functionality
8
+ super(runner, options);
9
+
10
+ // Clean previous test scores before running
11
+ try {
12
+ const scoresFile = path.resolve(process.cwd(), 'test-scores.json');
13
+
14
+ if (fs.existsSync(scoresFile)) {
15
+ fs.unlinkSync(scoresFile);
16
+ }
17
+ } catch (e) {
18
+ console.warn('test-scores.json delete was unsuccessful:', e.message);
19
+ }
20
+
21
+ this.runner = runner;
22
+ this.options = options;
23
+ this.reportGenerated = false;
24
+
25
+ this.allTests = [];
26
+ this.passedTests = [];
27
+ this.failedTests = [];
28
+ this.pendingTests = [];
29
+ this.testStates = {};
30
+ this.testErrors = {};
31
+
32
+ global.testMatchScores = global.testMatchScores || {};
33
+
34
+ this.loadSavedScores();
35
+
36
+ runner.on('test', test => {
37
+ this.allTests.push(test);
38
+ });
39
+
40
+ runner.on('pass', test => {
41
+ this.testStates[getFullTitle(test)] = 'passed';
42
+ this.passedTests.push(test);
43
+ });
44
+
45
+ runner.on('fail', (test, err) => {
46
+ const testKey = getFullTitle(test);
47
+ this.testStates[testKey] = 'failed';
48
+ this.failedTests.push(test);
49
+ this.testErrors[testKey] = err;
50
+ });
51
+
52
+ runner.on('pending', test => {
53
+ this.testStates[getFullTitle(test)] = 'pending';
54
+ this.pendingTests.push(test);
55
+ });
56
+
57
+ runner.on('end', () => {
58
+ this.generateReport();
59
+ });
60
+
61
+ process.on('exit', () => {
62
+ this.generateReport();
63
+ });
64
+
65
+ process.on('SIGINT', () => {
66
+ this.generateReport();
67
+ process.exit(0);
68
+ });
69
+
70
+ process.on('SIGTERM', () => {
71
+ this.generateReport();
72
+ process.exit(0);
73
+ });
74
+
75
+ process.on('uncaughtException', err => {
76
+ console.error('Uncaught Exception:', err);
77
+ this.generateReport();
78
+ process.exit(1);
79
+ });
80
+
81
+ process.on('unhandledRejection', (reason, promise) => {
82
+ console.error('Unhandled Rejection at:', promise, 'reason:', reason);
83
+ this.generateReport();
84
+ process.exit(1);
85
+ });
86
+ }
87
+
88
+ loadSavedScores() {
89
+ try {
90
+ const scoresFile = path.resolve(process.cwd(), 'test-scores.json');
91
+
92
+ if (fs.existsSync(scoresFile)) {
93
+ const persistedScores = JSON.parse(fs.readFileSync(scoresFile, 'utf8'));
94
+ global.testMatchScores = { ... persistedScores, ... global.testMatchScores };
95
+ }
96
+ } catch (e) {
97
+ console.warn('Failed to load test scores:', e.message);
98
+ }
99
+ }
100
+
101
+ generateReport() {
102
+ if (this.reportGenerated) {
103
+ return;
104
+ }
105
+
106
+ this.reportGenerated = true;
107
+
108
+ let report = null;
109
+ try {
110
+ this.loadSavedScores();
111
+
112
+ const suiteGroups = this.groupTestsBySuite();
113
+
114
+ const tests = this.allTests.map(test => this.processTest(test));
115
+ const passes = this.passedTests.map(test => this.processTest(test));
116
+ const failures = this.failedTests.map(test => this.processTest(test));
117
+ const pending = this.pendingTests.map(test => this.processTest(test));
118
+
119
+ const stats = this.runner.stats || {};
120
+
121
+ report = {
122
+ stats: {
123
+ suites: Object.keys(suiteGroups).length,
124
+ tests: this.allTests.length,
125
+ passes: this.passedTests.length,
126
+ pending: this.pendingTests.length,
127
+ failures: this.failedTests.length,
128
+ start: stats.start || new Date().toISOString(),
129
+ end: stats.end || new Date().toISOString(),
130
+ duration: stats.duration || 0
131
+ },
132
+ suites: this.generateSuitesFromGroups(suiteGroups),
133
+ tests,
134
+ passes,
135
+ failures,
136
+ pending
137
+ };
138
+ } catch (error) {
139
+ console.error('Error generating report:', error);
140
+ report = {
141
+ stats: {
142
+ suites: 0,
143
+ tests: 0,
144
+ passes: 0,
145
+ pending: 0,
146
+ failures: 0,
147
+ start: new Date().toISOString(),
148
+ end: new Date().toISOString(),
149
+ duration: 0
150
+ },
151
+ suites: [],
152
+ tests: [],
153
+ passes: [],
154
+ failures: [],
155
+ pending: []
156
+ };
157
+ } finally {
158
+ this.writeReport(report);
159
+ }
160
+ }
161
+
162
+ groupTestsBySuite() {
163
+ const suiteGroups = {};
164
+
165
+ for (const test of this.allTests) {
166
+ const fullTitle = getFullTitle(test);
167
+ const testTitle = test.title;
168
+ const suiteTitle = fullTitle.replace(testTitle, '').trim();
169
+
170
+ if (!suiteGroups[suiteTitle]) {
171
+ suiteGroups[suiteTitle] = [];
172
+ }
173
+
174
+ suiteGroups[suiteTitle].push(test);
175
+ }
176
+
177
+ return suiteGroups;
178
+ }
179
+
180
+ generateSuitesFromGroups(suiteGroups) {
181
+ const suites = [];
182
+
183
+ for (const [suiteTitle, tests] of Object.entries(suiteGroups)) {
184
+ const suiteData = {
185
+ title: suiteTitle,
186
+ tests: tests.map(test => this.processTest(test))
187
+ };
188
+
189
+ suites.push(suiteData);
190
+ }
191
+
192
+ return suites;
193
+ }
194
+
195
+ processTest(test) {
196
+ return {
197
+ fullTitle: getFullTitle(test),
198
+ title: test.title,
199
+ duration: test.duration,
200
+ result: this.getTestResult(test),
201
+ err: this.getTestError(test),
202
+ successRate: this.getSuccessRate(test)
203
+ };
204
+ }
205
+
206
+ getTestResult(test) {
207
+ const fullTitle = getFullTitle(test);
208
+ return this.testStates[fullTitle] || 'unknown';
209
+ }
210
+
211
+ getTestError(test) {
212
+ const testKey = getFullTitle(test);
213
+ const err = this.testErrors[testKey] || test.err;
214
+
215
+ return !err ?
216
+ {} :
217
+ {
218
+ message: err.message || '',
219
+ name: err.name || 'Error',
220
+ stack: err.stack || '',
221
+ showDiff: err.showDiff,
222
+ actual: err.actual,
223
+ expected: err.expected,
224
+ operator: err.operator
225
+ };
226
+ }
227
+
228
+ getSuccessRate(test) {
229
+ const fullTitle = getFullTitle(test);
230
+
231
+ if (global.testMatchScores && typeof global.testMatchScores[fullTitle] !== 'undefined') {
232
+ return global.testMatchScores[fullTitle];
233
+ }
234
+
235
+ const status = this.testStates[fullTitle];
236
+
237
+ if (status === 'failed') {
238
+ return 0;
239
+ }
240
+
241
+ if (status === 'passed') {
242
+ return 100;
243
+ }
244
+
245
+ return 0;
246
+ }
247
+
248
+ writeReport(report) {
249
+ try {
250
+ const fileName = (this.options.reporterOptions && this.options.reporterOptions.fileName) || 'report.json';
251
+ const filePath = path.resolve(process.cwd(), fileName);
252
+
253
+ fs.writeFileSync(filePath, JSON.stringify(report, null, 2));
254
+ console.log(`Report written to: ${filePath}`);
255
+ } catch (error) {
256
+ console.error('Error writing report:', error);
257
+ try {
258
+ const backupPath = path.resolve(process.cwd(), 'report-backup.json');
259
+ fs.writeFileSync(backupPath, JSON.stringify(report, null, 2));
260
+ console.log(`Backup report written to: ${backupPath}`);
261
+ } catch (backupError) {
262
+ console.error('Failed to write backup report:', backupError);
263
+ }
264
+ }
265
+ }
266
+ }
267
+
268
+ function getFullTitle(test) {
269
+ const title = test && (typeof test.fullTitle === 'function' ? test.fullTitle() : test.fullTitle);
270
+ return title?.trim() || '';
271
+ }
272
+
273
+ module.exports = CustomMochaReporter;