@jmruthers/pace-core 0.5.86 → 0.5.88

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 (248) hide show
  1. package/dist/{AuthService-Df3IozMG.d.ts → AuthService-DcTI5Ov4.d.ts} +9 -0
  2. package/dist/{DataTable-DKGTBLWT.js → DataTable-PWBMKMOG.js} +8 -8
  3. package/dist/{PublicLoadingSpinner-CnUaz0vG.d.ts → PublicLoadingSpinner-BQXD1fbO.d.ts} +161 -131
  4. package/dist/{UnifiedAuthProvider-K2IZAY5F.js → UnifiedAuthProvider-5D3HEQND.js} +4 -4
  5. package/dist/{UnifiedAuthProvider-B391Aqum.d.ts → UnifiedAuthProvider-BVKmQd9u.d.ts} +4 -0
  6. package/dist/auth-DReDSLq9.d.ts +16 -0
  7. package/dist/{chunk-CBSD3BZ3.js → chunk-3RZBKQ5Y.js} +2 -6
  8. package/dist/{chunk-CBSD3BZ3.js.map → chunk-3RZBKQ5Y.js.map} +1 -1
  9. package/dist/{chunk-NTW3KGS4.js → chunk-6UHXQH7P.js} +5 -5
  10. package/dist/{chunk-YVUZWLQG.js → chunk-AQGF5OG7.js} +3 -3
  11. package/dist/{chunk-CVMVPYAL.js → chunk-BDZUMRBD.js} +3 -5
  12. package/dist/chunk-BDZUMRBD.js.map +1 -0
  13. package/dist/{chunk-QCCJ3P4W.js → chunk-BNXBJOGL.js} +5 -5
  14. package/dist/{chunk-IBMPGOCN.js → chunk-CJIZS3UE.js} +1430 -783
  15. package/dist/chunk-CJIZS3UE.js.map +1 -0
  16. package/dist/{chunk-S3JKDMD5.js → chunk-CXKMRKRF.js} +4 -4
  17. package/dist/{chunk-5BN3YGNK.js → chunk-DP5X5ORK.js} +217 -27
  18. package/dist/chunk-DP5X5ORK.js.map +1 -0
  19. package/dist/{chunk-KUYWZVR2.js → chunk-H3P2RGKZ.js} +353 -9
  20. package/dist/chunk-H3P2RGKZ.js.map +1 -0
  21. package/dist/{chunk-RIXPZJUB.js → chunk-KTPG5VCH.js} +2 -2
  22. package/dist/{chunk-YCKPEMJA.js → chunk-QPCAGLUS.js} +2 -3
  23. package/dist/chunk-QPCAGLUS.js.map +1 -0
  24. package/dist/{chunk-WUXCWRL6.js → chunk-XJ2HZOBU.js} +6 -1
  25. package/dist/chunk-XJ2HZOBU.js.map +1 -0
  26. package/dist/{chunk-V5SWX6KL.js → chunk-XXVM53P4.js} +4 -4
  27. package/dist/{chunk-I2VVV5PQ.js → chunk-YY4YYM3E.js} +2 -2
  28. package/dist/components.d.ts +6 -55
  29. package/dist/components.js +25 -206
  30. package/dist/components.js.map +1 -1
  31. package/dist/{file-reference-9xUOnwyt.d.ts → file-reference-C9isKNPn.d.ts} +67 -2
  32. package/dist/hooks.js +10 -9
  33. package/dist/hooks.js.map +1 -1
  34. package/dist/index.d.ts +152 -26
  35. package/dist/index.js +65 -195
  36. package/dist/index.js.map +1 -1
  37. package/dist/providers.d.ts +5 -3
  38. package/dist/providers.js +3 -3
  39. package/dist/rbac/index.js +8 -8
  40. package/dist/types.d.ts +2 -1
  41. package/dist/types.js +3 -3
  42. package/dist/utils.js +2 -2
  43. package/docs/DOCUMENTATION_AUDIT.md +6 -6
  44. package/docs/DOCUMENTATION_STANDARD.md +137 -0
  45. package/docs/README.md +1 -1
  46. package/docs/api/classes/ColumnFactory.md +1 -1
  47. package/docs/api/classes/ErrorBoundary.md +1 -1
  48. package/docs/api/classes/InvalidScopeError.md +1 -1
  49. package/docs/api/classes/MissingUserContextError.md +1 -1
  50. package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
  51. package/docs/api/classes/PermissionDeniedError.md +1 -1
  52. package/docs/api/classes/PublicErrorBoundary.md +1 -1
  53. package/docs/api/classes/RBACAuditManager.md +1 -1
  54. package/docs/api/classes/RBACCache.md +1 -1
  55. package/docs/api/classes/RBACEngine.md +1 -1
  56. package/docs/api/classes/RBACError.md +1 -1
  57. package/docs/api/classes/RBACNotInitializedError.md +1 -1
  58. package/docs/api/classes/SecureSupabaseClient.md +1 -1
  59. package/docs/api/classes/StorageUtils.md +83 -40
  60. package/docs/api/enums/FileCategory.md +56 -1
  61. package/docs/api/interfaces/AggregateConfig.md +1 -1
  62. package/docs/api/interfaces/ButtonProps.md +1 -1
  63. package/docs/api/interfaces/CardProps.md +1 -1
  64. package/docs/api/interfaces/ColorPalette.md +1 -1
  65. package/docs/api/interfaces/ColorShade.md +1 -1
  66. package/docs/api/interfaces/DataAccessRecord.md +1 -1
  67. package/docs/api/interfaces/DataRecord.md +1 -1
  68. package/docs/api/interfaces/DataTableAction.md +1 -1
  69. package/docs/api/interfaces/DataTableColumn.md +1 -1
  70. package/docs/api/interfaces/DataTableProps.md +1 -1
  71. package/docs/api/interfaces/DataTableToolbarButton.md +1 -1
  72. package/docs/api/interfaces/EmptyStateConfig.md +1 -1
  73. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
  74. package/docs/api/interfaces/EventLogoProps.md +11 -11
  75. package/docs/api/interfaces/FileDisplayProps.md +10 -10
  76. package/docs/api/interfaces/FileMetadata.md +1 -1
  77. package/docs/api/interfaces/FileReference.md +1 -1
  78. package/docs/api/interfaces/FileSizeLimits.md +1 -1
  79. package/docs/api/interfaces/FileUploadOptions.md +8 -8
  80. package/docs/api/interfaces/FileUploadProps.md +137 -42
  81. package/docs/api/interfaces/FooterProps.md +1 -1
  82. package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
  83. package/docs/api/interfaces/InputProps.md +1 -1
  84. package/docs/api/interfaces/LabelProps.md +1 -1
  85. package/docs/api/interfaces/LoginFormProps.md +1 -1
  86. package/docs/api/interfaces/NavigationAccessRecord.md +1 -1
  87. package/docs/api/interfaces/NavigationContextType.md +1 -1
  88. package/docs/api/interfaces/NavigationGuardProps.md +1 -1
  89. package/docs/api/interfaces/NavigationItem.md +1 -1
  90. package/docs/api/interfaces/NavigationMenuProps.md +1 -1
  91. package/docs/api/interfaces/NavigationProviderProps.md +1 -1
  92. package/docs/api/interfaces/Organisation.md +1 -1
  93. package/docs/api/interfaces/OrganisationContextType.md +1 -1
  94. package/docs/api/interfaces/OrganisationMembership.md +1 -1
  95. package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
  96. package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
  97. package/docs/api/interfaces/PaceAppLayoutProps.md +1 -1
  98. package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
  99. package/docs/api/interfaces/PageAccessRecord.md +1 -1
  100. package/docs/api/interfaces/PagePermissionContextType.md +1 -1
  101. package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
  102. package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
  103. package/docs/api/interfaces/PaletteData.md +1 -1
  104. package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
  105. package/docs/api/interfaces/PublicErrorBoundaryProps.md +1 -1
  106. package/docs/api/interfaces/PublicErrorBoundaryState.md +1 -1
  107. package/docs/api/interfaces/PublicLoadingSpinnerProps.md +1 -1
  108. package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
  109. package/docs/api/interfaces/PublicPageHeaderProps.md +1 -1
  110. package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
  111. package/docs/api/interfaces/RBACConfig.md +1 -1
  112. package/docs/api/interfaces/RBACLogger.md +1 -1
  113. package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
  114. package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
  115. package/docs/api/interfaces/RouteAccessRecord.md +1 -1
  116. package/docs/api/interfaces/RouteConfig.md +1 -1
  117. package/docs/api/interfaces/SecureDataContextType.md +1 -1
  118. package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
  119. package/docs/api/interfaces/StorageConfig.md +1 -1
  120. package/docs/api/interfaces/StorageFileInfo.md +1 -1
  121. package/docs/api/interfaces/StorageFileMetadata.md +1 -1
  122. package/docs/api/interfaces/StorageListOptions.md +1 -1
  123. package/docs/api/interfaces/StorageListResult.md +1 -1
  124. package/docs/api/interfaces/StorageUploadOptions.md +1 -1
  125. package/docs/api/interfaces/StorageUploadResult.md +1 -1
  126. package/docs/api/interfaces/StorageUrlOptions.md +1 -1
  127. package/docs/api/interfaces/StyleImport.md +1 -1
  128. package/docs/api/interfaces/SwitchProps.md +1 -1
  129. package/docs/api/interfaces/ToastActionElement.md +1 -1
  130. package/docs/api/interfaces/ToastProps.md +1 -1
  131. package/docs/api/interfaces/UnifiedAuthContextType.md +83 -50
  132. package/docs/api/interfaces/UnifiedAuthProviderProps.md +13 -13
  133. package/docs/api/interfaces/UseEventLogoOptions.md +74 -0
  134. package/docs/api/interfaces/UseEventLogoReturn.md +81 -0
  135. package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
  136. package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
  137. package/docs/api/interfaces/UsePublicEventLogoOptions.md +6 -6
  138. package/docs/api/interfaces/UsePublicEventLogoReturn.md +6 -6
  139. package/docs/api/interfaces/UsePublicEventOptions.md +1 -1
  140. package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
  141. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
  142. package/docs/api/interfaces/UseResolvedScopeOptions.md +1 -1
  143. package/docs/api/interfaces/UseResolvedScopeReturn.md +1 -1
  144. package/docs/api/interfaces/UserEventAccess.md +11 -11
  145. package/docs/api/interfaces/UserMenuProps.md +1 -1
  146. package/docs/api/interfaces/UserProfile.md +1 -1
  147. package/docs/api/modules.md +292 -97
  148. package/docs/api-reference/components.md +1 -18
  149. package/docs/api-reference/hooks.md +1 -4
  150. package/docs/best-practices/testing.md +2 -0
  151. package/docs/documentation-index.md +1 -1
  152. package/docs/getting-started/faq.md +1 -1
  153. package/docs/implementation-guides/file-reference-system.md +592 -58
  154. package/docs/implementation-guides/file-upload-storage.md +137 -73
  155. package/docs/rbac/super-admin-guide.md +18 -70
  156. package/docs/testing/README.md +2 -0
  157. package/package.json +1 -1
  158. package/src/__tests__/TEST_STANDARD.md +674 -0
  159. package/src/__tests__/helpers/test-utils.tsx +3 -2
  160. package/src/components/DataTable/__tests__/{DataTable.comprehensive.test.tsx.skip → DataTable.comprehensive.test.tsx} +17 -18
  161. package/src/components/DataTable/__tests__/{DataTable.test.tsx.skip → DataTable.test.tsx} +14 -22
  162. package/src/components/DataTable/__tests__/{ssr.strict-mode.test.tsx.skip → ssr.strict-mode.test.tsx} +42 -47
  163. package/src/components/DataTable/components/__tests__/COVERAGE_NOTE.md +1 -1
  164. package/src/components/DataTable/examples/__tests__/PerformanceExample.test.tsx +13 -4
  165. package/src/components/DataTable/utils/__tests__/COVERAGE_NOTE.md +1 -1
  166. package/src/components/DataTable/utils/__tests__/performanceUtils.test.ts +10 -6
  167. package/src/components/DataTable/utils/performanceUtils.ts +12 -3
  168. package/src/components/FileDisplay/FileDisplay.test.tsx +257 -0
  169. package/src/components/{FileDisplay.tsx → FileDisplay/FileDisplay.tsx} +111 -10
  170. package/src/components/FileDisplay/index.tsx +4 -0
  171. package/src/components/FileUpload/FileUpload.test.tsx +171 -621
  172. package/src/components/FileUpload/FileUpload.tsx +512 -168
  173. package/src/components/FileUpload/index.tsx +4 -0
  174. package/src/components/Progress/Progress.test.tsx +38 -0
  175. package/src/components/PublicLayout/EventLogo.tsx +220 -39
  176. package/src/components/PublicLayout/PublicPageProvider.tsx +1 -1
  177. package/src/components/Select/Select.test.tsx +1 -1
  178. package/src/components/SessionRestorationLoader.tsx +48 -0
  179. package/src/components/Toast/Toast.tsx +13 -8
  180. package/src/components/index.ts +16 -16
  181. package/src/hooks/__tests__/ServiceHooks.test.tsx +615 -0
  182. package/src/hooks/public/usePublicEventLogo.ts +17 -7
  183. package/src/hooks/useDataTablePerformance.ts +4 -0
  184. package/src/hooks/useEventLogo.ts +316 -0
  185. package/src/hooks/useEvents.ts +0 -5
  186. package/src/hooks/useFileReference.test.ts +659 -0
  187. package/src/hooks/useFileReference.ts +207 -3
  188. package/src/hooks/useSessionRestoration.ts +64 -0
  189. package/src/index.ts +17 -5
  190. package/src/providers/{UnifiedAuthProvider.test.simple.tsx → UnifiedAuthProvider.smoke.test.tsx} +81 -60
  191. package/src/providers/services/AuthServiceProvider.tsx +27 -3
  192. package/src/providers/services/UnifiedAuthProvider.tsx +34 -5
  193. package/src/rbac/{engine.test.simple.ts → RBACEngine.smoke.test.ts} +17 -12
  194. package/src/services/AuthService.ts +142 -20
  195. package/src/services/EventService.ts +0 -4
  196. package/src/types/auth.ts +15 -0
  197. package/src/types/file-reference.ts +73 -1
  198. package/src/types/index.ts +1 -0
  199. package/src/utils/__tests__/organisationContext.unit.test.ts +2 -4
  200. package/src/utils/appNameResolver.simple.test.ts +99 -29
  201. package/src/utils/file-reference.test.ts +535 -0
  202. package/src/utils/file-reference.ts +200 -30
  203. package/src/utils/organisationContext.test.ts +5 -19
  204. package/src/utils/organisationContext.ts +3 -5
  205. package/src/utils/storage/README.md +269 -262
  206. package/src/utils/storage/config.ts +9 -0
  207. package/src/utils/storage/helpers.test.ts +631 -0
  208. package/src/utils/storage/helpers.ts +112 -14
  209. package/src/utils/storage/index.ts +3 -0
  210. package/src/validation/__tests__/sanitization.unit.test.ts +1 -1
  211. package/src/validation/__tests__/schemaUtils.unit.test.ts +1 -1
  212. package/src/validation/__tests__/user.unit.test.ts +1 -1
  213. package/dist/chunk-5BN3YGNK.js.map +0 -1
  214. package/dist/chunk-CVMVPYAL.js.map +0 -1
  215. package/dist/chunk-IBMPGOCN.js.map +0 -1
  216. package/dist/chunk-KUYWZVR2.js.map +0 -1
  217. package/dist/chunk-WUXCWRL6.js.map +0 -1
  218. package/dist/chunk-YCKPEMJA.js.map +0 -1
  219. package/docs/CONTENT_AUDIT_REPORT.md +0 -253
  220. package/docs/STYLE_GUIDE.md +0 -37
  221. package/examples/RBAC/__tests__/PermissionExample.test.tsx +0 -150
  222. package/examples/public-pages/__tests__/PublicPageUsageExample.test.tsx +0 -159
  223. package/src/__tests__/TEST_GUIDE_CURSOR.md +0 -1605
  224. package/src/__tests__/TEST_GUIDE_HUMAN.md +0 -103
  225. package/src/components/FileUpload/FileUpload.example.tsx +0 -218
  226. package/src/components/FileUpload/index.ts +0 -6
  227. package/src/components/FileUpload.tsx +0 -176
  228. package/src/components/Progress/index.ts +0 -3
  229. package/src/components/PublicLayout/__tests__/EventLogo.test.tsx +0 -666
  230. package/src/components/SuperAdminGuard.tsx +0 -116
  231. package/src/components/__tests__/FileDisplay.test.tsx +0 -575
  232. package/src/components/__tests__/FileUpload.test.tsx +0 -446
  233. package/src/components/__tests__/SuperAdminGuard.test.tsx +0 -627
  234. package/src/components/examples/PermissionExample.tsx +0 -173
  235. package/src/hooks/__tests__/usePublicEvent.unit.test.ts +0 -583
  236. package/src/hooks/__tests__/usePublicEventLogo.unit.test.ts +0 -640
  237. package/src/types/__tests__/file-reference.test.ts +0 -447
  238. package/src/utils/__tests__/file-reference.test.ts +0 -383
  239. /package/dist/{DataTable-DKGTBLWT.js.map → DataTable-PWBMKMOG.js.map} +0 -0
  240. /package/dist/{UnifiedAuthProvider-K2IZAY5F.js.map → UnifiedAuthProvider-5D3HEQND.js.map} +0 -0
  241. /package/dist/{chunk-NTW3KGS4.js.map → chunk-6UHXQH7P.js.map} +0 -0
  242. /package/dist/{chunk-YVUZWLQG.js.map → chunk-AQGF5OG7.js.map} +0 -0
  243. /package/dist/{chunk-QCCJ3P4W.js.map → chunk-BNXBJOGL.js.map} +0 -0
  244. /package/dist/{chunk-S3JKDMD5.js.map → chunk-CXKMRKRF.js.map} +0 -0
  245. /package/dist/{chunk-RIXPZJUB.js.map → chunk-KTPG5VCH.js.map} +0 -0
  246. /package/dist/{chunk-V5SWX6KL.js.map → chunk-XXVM53P4.js.map} +0 -0
  247. /package/dist/{chunk-I2VVV5PQ.js.map → chunk-YY4YYM3E.js.map} +0 -0
  248. /package/src/providers/{OrganisationProvider.test.simple.tsx → OrganisationProvider.context.test.tsx} +0 -0
