@jmruthers/pace-core 0.6.6 → 0.6.8

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 (292) hide show
  1. package/{scripts/audit/audit-dependencies.cjs → audit-tool/00-dependencies.cjs} +227 -22
  2. package/audit-tool/audits/01-pace-core-compliance.cjs +556 -0
  3. package/audit-tool/audits/02-project-structure.cjs +240 -0
  4. package/audit-tool/audits/03-architecture.cjs +224 -0
  5. package/audit-tool/audits/04-code-quality.cjs +149 -0
  6. package/audit-tool/audits/05-styling.cjs +224 -0
  7. package/audit-tool/audits/06-security-rbac.cjs +554 -0
  8. package/audit-tool/audits/07-api-tech-stack.cjs +355 -0
  9. package/audit-tool/audits/08-testing-documentation.cjs +202 -0
  10. package/audit-tool/audits/09-operations.cjs +208 -0
  11. package/audit-tool/index.cjs +295 -0
  12. package/audit-tool/utils/code-utils.cjs +218 -0
  13. package/audit-tool/utils/file-utils.cjs +230 -0
  14. package/audit-tool/utils/report-utils.cjs +380 -0
  15. package/cursor-rules/00-standards-overview.mdc +156 -0
  16. package/cursor-rules/{00-pace-core-compliance.mdc → 01-pace-core-compliance.mdc} +187 -34
  17. package/cursor-rules/02-project-structure.mdc +37 -5
  18. package/cursor-rules/{03-solid-principles.mdc → 03-architecture.mdc} +125 -11
  19. package/cursor-rules/04-code-quality.mdc +419 -0
  20. package/cursor-rules/{08-markup-quality.mdc → 05-styling.mdc} +55 -10
  21. package/cursor-rules/{09-rbac-compliance.mdc → 06-security-rbac.mdc} +62 -6
  22. package/cursor-rules/07-api-tech-stack.mdc +377 -0
  23. package/cursor-rules/08-testing-documentation.mdc +324 -0
  24. package/cursor-rules/09-operations.mdc +365 -0
  25. package/dist/DataTable-6RMSCQJ6.js +15 -0
  26. package/dist/{DataTable-2N_tqbfq.d.ts → DataTable-DRUIgtUH.d.ts} +1 -1
  27. package/dist/{PublicPageProvider-BBH6Vqg7.d.ts → PublicPageProvider-CIGSujI2.d.ts} +40 -24
  28. package/dist/{UnifiedAuthProvider-ZT6TIGM7.js → UnifiedAuthProvider-7SNDOWYD.js} +2 -2
  29. package/dist/{api-Y4MQWOFW.js → api-7P7DI652.js} +1 -1
  30. package/dist/{chunk-MAGBIDNS.js → chunk-4DDCYDQ3.js} +8 -7
  31. package/dist/{chunk-BVP2BCJF.js → chunk-5W2A3DRC.js} +10 -9
  32. package/dist/{chunk-SD6WQY43.js → chunk-7ILTDCL2.js} +9 -1
  33. package/dist/{chunk-3QC3KRHK.js → chunk-A3W6LW53.js} +16 -1
  34. package/dist/{chunk-3O3WHILE.js → chunk-EF2UGZWY.js} +239 -63
  35. package/dist/{chunk-LAZMKTTF.js → chunk-EURB7QFZ.js} +341 -337
  36. package/dist/{chunk-2HGJFNAH.js → chunk-FEJLJNWA.js} +1 -15
  37. package/dist/{chunk-7TYHROIV.js → chunk-GS5672WG.js} +55 -13
  38. package/dist/{chunk-UIYSCEV7.js → chunk-IUBRCBSY.js} +1 -1
  39. package/dist/{chunk-ZFYPMX46.js → chunk-LX6U42O3.js} +1 -1
  40. package/dist/{chunk-FENMYN2U.js → chunk-MPBLMWVR.js} +3 -3
  41. package/dist/{chunk-ZS5VO5JB.js → chunk-NKHKXPI4.js} +408 -453
  42. package/dist/{chunk-A55DK444.js → chunk-OJ4SKRSV.js} +1 -7
  43. package/dist/{chunk-4T7OBVTU.js → chunk-S6ZQKDY6.js} +1 -1
  44. package/dist/{chunk-FTCRZOG2.js → chunk-T5CVK4R3.js} +5 -5
  45. package/dist/{chunk-OHIK3MIO.js → chunk-Z2FNRKF3.js} +13 -13
  46. package/dist/components.d.ts +5 -4
  47. package/dist/components.js +29 -34
  48. package/dist/eslint-rules/index.cjs +22 -9
  49. package/{src/eslint-rules/rules/compliance.cjs → dist/eslint-rules/rules/01-pace-core-compliance.cjs} +184 -23
  50. package/dist/eslint-rules/rules/04-code-quality.cjs +346 -0
  51. package/dist/eslint-rules/rules/05-styling.cjs +61 -0
  52. package/dist/eslint-rules/rules/{rbac.cjs → 06-security-rbac.cjs} +34 -13
  53. package/dist/eslint-rules/rules/07-api-tech-stack.cjs +385 -0
  54. package/dist/eslint-rules/rules/08-testing.cjs +94 -0
  55. package/dist/{functions-DHebl8-F.d.ts → functions-lBy5L2ry.d.ts} +1 -1
  56. package/dist/hooks.d.ts +5 -5
  57. package/dist/hooks.js +8 -8
  58. package/dist/index.d.ts +7 -7
  59. package/dist/index.js +21 -20
  60. package/dist/providers.js +2 -2
  61. package/dist/rbac/index.d.ts +1 -1
  62. package/dist/rbac/index.js +8 -8
  63. package/dist/theming/runtime.d.ts +61 -1
  64. package/dist/theming/runtime.js +1 -1
  65. package/dist/{types-B-K_5VnO.d.ts → types-DXstZpNI.d.ts} +0 -17
  66. package/dist/types.d.ts +2 -2
  67. package/dist/{usePublicRouteParams-COZ28Mvq.d.ts → usePublicRouteParams-MamNgwqe.d.ts} +19 -19
  68. package/dist/utils.d.ts +2 -2
  69. package/dist/utils.js +8 -8
  70. package/docs/README.md +1 -1
  71. package/docs/api/modules.md +106 -41
  72. package/docs/api-reference/components.md +18 -20
  73. package/docs/api-reference/hooks.md +80 -80
  74. package/docs/api-reference/types.md +1 -1
  75. package/docs/api-reference/utilities.md +1 -1
  76. package/docs/architecture/README.md +1 -1
  77. package/docs/core-concepts/events.md +3 -3
  78. package/docs/core-concepts/organisations.md +6 -6
  79. package/docs/core-concepts/permissions.md +6 -6
  80. package/docs/documentation-index.md +12 -18
  81. package/docs/getting-started/dependencies.md +23 -0
  82. package/docs/getting-started/documentation-index.md +1 -1
  83. package/docs/getting-started/examples/README.md +4 -4
  84. package/docs/getting-started/examples/full-featured-app.md +1 -1
  85. package/docs/getting-started/faq.md +2 -2
  86. package/docs/getting-started/quick-reference.md +4 -4
  87. package/docs/implementation-guides/app-layout.md +1 -1
  88. package/docs/implementation-guides/authentication.md +15 -15
  89. package/docs/implementation-guides/component-styling.md +1 -1
  90. package/docs/implementation-guides/data-tables.md +127 -34
  91. package/docs/implementation-guides/datatable-rbac-usage.md +1 -1
  92. package/docs/implementation-guides/dynamic-colors.md +3 -3
  93. package/docs/implementation-guides/file-upload-storage.md +2 -2
  94. package/docs/implementation-guides/hierarchical-datatable.md +40 -60
  95. package/docs/implementation-guides/inactivity-tracking.md +3 -3
  96. package/docs/implementation-guides/large-datasets.md +3 -2
  97. package/docs/implementation-guides/organisation-security.md +2 -2
  98. package/docs/implementation-guides/performance.md +2 -2
  99. package/docs/implementation-guides/permission-enforcement.md +1 -1
  100. package/docs/migration/V0.3.44_organisation-context-timing-fix.md +1 -1
  101. package/docs/migration/V0.4.0_rbac-migration.md +6 -6
  102. package/docs/rbac/README.md +5 -5
  103. package/docs/rbac/advanced-patterns.md +6 -6
  104. package/docs/rbac/api-reference.md +20 -20
  105. package/docs/rbac/event-based-apps.md +3 -3
  106. package/docs/rbac/examples.md +41 -41
  107. package/docs/rbac/getting-started.md +37 -37
  108. package/docs/rbac/performance.md +1 -1
  109. package/docs/rbac/quick-start.md +52 -52
  110. package/docs/rbac/secure-client-protection.md +1 -1
  111. package/docs/rbac/troubleshooting.md +1 -1
  112. package/docs/security/README.md +5 -5
  113. package/docs/standards/0-standards-overview.md +220 -0
  114. package/docs/standards/{00-pace-core-compliance.md → 1-pace-core-compliance-standards.md} +241 -185
  115. package/docs/standards/{02-project-structure.md → 2-project-structure-standards.md} +11 -47
  116. package/docs/standards/3-architecture-standards.md +606 -0
  117. package/docs/standards/4-code-quality-standards.md +728 -0
  118. package/docs/standards/{08-markup-quality.md → 5-styling-standards.md} +12 -9
  119. package/docs/standards/{09-rbac-compliance.md → 6-security-rbac-standards.md} +126 -18
  120. package/docs/standards/7-api-tech-stack-standards.md +662 -0
  121. package/docs/standards/8-testing-documentation-standards.md +401 -0
  122. package/docs/standards/9-operations-standards.md +1102 -0
  123. package/docs/standards/README.md +203 -104
  124. package/docs/troubleshooting/README.md +4 -4
  125. package/docs/troubleshooting/common-issues.md +2 -2
  126. package/docs/troubleshooting/debugging.md +9 -9
  127. package/docs/troubleshooting/migration.md +4 -4
  128. package/eslint-config-pace-core.cjs +50 -20
  129. package/package.json +50 -19
  130. package/scripts/eslint-audit.cjs +123 -0
  131. package/scripts/install-cursor-rules.cjs +11 -243
  132. package/scripts/install-eslint-config.cjs +349 -0
  133. package/scripts/validate-dependencies.cjs +248 -0
  134. package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +2 -2
  135. package/src/__tests__/helpers/__tests__/test-providers.test.tsx +2 -2
  136. package/src/__tests__/helpers/__tests__/test-utils.test.tsx +30 -18
  137. package/src/__tests__/integration/UserProfile.test.tsx +14 -14
  138. package/src/__tests__/rbac/PagePermissionGuard.test.tsx +6 -6
  139. package/src/__tests__/templates/accessibility.test.template.tsx +10 -9
  140. package/src/__tests__/templates/component.test.template.tsx +18 -15
  141. package/src/components/AddressField/AddressField.tsx +26 -1
  142. package/src/components/Alert/Alert.test.tsx +86 -22
  143. package/src/components/Alert/Alert.tsx +19 -11
  144. package/src/components/Badge/Badge.tsx +1 -1
  145. package/src/components/Calendar/Calendar.tsx +201 -47
  146. package/src/components/Checkbox/Checkbox.test.tsx +2 -1
  147. package/src/components/ContextSelector/ContextSelector.tsx +108 -126
  148. package/src/components/DataTable/AUDIT_REPORT.md +293 -0
  149. package/src/components/DataTable/DataTable.tsx +1 -19
  150. package/src/components/DataTable/__tests__/DataTableCore.test.tsx +6 -2
  151. package/src/components/DataTable/__tests__/a11y.basic.test.tsx +21 -6
  152. package/src/components/DataTable/__tests__/pagination.modes.test.tsx +3 -2
  153. package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +9 -9
  154. package/src/components/DataTable/components/ColumnFilter.tsx +63 -74
  155. package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +43 -41
  156. package/src/components/DataTable/components/DataTableErrorBoundary.tsx +9 -11
  157. package/src/components/DataTable/components/DataTableLayout.tsx +5 -16
  158. package/src/components/DataTable/components/EditableRow.tsx +5 -7
  159. package/src/components/DataTable/components/EmptyState.tsx +11 -10
  160. package/src/components/DataTable/components/FilterRow.tsx +2 -4
  161. package/src/components/DataTable/components/ImportModal.tsx +124 -126
  162. package/src/components/DataTable/components/LoadingState.tsx +5 -6
  163. package/src/components/DataTable/components/SortIndicator.tsx +50 -0
  164. package/src/components/DataTable/components/__tests__/COVERAGE_NOTE.md +4 -4
  165. package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +23 -82
  166. package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +37 -9
  167. package/src/components/DataTable/components/__tests__/EmptyState.test.tsx +7 -4
  168. package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +12 -4
  169. package/src/components/DataTable/components/__tests__/LoadingState.test.tsx +45 -27
  170. package/src/components/DataTable/components/index.ts +2 -1
  171. package/src/components/DataTable/types.ts +0 -18
  172. package/src/components/DataTable/utils/a11yUtils.ts +17 -0
  173. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +1 -1
  174. package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.tsx +11 -15
  175. package/src/components/DateTimeField/DateTimeField.tsx +7 -8
  176. package/src/components/Dialog/Dialog.test.tsx +1 -0
  177. package/src/components/Dialog/Dialog.tsx +25 -8
  178. package/src/components/ErrorBoundary/ErrorBoundary.tsx +77 -79
  179. package/src/components/FileUpload/FileUpload.test.tsx +45 -16
  180. package/src/components/FileUpload/FileUpload.tsx +141 -130
  181. package/src/components/NavigationMenu/NavigationMenu.test.tsx +48 -12
  182. package/src/components/PaceAppLayout/PaceAppLayout.performance.test.tsx +9 -9
  183. package/src/components/PaceAppLayout/PaceAppLayout.security.test.tsx +30 -30
  184. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +4 -4
  185. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +7 -1
  186. package/src/components/Progress/Progress.tsx +2 -4
  187. package/src/components/ProtectedRoute/ProtectedRoute.tsx +8 -8
  188. package/src/components/Select/Select.tsx +86 -77
  189. package/src/components/Select/types.ts +3 -0
  190. package/src/hooks/__tests__/ServiceHooks.test.tsx +16 -16
  191. package/src/hooks/__tests__/hooks.integration.test.tsx +49 -49
  192. package/src/hooks/__tests__/useDataTablePerformance.unit.test.ts +8 -5
  193. package/src/hooks/__tests__/useFileUrl.unit.test.ts +4 -0
  194. package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +99 -99
  195. package/src/hooks/__tests__/useInactivityTracker.unit.test.ts +45 -8
  196. package/src/hooks/__tests__/usePerformanceMonitor.unit.test.ts +22 -2
  197. package/src/hooks/public/usePublicEvent.ts +5 -5
  198. package/src/hooks/public/usePublicEventLogo.ts +5 -5
  199. package/src/hooks/public/usePublicFileDisplay.ts +2 -2
  200. package/src/hooks/public/usePublicRouteParams.ts +13 -9
  201. package/src/hooks/useAddressAutocomplete.test.ts +18 -18
  202. package/src/hooks/useAppConfig.ts +2 -2
  203. package/src/hooks/useEventTheme.test.ts +7 -7
  204. package/src/hooks/useEventTheme.ts +2 -1
  205. package/src/hooks/useFileDisplay.ts +2 -2
  206. package/src/hooks/useFileUrl.ts +52 -8
  207. package/src/hooks/useOrganisationSecurity.test.ts +2 -1
  208. package/src/providers/UnifiedAuthProvider.smoke.test.tsx +21 -21
  209. package/src/providers/__tests__/AuthProvider.test.tsx +21 -21
  210. package/src/providers/__tests__/EventProvider.test.tsx +61 -61
  211. package/src/providers/__tests__/InactivityProvider.test.tsx +56 -56
  212. package/src/providers/__tests__/OrganisationProvider.test.tsx +75 -75
  213. package/src/providers/__tests__/ProviderLifecycle.test.tsx +38 -38
  214. package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +103 -103
  215. package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +7 -7
  216. package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +10 -10
  217. package/src/rbac/__tests__/auth-rbac.e2e.test.tsx +15 -6
  218. package/src/rbac/__tests__/rbac-functions.test.ts +3 -3
  219. package/src/rbac/api.test.ts +104 -0
  220. package/src/rbac/engine.ts +1 -1
  221. package/src/rbac/hooks/useCan.test.ts +2 -2
  222. package/src/rbac/secureClient.ts +1 -1
  223. package/src/rbac/types/functions.ts +1 -1
  224. package/src/styles/core.css +7 -0
  225. package/src/theming/__tests__/parseEventColours.test.ts +118 -3
  226. package/src/theming/parseEventColours.ts +77 -11
  227. package/src/types/supabase.ts +2 -3
  228. package/src/utils/__tests__/bundleAnalysis.unit.test.ts +9 -9
  229. package/src/utils/__tests__/lazyLoad.unit.test.tsx +42 -39
  230. package/src/utils/file-reference/__tests__/file-reference.test.ts +4 -0
  231. package/src/utils/formatting/formatDate.test.ts +3 -2
  232. package/src/utils/formatting/formatDateTime.test.ts +2 -2
  233. package/src/utils/google-places/googlePlacesUtils.test.ts +36 -24
  234. package/src/utils/storage/README.md +1 -1
  235. package/src/utils/storage/__tests__/helpers.unit.test.ts +19 -12
  236. package/src/utils/storage/helpers.test.ts +69 -3
  237. package/cursor-rules/01-standards-compliance.mdc +0 -285
  238. package/cursor-rules/04-testing-standards.mdc +0 -270
  239. package/cursor-rules/05-bug-reports-and-features.mdc +0 -248
  240. package/cursor-rules/06-code-quality.mdc +0 -311
  241. package/cursor-rules/07-tech-stack-compliance.mdc +0 -216
  242. package/cursor-rules/10-error-handling-patterns.mdc +0 -179
  243. package/cursor-rules/11-performance-optimization.mdc +0 -169
  244. package/cursor-rules/12-ci-cd-integration.mdc +0 -150
  245. package/dist/DataTable-LRJL4IRV.js +0 -15
  246. package/dist/eslint-rules/rules/compliance.cjs +0 -348
  247. package/dist/eslint-rules/rules/components.cjs +0 -113
  248. package/dist/eslint-rules/rules/imports.cjs +0 -102
  249. package/docs/best-practices/README.md +0 -472
  250. package/docs/best-practices/accessibility.md +0 -604
  251. package/docs/best-practices/common-patterns.md +0 -516
  252. package/docs/best-practices/deployment.md +0 -1103
  253. package/docs/best-practices/performance.md +0 -1328
  254. package/docs/best-practices/security.md +0 -940
  255. package/docs/best-practices/testing.md +0 -1034
  256. package/docs/rbac/compliance/compliance-guide.md +0 -544
  257. package/docs/standards/01-standards-compliance.md +0 -188
  258. package/docs/standards/03-solid-principles.md +0 -39
  259. package/docs/standards/04-testing-standards.md +0 -36
  260. package/docs/standards/05-bug-reports-and-features.md +0 -27
  261. package/docs/standards/06-code-quality.md +0 -34
  262. package/docs/standards/07-tech-stack-compliance.md +0 -30
  263. package/docs/standards/10-error-handling-patterns.md +0 -401
  264. package/docs/standards/11-performance-optimization.md +0 -348
  265. package/docs/standards/12-ci-cd-integration.md +0 -370
  266. package/docs/standards/ALIGNMENT_REVIEW_SUMMARY.md +0 -192
  267. package/scripts/audit/audit-compliance.cjs +0 -1295
  268. package/scripts/audit/audit-components.cjs +0 -260
  269. package/scripts/audit/audit-rbac.cjs +0 -954
  270. package/scripts/audit/audit-standards.cjs +0 -1268
  271. package/scripts/audit/index.cjs +0 -1927
  272. package/src/components/DataTable/components/DataTableBody.tsx +0 -478
  273. package/src/components/DataTable/components/DraggableColumnHeader.tsx +0 -156
  274. package/src/components/DataTable/components/ExpandButton.tsx +0 -113
  275. package/src/components/DataTable/components/GroupHeader.tsx +0 -54
  276. package/src/components/DataTable/components/ViewRowModal.tsx +0 -68
  277. package/src/components/DataTable/components/VirtualizedDataTable.tsx +0 -525
  278. package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +0 -462
  279. package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +0 -393
  280. package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +0 -476
  281. package/src/components/DataTable/components/__tests__/VirtualizedDataTable.test.tsx +0 -128
  282. package/src/components/DataTable/core/DataTableContext.tsx +0 -216
  283. package/src/components/DataTable/core/__tests__/DataTableContext.test.tsx +0 -136
  284. package/src/components/DataTable/hooks/__tests__/useColumnReordering.test.ts +0 -570
  285. package/src/components/DataTable/hooks/useColumnReordering.ts +0 -123
  286. package/src/components/DataTable/utils/debugTools.ts +0 -514
  287. package/src/eslint-rules/index.cjs +0 -22
  288. package/src/eslint-rules/rules/components.cjs +0 -113
  289. package/src/eslint-rules/rules/imports.cjs +0 -102
  290. package/src/eslint-rules/rules/rbac.cjs +0 -790
  291. package/src/eslint-rules/utils/helpers.cjs +0 -42
  292. package/src/eslint-rules/utils/manifest-loader.cjs +0 -75
