@jmruthers/pace-core 0.5.67 → 0.5.69

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 (384) hide show
  1. package/README.md +26 -0
  2. package/dist/{DataTable-MFUXNGPR.js → DataTable-MPBSXUC6.js} +5 -6
  3. package/dist/{PublicLoadingSpinner-DdKXTkCZ.d.ts → PublicLoadingSpinner-BOdyU3u-.d.ts} +1 -1
  4. package/dist/{UnifiedAuthProvider-CQNiemcB.d.ts → UnifiedAuthProvider-D02AMXgO.d.ts} +3 -3
  5. package/dist/{chunk-CKNY7HYS.js → chunk-2ARQW6VX.js} +3 -3
  6. package/dist/{chunk-T2MQY57J.js → chunk-6JILXFEA.js} +335 -5
  7. package/dist/chunk-6JILXFEA.js.map +1 -0
  8. package/dist/{chunk-D7ARGIA3.js → chunk-6RBH67W7.js} +23 -6
  9. package/dist/chunk-6RBH67W7.js.map +1 -0
  10. package/dist/{chunk-C7GUF747.js → chunk-FJTAWPAQ.js} +3 -5
  11. package/dist/{chunk-C7GUF747.js.map → chunk-FJTAWPAQ.js.map} +1 -1
  12. package/dist/{chunk-4HQ5BOVZ.js → chunk-NO5QHMDX.js} +7 -6
  13. package/dist/chunk-NO5QHMDX.js.map +1 -0
  14. package/dist/{chunk-ZPK5656W.js → chunk-O3NWNXDY.js} +4 -5
  15. package/dist/chunk-O3NWNXDY.js.map +1 -0
  16. package/dist/{chunk-BTCA3ENN.js → chunk-Q2UP3ZWQ.js} +4 -4
  17. package/dist/{chunk-QVEOQVD4.js → chunk-RVYGJPOD.js} +173 -20
  18. package/dist/chunk-RVYGJPOD.js.map +1 -0
  19. package/dist/{chunk-FVDOEGGG.js → chunk-UCMHBF7Y.js} +3 -5
  20. package/dist/{chunk-FVDOEGGG.js.map → chunk-UCMHBF7Y.js.map} +1 -1
  21. package/dist/{chunk-T6HVDA24.js → chunk-V3QO3LL7.js} +5 -7
  22. package/dist/chunk-V3QO3LL7.js.map +1 -0
  23. package/dist/{chunk-ZB6AEA7I.js → chunk-ZXJGZLLO.js} +17 -17
  24. package/dist/{chunk-ZB6AEA7I.js.map → chunk-ZXJGZLLO.js.map} +1 -1
  25. package/dist/components.d.ts +2 -2
  26. package/dist/components.js +8 -9
  27. package/dist/components.js.map +1 -1
  28. package/dist/hooks.d.ts +1 -1
  29. package/dist/hooks.js +9 -6
  30. package/dist/hooks.js.map +1 -1
  31. package/dist/index.d.ts +4 -4
  32. package/dist/index.js +16 -16
  33. package/dist/index.js.map +1 -1
  34. package/dist/providers.d.ts +1 -1
  35. package/dist/providers.js +5 -7
  36. package/dist/rbac/index.js +5 -6
  37. package/dist/{usePublicRouteParams-CdoFxnJK.d.ts → usePublicRouteParams-Ua1Vz-HG.d.ts} +35 -1
  38. package/dist/utils.d.ts +4 -1
  39. package/dist/utils.js +3 -3
  40. package/docs/DOCUMENTATION_CHECKLIST.md +281 -0
  41. package/docs/README.md +22 -10
  42. package/docs/api/README.md +26 -0
  43. package/docs/api/classes/ColumnFactory.md +1 -1
  44. package/docs/api/classes/ErrorBoundary.md +1 -1
  45. package/docs/api/classes/InvalidScopeError.md +1 -1
  46. package/docs/api/classes/MissingUserContextError.md +1 -1
  47. package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
  48. package/docs/api/classes/PermissionDeniedError.md +1 -1
  49. package/docs/api/classes/PublicErrorBoundary.md +1 -1
  50. package/docs/api/classes/RBACAuditManager.md +1 -1
  51. package/docs/api/classes/RBACCache.md +1 -1
  52. package/docs/api/classes/RBACEngine.md +1 -1
  53. package/docs/api/classes/RBACError.md +1 -1
  54. package/docs/api/classes/RBACNotInitializedError.md +1 -1
  55. package/docs/api/classes/SecureSupabaseClient.md +1 -1
  56. package/docs/api/classes/StorageUtils.md +1 -1
  57. package/docs/api/interfaces/AggregateConfig.md +1 -1
  58. package/docs/api/interfaces/ButtonProps.md +1 -1
  59. package/docs/api/interfaces/CardProps.md +1 -1
  60. package/docs/api/interfaces/ColorPalette.md +1 -1
  61. package/docs/api/interfaces/ColorShade.md +1 -1
  62. package/docs/api/interfaces/DataAccessRecord.md +1 -1
  63. package/docs/api/interfaces/DataTableAction.md +1 -1
  64. package/docs/api/interfaces/DataTableColumn.md +1 -1
  65. package/docs/api/interfaces/DataTableProps.md +1 -1
  66. package/docs/api/interfaces/DataTableToolbarButton.md +1 -1
  67. package/docs/api/interfaces/EmptyStateConfig.md +1 -1
  68. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
  69. package/docs/api/interfaces/EventContextType.md +1 -1
  70. package/docs/api/interfaces/EventLogoProps.md +1 -1
  71. package/docs/api/interfaces/EventProviderProps.md +1 -1
  72. package/docs/api/interfaces/FileSizeLimits.md +1 -1
  73. package/docs/api/interfaces/FileUploadProps.md +1 -1
  74. package/docs/api/interfaces/FooterProps.md +1 -1
  75. package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
  76. package/docs/api/interfaces/InputProps.md +1 -1
  77. package/docs/api/interfaces/LabelProps.md +1 -1
  78. package/docs/api/interfaces/LoginFormProps.md +1 -1
  79. package/docs/api/interfaces/NavigationAccessRecord.md +1 -1
  80. package/docs/api/interfaces/NavigationContextType.md +1 -1
  81. package/docs/api/interfaces/NavigationGuardProps.md +1 -1
  82. package/docs/api/interfaces/NavigationItem.md +1 -1
  83. package/docs/api/interfaces/NavigationMenuProps.md +1 -1
  84. package/docs/api/interfaces/NavigationProviderProps.md +1 -1
  85. package/docs/api/interfaces/Organisation.md +1 -1
  86. package/docs/api/interfaces/OrganisationContextType.md +1 -1
  87. package/docs/api/interfaces/OrganisationMembership.md +1 -1
  88. package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
  89. package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
  90. package/docs/api/interfaces/PaceAppLayoutProps.md +1 -1
  91. package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
  92. package/docs/api/interfaces/PageAccessRecord.md +1 -1
  93. package/docs/api/interfaces/PagePermissionContextType.md +1 -1
  94. package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
  95. package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
  96. package/docs/api/interfaces/PaletteData.md +1 -1
  97. package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
  98. package/docs/api/interfaces/PublicErrorBoundaryProps.md +1 -1
  99. package/docs/api/interfaces/PublicErrorBoundaryState.md +1 -1
  100. package/docs/api/interfaces/PublicLoadingSpinnerProps.md +1 -1
  101. package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
  102. package/docs/api/interfaces/PublicPageHeaderProps.md +2 -2
  103. package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
  104. package/docs/api/interfaces/RBACConfig.md +1 -1
  105. package/docs/api/interfaces/RBACContextType.md +1 -1
  106. package/docs/api/interfaces/RBACLogger.md +1 -1
  107. package/docs/api/interfaces/RBACProviderProps.md +1 -1
  108. package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
  109. package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
  110. package/docs/api/interfaces/RouteAccessRecord.md +1 -1
  111. package/docs/api/interfaces/RouteConfig.md +1 -1
  112. package/docs/api/interfaces/SecureDataContextType.md +1 -1
  113. package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
  114. package/docs/api/interfaces/StorageConfig.md +1 -1
  115. package/docs/api/interfaces/StorageFileInfo.md +1 -1
  116. package/docs/api/interfaces/StorageFileMetadata.md +1 -1
  117. package/docs/api/interfaces/StorageListOptions.md +1 -1
  118. package/docs/api/interfaces/StorageListResult.md +1 -1
  119. package/docs/api/interfaces/StorageUploadOptions.md +1 -1
  120. package/docs/api/interfaces/StorageUploadResult.md +1 -1
  121. package/docs/api/interfaces/StorageUrlOptions.md +1 -1
  122. package/docs/api/interfaces/StyleImport.md +1 -1
  123. package/docs/api/interfaces/SwitchProps.md +1 -1
  124. package/docs/api/interfaces/ToastActionElement.md +1 -1
  125. package/docs/api/interfaces/ToastProps.md +1 -1
  126. package/docs/api/interfaces/UnifiedAuthContextType.md +1 -1
  127. package/docs/api/interfaces/UnifiedAuthProviderProps.md +4 -4
  128. package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
  129. package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
  130. package/docs/api/interfaces/UsePublicEventLogoOptions.md +1 -1
  131. package/docs/api/interfaces/UsePublicEventLogoReturn.md +1 -1
  132. package/docs/api/interfaces/UsePublicEventOptions.md +1 -1
  133. package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
  134. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
  135. package/docs/api/interfaces/UserEventAccess.md +1 -1
  136. package/docs/api/interfaces/UserMenuProps.md +1 -1
  137. package/docs/api/interfaces/UserProfile.md +1 -1
  138. package/docs/api/modules.md +39 -14
  139. package/docs/api-reference/providers.md +16 -7
  140. package/docs/architecture/services.md +374 -0
  141. package/docs/best-practices/README.md +1 -1
  142. package/docs/best-practices/testing.md +1 -1
  143. package/docs/breaking-changes.md +182 -0
  144. package/docs/common-patterns.md +445 -0
  145. package/docs/core-concepts/authentication.md +26 -11
  146. package/docs/core-concepts/events.md +2 -0
  147. package/docs/core-concepts/organisations.md +2 -0
  148. package/docs/core-concepts/permissions.md +2 -0
  149. package/docs/{INDEX.md → documentation-index.md} +26 -38
  150. package/docs/faq.md +286 -0
  151. package/docs/{FILE_REFERENCE_SYSTEM.md → file-reference-system.md} +1 -1
  152. package/docs/getting-started/installation-guide.md +284 -0
  153. package/docs/getting-started/quick-start.md +8 -1
  154. package/docs/implementation-guides/app-layout.md +3 -1
  155. package/docs/implementation-guides/data-tables.md +2 -0
  156. package/docs/implementation-guides/dynamic-colors.md +47 -2
  157. package/docs/implementation-guides/event-theming-summary.md +220 -0
  158. package/docs/implementation-guides/forms.md +9 -7
  159. package/docs/implementation-guides/navigation.md +2 -0
  160. package/docs/migration/service-architecture.md +351 -0
  161. package/docs/migration-guides/unified-auth-provider-mandatory-timeouts.md +226 -0
  162. package/docs/rbac/README-rbac-rls-integration.md +2 -2
  163. package/docs/rbac/README.md +1 -1
  164. package/docs/rbac/examples/rbac-rls-integration-example.md +3 -3
  165. package/docs/rbac/quick-start.md +2 -0
  166. package/docs/rbac/rbac-rls-integration.md +2 -2
  167. package/docs/security/README.md +5 -1
  168. package/docs/style-guide.md +136 -1
  169. package/docs/testing/README.md +1 -1
  170. package/docs/troubleshooting/authentication-issues.md +334 -0
  171. package/docs/troubleshooting/common-issues.md +2 -0
  172. package/docs/troubleshooting/styling-issues.md +199 -144
  173. package/docs/usage.md +23 -2
  174. package/package.json +1 -1
  175. package/src/__tests__/{TESTING_GUIDELINES.md → TEST_GUIDE_CURSOR.md} +20 -0
  176. package/src/__tests__/TEST_GUIDE_HUMAN.md +103 -0
  177. package/src/__tests__/fixtures/test-data.ts +90 -0
  178. package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +260 -0
  179. package/src/__tests__/helpers/__tests__/optimized-test-setup.test.ts +224 -0
  180. package/src/__tests__/helpers/__tests__/supabaseMock.test.ts +273 -0
  181. package/src/__tests__/helpers/__tests__/test-providers.test.tsx +98 -0
  182. package/src/__tests__/helpers/__tests__/test-utils.test.tsx +436 -0
  183. package/src/__tests__/helpers/__tests__/timer-utils.test.ts +371 -0
  184. package/src/__tests__/helpers/component-test-utils.tsx +14 -4
  185. package/src/__tests__/helpers/optimized-test-setup.ts +68 -0
  186. package/src/__tests__/helpers/test-providers.tsx +329 -0
  187. package/src/__tests__/helpers/test-utils.tsx +91 -45
  188. package/src/__tests__/helpers/timer-utils.ts +71 -0
  189. package/src/__tests__/hooks/usePermissions.test.ts +1 -5
  190. package/src/__tests__/integration/UserProfile.test.tsx +1 -5
  191. package/src/__tests__/rbac/PagePermissionGuard.test.tsx +42 -12
  192. package/src/__tests__/setup.ts +34 -28
  193. package/src/components/Alert/Alert.test.tsx +1 -5
  194. package/src/components/Avatar/Avatar.test.tsx +1 -5
  195. package/src/components/Button/Button.test.tsx +4 -20
  196. package/src/components/Card/Card.test.tsx +1 -5
  197. package/src/components/Checkbox/Checkbox.test.tsx +1 -5
  198. package/src/components/DataTable/__tests__/DataTable.comprehensive.test.tsx +1 -5
  199. package/src/components/DataTable/__tests__/DataTable.test.tsx +45 -49
  200. package/src/components/DataTable/__tests__/DataTableCore.test.tsx +1 -5
  201. package/src/components/DataTable/__tests__/styles.test.ts +382 -0
  202. package/src/components/DataTable/context/__tests__/DataTableContext.test.tsx +409 -0
  203. package/src/components/DataTable/core/__tests__/ActionManager.test.ts +634 -0
  204. package/src/components/DataTable/core/__tests__/DataManager.test.ts +519 -0
  205. package/src/components/DataTable/core/__tests__/StateManager.test.ts +714 -0
  206. package/src/components/DataTable/hooks/__tests__/useDataTableState.test.ts +592 -0
  207. package/src/components/DataTable/utils/__tests__/exportUtils.test.ts +354 -0
  208. package/src/components/DataTable/utils/__tests__/hierarchicalUtils.test.ts +539 -0
  209. package/src/components/Dialog/examples/__tests__/SmartDialogExample.unit.test.tsx +1 -5
  210. package/src/components/Dialog/utils/__tests__/safeHtml.unit.test.ts +1 -8
  211. package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +34 -38
  212. package/src/components/Footer/Footer.test.tsx +1 -5
  213. package/src/components/Form/Form.test.tsx +22 -35
  214. package/src/components/Header/Header.test.tsx +1 -9
  215. package/src/components/InactivityWarningModal/InactivityWarningModal.test.tsx +1 -5
  216. package/src/components/Input/Input.test.tsx +2 -10
  217. package/src/components/LoginForm/LoginForm.test.tsx +1 -5
  218. package/src/components/NavigationMenu/NavigationMenu.test.tsx +24 -24
  219. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.accessibility.test.tsx +1 -6
  220. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.integration.test.tsx +6 -16
  221. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.performance.test.tsx +1 -5
  222. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.rbac.test.tsx +1 -5
  223. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +1 -7
  224. package/src/components/PasswordReset/PasswordChangeForm.test.tsx +1 -9
  225. package/src/components/PasswordReset/PasswordResetForm.test.tsx +1 -9
  226. package/src/components/PublicLayout/PublicErrorBoundary.tsx +4 -5
  227. package/src/components/PublicLayout/PublicPageHeader.tsx +13 -9
  228. package/src/components/PublicLayout/__tests__/EventLogo.test.tsx +666 -0
  229. package/src/components/PublicLayout/__tests__/PublicErrorBoundary.test.tsx +457 -0
  230. package/src/components/PublicLayout/__tests__/PublicLoadingSpinner.test.tsx +393 -0
  231. package/src/components/PublicLayout/__tests__/PublicPageFooter.test.tsx +351 -0
  232. package/src/components/PublicLayout/__tests__/PublicPageHeader.test.tsx +374 -0
  233. package/src/components/PublicLayout/__tests__/PublicPageLayout.test.tsx +388 -0
  234. package/src/components/Select/Select.bug-test.tsx +69 -0
  235. package/src/components/Select/Select.refactored.tsx +497 -0
  236. package/src/components/Select/Select.test.tsx +42 -49
  237. package/src/components/Select/Select.tsx +5 -2
  238. package/src/components/Select/hooks.ts +254 -0
  239. package/src/components/Switch/Switch.test.tsx +1 -5
  240. package/src/components/Table/__tests__/Table.test.tsx +775 -0
  241. package/src/components/Toast/Toast.test.tsx +15 -8
  242. package/src/components/Tooltip/Tooltip.test.tsx +1 -5
  243. package/src/components/UserMenu/UserMenu.test.tsx +3 -15
  244. package/src/components/__tests__/FileDisplay.test.tsx +575 -0
  245. package/src/components/__tests__/FileUpload.test.tsx +446 -0
  246. package/src/components/__tests__/SuperAdminGuard.test.tsx +422 -354
  247. package/src/hooks/__tests__/ServiceHooks.test.tsx +613 -0
  248. package/src/hooks/__tests__/hooks.integration.test.tsx +1 -10
  249. package/src/hooks/__tests__/useApiFetch.unit.test.ts +10 -14
  250. package/src/hooks/__tests__/useAppConfig.unit.test.ts +307 -0
  251. package/src/hooks/__tests__/useComponentPerformance.unit.test.tsx +1 -6
  252. package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +1 -5
  253. package/src/hooks/__tests__/useOrganisationPermissions.unit.test.tsx +6 -9
  254. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +321 -0
  255. package/src/hooks/__tests__/usePublicEvent.unit.test.ts +583 -0
  256. package/src/hooks/__tests__/usePublicEventLogo.unit.test.ts +640 -0
  257. package/src/hooks/__tests__/usePublicRouteParams.unit.test.ts +435 -0
  258. package/src/hooks/__tests__/useRBAC.unit.test.ts +10 -10
  259. package/src/hooks/__tests__/useStorage.unit.test.ts +751 -0
  260. package/src/hooks/index.ts +3 -0
  261. package/src/hooks/public/usePublicEvent.ts +181 -13
  262. package/src/hooks/public/usePublicRouteParams.ts +13 -3
  263. package/src/hooks/services/useAuth.ts +50 -0
  264. package/src/hooks/services/useAuthService.ts +30 -0
  265. package/src/hooks/services/useCurrentEvent.ts +36 -0
  266. package/src/hooks/services/useCurrentOrganisation.ts +52 -0
  267. package/src/hooks/services/useEventService.ts +30 -0
  268. package/src/hooks/services/useInactivityService.ts +30 -0
  269. package/src/hooks/services/useOrganisationService.ts +30 -0
  270. package/src/hooks/services/usePermissions.ts +70 -0
  271. package/src/hooks/services/useRBACService.ts +30 -0
  272. package/src/hooks/useCounter.test.ts +1 -5
  273. package/src/hooks/useEventTheme.ts +86 -0
  274. package/src/hooks/useOrganisationPermissions.test.ts +2 -5
  275. package/src/hooks/useOrganisationSecurity.test.ts +1 -5
  276. package/src/hooks/usePermissionCache.test.ts +1 -5
  277. package/src/hooks/usePermissionCheck.ts +150 -0
  278. package/src/hooks/useSecureDataAccess.test.ts +1 -5
  279. package/src/index.ts +1 -0
  280. package/src/providers/OrganisationProvider.test.tsx +1 -5
  281. package/src/providers/OrganisationProvider.tsx +56 -4
  282. package/src/providers/UnifiedAuthProvider.test.simple.tsx +42 -6
  283. package/src/providers/UnifiedAuthProvider.test.tsx +1 -5
  284. package/src/providers/UnifiedAuthProvider.tsx +4 -4
  285. package/src/providers/__tests__/AuthProvider.test.tsx +105 -439
  286. package/src/providers/__tests__/AuthProvider.test.tsx.backup +771 -0
  287. package/src/providers/__tests__/EventProvider.test.tsx +211 -110
  288. package/src/providers/__tests__/EventProvider.test.tsx.backup +824 -0
  289. package/src/providers/__tests__/InactivityProvider.test.tsx +1 -5
  290. package/src/providers/__tests__/OrganisationProvider.test.tsx +97 -261
  291. package/src/providers/__tests__/OrganisationProvider.test.tsx.backup +820 -0
  292. package/src/providers/__tests__/ServiceProviders.test.tsx +477 -0
  293. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +72 -504
  294. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx.backup +911 -0
  295. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx.backup2 +166 -0
  296. package/src/providers/services/AuthServiceProvider.tsx +65 -0
  297. package/src/providers/services/EventServiceProvider.tsx +83 -0
  298. package/src/providers/services/InactivityServiceProvider.tsx +83 -0
  299. package/src/providers/services/OrganisationServiceProvider.tsx +77 -0
  300. package/src/providers/services/RBACServiceProvider.tsx +79 -0
  301. package/src/providers/services/UnifiedAuthProvider.tsx +368 -0
  302. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +210 -0
  303. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +269 -0
  304. package/src/rbac/__tests__/adapters.comprehensive.test.tsx +892 -0
  305. package/src/rbac/__tests__/engine.comprehensive.test.ts +954 -0
  306. package/src/rbac/__tests__/integration.authflow.test.tsx +1 -5
  307. package/src/rbac/__tests__/integration.navigation.test.tsx +1 -4
  308. package/src/rbac/__tests__/rbac-core.test.tsx +2 -7
  309. package/src/rbac/__tests__/rbac-functions.test.ts +1 -9
  310. package/src/rbac/__tests__/rbac-integration.test.ts +1 -9
  311. package/src/rbac/api.test.ts +1 -9
  312. package/src/rbac/cache.test.ts +10 -8
  313. package/src/rbac/cli/__tests__/policy-manager.test.ts +339 -0
  314. package/src/rbac/components/EnhancedNavigationMenu.test.tsx +1 -5
  315. package/src/rbac/components/NavigationProvider.test.tsx +1 -5
  316. package/src/rbac/components/PagePermissionProvider.test.tsx +1 -5
  317. package/src/rbac/components/SecureDataProvider.test.tsx +1 -5
  318. package/src/rbac/components/__tests__/NavigationGuard.test.tsx +25 -29
  319. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +27 -30
  320. package/src/rbac/components/__tests__/PermissionEnforcer.test.tsx +23 -27
  321. package/src/rbac/components/__tests__/RoleBasedRouter.test.tsx +18 -22
  322. package/src/rbac/config.test.ts +1 -5
  323. package/src/rbac/hooks/useCan.test.ts +262 -9
  324. package/src/rbac/hooks/usePermissions.test.ts +246 -6
  325. package/src/rbac/hooks/useRBAC.simple.test.ts +1 -5
  326. package/src/rbac/hooks/useRBAC.test.ts +472 -198
  327. package/src/rbac/providers/__tests__/RBACProvider.test.tsx +1 -9
  328. package/src/services/AuthService.ts +416 -0
  329. package/src/services/EventService.ts +366 -0
  330. package/src/services/InactivityService.ts +388 -0
  331. package/src/services/OrganisationService.ts +592 -0
  332. package/src/services/RBACService.ts +522 -0
  333. package/src/services/__tests__/AuthService.test.ts +356 -0
  334. package/src/services/__tests__/BaseService.test.ts +314 -0
  335. package/src/services/__tests__/EventService.test.ts +489 -0
  336. package/src/services/__tests__/InactivityService.test.ts +403 -0
  337. package/src/services/__tests__/OrganisationService.test.ts +660 -0
  338. package/src/services/__tests__/RBACService.test.ts +492 -0
  339. package/src/services/base/BaseService.ts +87 -0
  340. package/src/services/interfaces/IAuthService.ts +39 -0
  341. package/src/services/interfaces/IEventService.ts +30 -0
  342. package/src/services/interfaces/IInactivityService.ts +31 -0
  343. package/src/services/interfaces/IOrganisationService.ts +41 -0
  344. package/src/services/interfaces/IRBACService.ts +62 -0
  345. package/src/theming/__tests__/runtime.test.ts +540 -0
  346. package/src/types/__tests__/file-reference.test.ts +447 -0
  347. package/src/types/__tests__/organisation.test.ts +1133 -0
  348. package/src/types/__tests__/theme.test.ts +830 -0
  349. package/src/types/__tests__/type-validation.test.ts +527 -0
  350. package/src/utils/__tests__/bundleAnalysis.unit.test.ts +1 -5
  351. package/src/utils/__tests__/debugLogger.test.ts +417 -0
  352. package/src/utils/__tests__/deviceFingerprint.unit.test.ts +1 -6
  353. package/src/utils/__tests__/dynamicUtils.unit.test.ts +1 -5
  354. package/src/utils/__tests__/lazyLoad.unit.test.tsx +35 -35
  355. package/src/utils/__tests__/organisationContext.unit.test.ts +1 -5
  356. package/src/utils/__tests__/performanceBudgets.unit.test.ts +5 -11
  357. package/src/utils/__tests__/secureErrors.unit.test.ts +1 -6
  358. package/src/utils/__tests__/secureStorage.unit.test.ts +1 -5
  359. package/src/utils/__tests__/securityMonitor.unit.test.ts +1 -5
  360. package/src/utils/__tests__/sessionTracking.unit.test.ts +1 -5
  361. package/src/utils/appIdResolver.test.ts +6 -10
  362. package/src/utils/appNameResolver.simple.test.ts +142 -0
  363. package/src/utils/appNameResolver.test.ts +31 -458
  364. package/src/utils/appNameResolver.test.ts.backup +494 -0
  365. package/src/utils/debugLogger.ts +26 -5
  366. package/src/utils/formatDate.test.ts +1 -5
  367. package/src/utils/organisationContext.test.ts +1 -5
  368. package/src/utils/performanceBudgets.ts +3 -4
  369. package/src/utils/secureDataAccess.test.ts +1 -5
  370. package/src/utils/storage/__tests__/helpers.unit.test.ts +1 -5
  371. package/src/validation/__tests__/sqlInjectionProtection.unit.test.ts +1 -5
  372. package/dist/chunk-4HQ5BOVZ.js.map +0 -1
  373. package/dist/chunk-D7ARGIA3.js.map +0 -1
  374. package/dist/chunk-QVEOQVD4.js.map +0 -1
  375. package/dist/chunk-T2MQY57J.js.map +0 -1
  376. package/dist/chunk-T6HVDA24.js.map +0 -1
  377. package/dist/chunk-VTJ5HCZB.js +0 -315
  378. package/dist/chunk-VTJ5HCZB.js.map +0 -1
  379. package/dist/chunk-ZPK5656W.js.map +0 -1
  380. package/docs/getting-started/installation.md +0 -269
  381. package/src/__tests__/REBUILD_PLAN.md +0 -223
  382. /package/dist/{DataTable-MFUXNGPR.js.map → DataTable-MPBSXUC6.js.map} +0 -0
  383. /package/dist/{chunk-CKNY7HYS.js.map → chunk-2ARQW6VX.js.map} +0 -0
  384. /package/dist/{chunk-BTCA3ENN.js.map → chunk-Q2UP3ZWQ.js.map} +0 -0
