[AZ-461] [AZ-464] [AZ-470] [AZ-472] Batch 5 - detection/bulk-validate/panel-width/classes tests
ci/woodpecker/push/build-arm Pipeline was successful

- AZ-461 sync image detect URL canary (FT-P-11) PASS;
  async-video QUARANTINE (FT-P-12) + X-Refresh-Token drift
  (FT-P-13) recorded as it.fails() with controls.
- AZ-464 bulk-validate URL + UI sync (≤2 s) PASS;
  body shape drift {annotationIds,status} vs contract
  {ids,targetStatus:30} captured as it.fails().
- AZ-470 panel-width debounce + rehydration: entire task
  is Phase-B target (useResizablePanel has no PUT writer
  / no rehydration); 3 ACs as it.fails() with controls.
- AZ-472 DetectionClasses load + click + fallback PASS;
  hotkey arithmetic P=0 PASS, P=20/P=40 it.fails() for
  classes[idx+P]-against-dense-array drift.

Code review: PASS (0 findings). Fast: 18/18 files,
102 passed / 13 skipped. Static: 21/21 PASS.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Oleksandr Bezdieniezhnykh
2026-05-11 04:38:22 +03:00
parent 1dd25edee3
commit 6d03643c2c
15 changed files with 1644 additions and 4 deletions
+35
View File
@@ -0,0 +1,35 @@
import { test, expect } from '@playwright/test'
// AZ-472 — e2e companion for FT-P-44 (DetectionClasses load contract).
//
// The fast suite covers all four ACs (load + hotkeys + click + fallback);
// the e2e companion exists so the load path is observed end-to-end against
// the real `annotations/` service. Hotkey and click paths are not duplicated
// here — they're already deterministic in JSDOM.
test.describe('AZ-472 — DetectionClasses (e2e companion)', () => {
test('AC-1 (FT-P-44) — GET /api/annotations/classes observed at mount', async ({ page }) => {
const gets: { url: string }[] = []
await page.route('**/api/annotations/classes', async (route) => {
if (route.request().method() === 'GET') {
gets.push({ url: route.request().url() })
}
await route.continue()
})
await page.goto('/annotations')
// The DetectionClasses panel renders inside the left sidebar of
// <AnnotationsPage>. Wait for it to be visible by its localized title.
const heading = page.getByText(/Classes/i).first()
if (!(await heading.isVisible({ timeout: 5000 }).catch(() => false))) {
test.skip(true, 'DetectionClasses panel not rendered (auth gate?)')
}
expect(gets.length).toBeGreaterThan(0)
for (const g of gets) {
const path = new URL(g.url).pathname
expect(path).toBe('/api/annotations/classes')
}
})
})