@@ -1,393 +0,0 @@
1
- /**
2
- * @file GroupHeader Component Tests
3
- * @package @jmruthers/pace-core
4
- * @module Components/DataTable/Components/__tests__
5
- * @since 0.4.0
6
- *
7
- * Comprehensive test suite for GroupHeader component following testing guidelines.
8
- * Tests cover all major functionality, edge cases, and user interactions.
9
- */
10
-
11
- import React from 'react';
12
- import { render, screen } from '@testing-library/react';
13
- import userEvent from '@testing-library/user-event';
14
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
15
- import { GroupHeader } from '../GroupHeader';
16
- import type { Row } from '@tanstack/react-table';
17
-
18
- // Mock lucide-react icons
19
- vi.mock('lucide-react', () => ({
20
- ChevronDown: ({ className }: { className?: string }) => (
21
- <div data-testid="chevron-down-icon" className={className}>ChevronDown</div>
22
- ),
23
- ChevronRight: ({ className }: { className?: string }) => (
24
- <div data-testid="chevron-right-icon" className={className}>ChevronRight</div>
25
- ),
26
- }));
27
-
28
- // Mock Button component
29
- vi.mock('../../Button/Button', () => ({
30
- Button: ({ children, onClick, variant, size, className, ...props }: any) => (
31
- <button
32
- onClick={onClick}
33
- data-variant={variant}
34
- data-size={size}
35
- className={className}
36
- {...props}
37
- >
38
- {children}
39
- </button>
40
- ),
41
- }));
42
-
43
- interface TestData {
44
- id: string;
45
- name: string;
46
- category: string;
47
- }
48
-
49
- const createMockRow = (overrides: Partial<Row<TestData>> = {}): Row<TestData> => ({
50
- id: 'row-1',
51
- index: 0,
52
- depth: 0,
53
- original: { id: '1', name: 'Test', category: 'Category A' } as TestData,
54
- getValue: vi.fn((columnId: string) => {
55
- if (columnId === 'category') return 'Category A';
56
- return 'value';
57
- }),
58
- renderValue: vi.fn(),
59
- getUniqueValues: vi.fn(),
60
- toggleSelected: vi.fn(),
61
- getIsSelected: vi.fn(() => false),
62
- getIsSomeSelected: vi.fn(() => false),
63
- getIsAllSubRowsSelected: vi.fn(() => false),
64
- getCanSelect: vi.fn(() => true),
65
- getCanSelectSubRows: vi.fn(() => false),
66
- getCanMultiSelect: vi.fn(() => true),
67
- getToggleSelectedHandler: vi.fn(),
68
- getParentRow: vi.fn(),
69
- getParentRows: vi.fn(),
70
- subRows: [],
71
- getLeafValues: vi.fn(),
72
- getAllCells: vi.fn(),
73
- getLeftVisibleCells: vi.fn(),
74
- getRightVisibleCells: vi.fn(),
75
- getVisibleCells: vi.fn(),
76
- getCenterVisibleCells: vi.fn(),
77
- ...overrides,
78
- } as unknown as Row<TestData>);
79
-
80
- describe('[component] GroupHeader', () => {
81
- const baseProps = {
82
- row: createMockRow(),
83
- groupByColumn: 'category',
84
- isExpanded: false,
85
- onToggle: vi.fn(),
86
- subRowsCount: 5,
87
- };
88
-
89
- beforeEach(() => {
90
- vi.clearAllMocks();
91
- });
92
-
93
- afterEach(() => {
94
- vi.clearAllMocks();
95
- });
96
-
97
- describe('Rendering', () => {
98
- it('renders group header container', () => {
99
- render(<GroupHeader {...baseProps} />);
100
-
101
- const container = screen.getByText(/Category A/i).closest('div');
102
- expect(container).toBeInTheDocument();
103
- });
104
-
105
- it('displays group value', () => {
106
- render(<GroupHeader {...baseProps} />);
107
-
108
- expect(screen.getByText(/Category A/i)).toBeInTheDocument();
109
- });
110
-
111
- it('displays subRowsCount', () => {
112
- render(<GroupHeader {...baseProps} subRowsCount={10} />);
113
-
114
- expect(screen.getByText(/\(10 items\)/i)).toBeInTheDocument();
115
- });
116
-
117
- it('renders ChevronRight icon when not expanded', () => {
118
- render(<GroupHeader {...baseProps} isExpanded={false} />);
119
-
120
- expect(screen.getByTestId('chevron-right-icon')).toBeInTheDocument();
121
- expect(screen.queryByTestId('chevron-down-icon')).not.toBeInTheDocument();
122
- });
123
-
124
- it('renders ChevronDown icon when expanded', () => {
125
- render(<GroupHeader {...baseProps} isExpanded={true} />);
126
-
127
- expect(screen.getByTestId('chevron-down-icon')).toBeInTheDocument();
128
- expect(screen.queryByTestId('chevron-right-icon')).not.toBeInTheDocument();
129
- });
130
-
131
- it('renders toggle button', () => {
132
- render(<GroupHeader {...baseProps} />);
133
-
134
- const button = screen.getByRole('button');
135
- expect(button).toBeInTheDocument();
136
- });
137
- });
138
-
139
- describe('Group Value Display', () => {
140
- it('displays correct group value from row', () => {
141
- const row = createMockRow({
142
- getValue: vi.fn((columnId: string) => {
143
- if (columnId === 'category') return 'Electronics';
144
- return 'value';
145
- }),
146
- });
147
-
148
- render(
149
- <GroupHeader
150
- {...baseProps}
151
- row={row}
152
- />
153
- );
154
-
155
- expect(screen.getByText(/Electronics/i)).toBeInTheDocument();
156
- });
157
-
158
- it('converts group value to string', () => {
159
- const row = createMockRow({
160
- getValue: vi.fn((columnId: string) => {
161
- if (columnId === 'category') return 123;
162
- return 'value';
163
- }),
164
- });
165
-
166
- render(
167
- <GroupHeader
168
- {...baseProps}
169
- row={row}
170
- />
171
- );
172
-
173
- expect(screen.getByText(/123/i)).toBeInTheDocument();
174
- });
175
-
176
- it('handles null group value', () => {
177
- const row = createMockRow({
178
- getValue: vi.fn((columnId: string) => {
179
- if (columnId === 'category') return null;
180
- return 'value';
181
- }),
182
- });
183
-
184
- render(
185
- <GroupHeader
186
- {...baseProps}
187
- row={row}
188
- />
189
- );
190
-
191
- expect(screen.getByText(/null/i)).toBeInTheDocument();
192
- });
193
-
194
- it('handles undefined group value', () => {
195
- const row = createMockRow({
196
- getValue: vi.fn((columnId: string) => {
197
- if (columnId === 'category') return undefined;
198
- return 'value';
199
- }),
200
- });
201
-
202
- render(
203
- <GroupHeader
204
- {...baseProps}
205
- row={row}
206
- />
207
- );
208
-
209
- expect(screen.getByText(/undefined/i)).toBeInTheDocument();
210
- });
211
- });
212
-
213
- describe('SubRows Count Display', () => {
214
- it('displays correct count for single item', () => {
215
- render(<GroupHeader {...baseProps} subRowsCount={1} />);
216
-
217
- expect(screen.getByText(/\(1 items\)/i)).toBeInTheDocument();
218
- });
219
-
220
- it('displays correct count for multiple items', () => {
221
- render(<GroupHeader {...baseProps} subRowsCount={25} />);
222
-
223
- expect(screen.getByText(/\(25 items\)/i)).toBeInTheDocument();
224
- });
225
-
226
- it('displays zero count', () => {
227
- render(<GroupHeader {...baseProps} subRowsCount={0} />);
228
-
229
- expect(screen.getByText(/\(0 items\)/i)).toBeInTheDocument();
230
- });
231
- });
232
-
233
- describe('User Interactions', () => {
234
- it('calls onToggle when button is clicked', async () => {
235
- const user = userEvent.setup();
236
- const handleToggle = vi.fn();
237
-
238
- render(
239
- <GroupHeader
240
- {...baseProps}
241
- onToggle={handleToggle}
242
- />
243
- );
244
-
245
- const button = screen.getByRole('button');
246
- await user.click(button);
247
-
248
- expect(handleToggle).toHaveBeenCalledTimes(1);
249
- });
250
-
251
- it('calls onToggle multiple times on rapid clicks', async () => {
252
- const user = userEvent.setup();
253
- const handleToggle = vi.fn();
254
-
255
- render(
256
- <GroupHeader
257
- {...baseProps}
258
- onToggle={handleToggle}
259
- />
260
- );
261
-
262
- const button = screen.getByRole('button');
263
- await user.click(button);
264
- await user.click(button);
265
- await user.click(button);
266
-
267
- expect(handleToggle).toHaveBeenCalledTimes(3);
268
- });
269
-
270
- it('updates icon when expanded state changes', () => {
271
- const { rerender } = render(
272
- <GroupHeader
273
- {...baseProps}
274
- isExpanded={false}
275
- />
276
- );
277
-
278
- expect(screen.getByTestId('chevron-right-icon')).toBeInTheDocument();
279
-
280
- rerender(
281
- <GroupHeader
282
- {...baseProps}
283
- isExpanded={true}
284
- />
285
- );
286
-
287
- expect(screen.getByTestId('chevron-down-icon')).toBeInTheDocument();
288
- });
289
- });
290
-
291
- describe('Edge Cases', () => {
292
- it('handles empty group value', () => {
293
- const row = createMockRow({
294
- getValue: vi.fn((columnId: string) => {
295
- if (columnId === 'category') return '';
296
- return 'value';
297
- }),
298
- });
299
-
300
- render(
301
- <GroupHeader
302
- {...baseProps}
303
- row={row}
304
- />
305
- );
306
-
307
- expect(screen.getByText(/\(5 items\)/i)).toBeInTheDocument();
308
- });
309
-
310
- it('handles very large subRowsCount', () => {
311
- render(<GroupHeader {...baseProps} subRowsCount={999999} />);
312
-
313
- expect(screen.getByText(/\(999999 items\)/i)).toBeInTheDocument();
314
- });
315
-
316
- it('handles different groupByColumn values', () => {
317
- const row = createMockRow({
318
- getValue: vi.fn((columnId: string) => {
319
- if (columnId === 'status') return 'Active';
320
- return 'value';
321
- }),
322
- });
323
-
324
- render(
325
- <GroupHeader
326
- {...baseProps}
327
- row={row}
328
- groupByColumn="status"
329
- />
330
- );
331
-
332
- expect(screen.getByText(/Active/i)).toBeInTheDocument();
333
- });
334
-
335
- it('handles special characters in group value', () => {
336
- const row = createMockRow({
337
- getValue: vi.fn((columnId: string) => {
338
- if (columnId === 'category') return 'Category & Type (Special)';
339
- return 'value';
340
- }),
341
- });
342
-
343
- render(
344
- <GroupHeader
345
- {...baseProps}
346
- row={row}
347
- />
348
- );
349
-
350
- expect(screen.getByText(/Category & Type \(Special\)/i)).toBeInTheDocument();
351
- });
352
- });
353
-
354
- describe('Styling', () => {
355
- it('has proper container styling', () => {
356
- render(<GroupHeader {...baseProps} />);
357
-
358
- const container = screen.getByText(/Category A/i).closest('div');
359
- expect(container).toHaveClass('flex', 'items-center');
360
- });
361
-
362
- it('applies background and border styling', () => {
363
- render(<GroupHeader {...baseProps} />);
364
-
365
- const container = screen.getByText(/Category A/i).closest('div');
366
- expect(container).toHaveClass('bg-muted/50', 'border-b');
367
- });
368
-
369
- it('applies font styling', () => {
370
- render(<GroupHeader {...baseProps} />);
371
-
372
- const container = screen.getByText(/Category A/i).closest('div');
373
- expect(container).toHaveClass('font-medium');
374
- });
375
- });
376
-
377
- describe('Accessibility', () => {
378
- it('has accessible button for toggling', () => {
379
- render(<GroupHeader {...baseProps} />);
380
-
381
- const button = screen.getByRole('button');
382
- expect(button).toBeInTheDocument();
383
- });
384
-
385
- it('displays group information clearly', () => {
386
- render(<GroupHeader {...baseProps} />);
387
-
388
- expect(screen.getByText(/Category A/i)).toBeInTheDocument();
389
- expect(screen.getByText(/\(5 items\)/i)).toBeInTheDocument();
390
- });
391
- });
392
- });
393
-