- Sidebar unit test: entries with isA 'Monday Ideas' produce exactly one section header (not two) - Playwright smoke test: verify no duplicate section labels in sidebar Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
37 lines
1.5 KiB
TypeScript
37 lines
1.5 KiB
TypeScript
import { test, expect } from '@playwright/test'
|
|
|
|
test.describe('Sidebar duplicate sections', () => {
|
|
test.beforeEach(async ({ page }) => {
|
|
await page.goto('/')
|
|
await page.waitForLoadState('networkidle')
|
|
})
|
|
|
|
test('no duplicate sidebar section headers', async ({ page }) => {
|
|
// Verify that every section label in the sidebar is unique.
|
|
// Before the fix, hyphenated folder names (e.g. monday-ideas/)
|
|
// would produce a different isA than the Type file title,
|
|
// resulting in two sidebar sections for the same type.
|
|
|
|
const sidebar = page.locator('.app__sidebar')
|
|
|
|
// Wait for at least one Expand/Collapse button (indicates sections rendered)
|
|
await sidebar.locator('button[aria-label*="Collapse"], button[aria-label*="Expand"]').first().waitFor({ timeout: 5000 })
|
|
|
|
// Extract section labels from the Expand/Collapse aria-labels
|
|
const buttons = sidebar.locator('button[aria-label*="Collapse"], button[aria-label*="Expand"]')
|
|
const count = await buttons.count()
|
|
const labels: string[] = []
|
|
for (let i = 0; i < count; i++) {
|
|
const ariaLabel = await buttons.nth(i).getAttribute('aria-label')
|
|
// aria-label is like "Collapse Projects" or "Expand Projects"
|
|
const label = ariaLabel?.replace(/^(Collapse|Expand)\s+/, '') ?? ''
|
|
if (label) labels.push(label)
|
|
}
|
|
|
|
// Every label should be unique — no duplicates
|
|
const uniqueLabels = [...new Set(labels)]
|
|
expect(labels).toEqual(uniqueLabels)
|
|
expect(labels.length).toBeGreaterThan(0)
|
|
})
|
|
})
|