task(CAD-14): phase 1 - tool exclusivity, V2 dispatcher exclusive for V2 tools (was: both engines had same tool = multi elements per click), selection handles now render in pixi mode via overlay pass, E2E proof test added
This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
/**
|
||||
* CAD-14 Beweis-Test: Der Workflow, den der Nutzer jeden Tag macht.
|
||||
* 1. Werkzeug waehlen (Sidebar), 2. zeichnen (2 Klicks),
|
||||
* 3. EXAKT EIN Element an der geklickten Position erwarten.
|
||||
* ROT-Zustand (jetzt): 2 Elemente (Legacy + V2 je eins) = Doppelung belegt.
|
||||
* GRUEN nach Schnitt: 1 Element, Position = Klickposition.
|
||||
*/
|
||||
import { test, expect } from '@playwright/test';
|
||||
|
||||
const BASE_URL = process.env.FRONTEND_URL || 'https://web-cad-neu.server.media-on.de';
|
||||
|
||||
interface VerifyWindow {
|
||||
__v2Debug?: { info: () => { cachedElements: number; ready: boolean } | null };
|
||||
}
|
||||
|
||||
test('zeichnen erzeugt GENAU EIN Element an der Klick-Position', async ({ page }) => {
|
||||
await page.goto(BASE_URL);
|
||||
await page.fill('input[type=email]', 'admin@media-on.de');
|
||||
await page.fill('input[type=password]', 'WebCAD2026!');
|
||||
await page.click('button[type=submit]');
|
||||
await page.waitForTimeout(3000);
|
||||
|
||||
// Neues leeres Projekt anlegen (damit der Count deterministisch ist)
|
||||
const newBtn = page.locator('button:has-text("Neu"), [title*="Neues Projekt"]').first();
|
||||
const cards = await page.$$('.dashboard-project-card, [class*=project-card]');
|
||||
if (cards.length === 0) { await newBtn.click(); } // Dashboard-Variante
|
||||
// Falls Dashboard: einfach das erste Projekt oeffnen und Delta messen
|
||||
if (cards.length > 0) { await cards[0].click(); }
|
||||
await page.waitForTimeout(2500);
|
||||
|
||||
const verify = () => page.evaluate(() => {
|
||||
const w = window as unknown as VerifyWindow;
|
||||
return w.__v2Debug?.info?.() ?? null;
|
||||
});
|
||||
|
||||
const before = await verify();
|
||||
const beforeCount = before?.cachedElements ?? -1;
|
||||
expect(beforeCount, 'Pixi muss ready sein').toBeGreaterThanOrEqual(0);
|
||||
|
||||
// Linie-Werkzeug aus der SIDEBAR (der richtige Ort)
|
||||
await page.locator('[data-tool="line"]').first().click();
|
||||
await page.waitForTimeout(300);
|
||||
|
||||
// Auf die Zeichenflaeche klicken: zwei Klicks = eine Linie
|
||||
const canvas = page.locator('canvas').last();
|
||||
const box = await canvas.boundingBox();
|
||||
if (!box) throw new Error('Kein Canvas gefunden');
|
||||
const cx = box.x + box.width / 2;
|
||||
const cy = box.y + box.height / 2;
|
||||
await page.mouse.click(cx, cy);
|
||||
await page.waitForTimeout(200);
|
||||
await page.mouse.click(cx + 120, cy + 60);
|
||||
await page.waitForTimeout(600);
|
||||
|
||||
const after = await verify();
|
||||
const afterCount = after?.cachedElements ?? -1;
|
||||
|
||||
// ABNAHME: genau +1 Element (jetzt faehlt der Test, weil 2 entstehen)
|
||||
expect(afterCount - beforeCount, `Erwartet genau 1 neues Element, got ${afterCount - beforeCount}`).toBe(1);
|
||||
});
|
||||
Reference in New Issue
Block a user