Skip to content

Commit 1f2781f

Browse files
feat: add automated accessibility audit with axe-core on key pages (#956) (#959)
Co-authored-by: Ona <no-reply@ona.com>
1 parent 75568fb commit 1f2781f

9 files changed

Lines changed: 232 additions & 11 deletions

File tree

.agents/quality.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ Tracks code quality per domain. Updated by automations as a side effect of featu
2323
| Import/Export | A | Markdown export (download .md) and import (parse .md, create page) via page menu. Markdown utils with unit tests (8 tests). E2E spec covers export and import flow (`e2e/import-export.spec.ts`, 2 tests). |
2424
| Members | A | Member list with role badges, role change, remove. Invite form (email + role). Pending invite list with revoke. Invite accept page. Role select dropdown. Settings members page with server-side data fetching. Unit tests: invite-form (4 tests), member-list (14 tests), pending-invite-list (8 tests), role-select (8 tests). E2E coverage: invite, pending list, revoke, accept, role change, remove, member role restrictions (7 tests). |
2525
| Feedback | A | Feedback form with screenshot capture. API route with integration tests (15 tests). Feedback form design spec tests (5 tests). Screenshot hook unit tests (2 tests). |
26-
| App Shell | A | Collapsible sidebar (desktop: aside, mobile: Sheet), sidebar context with ⌘+\ shortcut, workspace switcher, page tree, user menu with sign-out, focus mode hint, theme toggle, skip-to-content accessibility link. Clean component decomposition. Sidebar context unit tests (21 tests): state management, keyboard shortcut registration, toggle behavior, focus mode, mobile close-on-navigate. Loading skeleton tests (25 tests): app (4), workspace (5), page (6), settings (5), settings members (5). Error boundary tests (22 tests): route-error component (6), workspace error (4), page error (4), settings error (4), settings members error (4). Focus mode hint design spec tests (3 tests). Workspace home design spec tests (5 tests). E2E specs: sidebar responsive (4 tests), theme toggle (4 tests), skip-to-content (2 tests), not-found pages (3 tests), public routes (18 tests). |
26+
| App Shell | A | Collapsible sidebar (desktop: aside, mobile: Sheet), sidebar context with ⌘+\ shortcut, workspace switcher, page tree, user menu with sign-out, focus mode hint, theme toggle, skip-to-content accessibility link. Clean component decomposition. Sidebar context unit tests (21 tests): state management, keyboard shortcut registration, toggle behavior, focus mode, mobile close-on-navigate. Loading skeleton tests (25 tests): app (4), workspace (5), page (6), settings (5), settings members (5). Error boundary tests (22 tests): route-error component (6), workspace error (4), page error (4), settings error (4), settings members error (4). Focus mode hint design spec tests (3 tests). Workspace home design spec tests (5 tests). E2E specs: sidebar responsive (4 tests), theme toggle (4 tests), skip-to-content (2 tests), not-found pages (3 tests), public routes (18 tests), accessibility audit with axe-core (5 tests). |
2727
| API Routes | A | Health endpoint (DB connectivity check, 7 tests), search endpoint (full-text search, 14 tests), account deletion endpoint (6 tests), trash purge cron endpoint (8 tests), page versions endpoints (22 tests), and feedback endpoint (17 tests). All routes use `captureApiError` for transient network error classification. Search route uses `retryOnNetworkError` for transient failure resilience. All have integration tests with mocked Supabase. Account deletion E2E spec (4 tests). |
2828
| UI Components | A | 16 shadcn/ui components (base-nova style): alert-dialog, badge, button, card, checkbox, context-menu, dialog, dropdown-menu, input, label, select, separator, sheet, table, textarea, tooltip. Overlay opacity regression test (2 tests). Toast error duration regression test (1 test). Dialog design spec test (3 tests). Global design-spec compliance checks (6 tests): rounded corners, hex/RGB/HSL colors, font-family, arbitrary spacing. Reduced-motion accessibility test (6 tests): verifies prefers-reduced-motion media query in globals.css. Design tokens use oklch color space, --radius: 0 for sharp corners. Visual regression E2E spec (1 test). |
2929
| Database | A | Database CRUD, table/board/gallery/calendar/list views, inline database, row detail pages, property types (text, number, select, multi-select, date, checkbox, URL, person, formula, email, phone, files, status, computed, relation), filter engine, filter/sort toolbar, formula parser/evaluator, column drag-and-drop reorder, table keyboard navigation, calendar keyboard navigation, CSV export, database duplication, bulk row selection and delete, mobile-responsive layouts. 56 Vitest files (1034 tests): CRUD utilities (55), column helpers (65), database duplicate (11), filter engine (54), formula parser/evaluator (80), CSV export (38), property type picker (14), property type picker completeness (5), table view value format (33), table defaults (27), table cell (40), database page width (3), database view client (6), filter bar (20), filter value editor (34), sort menu (19), rename property dialog (14), row properties header (17), view tabs (24), 5 hooks (use-database-filters 18, use-database-properties 20, use-database-rows 23, use-database-views 24, use-row-selection 10), 14 property type tests (checkbox 8, computed 15, date 12, email 8, files 11, formula 6, multi-select 10, number 14, person 9, phone 10, relation 12, select 11, select-dropdown 32, status 14, text 10, url 10), 11 view tests (board-view-helpers 18, board-view 13, calendar-keyboard 25, calendar-view-helpers 35, calendar-view 15, database-empty-state 14, gallery-view 17, list-keyboard 14, list-view 22, row-count-announcer 7, row-count-status-bar 5), 6 design spec tests: formula (2), person skeleton (1), calendar view (1), gallery view (3), filter/sort toolbar (2). 29 E2E specs: database CRUD (10), database duplicate (2), database duplicate row (3), bulk select (7), add property types (10), board view (4), board keyboard (6), calendar view (4), calendar keyboard (7), column reorder (3), CSV export (3), error recovery (4), files (4), filter keyboard (6), filter types (4), formula (3), gallery view (4), gallery keyboard (5), inline database (4), list view (4), list keyboard (6), relation (3), row page (7), search (2), select options (6), table editor portal (3), table keyboard (6), view config (4), views (10) — 144 E2E tests total. |
@@ -34,8 +34,8 @@ Tracks code quality per domain. Updated by automations as a side effect of featu
3434
| Category | Files | Tests |
3535
|---|---|---|
3636
| Unit/Integration (Vitest) | 133 | 1818 |
37-
| E2E (Playwright) | 69 | 340 |
38-
| **Total** | **202** | **2158** |
37+
| E2E (Playwright) | 70 | 345 |
38+
| **Total** | **203** | **2163** |
3939

4040
### Test files by domain
4141

@@ -46,7 +46,7 @@ Tracks code quality per domain. Updated by automations as a side effect of featu
4646
- **Search**: `search/route.test.ts` (14 tests), `page-search.test.tsx` (12 tests), `e2e/search.spec.ts` (5 tests)
4747
- **Import/Export**: `e2e/import-export.spec.ts` (2 tests)
4848
- **Database**: `database.test.ts` (55 tests), `column-helpers.test.ts` (65 tests), `database-duplicate.test.ts` (11 tests), `database-filters.test.ts` (54 tests), `formula.test.ts` (80 tests), `csv-export.test.ts` (38 tests), `property-type-picker.test.ts` (14 tests), `property-type-picker-completeness.test.ts` (5 tests), `table-view-value-format.test.ts` (33 tests), `table-defaults.test.ts` (27 tests), `table-cell.test.tsx` (40 tests), `database-width.test.ts` (3 tests), `database-view-client.test.tsx` (6 tests), `filter-bar.test.tsx` (20 tests), `filter-value-editor.test.tsx` (34 tests), `sort-menu.test.tsx` (19 tests), `rename-property-dialog.test.tsx` (14 tests), `row-properties-header.test.tsx` (17 tests), `view-tabs.test.tsx` (24 tests), `use-database-filters.test.ts` (18 tests), `use-database-properties.test.ts` (20 tests), `use-database-rows.test.ts` (23 tests), `use-database-views.test.ts` (24 tests), `checkbox.test.tsx` (8 tests), `computed.test.tsx` (15 tests), `date.test.tsx` (12 tests), `email.test.tsx` (8 tests), `files.test.tsx` (11 tests), `formula.test.tsx` (6 tests), `multi-select.test.tsx` (10 tests), `number.test.tsx` (14 tests), `person.test.tsx` (9 tests), `phone.test.tsx` (10 tests), `relation.test.tsx` (12 tests), `select-dropdown.test.tsx` (32 tests), `select.test.tsx` (11 tests), `status.test.tsx` (14 tests), `text.test.tsx` (10 tests), `url.test.tsx` (10 tests), `board-view-helpers.test.ts` (18 tests), `board-view.test.tsx` (13 tests), `calendar-keyboard.test.ts` (25 tests), `calendar-view-helpers.test.ts` (35 tests), `calendar-view.test.tsx` (15 tests), `database-empty-state.test.tsx` (14 tests), `gallery-view.test.tsx` (17 tests), `list-keyboard.test.ts` (14 tests), `list-view.test.tsx` (22 tests), `row-count-announcer.test.tsx` (7 tests), `row-count-status-bar.test.tsx` (5 tests), `formula-design-spec.test.ts` (2 tests), `person-skeleton-design-spec.test.ts` (1 test), `calendar-view-design-spec.test.ts` (1 test), `gallery-view-design-spec.test.ts` (3 tests), `filter-sort-toolbar-design-spec.test.ts` (2 tests), `e2e/database-crud.spec.ts` (11), `e2e/database-duplicate.spec.ts` (2), `e2e/database-duplicate-row.spec.ts` (3), `e2e/database-add-property-types.spec.ts` (10), `e2e/database-board.spec.ts` (4), `e2e/database-board-keyboard.spec.ts` (6), `e2e/database-calendar.spec.ts` (4), `e2e/database-calendar-keyboard.spec.ts` (7), `e2e/database-column-reorder.spec.ts` (3), `e2e/database-csv-export.spec.ts` (3), `e2e/database-error-recovery.spec.ts` (4), `e2e/database-files.spec.ts` (4), `e2e/database-filter-keyboard.spec.ts` (6), `e2e/database-filter-types.spec.ts` (4), `e2e/database-formula.spec.ts` (3), `e2e/database-gallery.spec.ts` (4), `e2e/database-gallery-keyboard.spec.ts` (5), `e2e/database-inline.spec.ts` (4), `e2e/database-list.spec.ts` (4), `e2e/database-list-keyboard.spec.ts` (6), `e2e/database-relation.spec.ts` (3), `e2e/database-row-page.spec.ts` (7), `e2e/database-search.spec.ts` (2), `e2e/database-select-options.spec.ts` (6), `e2e/database-table-editor-portal.spec.ts` (3), `e2e/database-table-keyboard.spec.ts` (6), `e2e/database-view-config.spec.ts` (4), `e2e/database-views.spec.ts` (10), `use-row-selection.test.ts` (10 tests), `e2e/database-bulk-select.spec.ts` (7)
49-
- **App Shell**: `sidebar-context.test.tsx` (21 tests), `(app)/loading.test.ts` (4 tests), `[workspaceSlug]/loading.test.ts` (5 tests), `[workspaceSlug]/[pageId]/loading.test.ts` (6 tests), `[workspaceSlug]/settings/loading.test.ts` (5 tests), `[workspaceSlug]/settings/members/loading.test.ts` (5 tests), `route-error.test.ts` (6 tests), `[workspaceSlug]/error.test.ts` (4 tests), `[workspaceSlug]/[pageId]/error.test.ts` (4 tests), `[workspaceSlug]/settings/error.test.ts` (4 tests), `[workspaceSlug]/settings/members/error.test.ts` (4 tests), `focus-mode-hint-design-spec.test.ts` (3 tests), `workspace-home-design-spec.test.ts` (5 tests), `e2e/sidebar-responsive.spec.ts` (4 tests), `e2e/theme-toggle.spec.ts` (4 tests), `e2e/skip-to-content.spec.ts` (2 tests), `e2e/not-found.spec.ts` (3 tests), `e2e/public-routes.spec.ts` (18 tests), `e2e/demo-editor.spec.ts` (11 tests)
49+
- **App Shell**: `sidebar-context.test.tsx` (21 tests), `(app)/loading.test.ts` (4 tests), `[workspaceSlug]/loading.test.ts` (5 tests), `[workspaceSlug]/[pageId]/loading.test.ts` (6 tests), `[workspaceSlug]/settings/loading.test.ts` (5 tests), `[workspaceSlug]/settings/members/loading.test.ts` (5 tests), `route-error.test.ts` (6 tests), `[workspaceSlug]/error.test.ts` (4 tests), `[workspaceSlug]/[pageId]/error.test.ts` (4 tests), `[workspaceSlug]/settings/error.test.ts` (4 tests), `[workspaceSlug]/settings/members/error.test.ts` (4 tests), `focus-mode-hint-design-spec.test.ts` (3 tests), `workspace-home-design-spec.test.ts` (5 tests), `e2e/sidebar-responsive.spec.ts` (4 tests), `e2e/theme-toggle.spec.ts` (4 tests), `e2e/skip-to-content.spec.ts` (2 tests), `e2e/not-found.spec.ts` (3 tests), `e2e/public-routes.spec.ts` (18 tests), `e2e/demo-editor.spec.ts` (11 tests), `e2e/accessibility.spec.ts` (5 tests)
5050
- **Members**: `invite-form.test.ts` (4 tests), `member-list.test.tsx` (14 tests), `pending-invite-list.test.tsx` (8 tests), `role-select.test.tsx` (8 tests), `e2e/members.spec.ts` (7 tests)
5151
- **Feedback**: `feedback/route.test.ts` (17 tests), `feedback-form-design-spec.test.ts` (5 tests), `use-screenshot.test.ts` (2 tests)
5252
- **API**: `health/route.test.ts` (7 tests), `search/route.test.ts` (14 tests), `account/route.test.ts` (6 tests), `cron/purge-trash/route.test.ts` (8 tests), `feedback/route.test.ts` (17 tests), `pages/[pageId]/versions/route.test.ts` (11 tests), `pages/[pageId]/versions/[versionId]/route.test.ts` (11 tests), `e2e/account-deletion.spec.ts` (4 tests)
@@ -112,5 +112,6 @@ Tracks code quality per domain. Updated by automations as a side effect of featu
112112
| 2026-05-07 | Transient fetch retry on search RPC (#937). Extended `retryOnNetworkError` to handle thrown transient errors. Wrapped search route RPC call with retry. Updated 2 files with grown counts: `search/route.test.ts` (11→14), `retry.test.ts` (6→9). Test totals: 132 Vitest files (1808 tests), 69 E2E specs (340 tests). |
113113
| 2026-05-07 | Prefers-reduced-motion accessibility (#940). Added `@media (prefers-reduced-motion: reduce)` rule to `globals.css`. Added 1 new Vitest file: `reduced-motion.test.ts` (6 tests). Test totals: 133 Vitest files (1818 tests), 69 E2E specs (340 tests). |
114114
| 2026-05-08 | Replace direct sonner imports with lazy `@/lib/toast` wrapper (#949). Updated 5 source files and 5 test mocks. Added ESLint `no-restricted-imports` rule for `sonner` toast. Extended `ToastData` type with `action` property. No new tests. Test totals unchanged: 133 Vitest files (1818 tests), 69 E2E specs (340 tests). |
115+
| 2026-05-08 | Automated accessibility audit with axe-core (#956). Added `@axe-core/playwright` dev dependency. New E2E spec `e2e/accessibility.spec.ts` (5 tests) scanning sign-in, workspace home, page editor, workspace settings, and members pages. Fixed `button-name` violation on role select triggers (added `aria-label`). Fixed `aria-input-field-name` violation on editor contenteditable (added `aria-label`). Known pre-existing violations (color-contrast, link-in-text-block) documented and excluded. Test totals: 133 Vitest files (1818 tests), 70 E2E specs (345 tests). |
115116

116117

0 commit comments

Comments
 (0)