[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
+44
View File
@@ -0,0 +1,44 @@
import { test, expect } from '@playwright/test'
// AZ-470 — e2e companion for panel-width rehydration on reload (FT-P-38).
//
// FT-P-38 is the e2e-only AC for AZ-470 (the fast tests cover the debounce
// and body-shape ACs). This test will skip until production wires the
// rehydration path; today it captures the drift via `test.fail`.
test.describe('AZ-470 — panel-width rehydration (e2e companion)', () => {
test.fail('AC-3 (FT-P-38) — rehydration on reload (drift — production has no writer)', async ({ page }) => {
await page.goto('/annotations')
const dividers = page.locator('div.cursor-col-resize')
if ((await dividers.count().catch(() => 0)) === 0) {
test.skip(true, 'No resizable divider rendered (annotations page not seeded?)')
}
// Capture initial widths (rendered defaults today).
const panels = page.locator('div.bg-az-panel.shrink-0')
const initialLeft = parseFloat(
(await panels.first().evaluate((el: HTMLElement) => el.style.width)) || '0',
)
// Drag the left divider by +50 px.
const divider = dividers.first()
const box = await divider.boundingBox()
if (!box) test.skip(true, 'Divider has no bounding box (display:none?)')
await page.mouse.move(box!.x + box!.width / 2, box!.y + box!.height / 2)
await page.mouse.down()
await page.mouse.move(box!.x + box!.width / 2 + 50, box!.y + box!.height / 2)
await page.mouse.up()
// Reload — production has no PUT, so the new width is forgotten.
await page.reload()
await page.waitForLoadState('domcontentloaded')
// Spec: rendered widths equal pre-reload widths within ± 1 px.
const reloadedLeft = parseFloat(
(await page.locator('div.bg-az-panel.shrink-0').first().evaluate(
(el: HTMLElement) => el.style.width,
)) || '0',
)
// Drift: reloadedLeft equals constructor default, NOT initialLeft+50.
expect(Math.abs(reloadedLeft - (initialLeft + 50))).toBeLessThanOrEqual(1)
})
})