@cccsaurora/howler-ui 3.1.0-dev.1655 → 3.1.0-dev.1657

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 (354) hide show
  1. package/api/action/execute.test.d.ts +1 -0
  2. package/api/action/execute.test.js +38 -0
  3. package/api/action/index.test.d.ts +1 -0
  4. package/api/action/index.test.js +59 -0
  5. package/api/action/operations.test.d.ts +1 -0
  6. package/api/action/operations.test.js +23 -0
  7. package/api/analytic/comments/index.test.d.ts +1 -0
  8. package/api/analytic/comments/index.test.js +43 -0
  9. package/api/analytic/comments/react.test.d.ts +1 -0
  10. package/api/analytic/comments/react.test.js +27 -0
  11. package/api/analytic/favourite.test.d.ts +1 -0
  12. package/api/analytic/favourite.test.js +20 -0
  13. package/api/analytic/index.test.d.ts +1 -0
  14. package/api/analytic/index.test.js +54 -0
  15. package/api/analytic/notebooks/index.test.d.ts +1 -0
  16. package/api/analytic/notebooks/index.test.js +31 -0
  17. package/api/analytic/owner.test.d.ts +1 -0
  18. package/api/analytic/owner.test.js +25 -0
  19. package/api/auth/apikey.test.d.ts +1 -0
  20. package/api/auth/apikey.test.js +34 -0
  21. package/api/auth/index.test.d.ts +1 -0
  22. package/api/auth/index.test.js +21 -0
  23. package/api/auth/login.test.d.ts +1 -0
  24. package/api/auth/login.test.js +53 -0
  25. package/api/configs/index.test.d.ts +1 -0
  26. package/api/configs/index.test.js +22 -0
  27. package/api/dossier/index.test.d.ts +1 -0
  28. package/api/dossier/index.test.js +57 -0
  29. package/api/help.test.d.ts +1 -0
  30. package/api/help.test.js +25 -0
  31. package/api/hit/assign.test.d.ts +1 -0
  32. package/api/hit/assign.test.js +22 -0
  33. package/api/hit/comments/index.test.d.ts +1 -0
  34. package/api/hit/comments/index.test.js +47 -0
  35. package/api/hit/comments/react.test.d.ts +1 -0
  36. package/api/hit/comments/react.test.js +27 -0
  37. package/api/hit/index.test.d.ts +1 -0
  38. package/api/hit/index.test.js +49 -0
  39. package/api/hit/labels.test.d.ts +1 -0
  40. package/api/hit/labels.test.js +29 -0
  41. package/api/hit/overwrite.test.d.ts +1 -0
  42. package/api/hit/overwrite.test.js +23 -0
  43. package/api/hit/transition.test.d.ts +1 -0
  44. package/api/hit/transition.test.js +24 -0
  45. package/api/index.test.d.ts +1 -0
  46. package/api/index.test.js +137 -0
  47. package/api/notebook/environments.test.d.ts +1 -0
  48. package/api/notebook/environments.test.js +22 -0
  49. package/api/notebook/index.test.d.ts +1 -0
  50. package/api/notebook/index.test.js +28 -0
  51. package/api/overview/index.test.d.ts +1 -0
  52. package/api/overview/index.test.js +42 -0
  53. package/api/search/fields/index.test.d.ts +1 -0
  54. package/api/search/fields/index.test.js +31 -0
  55. package/api/search/grouped/index.test.d.ts +1 -0
  56. package/api/search/grouped/index.test.js +18 -0
  57. package/api/search/grouped/user.test.d.ts +1 -0
  58. package/api/search/grouped/user.test.js +33 -0
  59. package/api/search/index.test.d.ts +1 -0
  60. package/api/search/index.test.js +41 -0
  61. package/api/search/user.test.d.ts +1 -0
  62. package/api/search/user.test.js +41 -0
  63. package/api/socket/index.test.d.ts +1 -0
  64. package/api/socket/index.test.js +15 -0
  65. package/api/template/index.test.d.ts +1 -0
  66. package/api/template/index.test.js +43 -0
  67. package/api/user/avatar/index.test.d.ts +1 -0
  68. package/api/user/avatar/index.test.js +22 -0
  69. package/api/user/groups.test.d.ts +1 -0
  70. package/api/user/groups.test.js +22 -0
  71. package/api/user/index.test.d.ts +1 -0
  72. package/api/user/index.test.js +37 -0
  73. package/api/user/whoami.test.d.ts +1 -0
  74. package/api/user/whoami.test.js +26 -0
  75. package/api/utils/createPermissionsApi.test.d.ts +1 -0
  76. package/api/utils/createPermissionsApi.test.js +30 -0
  77. package/api/v2/case/index.test.d.ts +1 -0
  78. package/api/v2/case/index.test.js +57 -0
  79. package/api/v2/case/items.test.d.ts +1 -0
  80. package/api/v2/case/items.test.js +37 -0
  81. package/api/v2/case/rules.test.d.ts +1 -0
  82. package/api/v2/case/rules.test.js +33 -0
  83. package/api/v2/fuzzy.test.d.ts +1 -0
  84. package/api/v2/fuzzy.test.js +30 -0
  85. package/api/v2/index.test.d.ts +1 -0
  86. package/api/v2/index.test.js +13 -0
  87. package/api/v2/search/index.test.d.ts +1 -0
  88. package/api/v2/search/index.test.js +42 -0
  89. package/api/view/index.test.d.ts +1 -0
  90. package/api/view/index.test.js +54 -0
  91. package/branding/AppBrand.test.d.ts +1 -0
  92. package/branding/AppBrand.test.js +29 -0
  93. package/components/app/drawers/ApiKeyDrawer.test.d.ts +1 -0
  94. package/components/app/drawers/ApiKeyDrawer.test.js +119 -0
  95. package/components/app/drawers/AssignUserDrawer.test.d.ts +1 -0
  96. package/components/app/drawers/AssignUserDrawer.test.js +75 -0
  97. package/components/app/hooks/useTitle.test.d.ts +1 -0
  98. package/components/app/hooks/useTitle.test.js +103 -0
  99. package/components/app/providers/AnalyticProvider.test.d.ts +1 -0
  100. package/components/app/providers/AnalyticProvider.test.js +58 -0
  101. package/components/app/providers/AppBarProvider.test.d.ts +1 -0
  102. package/components/app/providers/AppBarProvider.test.js +23 -0
  103. package/components/app/providers/AppDrawerProvider.test.d.ts +1 -0
  104. package/components/app/providers/AppDrawerProvider.test.js +42 -0
  105. package/components/app/providers/AvatarProvider.test.d.ts +1 -0
  106. package/components/app/providers/AvatarProvider.test.js +50 -0
  107. package/components/app/providers/CustomPluginProvider.test.d.ts +1 -0
  108. package/components/app/providers/CustomPluginProvider.test.js +29 -0
  109. package/components/app/providers/FavouritesProvider.test.d.ts +1 -0
  110. package/components/app/providers/FavouritesProvider.test.js +115 -0
  111. package/components/app/providers/FieldProvider.test.d.ts +1 -0
  112. package/components/app/providers/FieldProvider.test.js +28 -0
  113. package/components/app/providers/LocalStorageProvider.test.d.ts +1 -0
  114. package/components/app/providers/LocalStorageProvider.test.js +42 -0
  115. package/components/app/providers/ModalProvider.test.d.ts +1 -0
  116. package/components/app/providers/ModalProvider.test.js +35 -0
  117. package/components/app/providers/OverviewProvider.test.d.ts +1 -0
  118. package/components/app/providers/OverviewProvider.test.js +62 -0
  119. package/components/app/providers/RecordProvider.test.d.ts +1 -0
  120. package/components/app/providers/RecordProvider.test.js +66 -0
  121. package/components/app/providers/contextUtils.test.d.ts +1 -0
  122. package/components/app/providers/contextUtils.test.js +8 -0
  123. package/components/elements/Comment.test.d.ts +1 -0
  124. package/components/elements/Comment.test.js +109 -0
  125. package/components/elements/EditRow.test.d.ts +1 -0
  126. package/components/elements/EditRow.test.js +88 -0
  127. package/components/elements/MarkdownEditor.test.d.ts +1 -0
  128. package/components/elements/MarkdownEditor.test.js +75 -0
  129. package/components/elements/ObjectDetails.test.d.ts +1 -0
  130. package/components/elements/ObjectDetails.test.js +70 -0
  131. package/components/elements/PluginChip.d.ts +3 -2
  132. package/components/elements/PluginChip.js +2 -2
  133. package/components/elements/PluginChip.test.d.ts +1 -0
  134. package/components/elements/PluginChip.test.js +30 -0
  135. package/components/elements/ThemedEditor.test.d.ts +1 -0
  136. package/components/elements/ThemedEditor.test.js +66 -0
  137. package/components/elements/addons/layout/FlexPort.test.d.ts +1 -0
  138. package/components/elements/addons/layout/FlexPort.test.js +34 -0
  139. package/components/elements/addons/lists/TuiListBase.test.d.ts +1 -0
  140. package/components/elements/addons/lists/TuiListBase.test.js +44 -0
  141. package/components/elements/addons/lists/TuiListProvider.test.d.ts +1 -0
  142. package/components/elements/addons/lists/TuiListProvider.test.js +50 -0
  143. package/components/elements/addons/search/phrase/Phrase.test.d.ts +1 -0
  144. package/components/elements/addons/search/phrase/Phrase.test.js +77 -0
  145. package/components/elements/addons/search/phrase/PhraseLexer.test.d.ts +1 -0
  146. package/components/elements/addons/search/phrase/PhraseLexer.test.js +92 -0
  147. package/components/elements/addons/search/phrase/index.test.d.ts +1 -0
  148. package/components/elements/addons/search/phrase/index.test.js +20 -0
  149. package/components/elements/case/CaseCard.test.d.ts +1 -0
  150. package/components/elements/case/CaseCard.test.js +107 -0
  151. package/components/elements/display/ClassificationChip.test.d.ts +1 -0
  152. package/components/elements/display/ClassificationChip.test.js +60 -0
  153. package/components/elements/display/HandlebarsMarkdown.test.d.ts +1 -0
  154. package/components/elements/display/HandlebarsMarkdown.test.js +41 -0
  155. package/components/elements/display/HowlerAvatar.test.d.ts +1 -0
  156. package/components/elements/display/HowlerAvatar.test.js +54 -0
  157. package/components/elements/display/ItemManager.test.d.ts +1 -0
  158. package/components/elements/display/ItemManager.test.js +68 -0
  159. package/components/elements/display/UserPageWrapper.test.d.ts +1 -0
  160. package/components/elements/display/UserPageWrapper.test.js +22 -0
  161. package/components/elements/display/handlebars/helpers.test.d.ts +1 -0
  162. package/components/elements/display/handlebars/helpers.test.js +104 -0
  163. package/components/elements/display/icons/SocketBadge.test.d.ts +1 -0
  164. package/components/elements/display/icons/SocketBadge.test.js +49 -0
  165. package/components/elements/display/markdownPlugins/tabs.test.d.ts +1 -0
  166. package/components/elements/display/markdownPlugins/tabs.test.js +50 -0
  167. package/components/elements/hit/HitActions.js +1 -1
  168. package/components/elements/hit/HitActions.test.d.ts +1 -0
  169. package/components/elements/hit/HitActions.test.js +166 -0
  170. package/components/elements/hit/HitLabels.test.js +34 -3
  171. package/components/elements/hit/HitNotebooks.test.d.ts +1 -0
  172. package/components/elements/hit/HitNotebooks.test.js +138 -0
  173. package/components/elements/hit/HitSummary.test.d.ts +1 -0
  174. package/components/elements/hit/HitSummary.test.js +188 -0
  175. package/components/elements/hit/actions/ButtonActions.test.d.ts +1 -0
  176. package/components/elements/hit/actions/ButtonActions.test.js +51 -0
  177. package/components/elements/hit/actions/DropdownActions.test.d.ts +1 -0
  178. package/components/elements/hit/actions/DropdownActions.test.js +60 -0
  179. package/components/elements/hit/grid/AddColumnModal.test.d.ts +1 -0
  180. package/components/elements/hit/grid/AddColumnModal.test.js +88 -0
  181. package/components/elements/hit/grid/RecordTable.test.d.ts +1 -0
  182. package/components/elements/hit/grid/RecordTable.test.js +99 -0
  183. package/components/elements/record/RecordComments.test.d.ts +1 -0
  184. package/components/elements/record/RecordComments.test.js +151 -0
  185. package/components/elements/record/RecordContextMenu.js +3 -3
  186. package/components/elements/record/RecordRelated.test.d.ts +1 -0
  187. package/components/elements/record/RecordRelated.test.js +77 -0
  188. package/components/elements/record/RecordWorklog.test.d.ts +1 -0
  189. package/components/elements/record/RecordWorklog.test.js +77 -0
  190. package/components/hooks/useHitActions.test.d.ts +1 -0
  191. package/components/hooks/useHitActions.test.js +189 -0
  192. package/components/hooks/useMyApi.test.d.ts +1 -0
  193. package/components/hooks/useMyApi.test.js +31 -0
  194. package/components/hooks/useMyChart.test.d.ts +1 -0
  195. package/components/hooks/useMyChart.test.js +62 -0
  196. package/components/hooks/useMySearch.test.d.ts +1 -0
  197. package/components/hooks/useMySearch.test.js +96 -0
  198. package/components/hooks/useMySnackbar.test.d.ts +1 -0
  199. package/components/hooks/useMySnackbar.test.js +36 -0
  200. package/components/hooks/useMyUserFunctions.test.d.ts +1 -0
  201. package/components/hooks/useMyUserFunctions.test.js +142 -0
  202. package/components/hooks/useRecordSelection.test.d.ts +1 -0
  203. package/components/hooks/useRecordSelection.test.js +102 -0
  204. package/components/logins/Login.test.d.ts +1 -0
  205. package/components/logins/Login.test.js +67 -0
  206. package/components/logins/hooks/useLogin.test.d.ts +1 -0
  207. package/components/logins/hooks/useLogin.test.js +142 -0
  208. package/components/routes/action/shared/OperationEntry.test.d.ts +1 -0
  209. package/components/routes/action/shared/OperationEntry.test.js +80 -0
  210. package/components/routes/action/shared/OperationStep.test.d.ts +1 -0
  211. package/components/routes/action/shared/OperationStep.test.js +84 -0
  212. package/components/routes/action/useMyActionFunctions.test.d.ts +1 -0
  213. package/components/routes/action/useMyActionFunctions.test.js +217 -0
  214. package/components/routes/action/view/ActionDetails.test.d.ts +1 -0
  215. package/components/routes/action/view/ActionDetails.test.js +170 -0
  216. package/components/routes/action/view/ActionSearch.test.d.ts +1 -0
  217. package/components/routes/action/view/ActionSearch.test.js +185 -0
  218. package/components/routes/action/view/Integrations.test.d.ts +1 -0
  219. package/components/routes/action/view/Integrations.test.js +62 -0
  220. package/components/routes/admin/users/UserEditor.test.d.ts +1 -0
  221. package/components/routes/admin/users/UserEditor.test.js +74 -0
  222. package/components/routes/admin/users/UserSearch.test.d.ts +1 -0
  223. package/components/routes/admin/users/UserSearch.test.js +146 -0
  224. package/components/routes/advanced/QueryBuilder.test.d.ts +1 -0
  225. package/components/routes/advanced/QueryBuilder.test.js +185 -0
  226. package/components/routes/advanced/QueryEditor.test.d.ts +1 -0
  227. package/components/routes/advanced/QueryEditor.test.js +130 -0
  228. package/components/routes/advanced/completionProviders.test.d.ts +1 -0
  229. package/components/routes/advanced/completionProviders.test.js +144 -0
  230. package/components/routes/analytics/AnalyticComments.test.d.ts +1 -0
  231. package/components/routes/analytics/AnalyticComments.test.js +156 -0
  232. package/components/routes/analytics/AnalyticDetails.test.d.ts +1 -0
  233. package/components/routes/analytics/AnalyticDetails.test.js +161 -0
  234. package/components/routes/analytics/AnalyticNotebooks.test.d.ts +1 -0
  235. package/components/routes/analytics/AnalyticNotebooks.test.js +112 -0
  236. package/components/routes/analytics/AnalyticOverview.test.d.ts +1 -0
  237. package/components/routes/analytics/AnalyticOverview.test.js +97 -0
  238. package/components/routes/analytics/AnalyticOverviews.test.d.ts +1 -0
  239. package/components/routes/analytics/AnalyticOverviews.test.js +70 -0
  240. package/components/routes/analytics/AnalyticSearch.test.d.ts +1 -0
  241. package/components/routes/analytics/AnalyticSearch.test.js +167 -0
  242. package/components/routes/analytics/AnalyticTemplates.test.d.ts +1 -0
  243. package/components/routes/analytics/AnalyticTemplates.test.js +63 -0
  244. package/components/routes/analytics/TriageSettings.test.d.ts +1 -0
  245. package/components/routes/analytics/TriageSettings.test.js +89 -0
  246. package/components/routes/analytics/widgets/Assessment.test.d.ts +1 -0
  247. package/components/routes/analytics/widgets/Assessment.test.js +45 -0
  248. package/components/routes/analytics/widgets/Created.test.d.ts +1 -0
  249. package/components/routes/analytics/widgets/Created.test.js +41 -0
  250. package/components/routes/analytics/widgets/DetectionStatus.test.d.ts +1 -0
  251. package/components/routes/analytics/widgets/DetectionStatus.test.js +21 -0
  252. package/components/routes/analytics/widgets/Stacked.test.d.ts +1 -0
  253. package/components/routes/analytics/widgets/Stacked.test.js +51 -0
  254. package/components/routes/cases/Cases.test.d.ts +1 -0
  255. package/components/routes/cases/Cases.test.js +132 -0
  256. package/components/routes/dossiers/Dossiers.test.d.ts +1 -0
  257. package/components/routes/dossiers/Dossiers.test.js +150 -0
  258. package/components/routes/help/ActionDocumentation.test.d.ts +1 -0
  259. package/components/routes/help/ActionDocumentation.test.js +58 -0
  260. package/components/routes/help/ActionIntroductionDocumentation.test.d.ts +1 -0
  261. package/components/routes/help/ActionIntroductionDocumentation.test.js +68 -0
  262. package/components/routes/help/ApiDocumentation.test.d.ts +1 -0
  263. package/components/routes/help/ApiDocumentation.test.js +79 -0
  264. package/components/routes/help/AuthDocumentation.test.d.ts +1 -0
  265. package/components/routes/help/AuthDocumentation.test.js +34 -0
  266. package/components/routes/help/ClientDocumentation.test.d.ts +1 -0
  267. package/components/routes/help/ClientDocumentation.test.js +34 -0
  268. package/components/routes/help/Help.test.d.ts +1 -0
  269. package/components/routes/help/Help.test.js +57 -0
  270. package/components/routes/help/HitBannerDocumentation.test.d.ts +1 -0
  271. package/components/routes/help/HitBannerDocumentation.test.js +25 -0
  272. package/components/routes/help/HitDocumentation.test.d.ts +1 -0
  273. package/components/routes/help/HitDocumentation.test.js +53 -0
  274. package/components/routes/help/HitLabelsDocumentation.test.d.ts +1 -0
  275. package/components/routes/help/HitLabelsDocumentation.test.js +17 -0
  276. package/components/routes/help/HitLinksDocumentation.test.d.ts +1 -0
  277. package/components/routes/help/HitLinksDocumentation.test.js +27 -0
  278. package/components/routes/help/HitSchemaDocumentation.test.d.ts +1 -0
  279. package/components/routes/help/HitSchemaDocumentation.test.js +67 -0
  280. package/components/routes/help/NotebookDocumentation.test.d.ts +1 -0
  281. package/components/routes/help/NotebookDocumentation.test.js +34 -0
  282. package/components/routes/help/OverviewDocumentation.test.d.ts +1 -0
  283. package/components/routes/help/OverviewDocumentation.test.js +26 -0
  284. package/components/routes/help/RetentionDocumentation.test.d.ts +1 -0
  285. package/components/routes/help/RetentionDocumentation.test.js +61 -0
  286. package/components/routes/help/SearchDocumentation.test.d.ts +1 -0
  287. package/components/routes/help/SearchDocumentation.test.js +65 -0
  288. package/components/routes/help/TemplateDocumentation.test.d.ts +1 -0
  289. package/components/routes/help/TemplateDocumentation.test.js +58 -0
  290. package/components/routes/help/ViewDocumentation.test.d.ts +1 -0
  291. package/components/routes/help/ViewDocumentation.test.js +34 -0
  292. package/components/routes/help/components/HelpTabs.test.d.ts +1 -0
  293. package/components/routes/help/components/HelpTabs.test.js +26 -0
  294. package/components/routes/hits/search/InformationPane.test.d.ts +1 -0
  295. package/components/routes/hits/search/InformationPane.test.js +251 -0
  296. package/components/routes/hits/search/RecordBrowser.test.js +179 -51
  297. package/components/routes/hits/search/RecordQuery.test.d.ts +1 -0
  298. package/components/routes/hits/search/RecordQuery.test.js +117 -0
  299. package/components/routes/hits/search/SearchPane.test.d.ts +1 -0
  300. package/components/routes/hits/search/SearchPane.test.js +178 -0
  301. package/components/routes/hits/search/grid/RecordGrid.test.d.ts +1 -0
  302. package/components/routes/hits/search/grid/RecordGrid.test.js +107 -0
  303. package/components/routes/hits/search/shared/CustomSort.test.d.ts +1 -0
  304. package/components/routes/hits/search/shared/CustomSort.test.js +77 -0
  305. package/components/routes/hits/search/shared/HitFilter.test.d.ts +1 -0
  306. package/components/routes/hits/search/shared/HitFilter.test.js +83 -0
  307. package/components/routes/hits/search/shared/HitSort.test.d.ts +1 -0
  308. package/components/routes/hits/search/shared/HitSort.test.js +61 -0
  309. package/components/routes/hits/search/shared/LayoutSettings.test.d.ts +1 -0
  310. package/components/routes/hits/search/shared/LayoutSettings.test.js +84 -0
  311. package/components/routes/hits/search/shared/SearchSpan.test.d.ts +1 -0
  312. package/components/routes/hits/search/shared/SearchSpan.test.js +84 -0
  313. package/components/routes/home/AnalyticCard.test.d.ts +1 -0
  314. package/components/routes/home/AnalyticCard.test.js +87 -0
  315. package/components/routes/home/index.test.d.ts +1 -0
  316. package/components/routes/home/index.test.js +190 -0
  317. package/components/routes/overviews/OverviewViewer.test.d.ts +1 -0
  318. package/components/routes/overviews/OverviewViewer.test.js +151 -0
  319. package/components/routes/overviews/Overviews.test.d.ts +1 -0
  320. package/components/routes/overviews/Overviews.test.js +154 -0
  321. package/components/routes/settings/AdminSection.test.d.ts +1 -0
  322. package/components/routes/settings/AdminSection.test.js +26 -0
  323. package/components/routes/settings/LocalSection.test.d.ts +1 -0
  324. package/components/routes/settings/LocalSection.test.js +75 -0
  325. package/components/routes/settings/ProfileSection.test.d.ts +1 -0
  326. package/components/routes/settings/ProfileSection.test.js +95 -0
  327. package/components/routes/settings/SecuritySection.test.d.ts +1 -0
  328. package/components/routes/settings/SecuritySection.test.js +90 -0
  329. package/components/routes/settings/Settings.test.d.ts +1 -0
  330. package/components/routes/settings/Settings.test.js +60 -0
  331. package/components/routes/templates/TemplateEditor.test.d.ts +1 -0
  332. package/components/routes/templates/TemplateEditor.test.js +94 -0
  333. package/components/routes/templates/TemplateViewer.test.d.ts +1 -0
  334. package/components/routes/templates/TemplateViewer.test.js +145 -0
  335. package/components/routes/templates/Templates.test.d.ts +1 -0
  336. package/components/routes/templates/Templates.test.js +165 -0
  337. package/components/routes/views/ViewComposer.test.d.ts +1 -0
  338. package/components/routes/views/ViewComposer.test.js +320 -0
  339. package/components/routes/views/Views.test.d.ts +1 -0
  340. package/components/routes/views/Views.test.js +247 -0
  341. package/package.json +1 -1
  342. package/plugins/HowlerPlugin.test.d.ts +1 -0
  343. package/plugins/HowlerPlugin.test.js +103 -0
  344. package/plugins/clue/components/ClueChip.js +2 -2
  345. package/plugins/clue/helpers.test.d.ts +1 -0
  346. package/plugins/clue/helpers.test.js +100 -0
  347. package/plugins/store.test.d.ts +1 -0
  348. package/plugins/store.test.js +53 -0
  349. package/utils/classificationParser.test.d.ts +1 -0
  350. package/utils/classificationParser.test.js +199 -0
  351. package/utils/constants.test.d.ts +1 -0
  352. package/utils/constants.test.js +62 -0
  353. package/utils/typeUtils.test.d.ts +1 -0
  354. package/utils/typeUtils.test.js +22 -0
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,62 @@
1
+ /// <reference types="vitest" />
2
+ import { renderHook } from '@testing-library/react';
3
+ import { describe, expect, it, vi } from 'vitest';
4
+ const mockRegister = vi.hoisted(() => vi.fn());
5
+ vi.mock('@mui/material', () => ({
6
+ useTheme: () => ({
7
+ palette: {
8
+ text: { primary: '#111111', secondary: '#999999' }
9
+ }
10
+ })
11
+ }));
12
+ vi.mock('chart.js', () => {
13
+ const token = {};
14
+ return {
15
+ ArcElement: token,
16
+ BarElement: token,
17
+ CategoryScale: token,
18
+ Filler: token,
19
+ Legend: token,
20
+ LinearScale: token,
21
+ LineElement: token,
22
+ PointElement: token,
23
+ SubTitle: token,
24
+ TimeScale: token,
25
+ Title: token,
26
+ Tooltip: token,
27
+ Chart: {
28
+ defaults: { font: {} },
29
+ register: mockRegister
30
+ }
31
+ };
32
+ });
33
+ vi.mock('chartjs-plugin-zoom', () => ({
34
+ default: { id: 'zoom' }
35
+ }));
36
+ vi.mock('chartjs-adapter-dayjs-4', () => ({}));
37
+ vi.mock('react-i18next', () => ({
38
+ useTranslation: () => ({ t: (key) => `translated:${key}` })
39
+ }));
40
+ import useMyChart from './useMyChart';
41
+ describe('useMyChart', () => {
42
+ it('registers chart primitives and builds line options', () => {
43
+ const { result } = renderHook(() => useMyChart());
44
+ const line = result.current.line('title.key', 'subtitle.key');
45
+ expect(mockRegister).toHaveBeenCalled();
46
+ expect(line.plugins.title.text).toBe('translated:title.key');
47
+ expect(line.plugins.zoom.pan.mode).toBe('x');
48
+ expect(line.plugins).not.toHaveProperty('subtitle');
49
+ expect(line.scales.x.type).toBe('time');
50
+ });
51
+ it('builds doughnut, bar, and scatter options', () => {
52
+ const { result } = renderHook(() => useMyChart());
53
+ const doughnut = result.current.doughnut('doughnut.title');
54
+ const bar = result.current.bar('bar.title');
55
+ const scatter = result.current.scatter('scatter.title', 'scatter.subtitle');
56
+ expect(doughnut).not.toHaveProperty('scales');
57
+ expect(doughnut.plugins.subtitle.text).toBe('translated:route.analytics.overview.limit');
58
+ expect(bar.plugins.legend).toEqual({ display: false });
59
+ expect(bar.scales.y.ticks).toEqual({ precision: 0, color: '#111111' });
60
+ expect(scatter.plugins.subtitle.text).toBe('translated:scatter.subtitle');
61
+ });
62
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,96 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /// <reference types="vitest" />
3
+ import { act, render, renderHook, screen } from '@testing-library/react';
4
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
5
+ const mockNavigate = vi.hoisted(() => vi.fn());
6
+ const mockSearchPost = vi.hoisted(() => vi.fn());
7
+ vi.mock('@mui/material', () => ({
8
+ Alert: ({ children }) => _jsx("div", { children: children }),
9
+ Box: ({ children }) => _jsx("div", { children: children }),
10
+ Typography: ({ children }) => _jsx("div", { children: children })
11
+ }));
12
+ vi.mock('api', () => ({
13
+ default: {
14
+ search: {
15
+ hit: {
16
+ post: mockSearchPost
17
+ }
18
+ }
19
+ }
20
+ }));
21
+ vi.mock('components/elements/hit/HitPreview', () => ({
22
+ default: ({ hit }) => _jsx("div", { children: hit.howler.id })
23
+ }));
24
+ vi.mock('react-i18next', () => ({
25
+ useTranslation: () => ({ t: (key) => key })
26
+ }));
27
+ vi.mock('react-router', () => ({
28
+ Link: ({ children, to }) => _jsx("a", { href: to, children: children }),
29
+ useNavigate: () => mockNavigate
30
+ }));
31
+ vi.mock('./useMyLocalStorage', () => ({
32
+ useMyLocalStorageItem: () => [25]
33
+ }));
34
+ import useMySearch from './useMySearch';
35
+ describe('useMySearch', () => {
36
+ beforeEach(() => {
37
+ mockNavigate.mockReset();
38
+ mockSearchPost.mockReset();
39
+ });
40
+ it('searches hits and maps results into quick-search items', async () => {
41
+ mockSearchPost.mockResolvedValue({
42
+ items: [{ howler: { id: 'hit-1' } }, { howler: { id: 'hit-2' } }]
43
+ });
44
+ const set = vi.fn();
45
+ const state = { items: [], set, searching: false };
46
+ const { result } = renderHook(() => useMySearch());
47
+ await result.current.onEnter('alpha/beta', state);
48
+ expect(mockSearchPost).toHaveBeenCalledWith({
49
+ offset: 0,
50
+ rows: 25,
51
+ query: 'howler.assignment:*alpha\\/beta* OR howler.analytic:*alpha\\/beta* OR howler.detection:*alpha\\/beta* OR howler.status:*alpha\\/beta*'
52
+ });
53
+ expect(set).toHaveBeenLastCalledWith({
54
+ ...state,
55
+ searching: false,
56
+ items: [
57
+ { id: 'hit-1', item: { howler: { id: 'hit-1' } } },
58
+ { id: 'hit-2', item: { howler: { id: 'hit-2' } } }
59
+ ]
60
+ });
61
+ });
62
+ it('handles missing state, empty responses, and thrown errors', async () => {
63
+ const { result } = renderHook(() => useMySearch());
64
+ await expect(result.current.onEnter('ignored')).resolves.toBeUndefined();
65
+ const set = vi.fn();
66
+ const state = { items: [{ id: 'x' }], set, searching: false };
67
+ mockSearchPost.mockResolvedValueOnce(null);
68
+ await act(async () => {
69
+ await result.current.onEnter('bad', state);
70
+ });
71
+ expect(set).toHaveBeenLastCalledWith({ ...state, searching: false, items: [] });
72
+ mockSearchPost.mockRejectedValueOnce(new Error('boom'));
73
+ await act(async () => {
74
+ await result.current.onEnter('bad', state);
75
+ });
76
+ expect(set).toHaveBeenLastCalledWith({ ...state, searching: false, items: [] });
77
+ });
78
+ it('renders quick-search header states, item links, and navigates on selection', async () => {
79
+ const { result, rerender } = renderHook(() => useMySearch());
80
+ render(result.current.headerRenderer({ items: undefined, searching: false, set: vi.fn() }));
81
+ expect(screen.getByText('hit.quicksearch')).toBeInTheDocument();
82
+ const set = vi.fn();
83
+ mockSearchPost.mockResolvedValueOnce(null);
84
+ await act(async () => {
85
+ await result.current.onEnter('broken', { items: [], searching: false, set });
86
+ });
87
+ rerender();
88
+ render(result.current.headerRenderer({ items: [], searching: false, set }));
89
+ expect(screen.getByText('hit.search.invalid')).toBeInTheDocument();
90
+ render(result.current.itemRenderer({ id: 'hit-9', item: { howler: { id: 'hit-9' } } }));
91
+ expect(screen.getByRole('link')).toHaveAttribute('href', '/hits/hit-9');
92
+ expect(screen.getByText('hit-9')).toBeInTheDocument();
93
+ result.current.onItemSelect({ item: { howler: { id: 'hit-9' } } });
94
+ expect(mockNavigate).toHaveBeenCalledWith('/hits/hit-9');
95
+ });
96
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,36 @@
1
+ /// <reference types="vitest" />
2
+ import { renderHook } from '@testing-library/react';
3
+ import { describe, expect, it, vi } from 'vitest';
4
+ const mockEnqueueSnackbar = vi.hoisted(() => vi.fn());
5
+ const mockCloseSnackbar = vi.hoisted(() => vi.fn());
6
+ vi.mock('notistack', () => ({
7
+ useSnackbar: () => ({
8
+ enqueueSnackbar: mockEnqueueSnackbar,
9
+ closeSnackbar: mockCloseSnackbar
10
+ })
11
+ }));
12
+ import useMySnackbar from './useMySnackbar';
13
+ describe('useMySnackbar', () => {
14
+ it('enqueues typed snackbar messages with default options', () => {
15
+ const { result } = renderHook(() => useMySnackbar());
16
+ result.current.showSuccessMessage('saved');
17
+ result.current.showWarningMessage('warn', 2000);
18
+ result.current.showErrorMessage('error');
19
+ result.current.showInfoMessage('info');
20
+ expect(mockEnqueueSnackbar).toHaveBeenCalledWith('saved', expect.objectContaining({
21
+ variant: 'success',
22
+ autoHideDuration: 5000,
23
+ preventDuplicate: true
24
+ }));
25
+ expect(mockEnqueueSnackbar).toHaveBeenCalledWith('warn', expect.objectContaining({ variant: 'warning', autoHideDuration: 2000 }));
26
+ });
27
+ it('merges custom snackbar click handlers with the default close handler', () => {
28
+ const { result } = renderHook(() => useMySnackbar());
29
+ const onClick = vi.fn();
30
+ result.current.showInfoMessage('custom', 1000, { SnackbarProps: { onClick } });
31
+ const options = mockEnqueueSnackbar.mock.calls.at(-1)[1];
32
+ options.SnackbarProps.onClick('event');
33
+ expect(onClick).toHaveBeenCalledWith('event');
34
+ expect(mockCloseSnackbar).toHaveBeenCalled();
35
+ });
36
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,142 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /// <reference types="vitest" />
3
+ import { act, renderHook } from '@testing-library/react';
4
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
5
+ const mockDispatchApi = vi.hoisted(() => vi.fn());
6
+ const mockShowSuccessMessage = vi.hoisted(() => vi.fn());
7
+ const mockShowWarningMessage = vi.hoisted(() => vi.fn());
8
+ const mockNavigate = vi.hoisted(() => vi.fn());
9
+ const mockSetUser = vi.hoisted(() => vi.fn());
10
+ const mockDrawerOpen = vi.hoisted(() => vi.fn());
11
+ const mockShowModal = vi.hoisted(() => vi.fn((node) => node.props.onConfirm()));
12
+ const mockUserPut = vi.hoisted(() => vi.fn((username, body) => ({ username, body })));
13
+ const mockApiKeyDelete = vi.hoisted(() => vi.fn((keyId) => ({ keyId })));
14
+ const mockGroupsGet = vi.hoisted(() => ({ groups: true }));
15
+ let currentUser = { username: 'current', apikeys: [['existing', ['r'], '2026-12-31']], dashboard: [] };
16
+ const modalContextToken = vi.hoisted(() => ({ name: 'modal-context' }));
17
+ const drawerContextToken = vi.hoisted(() => ({ name: 'drawer-context' }));
18
+ vi.mock('@tui/core', () => ({
19
+ useAppUser: () => ({ user: currentUser, setUser: mockSetUser })
20
+ }));
21
+ vi.mock('api', () => ({
22
+ default: {
23
+ user: {
24
+ put: mockUserPut,
25
+ groups: { get: () => mockGroupsGet }
26
+ },
27
+ auth: {
28
+ apikey: { del: mockApiKeyDelete }
29
+ }
30
+ }
31
+ }));
32
+ vi.mock('components/app/drawers/ApiKeyDrawer', () => ({
33
+ default: ({ onCreated }) => (_jsx("button", { onClick: () => onCreated('new-key', ['rw'], '2027-01-01'), children: "create api key" }))
34
+ }));
35
+ vi.mock('components/app/drawers/ViewGroupsDrawer', () => ({
36
+ default: ({ groups }) => _jsx("div", { children: groups.join(',') })
37
+ }));
38
+ vi.mock('components/app/providers/AppDrawerProvider', () => ({
39
+ AppDrawerContext: drawerContextToken
40
+ }));
41
+ vi.mock('components/app/providers/ModalProvider', () => ({
42
+ ModalContext: modalContextToken
43
+ }));
44
+ vi.mock('components/elements/display/modals/ConfirmDeleteModal', () => ({
45
+ default: ({ onConfirm }) => _jsx("button", { onClick: onConfirm, children: "confirm delete" })
46
+ }));
47
+ vi.mock('components/hooks/useMyApi', () => ({
48
+ default: () => ({ dispatchApi: mockDispatchApi })
49
+ }));
50
+ vi.mock('components/hooks/useMySnackbar', () => ({
51
+ default: () => ({
52
+ showSuccessMessage: mockShowSuccessMessage,
53
+ showWarningMessage: mockShowWarningMessage
54
+ })
55
+ }));
56
+ vi.mock('react-i18next', () => ({
57
+ useTranslation: () => ({ t: (key) => key })
58
+ }));
59
+ vi.mock('react-router', () => ({
60
+ useNavigate: () => mockNavigate
61
+ }));
62
+ vi.mock('react', async (importOriginal) => {
63
+ const actual = await importOriginal();
64
+ return {
65
+ ...actual,
66
+ useContext: (context) => {
67
+ if (context === modalContextToken) {
68
+ return { showModal: mockShowModal };
69
+ }
70
+ if (context === drawerContextToken) {
71
+ return { open: mockDrawerOpen };
72
+ }
73
+ return actual.useContext(context);
74
+ }
75
+ };
76
+ });
77
+ import useMyUserFunctions from './useMyUserFunctions';
78
+ describe('useMyUserFunctions', () => {
79
+ beforeEach(() => {
80
+ currentUser = { username: 'current', apikeys: [['existing', ['r'], '2026-12-31']], dashboard: [] };
81
+ mockDispatchApi.mockReset();
82
+ mockShowSuccessMessage.mockReset();
83
+ mockShowWarningMessage.mockReset();
84
+ mockNavigate.mockReset();
85
+ mockSetUser.mockReset();
86
+ mockDrawerOpen.mockReset();
87
+ mockShowModal.mockReset();
88
+ mockUserPut.mockReset();
89
+ vi.useRealTimers();
90
+ });
91
+ it('updates user profile fields and roles', async () => {
92
+ const { result } = renderHook(() => useMyUserFunctions());
93
+ const user = { username: 'demo', roles: ['member'], apikeys: [] };
94
+ await expect(result.current.editName(user, 'Demo User')).resolves.toEqual({ ...user, name: 'Demo User' });
95
+ await expect(result.current.editQuota(user, '42')).resolves.toEqual({ ...user, api_quota: 42 });
96
+ await expect(result.current.editQuota(user)).resolves.toEqual({ ...user, api_quota: 25 });
97
+ await expect(result.current.addRole(user, 'admin')).resolves.toEqual({ ...user, roles: ['member', 'admin'] });
98
+ await expect(result.current.removeRole({ ...user, roles: ['member', 'admin'] }, 'admin')).resolves.toEqual({
99
+ ...user,
100
+ roles: ['member']
101
+ });
102
+ expect(mockShowSuccessMessage).toHaveBeenCalledWith('api.user.name.updated');
103
+ expect(mockShowSuccessMessage).toHaveBeenCalledWith('api.user.quota.updated');
104
+ expect(mockShowSuccessMessage).toHaveBeenCalledWith('api.user.role.updated');
105
+ });
106
+ it('opens drawers for api keys and group viewing', async () => {
107
+ const { result } = renderHook(() => useMyUserFunctions());
108
+ result.current.addApiKey();
109
+ const apiKeyDrawerProps = mockDrawerOpen.mock.calls[0][0];
110
+ expect(apiKeyDrawerProps.titleKey).toBe('app.drawer.user.apikey.title');
111
+ const apiKeyChild = apiKeyDrawerProps.children;
112
+ apiKeyChild.props.onCreated('new-key', ['rw'], '2027-01-01');
113
+ expect(mockSetUser).toHaveBeenCalledWith({
114
+ ...currentUser,
115
+ apikeys: [...currentUser.apikeys, ['new-key', ['rw'], '2027-01-01']]
116
+ });
117
+ expect(mockShowSuccessMessage).toHaveBeenCalledWith('api.user.apikey.updated');
118
+ mockDispatchApi.mockResolvedValueOnce([]);
119
+ await result.current.viewGroups();
120
+ expect(mockShowWarningMessage).toHaveBeenCalledWith('api.user.groups.empty');
121
+ mockDispatchApi.mockResolvedValueOnce(['group-a', 'group-b']);
122
+ await result.current.viewGroups();
123
+ expect(mockDrawerOpen).toHaveBeenLastCalledWith(expect.objectContaining({ titleKey: 'app.drawer.user.groups.title', children: expect.any(Object) }));
124
+ });
125
+ it('removes api keys, updates dashboard settings, and logs out after password changes', async () => {
126
+ vi.useFakeTimers();
127
+ const { result } = renderHook(() => useMyUserFunctions());
128
+ const user = { username: 'demo', roles: ['member'], apikeys: [['key-1', ['r'], '2026-01-01']] };
129
+ await result.current.removeApiKey(user, ['key-1', ['r'], '2026-01-01']);
130
+ expect(mockShowModal).toHaveBeenCalled();
131
+ expect(mockApiKeyDelete).toHaveBeenCalledWith('key-1');
132
+ expect(mockShowSuccessMessage).toHaveBeenCalledWith('api.user.apikey.removed');
133
+ await result.current.setDashboard([{ i: 'widget' }]);
134
+ await result.current.setRefreshRate(30);
135
+ await result.current.editPassword('new-pass');
136
+ expect(mockShowSuccessMessage).toHaveBeenCalledWith('password.success');
137
+ await act(async () => {
138
+ await vi.advanceTimersByTimeAsync(5000);
139
+ });
140
+ expect(mockNavigate).toHaveBeenCalledWith('/logout');
141
+ });
142
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,102 @@
1
+ /// <reference types="vitest" />
2
+ import { act, renderHook } from '@testing-library/react';
3
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
4
+ const mockAddRecordToSelection = vi.hoisted(() => vi.fn());
5
+ const mockRemoveRecordFromSelection = vi.hoisted(() => vi.fn());
6
+ const mockClearSelectedRecords = vi.hoisted(() => vi.fn());
7
+ const mockSetSelected = vi.hoisted(() => vi.fn());
8
+ const parameterContextToken = vi.hoisted(() => ({ name: 'parameter-context' }));
9
+ const recordContextToken = vi.hoisted(() => ({ name: 'record-context' }));
10
+ const recordSearchContextToken = vi.hoisted(() => ({ name: 'record-search-context' }));
11
+ let selectedRecords = [];
12
+ let responseItems = [];
13
+ vi.mock('components/app/providers/ParameterProvider', () => ({
14
+ ParameterContext: parameterContextToken
15
+ }));
16
+ vi.mock('components/app/providers/RecordProvider', () => ({
17
+ RecordContext: recordContextToken
18
+ }));
19
+ vi.mock('components/app/providers/RecordSearchProvider', () => ({
20
+ RecordSearchContext: recordSearchContextToken
21
+ }));
22
+ vi.mock('use-context-selector', async (importOriginal) => {
23
+ const actual = await importOriginal();
24
+ return {
25
+ ...actual,
26
+ useContextSelector: (context, selector) => {
27
+ if (context === recordSearchContextToken) {
28
+ return selector({ response: { items: responseItems } });
29
+ }
30
+ if (context === recordContextToken) {
31
+ return selector({
32
+ selectedRecords,
33
+ addRecordToSelection: mockAddRecordToSelection,
34
+ removeRecordFromSelection: mockRemoveRecordFromSelection,
35
+ clearSelectedRecords: mockClearSelectedRecords
36
+ });
37
+ }
38
+ if (context === parameterContextToken) {
39
+ return selector({ setSelected: mockSetSelected });
40
+ }
41
+ return selector(null);
42
+ }
43
+ };
44
+ });
45
+ import useRecordSelection from './useRecordSelection';
46
+ describe('useRecordSelection', () => {
47
+ beforeEach(() => {
48
+ selectedRecords = [];
49
+ responseItems = [{ howler: { id: 'a' } }, { howler: { id: 'b' } }, { howler: { id: 'c' } }];
50
+ mockAddRecordToSelection.mockReset();
51
+ mockRemoveRecordFromSelection.mockReset();
52
+ mockClearSelectedRecords.mockReset();
53
+ mockSetSelected.mockReset();
54
+ document.getSelection = vi.fn(() => ({ removeAllRanges: vi.fn() }));
55
+ });
56
+ it('selects a single record on normal click', () => {
57
+ const { result } = renderHook(() => useRecordSelection());
58
+ const event = { ctrlKey: false, shiftKey: false };
59
+ act(() => {
60
+ result.current.onClick(event, { howler: { id: 'b' } });
61
+ });
62
+ expect(result.current.lastSelected).toBe('b');
63
+ expect(mockClearSelectedRecords).toHaveBeenCalledWith('b');
64
+ expect(mockSetSelected).toHaveBeenCalledWith('b');
65
+ });
66
+ it('toggles ctrl-clicked records in the multi-selection set', () => {
67
+ selectedRecords = [{ howler: { id: 'b' } }];
68
+ const { result } = renderHook(() => useRecordSelection());
69
+ const stopPropagation = vi.fn();
70
+ act(() => {
71
+ result.current.onClick({ ctrlKey: true, shiftKey: false, stopPropagation }, { howler: { id: 'b' } });
72
+ });
73
+ expect(mockRemoveRecordFromSelection).toHaveBeenCalledWith('b');
74
+ selectedRecords = [];
75
+ act(() => {
76
+ result.current.onClick({ ctrlKey: true, shiftKey: false, stopPropagation }, { howler: { id: 'c' } });
77
+ });
78
+ expect(mockAddRecordToSelection).toHaveBeenCalledWith('c');
79
+ expect(stopPropagation).toHaveBeenCalledTimes(2);
80
+ });
81
+ it('adds a shift-click range from the last selected hit', () => {
82
+ selectedRecords = [{ howler: { id: 'a' } }];
83
+ const { result, rerender } = renderHook(() => useRecordSelection());
84
+ act(() => {
85
+ result.current.setLastSelected('a');
86
+ });
87
+ rerender();
88
+ act(() => {
89
+ result.current.onClick({ ctrlKey: false, shiftKey: true, stopPropagation: vi.fn() }, { howler: { id: 'c' } });
90
+ });
91
+ expect(mockAddRecordToSelection).toHaveBeenCalledWith('a');
92
+ expect(mockAddRecordToSelection).toHaveBeenCalledWith('b');
93
+ expect(mockAddRecordToSelection).toHaveBeenCalledWith('c');
94
+ });
95
+ it('handles shift-click when nothing is selected yet', () => {
96
+ const { result } = renderHook(() => useRecordSelection());
97
+ act(() => {
98
+ result.current.onClick({ ctrlKey: false, shiftKey: true, stopPropagation: vi.fn() }, { howler: { id: 'a' } });
99
+ });
100
+ expect(mockAddRecordToSelection).toHaveBeenCalledWith('a');
101
+ });
102
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,67 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /// <reference types="vitest" />
3
+ import { render, screen } from '@testing-library/react';
4
+ import { describe, expect, it, vi } from 'vitest';
5
+ const apiConfigContextToken = vi.hoisted(() => ({ name: 'api-config-context' }));
6
+ let apiConfigValue = { loaded: false, config: {} };
7
+ vi.mock('@mui/material', () => ({
8
+ Box: ({ children }) => _jsx("div", { children: children }),
9
+ CircularProgress: () => _jsx("div", { children: "loading" }),
10
+ Container: ({ children }) => _jsx("div", { children: children }),
11
+ Stack: ({ children }) => _jsx("div", { children: children }),
12
+ styled: (component) => () => component
13
+ }));
14
+ vi.mock('@tui/core', () => ({
15
+ PageCardCentered: ({ children }) => _jsx("div", { children: children })
16
+ }));
17
+ vi.mock('branding/AppBrand', () => ({
18
+ AppBrand: () => _jsx("div", { children: "brand" })
19
+ }));
20
+ vi.mock('components/app/providers/ApiConfigProvider', () => ({
21
+ ApiConfigContext: apiConfigContextToken
22
+ }));
23
+ vi.mock('components/elements/display/TextDivider', () => ({
24
+ default: () => _jsx("div", { children: "divider" })
25
+ }));
26
+ vi.mock('./auth/OAuthLogin', () => ({
27
+ default: ({ providers }) => _jsx("div", { children: providers.join(',') })
28
+ }));
29
+ vi.mock('./auth/UserPassLogin', () => ({
30
+ default: () => _jsx("div", { children: "userpass" })
31
+ }));
32
+ vi.mock('react', async (importOriginal) => {
33
+ const actual = await importOriginal();
34
+ return {
35
+ ...actual,
36
+ useContext: (context) => {
37
+ if (context === apiConfigContextToken)
38
+ return apiConfigValue;
39
+ return actual.useContext(context);
40
+ }
41
+ };
42
+ });
43
+ import LoginScreen from './Login';
44
+ describe('Login', () => {
45
+ it('shows a loading indicator until config is loaded', () => {
46
+ apiConfigValue = { loaded: false, config: {} };
47
+ render(_jsx(LoginScreen, {}));
48
+ expect(screen.getByText('loading')).toBeInTheDocument();
49
+ });
50
+ it('renders internal and oauth login options from config', () => {
51
+ apiConfigValue = {
52
+ loaded: true,
53
+ config: {
54
+ configuration: {
55
+ auth: {
56
+ internal: { enabled: true },
57
+ oauth_providers: ['azure', 'google']
58
+ }
59
+ }
60
+ }
61
+ };
62
+ render(_jsx(LoginScreen, {}));
63
+ expect(screen.getByText('userpass')).toBeInTheDocument();
64
+ expect(screen.getByText('divider')).toBeInTheDocument();
65
+ expect(screen.getByText('azure,google')).toBeInTheDocument();
66
+ });
67
+ });
@@ -0,0 +1 @@
1
+ export {};