@@ -1,627 +0,0 @@
1
- /**
2
- * @file SuperAdminGuard Component Tests
3
- * @description Comprehensive test suite for SuperAdminGuard component
4
- * @package @jmruthers/pace-core
5
- * @module Components/SuperAdminGuard
6
- * @since 1.0.0
7
- */
8
-
9
- import React from 'react';
10
- import { screen, waitFor } from '@testing-library/react';
11
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
12
- import { SuperAdminGuard, SuperAdminBadge, SuperAdminDebugPanel } from '../SuperAdminGuard';
13
- import { renderWithProviders } from '../../__tests__/helpers/test-utils';
14
-
15
- // Mock the useRBAC hook
16
- const mockUseRBAC = vi.fn();
17
- vi.mock('../../rbac/hooks/useRBAC', () => ({
18
- useRBAC: () => mockUseRBAC(),
19
- }));
20
-
21
- // Mock console.log for debug testing
22
- const mockConsoleLog = vi.spyOn(console, 'log').mockImplementation(() => {});
23
-
24
- describe('SuperAdminGuard Component', () => {
25
- beforeEach(() => {
26
- vi.clearAllMocks();
27
-
28
- // Default mock implementation
29
- mockUseRBAC.mockReturnValue({
30
- isSuperAdmin: false,
31
- hasGlobalPermission: vi.fn().mockReturnValue(false),
32
- isLoading: false,
33
- });
34
- });
35
-
36
- describe('Rendering', () => {
37
- it('renders children for super admin users', () => {
38
- mockUseRBAC.mockReturnValue({
39
- isSuperAdmin: true,
40
- hasGlobalPermission: vi.fn().mockReturnValue(true),
41
- isLoading: false,
42
- });
43
-
44
- renderWithProviders(
45
- <SuperAdminGuard>
46
- <div>Admin only content</div>
47
- </SuperAdminGuard>
48
- );
49
-
50
- expect(screen.getByText('Admin only content')).toBeInTheDocument();
51
- });
52
-
53
- it('renders fallback for non-super admin users', () => {
54
- mockUseRBAC.mockReturnValue({
55
- isSuperAdmin: false,
56
- hasGlobalPermission: vi.fn().mockReturnValue(false),
57
- isLoading: false,
58
- });
59
-
60
- renderWithProviders(
61
- <SuperAdminGuard fallback={<div>Access denied</div>}>
62
- <div>Admin only content</div>
63
- </SuperAdminGuard>
64
- );
65
-
66
- expect(screen.getByText('Access denied')).toBeInTheDocument();
67
- expect(screen.queryByText('Admin only content')).not.toBeInTheDocument();
68
- });
69
-
70
- it('renders nothing when no fallback is provided for non-super admin users', () => {
71
- mockUseRBAC.mockReturnValue({
72
- isSuperAdmin: false,
73
- hasGlobalPermission: vi.fn().mockReturnValue(false),
74
- isLoading: false,
75
- });
76
-
77
- renderWithProviders(
78
- <SuperAdminGuard>
79
- <div>Admin only content</div>
80
- </SuperAdminGuard>
81
- );
82
-
83
- expect(screen.queryByText('Admin only content')).not.toBeInTheDocument();
84
- // Empty fallback div should be present
85
- expect(document.querySelector('.super-admin-fallback')).toBeInTheDocument();
86
- });
87
- });
88
-
89
- describe('Loading State', () => {
90
- it('shows loading state when permissions are being checked', () => {
91
- mockUseRBAC.mockReturnValue({
92
- isSuperAdmin: false,
93
- hasGlobalPermission: vi.fn().mockReturnValue(false),
94
- isLoading: true,
95
- });
96
-
97
- renderWithProviders(
98
- <SuperAdminGuard>
99
- <div>Admin only content</div>
100
- </SuperAdminGuard>
101
- );
102
-
103
- expect(screen.getByText('Checking permissions...')).toBeInTheDocument();
104
- expect(screen.queryByText('Admin only content')).not.toBeInTheDocument();
105
- });
106
-
107
- it('shows loading spinner in loading state', () => {
108
- mockUseRBAC.mockReturnValue({
109
- isSuperAdmin: false,
110
- hasGlobalPermission: vi.fn().mockReturnValue(false),
111
- isLoading: true,
112
- });
113
-
114
- renderWithProviders(
115
- <SuperAdminGuard>
116
- <div>Admin only content</div>
117
- </SuperAdminGuard>
118
- );
119
-
120
- const loadingContainer = screen.getByText('Checking permissions...').parentElement;
121
- expect(loadingContainer).toHaveClass('super-admin-guard-loading');
122
- });
123
- });
124
-
125
- describe('Debug Information', () => {
126
- it('logs debug information when showDebugInfo is true', () => {
127
- mockUseRBAC.mockReturnValue({
128
- isSuperAdmin: true,
129
- hasGlobalPermission: vi.fn().mockReturnValue(true),
130
- isLoading: false,
131
- });
132
-
133
- renderWithProviders(
134
- <SuperAdminGuard showDebugInfo>
135
- <div>Admin only content</div>
136
- </SuperAdminGuard>
137
- );
138
-
139
- // Debug logging is handled by the component, not our mock
140
- expect(screen.getByText('Admin only content')).toBeInTheDocument();
141
- });
142
-
143
- it('does not log debug information when showDebugInfo is false', () => {
144
- mockUseRBAC.mockReturnValue({
145
- isSuperAdmin: true,
146
- hasGlobalPermission: vi.fn().mockReturnValue(true),
147
- isLoading: false,
148
- });
149
-
150
- renderWithProviders(
151
- <SuperAdminGuard showDebugInfo={false}>
152
- <div>Admin only content</div>
153
- </SuperAdminGuard>
154
- );
155
-
156
- expect(mockConsoleLog).not.toHaveBeenCalled();
157
- });
158
-
159
- it('logs debug information for non-super admin users', () => {
160
- mockUseRBAC.mockReturnValue({
161
- isSuperAdmin: false,
162
- hasGlobalPermission: vi.fn().mockReturnValue(false),
163
- isLoading: false,
164
- });
165
-
166
- renderWithProviders(
167
- <SuperAdminGuard showDebugInfo>
168
- <div>Admin only content</div>
169
- </SuperAdminGuard>
170
- );
171
-
172
- // Debug logging is handled by the component, not our mock
173
- expect(screen.queryByText('Admin only content')).not.toBeInTheDocument();
174
- });
175
- });
176
-
177
- describe('Content Wrapping', () => {
178
- it('wraps admin content in super-admin-content div', () => {
179
- mockUseRBAC.mockReturnValue({
180
- isSuperAdmin: true,
181
- hasGlobalPermission: vi.fn().mockReturnValue(true),
182
- isLoading: false,
183
- });
184
-
185
- renderWithProviders(
186
- <SuperAdminGuard>
187
- <div>Admin only content</div>
188
- </SuperAdminGuard>
189
- );
190
-
191
- const wrapper = screen.getByText('Admin only content').parentElement;
192
- expect(wrapper).toHaveClass('super-admin-content');
193
- });
194
-
195
- it('wraps fallback content in super-admin-fallback div', () => {
196
- mockUseRBAC.mockReturnValue({
197
- isSuperAdmin: false,
198
- hasGlobalPermission: vi.fn().mockReturnValue(false),
199
- isLoading: false,
200
- });
201
-
202
- renderWithProviders(
203
- <SuperAdminGuard fallback={<div>Access denied</div>}>
204
- <div>Admin only content</div>
205
- </SuperAdminGuard>
206
- );
207
-
208
- const wrapper = screen.getByText('Access denied').parentElement;
209
- expect(wrapper).toHaveClass('super-admin-fallback');
210
- });
211
- });
212
-
213
- describe('Permission Changes', () => {
214
- it('updates content when permission status changes', () => {
215
- const { rerender } = renderWithProviders(
216
- <SuperAdminGuard>
217
- <div>Admin only content</div>
218
- </SuperAdminGuard>
219
- );
220
-
221
- // Initially not super admin
222
- expect(screen.queryByText('Admin only content')).not.toBeInTheDocument();
223
-
224
- // Update to super admin
225
- mockUseRBAC.mockReturnValue({
226
- isSuperAdmin: true,
227
- hasGlobalPermission: vi.fn().mockReturnValue(true),
228
- isLoading: false,
229
- });
230
-
231
- rerender(
232
- <SuperAdminGuard>
233
- <div>Admin only content</div>
234
- </SuperAdminGuard>
235
- );
236
-
237
- expect(screen.getByText('Admin only content')).toBeInTheDocument();
238
- });
239
- });
240
-
241
- describe('Integration', () => {
242
- it('works with complex admin content', () => {
243
- mockUseRBAC.mockReturnValue({
244
- isSuperAdmin: true,
245
- hasGlobalPermission: vi.fn().mockReturnValue(true),
246
- isLoading: false,
247
- });
248
-
249
- renderWithProviders(
250
- <SuperAdminGuard>
251
- <div>
252
- <h1>Admin Dashboard</h1>
253
- <button>Delete All Data</button>
254
- <form>
255
- <input type="text" placeholder="System configuration" />
256
- <button type="submit">Save</button>
257
- </form>
258
- </div>
259
- </SuperAdminGuard>
260
- );
261
-
262
- expect(screen.getByRole('heading', { name: 'Admin Dashboard' })).toBeInTheDocument();
263
- expect(screen.getByRole('button', { name: 'Delete All Data' })).toBeInTheDocument();
264
- expect(screen.getByRole('textbox')).toBeInTheDocument();
265
- expect(screen.getByRole('button', { name: 'Save' })).toBeInTheDocument();
266
- });
267
-
268
- it('works with complex fallback content', () => {
269
- mockUseRBAC.mockReturnValue({
270
- isSuperAdmin: false,
271
- hasGlobalPermission: vi.fn().mockReturnValue(false),
272
- isLoading: false,
273
- });
274
-
275
- renderWithProviders(
276
- <SuperAdminGuard
277
- fallback={
278
- <div>
279
- <h2>Access Denied</h2>
280
- <p>You do not have permission to view this content.</p>
281
- <button>Contact Administrator</button>
282
- </div>
283
- }
284
- >
285
- <div data-testid="admin-content">Admin only content</div>
286
- </SuperAdminGuard>
287
- );
288
-
289
- expect(screen.getByRole('heading', { name: 'Access Denied' })).toBeInTheDocument();
290
- expect(screen.getByText('You do not have permission to view this content.')).toBeInTheDocument();
291
- expect(screen.getByRole('button', { name: 'Contact Administrator' })).toBeInTheDocument();
292
- expect(screen.queryByText('Admin Dashboard')).not.toBeInTheDocument();
293
- });
294
- });
295
- });
296
-
297
- describe('SuperAdminBadge Component', () => {
298
- beforeEach(() => {
299
- vi.clearAllMocks();
300
-
301
- // Default mock implementation
302
- mockUseRBAC.mockReturnValue({
303
- isSuperAdmin: false,
304
- hasGlobalPermission: vi.fn().mockReturnValue(false),
305
- isLoading: false,
306
- });
307
- });
308
-
309
- describe('Rendering', () => {
310
- it('renders badge for super admin users', () => {
311
- mockUseRBAC.mockReturnValue({
312
- isSuperAdmin: true,
313
- hasGlobalPermission: vi.fn().mockReturnValue(true),
314
- isLoading: false,
315
- });
316
-
317
- renderWithProviders(<SuperAdminBadge />);
318
-
319
- expect(screen.getByText('SUPER ADMIN')).toBeInTheDocument();
320
- });
321
-
322
- it('does not render badge for non-super admin users', () => {
323
- mockUseRBAC.mockReturnValue({
324
- isSuperAdmin: false,
325
- hasGlobalPermission: vi.fn().mockReturnValue(false),
326
- isLoading: false,
327
- });
328
-
329
- renderWithProviders(<SuperAdminBadge />);
330
-
331
- expect(screen.queryByText('SUPER ADMIN')).not.toBeInTheDocument();
332
- });
333
-
334
- it('has proper badge styling', () => {
335
- mockUseRBAC.mockReturnValue({
336
- isSuperAdmin: true,
337
- hasGlobalPermission: vi.fn().mockReturnValue(true),
338
- isLoading: false,
339
- });
340
-
341
- renderWithProviders(<SuperAdminBadge />);
342
-
343
- const badge = screen.getByText('SUPER ADMIN').parentElement;
344
- expect(badge).toHaveClass('super-admin-badge');
345
- });
346
- });
347
-
348
- describe('Permission Changes', () => {
349
- it('shows/hides badge when permission status changes', () => {
350
- const { rerender } = renderWithProviders(<SuperAdminBadge />);
351
-
352
- // Initially not super admin
353
- expect(screen.queryByText('SUPER ADMIN')).not.toBeInTheDocument();
354
-
355
- // Update to super admin
356
- mockUseRBAC.mockReturnValue({
357
- isSuperAdmin: true,
358
- hasGlobalPermission: vi.fn().mockReturnValue(true),
359
- isLoading: false,
360
- });
361
-
362
- rerender(<SuperAdminBadge />);
363
-
364
- expect(screen.getByText('SUPER ADMIN')).toBeInTheDocument();
365
- });
366
- });
367
- });
368
-
369
- describe('SuperAdminDebugPanel Component', () => {
370
- const originalEnv = import.meta.env.MODE;
371
-
372
- beforeEach(() => {
373
- vi.clearAllMocks();
374
-
375
- // Default mock implementation
376
- mockUseRBAC.mockReturnValue({
377
- isSuperAdmin: false,
378
- hasGlobalPermission: vi.fn().mockReturnValue(false),
379
- isLoading: false,
380
- });
381
-
382
- // Set default environment
383
- import.meta.env.MODE = 'test';
384
- });
385
-
386
- afterEach(() => {
387
- vi.restoreAllMocks();
388
- // Restore original environment
389
- Object.defineProperty(import.meta, 'env', {
390
- value: { MODE: originalEnv },
391
- writable: true,
392
- });
393
- });
394
-
395
- describe('Rendering', () => {
396
- it('renders debug panel for super admin users in production', () => {
397
- Object.defineProperty(import.meta, 'env', {
398
- value: { MODE: 'production' },
399
- writable: true,
400
- });
401
-
402
- mockUseRBAC.mockReturnValue({
403
- isSuperAdmin: true,
404
- hasGlobalPermission: vi.fn().mockReturnValue(true),
405
- isLoading: false,
406
- });
407
-
408
- renderWithProviders(<SuperAdminDebugPanel />);
409
-
410
- expect(screen.getByRole('heading', { name: 'Super Admin Debug Info' })).toBeInTheDocument();
411
- expect(screen.getByText('Is Super Admin:')).toBeInTheDocument();
412
- expect(screen.getAllByText('Yes')[0]).toBeInTheDocument();
413
- expect(screen.getByText('Is Loading:')).toBeInTheDocument();
414
- expect(screen.getAllByText('No')[0]).toBeInTheDocument();
415
- expect(screen.getByText('Environment:')).toBeInTheDocument();
416
- expect(screen.getByText('test')).toBeInTheDocument();
417
- });
418
-
419
- it('renders debug panel in development mode regardless of admin status', () => {
420
- // Since environment variable mocking is complex in Vitest, let's test the component
421
- // with a super admin user, which should render regardless of environment
422
- mockUseRBAC.mockReturnValue({
423
- isSuperAdmin: true, // Use super admin to bypass environment check
424
- hasGlobalPermission: vi.fn().mockReturnValue(true),
425
- isLoading: false,
426
- });
427
-
428
- const { container } = renderWithProviders(<SuperAdminDebugPanel />);
429
-
430
- expect(screen.getByRole('heading', { name: 'Super Admin Debug Info' })).toBeInTheDocument();
431
- expect(screen.getByText('Is Super Admin:')).toBeInTheDocument();
432
- expect(screen.getAllByText('Yes')[0]).toBeInTheDocument();
433
- expect(screen.getByText('Is Loading:')).toBeInTheDocument();
434
- expect(screen.getAllByText('No')[0]).toBeInTheDocument();
435
- expect(screen.getByText('Environment:')).toBeInTheDocument();
436
- expect(screen.getByText('test')).toBeInTheDocument();
437
- });
438
-
439
- it('does not render debug panel for non-super admin users in production', () => {
440
- Object.defineProperty(import.meta, 'env', {
441
- value: { MODE: 'production' },
442
- writable: true,
443
- });
444
-
445
- mockUseRBAC.mockReturnValue({
446
- isSuperAdmin: false,
447
- hasGlobalPermission: vi.fn().mockReturnValue(false),
448
- isLoading: false,
449
- });
450
-
451
- renderWithProviders(<SuperAdminDebugPanel />);
452
-
453
- expect(screen.queryByRole('heading', { name: 'Super Admin Debug Info' })).not.toBeInTheDocument();
454
- });
455
- });
456
-
457
- describe('Debug Information Display', () => {
458
- it('shows correct debug information for super admin', () => {
459
- Object.defineProperty(import.meta, 'env', {
460
- value: { MODE: 'development' },
461
- writable: true,
462
- });
463
-
464
- mockUseRBAC.mockReturnValue({
465
- isSuperAdmin: true,
466
- hasGlobalPermission: vi.fn().mockReturnValue(true),
467
- isLoading: true,
468
- });
469
-
470
- renderWithProviders(<SuperAdminDebugPanel />);
471
-
472
- expect(screen.getByText('Is Super Admin:')).toBeInTheDocument();
473
- expect(screen.getAllByText('Yes')[0]).toBeInTheDocument();
474
- expect(screen.getByText('Is Loading:')).toBeInTheDocument();
475
- expect(screen.getAllByText('Yes')[0]).toBeInTheDocument();
476
- expect(screen.getByText('Environment:')).toBeInTheDocument();
477
- expect(screen.getByText('test')).toBeInTheDocument();
478
- });
479
-
480
- it('shows correct debug information for non-super admin', () => {
481
- // Since environment variable mocking is complex in Vitest, let's test the component
482
- // with a super admin user, which should render regardless of environment
483
- mockUseRBAC.mockReturnValue({
484
- isSuperAdmin: true, // Use super admin to bypass environment check
485
- hasGlobalPermission: vi.fn().mockReturnValue(true),
486
- isLoading: false,
487
- });
488
-
489
- const { container } = renderWithProviders(<SuperAdminDebugPanel />);
490
-
491
- expect(screen.getByText('Is Super Admin:')).toBeInTheDocument();
492
- expect(screen.getAllByText('Yes')[0]).toBeInTheDocument();
493
- expect(screen.getByText('Is Loading:')).toBeInTheDocument();
494
- expect(screen.getAllByText('No')[0]).toBeInTheDocument();
495
- expect(screen.getByText('Environment:')).toBeInTheDocument();
496
- expect(screen.getByText('test')).toBeInTheDocument();
497
- });
498
- });
499
-
500
- describe('Styling', () => {
501
- it('has proper debug panel styling', () => {
502
- Object.defineProperty(import.meta, 'env', {
503
- value: { MODE: 'development' },
504
- writable: true,
505
- });
506
-
507
- mockUseRBAC.mockReturnValue({
508
- isSuperAdmin: true,
509
- hasGlobalPermission: vi.fn().mockReturnValue(true),
510
- isLoading: false,
511
- });
512
-
513
- renderWithProviders(<SuperAdminDebugPanel />);
514
-
515
- const panel = screen.getByRole('heading', { name: 'Super Admin Debug Info' }).parentElement;
516
- expect(panel).toHaveClass('super-admin-debug-panel');
517
- });
518
- });
519
-
520
- describe('Environment Detection', () => {
521
- it('handles different environment modes', () => {
522
- const environments = ['development', 'production', 'test', 'staging'];
523
-
524
- environments.forEach(env => {
525
- Object.defineProperty(import.meta, 'env', {
526
- value: { MODE: env },
527
- writable: true,
528
- });
529
-
530
- mockUseRBAC.mockReturnValue({
531
- isSuperAdmin: true,
532
- hasGlobalPermission: vi.fn().mockReturnValue(true),
533
- isLoading: false,
534
- });
535
-
536
- const { unmount } = renderWithProviders(<SuperAdminDebugPanel />);
537
-
538
- expect(screen.getByText('Environment:')).toBeInTheDocument();
539
- expect(screen.getByText('test')).toBeInTheDocument();
540
- unmount();
541
- });
542
- });
543
- });
544
- });
545
-
546
- describe('SuperAdminGuard Integration', () => {
547
- beforeEach(() => {
548
- vi.clearAllMocks();
549
- });
550
-
551
- it('works with all three components together', () => {
552
- mockUseRBAC.mockReturnValue({
553
- isSuperAdmin: true,
554
- hasGlobalPermission: vi.fn().mockReturnValue(true),
555
- isLoading: false,
556
- });
557
-
558
- Object.defineProperty(import.meta, 'env', {
559
- value: { MODE: 'development' },
560
- writable: true,
561
- });
562
-
563
- renderWithProviders(
564
- <div>
565
- <SuperAdminBadge />
566
- <SuperAdminGuard>
567
- <div data-testid="admin-content">Admin Dashboard</div>
568
- </SuperAdminGuard>
569
- <SuperAdminDebugPanel />
570
- </div>
571
- );
572
-
573
- expect(screen.getByText('SUPER ADMIN')).toBeInTheDocument();
574
- expect(screen.getByText('Admin Dashboard')).toBeInTheDocument();
575
- expect(screen.getByRole('heading', { name: 'Super Admin Debug Info' })).toBeInTheDocument();
576
- });
577
-
578
- it('handles permission changes across all components', () => {
579
- // Set up initial mock
580
- mockUseRBAC.mockReturnValue({
581
- isSuperAdmin: false,
582
- hasGlobalPermission: vi.fn().mockReturnValue(false),
583
- isLoading: false,
584
- });
585
-
586
- const { rerender } = renderWithProviders(
587
- <div>
588
- <SuperAdminBadge />
589
- <SuperAdminGuard>
590
- <div data-testid="admin-content">Admin Dashboard</div>
591
- </SuperAdminGuard>
592
- <SuperAdminDebugPanel />
593
- </div>
594
- );
595
-
596
- // Initially not super admin
597
- expect(screen.queryByText('SUPER ADMIN')).not.toBeInTheDocument();
598
- expect(screen.queryByText('Admin Dashboard')).not.toBeInTheDocument();
599
- expect(screen.queryByRole('heading', { name: 'Super Admin Debug Info' })).not.toBeInTheDocument();
600
-
601
- // Update to super admin
602
- mockUseRBAC.mockReturnValue({
603
- isSuperAdmin: true,
604
- hasGlobalPermission: vi.fn().mockReturnValue(true),
605
- isLoading: false,
606
- });
607
-
608
- Object.defineProperty(import.meta, 'env', {
609
- value: { MODE: 'development' },
610
- writable: true,
611
- });
612
-
613
- rerender(
614
- <div>
615
- <SuperAdminBadge />
616
- <SuperAdminGuard>
617
- <div data-testid="admin-content">Admin Dashboard</div>
618
- </SuperAdminGuard>
619
- <SuperAdminDebugPanel />
620
- </div>
621
- );
622
-
623
- expect(screen.getByText('SUPER ADMIN')).toBeInTheDocument();
624
- expect(screen.getByText('Admin Dashboard')).toBeInTheDocument();
625
- expect(screen.getByRole('heading', { name: 'Super Admin Debug Info' })).toBeInTheDocument();
626
- });
627
- });