@@ -76,11 +76,7 @@ describe('RBAC AuthFlow Minimal', () => {
76
76
  .mockResolvedValue({ data: { user: mockUser }, error: null });
77
77
  });
78
78
 
79
- afterEach(() => {
80
- vi.restoreAllMocks();
81
- });
82
-
83
- it('renders authenticated view', async () => {
79
+ it('renders authenticated view', async () => {
84
80
  const router = createMemoryRouter([{ path: '/', element: <MinimalAuthComponent /> }]);
85
81
 
86
82
  render(
@@ -49,10 +49,7 @@ const NavUnderTest = () => {
49
49
  };
50
50
 
51
51
  describe('RBAC Navigation Integration', () => {
52
- beforeEach(() => {
53
- vi.clearAllMocks();
54
- });
55
- afterEach(() => vi.restoreAllMocks());
52
+ afterEach(() => vi.restoreAllMocks());
56
53
 
57
54
  it('shows all mocked navigation items', async () => {
58
55
  const router = createMemoryRouter([{ path: '/', element: <NavUnderTest /> }]);
@@ -19,13 +19,8 @@ const mockSupabaseClient = {
19
19
  };
20
20
 
21
21
  describe('RBAC Core Functionality', () => {
22
- beforeEach(() => {
23
- vi.clearAllMocks();
24
- });
25
-
26
- afterEach(() => {
27
- vi.restoreAllMocks();
28
- });
22
+ // Removed redundant beforeEach/afterEach - global config handles this
23
+ // (vitest.config.ts has restoreMocks: true and clearMocks: true)
29
24
 
30
25
  describe('Permission Types', () => {
31
26
  it('has all required operation types', () => {
@@ -46,15 +46,7 @@ const mockApp = {
46
46
  };
47
47
 
48
48
  describe('RBAC Functions', () => {
49
- beforeEach(() => {
50
- vi.clearAllMocks();
51
- });
52
-
53
- afterEach(() => {
54
- vi.restoreAllMocks();
55
- });
56
-
57
- describe('rbac_permission_check', () => {
49
+ describe('rbac_permission_check', () => {
58
50
  it('should return false for null user_id', async () => {
59
51
  mockSupabase.rpc.mockResolvedValue({
60
52
  data: [{ has_permission: false, role_name: null, permission_source: 'none', granted_at: null }],
@@ -46,15 +46,7 @@ const testApp = {
46
46
  };
47
47
 
48
48
  describe('RBAC Integration Tests', () => {
49
- beforeEach(() => {
50
- vi.clearAllMocks();
51
- });
52
-
53
- afterEach(() => {
54
- vi.restoreAllMocks();
55
- });
56
-
57
- describe('Complete Permission Flow', () => {
49
+ describe('Complete Permission Flow', () => {
58
50
  it('should handle user login → permission check → data access flow', async () => {
59
51
  // 1. User logs in and session is tracked
60
52
  mockSupabase.rpc
@@ -90,15 +90,7 @@ describe('RBAC API', () => {
90
90
  const mockCreateRBACConfig = vi.mocked(createRBACConfig);
91
91
  const mockGetRBACLogger = vi.mocked(getRBACLogger);
92
92
 
93
- beforeEach(() => {
94
- vi.clearAllMocks();
95
- });
96
-
97
- afterEach(() => {
98
- vi.restoreAllMocks();
99
- });
100
-
101
- describe('setupRBAC', () => {
93
+ describe('setupRBAC', () => {
102
94
  it('initializes RBAC system correctly', () => {
103
95
  const originalEnv = process.env.NODE_ENV;
104
96
  process.env.NODE_ENV = 'production';
@@ -49,38 +49,40 @@ describe('RBACCache', () => {
49
49
  });
50
50
 
51
51
  describe('TTL Expiration', () => {
52
- it.skip('expires entries after TTL', () => {
52
+ it('expires entries after TTL', () => {
53
53
  // Create a new cache instance to avoid timing issues
54
54
  const testCache = new RBACCache();
55
55
 
56
56
  // Mock Date.now to control time
57
57
  const mockDateNow = vi.spyOn(Date, 'now');
58
58
  const startTime = 1000000;
59
- mockDateNow.mockReturnValue(startTime);
60
59
 
60
+ // Set initial time
61
+ mockDateNow.mockReturnValue(startTime);
61
62
  testCache.set('test-key', 'test-value', 1000); // 1 second TTL
62
63
  expect(testCache.get('test-key')).toBe('test-value');
63
64
 
64
- // Advance time by 1 second
65
- mockDateNow.mockReturnValue(startTime + 1000);
65
+ // Advance time by 1 second (1001ms to ensure expiration)
66
+ mockDateNow.mockReturnValue(startTime + 1001);
66
67
  expect(testCache.get('test-key')).toBeNull();
67
68
 
68
69
  mockDateNow.mockRestore();
69
70
  });
70
71
 
71
- it.skip('uses default TTL when not specified', () => {
72
+ it('uses default TTL when not specified', () => {
72
73
  // Create a new cache instance to avoid timing issues
73
74
  const testCache = new RBACCache();
74
75
 
75
76
  // Mock Date.now to control time
76
77
  const mockDateNow = vi.spyOn(Date, 'now');
77
78
  const startTime = 1000000;
78
- mockDateNow.mockReturnValue(startTime);
79
79
 
80
+ // Set initial time
81
+ mockDateNow.mockReturnValue(startTime);
80
82
  testCache.set('test-key', 'test-value');
81
83
 
82
- // Advance time by 60 seconds (default TTL)
83
- mockDateNow.mockReturnValue(startTime + 60000);
84
+ // Advance time by 60 seconds (default TTL) + 1ms to ensure expiration
85
+ mockDateNow.mockReturnValue(startTime + 60001);
84
86
  expect(testCache.get('test-key')).toBeNull();
85
87
 
86
88
  mockDateNow.mockRestore();
@@ -0,0 +1,339 @@
1
+ /**
2
+ * @file RBAC Policy Manager CLI Tests
3
+ * @package @jmruthers/pace-core
4
+ * @module RBAC/CLI/__tests__
5
+ * @since 1.0.0
6
+ */
7
+
8
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
9
+
10
+ // Mock external dependencies
11
+ vi.mock('@supabase/supabase-js', () => ({
12
+ createClient: vi.fn(() => ({
13
+ from: vi.fn(() => ({
14
+ select: vi.fn(() => ({
15
+ eq: vi.fn(() => ({
16
+ order: vi.fn(() => ({
17
+ data: [],
18
+ error: null
19
+ }))
20
+ }))
21
+ })),
22
+ insert: vi.fn(() => ({
23
+ data: [],
24
+ error: null
25
+ })),
26
+ update: vi.fn(() => ({
27
+ eq: vi.fn(() => ({
28
+ data: [],
29
+ error: null
30
+ }))
31
+ })),
32
+ delete: vi.fn(() => ({
33
+ eq: vi.fn(() => ({
34
+ data: [],
35
+ error: null
36
+ }))
37
+ }))
38
+ })),
39
+ rpc: vi.fn(() => ({
40
+ data: null,
41
+ error: null
42
+ }))
43
+ }))
44
+ }));
45
+
46
+ vi.mock('commander', () => ({
47
+ Command: vi.fn(() => ({
48
+ name: vi.fn().mockReturnThis(),
49
+ description: vi.fn().mockReturnThis(),
50
+ version: vi.fn().mockReturnThis(),
51
+ option: vi.fn().mockReturnThis(),
52
+ command: vi.fn().mockReturnThis(),
53
+ argument: vi.fn().mockReturnThis(),
54
+ action: vi.fn().mockReturnThis(),
55
+ parse: vi.fn().mockReturnThis()
56
+ }))
57
+ }));
58
+
59
+ vi.mock('chalk', () => ({
60
+ default: {
61
+ red: vi.fn((text) => text),
62
+ green: vi.fn((text) => text),
63
+ yellow: vi.fn((text) => text),
64
+ blue: vi.fn((text) => text),
65
+ bold: vi.fn((text) => text)
66
+ }
67
+ }));
68
+
69
+ vi.mock('ora', () => ({
70
+ default: vi.fn(() => ({
71
+ start: vi.fn().mockReturnThis(),
72
+ succeed: vi.fn().mockReturnThis(),
73
+ fail: vi.fn().mockReturnThis(),
74
+ stop: vi.fn().mockReturnThis()
75
+ }))
76
+ }));
77
+
78
+ vi.mock('cli-table3', () => ({
79
+ default: vi.fn(() => ({
80
+ push: vi.fn(),
81
+ toString: vi.fn(() => 'Mock table output')
82
+ }))
83
+ }));
84
+
85
+ // Mock console methods
86
+ const originalConsole = console;
87
+ beforeEach(() => {
88
+ console.log = vi.fn();
89
+ console.error = vi.fn();
90
+ });
91
+
92
+ afterEach(() => {
93
+ console.log = originalConsole.log;
94
+ console.error = originalConsole.error;
95
+ });
96
+
97
+ describe('[cli] PolicyManager', () => {
98
+ describe('Class Instantiation', () => {
99
+ it('creates instance with valid parameters', async () => {
100
+ // Import the mocked createClient
101
+ const { createClient } = await import('@supabase/supabase-js');
102
+
103
+ // Test that the class can be instantiated
104
+ const { PolicyManager } = await import('../policy-manager');
105
+ const manager = new PolicyManager('https://test.supabase.co', 'test-key');
106
+
107
+ expect(manager).toBeDefined();
108
+ expect(createClient).toHaveBeenCalledWith('https://test.supabase.co', 'test-key');
109
+ });
110
+
111
+ it('handles invalid Supabase URL', async () => {
112
+ expect(async () => {
113
+ const { PolicyManager } = await import('../policy-manager');
114
+ new PolicyManager('', 'test-key');
115
+ }).not.toThrow();
116
+ });
117
+
118
+ it('handles invalid Supabase key', async () => {
119
+ expect(async () => {
120
+ const { PolicyManager } = await import('../policy-manager');
121
+ new PolicyManager('https://test.supabase.co', '');
122
+ }).not.toThrow();
123
+ });
124
+ });
125
+
126
+ describe('Interface Definitions', () => {
127
+ it('has correct PolicyConfig interface structure', () => {
128
+ // Test that the interface is properly defined by checking the mock data structure
129
+ const mockPolicyConfig = {
130
+ table_name: 'test_table',
131
+ page_name: 'test_page',
132
+ app_name: 'TEST_APP',
133
+ organisation_column: 'organisation_id',
134
+ event_column: 'event_id',
135
+ operations: ['read', 'create', 'update', 'delete'],
136
+ is_active: true
137
+ };
138
+
139
+ expect(mockPolicyConfig).toHaveProperty('table_name');
140
+ expect(mockPolicyConfig).toHaveProperty('page_name');
141
+ expect(mockPolicyConfig).toHaveProperty('app_name');
142
+ expect(mockPolicyConfig).toHaveProperty('organisation_column');
143
+ expect(mockPolicyConfig).toHaveProperty('event_column');
144
+ expect(mockPolicyConfig).toHaveProperty('operations');
145
+ expect(mockPolicyConfig).toHaveProperty('is_active');
146
+ });
147
+
148
+ it('has correct PolicyAudit interface structure', () => {
149
+ const mockPolicyAudit = {
150
+ table_name: 'test_table',
151
+ policy_name: 'test_policy',
152
+ operation: 'read',
153
+ action: 'created',
154
+ changed_at: '2024-01-01T00:00:00Z',
155
+ success: true,
156
+ error_message: undefined
157
+ };
158
+
159
+ expect(mockPolicyAudit).toHaveProperty('table_name');
160
+ expect(mockPolicyAudit).toHaveProperty('policy_name');
161
+ expect(mockPolicyAudit).toHaveProperty('operation');
162
+ expect(mockPolicyAudit).toHaveProperty('action');
163
+ expect(mockPolicyAudit).toHaveProperty('changed_at');
164
+ expect(mockPolicyAudit).toHaveProperty('success');
165
+ expect(mockPolicyAudit).toHaveProperty('error_message');
166
+ });
167
+
168
+ it('has correct HealthCheck interface structure', () => {
169
+ const mockHealthCheck = {
170
+ table_name: 'test_table',
171
+ policy_name: 'test_policy',
172
+ operation: 'read',
173
+ is_healthy: true,
174
+ issues: []
175
+ };
176
+
177
+ expect(mockHealthCheck).toHaveProperty('table_name');
178
+ expect(mockHealthCheck).toHaveProperty('policy_name');
179
+ expect(mockHealthCheck).toHaveProperty('operation');
180
+ expect(mockHealthCheck).toHaveProperty('is_healthy');
181
+ expect(mockHealthCheck).toHaveProperty('issues');
182
+ });
183
+ });
184
+
185
+ describe('CLI Command Structure', () => {
186
+ it('has proper command setup', () => {
187
+ const { Command } = require('commander');
188
+
189
+ // Test that Command is a function (mocked)
190
+ expect(Command).toBeInstanceOf(Function);
191
+ });
192
+
193
+ it('handles command line arguments', () => {
194
+ // Mock process.argv
195
+ const originalArgv = process.argv;
196
+ process.argv = ['node', 'policy-manager.js', 'list'];
197
+
198
+ // Test that the CLI can handle arguments
199
+ expect(process.argv).toContain('list');
200
+
201
+ // Restore original argv
202
+ process.argv = originalArgv;
203
+ });
204
+ });
205
+
206
+ describe('Error Handling', () => {
207
+ it('handles Supabase connection errors gracefully', async () => {
208
+ const { createClient } = await import('@supabase/supabase-js');
209
+ const mockedCreateClient = vi.mocked(createClient);
210
+
211
+ // Mock a connection error
212
+ mockedCreateClient.mockImplementationOnce(() => {
213
+ throw new Error('Connection failed');
214
+ });
215
+
216
+ await expect(async () => {
217
+ const { PolicyManager } = await import('../policy-manager');
218
+ new PolicyManager('https://invalid.supabase.co', 'invalid-key');
219
+ }).rejects.toThrow('Connection failed');
220
+ });
221
+
222
+ it('handles missing environment variables', () => {
223
+ const originalEnv = process.env;
224
+
225
+ // Test with missing SUPABASE_URL
226
+ delete process.env.SUPABASE_URL;
227
+ delete process.env.SUPABASE_SERVICE_ROLE_KEY;
228
+
229
+ // The CLI should handle missing env vars gracefully
230
+ expect(process.env.SUPABASE_URL).toBeUndefined();
231
+ expect(process.env.SUPABASE_SERVICE_ROLE_KEY).toBeUndefined();
232
+
233
+ // Restore original env
234
+ process.env = originalEnv;
235
+ });
236
+ });
237
+
238
+ describe('Utility Functions', () => {
239
+ it('validates table names', () => {
240
+ const validTableNames = ['users', 'events', 'organisations', 'cake_meal'];
241
+ const invalidTableNames = ['', '123invalid', 'table with spaces', 'table-with-dashes'];
242
+
243
+ validTableNames.forEach(name => {
244
+ expect(name).toMatch(/^[a-zA-Z_][a-zA-Z0-9_]*$/);
245
+ });
246
+
247
+ invalidTableNames.forEach(name => {
248
+ expect(name).not.toMatch(/^[a-zA-Z_][a-zA-Z0-9_]*$/);
249
+ });
250
+ });
251
+
252
+ it('validates app names', () => {
253
+ const validAppNames = ['CAKE', 'PACE', 'TRAC', 'TEST_APP'];
254
+ const invalidAppNames = ['', 'invalid app', 'app-with-dashes', '123APP'];
255
+
256
+ validAppNames.forEach(name => {
257
+ expect(name).toMatch(/^[A-Z_][A-Z0-9_]*$/);
258
+ });
259
+
260
+ invalidAppNames.forEach(name => {
261
+ expect(name).not.toMatch(/^[A-Z_][A-Z0-9_]*$/);
262
+ });
263
+ });
264
+
265
+ it('validates operation names', () => {
266
+ const validOperations = ['read', 'create', 'update', 'delete', 'manage'];
267
+ const invalidOperations = ['', 'READ', 'invalid', 'read-create'];
268
+
269
+ validOperations.forEach(op => {
270
+ expect(op).toMatch(/^(read|create|update|delete|manage)$/);
271
+ });
272
+
273
+ invalidOperations.forEach(op => {
274
+ expect(op).not.toMatch(/^(read|create|update|delete|manage)$/);
275
+ });
276
+ });
277
+ });
278
+
279
+ describe('Mock Data Validation', () => {
280
+ it('validates mock policy config data', () => {
281
+ const mockData = {
282
+ table_name: 'cake_meal',
283
+ page_name: 'meals',
284
+ app_name: 'CAKE',
285
+ organisation_column: 'organisation_id',
286
+ event_column: 'meal_event_id',
287
+ operations: ['read', 'create', 'update', 'delete'],
288
+ is_active: true
289
+ };
290
+
291
+ expect(mockData.table_name).toBe('cake_meal');
292
+ expect(mockData.page_name).toBe('meals');
293
+ expect(mockData.app_name).toBe('CAKE');
294
+ expect(mockData.organisation_column).toBe('organisation_id');
295
+ expect(mockData.event_column).toBe('meal_event_id');
296
+ expect(Array.isArray(mockData.operations)).toBe(true);
297
+ expect(mockData.operations).toContain('read');
298
+ expect(mockData.operations).toContain('create');
299
+ expect(mockData.operations).toContain('update');
300
+ expect(mockData.operations).toContain('delete');
301
+ expect(typeof mockData.is_active).toBe('boolean');
302
+ });
303
+
304
+ it('validates mock audit data', () => {
305
+ const mockAudit = {
306
+ table_name: 'cake_meal',
307
+ policy_name: 'rbac_read_meals',
308
+ operation: 'read',
309
+ action: 'created',
310
+ changed_at: '2024-01-01T00:00:00Z',
311
+ success: true
312
+ };
313
+
314
+ expect(mockAudit.table_name).toBe('cake_meal');
315
+ expect(mockAudit.policy_name).toBe('rbac_read_meals');
316
+ expect(mockAudit.operation).toBe('read');
317
+ expect(mockAudit.action).toBe('created');
318
+ expect(mockAudit.changed_at).toMatch(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$/);
319
+ expect(typeof mockAudit.success).toBe('boolean');
320
+ });
321
+ });
322
+
323
+ describe('CLI Integration', () => {
324
+ it('can be imported without errors', async () => {
325
+ expect(async () => {
326
+ const { PolicyManager } = await import('../policy-manager');
327
+ // Just check that the module can be imported
328
+ expect(PolicyManager).toBeDefined();
329
+ }).not.toThrow();
330
+ });
331
+
332
+ it('exports expected interfaces', async () => {
333
+ const { PolicyManager } = await import('../policy-manager');
334
+
335
+ // The module should be importable
336
+ expect(PolicyManager).toBeDefined();
337
+ });
338
+ });
339
+ });
@@ -100,11 +100,7 @@ describe('EnhancedNavigationMenu', () => {
100
100
  } as any);
101
101
  });
102
102
 
103
- afterEach(() => {
104
- vi.restoreAllMocks();
105
- });
106
-
107
- describe('Rendering', () => {
103
+ describe('Rendering', () => {
108
104
  it('renders navigation items correctly', () => {
109
105
  render(
110
106
  <EnhancedNavigationMenu items={mockNavigationItems} />
@@ -84,11 +84,7 @@ describe('NavigationProvider', () => {
84
84
  } as any);
85
85
  });
86
86
 
87
- afterEach(() => {
88
- vi.restoreAllMocks();
89
- });
90
-
91
- describe('Provider Initialization', () => {
87
+ describe('Provider Initialization', () => {
92
88
  it('renders children correctly', () => {
93
89
  render(
94
90
  <NavigationProvider>
@@ -60,11 +60,7 @@ describe('PagePermissionProvider', () => {
60
60
  } as any);
61
61
  });
62
62
 
63
- afterEach(() => {
64
- vi.restoreAllMocks();
65
- });
66
-
67
- describe('Provider Initialization', () => {
63
+ describe('Provider Initialization', () => {
68
64
  it('renders children correctly', () => {
69
65
  render(
70
66
  <PagePermissionProvider>
@@ -74,11 +74,7 @@ describe('SecureDataProvider', () => {
74
74
  } as any);
75
75
  });
76
76
 
77
- afterEach(() => {
78
- vi.restoreAllMocks();
79
- });
80
-
81
- describe('Provider Initialization', () => {
77
+ describe('Provider Initialization', () => {
82
78
  it('renders children correctly', () => {
83
79
  render(
84
80
  <SecureDataProvider>