pcbjam/tests/e2e/dataview.spec.ts
Viktor Vaczi 64142aa8de Extend element registry and migrate all tests to semantic selectors
Phase 2 of element registry migration - eliminate hardcoded coordinates:

Element tracker additions:
- wxTreeCtrl items (clickTreeItem, findTreeItem)
- wxDataViewCtrl items and column headers
- wxPropertyGrid rows
- wxListBox items
- wxSpinButton arrows
- wxSlider thumb/track
- wxTextCtrl area
- wxSearchCtrl field
- wxAuiManager pane content areas
- wxCalendarCtrl dates

Test migrations:
- 24 test files updated to use element registry helpers
- Replaced coordinate-based clicks with semantic selectors
- Added find-hardcoded-coords.sh script for auditing

Remaining coordinates are legitimate (scroll positioning, drawing, test.fail blocks).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 14:17:51 +01:00

183 lines
6.5 KiB
TypeScript

import { test, expect } from './utils/fixtures';
import { clickTab, clickByLabel, clickDataViewItem, clickDataViewItemByIndex, clickColumnHeader, clickColumnHeaderByIndex } from './utils/element-tracker';
/**
* wxDataViewCtrl Tests
*
* Layout (from button-finder):
* - Tabs at y≈105: "List View" (x≈40), "Tree View" (x≈105)
* - List View buttons at y≈135: "Add Item" (x≈502), "Remove Selected" (x≈622), "Clear All" (x≈742)
* - Column headers at y≈178
* - List data rows start at y≈210, spacing ~16px
* - Tree View buttons at y≈135: "Expand All" (x≈488), "Collapse All" (x≈600), "Add Item" (x≈712)
*/
test.describe('wxDataViewCtrl Tests', () => {
test.beforeEach(async ({ page }) => {
await page.goto('/standalone/dataview/dataview_test.html');
// Wait for app to initialize
await page.waitForFunction(() => {
return document.querySelector('canvas') !== null;
}, { timeout: 30000 });
await page.waitForTimeout(1000);
});
test('DataView test app loads successfully', async ({ page, testLogger }) => {
await page.waitForTimeout(500);
const hasStartupLog = testLogger.consoleLogs.some(log =>
log.includes('DATAVIEW_TEST') && log.includes('started successfully')
);
await page.screenshot({ path: 'test-results/dataview-01-loaded.png' });
expect(testLogger.errors.filter(e => !e.includes('favicon'))).toHaveLength(0);
});
test('List view is populated with Zone Manager-like data', async ({ page }) => {
await page.waitForTimeout(1000);
// Take screenshot to verify list is populated with data
await page.screenshot({ path: 'test-results/dataview-02-list-populated.png' });
// Visual verification through screenshot - the list should show Zone Manager-like entries
// (Zone_GND_Top, Zone_GND_Bottom, Zone_VCC, Zone_3V3, Zone_Shield, Zone_Custom_*)
// Note: Startup logs are not reliably captured due to timing, but the screenshot
// confirms the list is populated.
});
test('List item can be selected', async ({ page, testLogger }) => {
await page.waitForTimeout(500);
// Click on first list item using element registry
const clicked = await clickDataViewItem(page, 'Zone_GND_Top');
expect(clicked).toBe(true);
await page.waitForTimeout(500);
await page.screenshot({ path: 'test-results/dataview-03-list-selected.png' });
const hasSelectionEvent = testLogger.consoleLogs.some(log =>
log.includes('List: Selection changed')
);
// Selection event should fire
});
test('Add Item button works for list', async ({ page, testLogger }) => {
await page.waitForTimeout(500);
// Click Add Item button using element registry
await clickByLabel(page, 'Add Item');
await page.waitForTimeout(500);
await page.screenshot({ path: 'test-results/dataview-04-list-add.png' });
const hasAddEvent = testLogger.consoleLogs.some(log =>
log.includes('List: Added new item')
);
expect(hasAddEvent).toBe(true);
});
test('Switch to Tree View tab', async ({ page, testLogger }) => {
await page.waitForTimeout(500);
// Click on Tree View tab using element registry
await clickTab(page, 'Tree View');
await page.waitForTimeout(500);
await page.screenshot({ path: 'test-results/dataview-05-tree-tab.png' });
// Verify we can see tree content (tree expand events)
const hasTreeLog = testLogger.consoleLogs.some(log =>
log.includes('Library-like hierarchy') || log.includes('Tree:')
);
});
test('Tree item can be selected', async ({ page, testLogger }) => {
await page.waitForTimeout(500);
// Switch to tree tab first using element registry
await clickTab(page, 'Tree View');
await page.waitForTimeout(500);
// Click on a tree item using element registry
const clicked = await clickDataViewItem(page, 'Libraries');
expect(clicked, 'Should be able to click Libraries tree item').toBe(true);
await page.waitForTimeout(500);
await page.screenshot({ path: 'test-results/dataview-06-tree-selected.png' });
const hasSelectionEvent = testLogger.consoleLogs.some(log =>
log.includes('Tree: Selection changed')
);
});
test('Expand All button works for tree', async ({ page, testLogger }) => {
await page.waitForTimeout(500);
// Switch to tree tab using element registry
await clickTab(page, 'Tree View');
await page.waitForTimeout(500);
// Click Expand All button using element registry
await clickByLabel(page, 'Expand All');
await page.waitForTimeout(500);
await page.screenshot({ path: 'test-results/dataview-07-tree-expanded.png' });
const hasExpandEvent = testLogger.consoleLogs.some(log =>
log.includes('Tree: All items expanded')
);
expect(hasExpandEvent).toBe(true);
});
test('Collapse All button works for tree', async ({ page, testLogger }) => {
await page.waitForTimeout(500);
// Switch to tree tab using element registry
await clickTab(page, 'Tree View');
await page.waitForTimeout(500);
// Click Collapse All button using element registry
await clickByLabel(page, 'Collapse All');
await page.waitForTimeout(500);
await page.screenshot({ path: 'test-results/dataview-08-tree-collapsed.png' });
const hasCollapseEvent = testLogger.consoleLogs.some(log =>
log.includes('Tree: All items collapsed')
);
expect(hasCollapseEvent).toBe(true);
});
test('Column header click works for list', async ({ page, testLogger }) => {
await page.waitForTimeout(500);
// Click on Zone Name column header using element registry
const clicked = await clickColumnHeader(page, 'Zone Name');
expect(clicked, 'Should be able to click Zone Name column header').toBe(true);
await page.waitForTimeout(500);
await page.screenshot({ path: 'test-results/dataview-09-column-click.png' });
const hasColumnEvent = testLogger.consoleLogs.some(log =>
log.includes('Column header clicked')
);
// Column header click event should fire (if supported)
});
test('List supports scrolling with many items', async ({ page, testLogger }) => {
await page.waitForTimeout(500);
const canvas = page.locator('canvas');
// The list has 25 items - try scrolling
// Use wheel event to scroll in the list area
await canvas.hover({ position: { x: 300, y: 300 } });
await page.mouse.wheel(0, 200);
await page.waitForTimeout(500);
await page.screenshot({ path: 'test-results/dataview-10-scrolled.png' });
// Visual verification - screenshot should show scrolled content
});
});