61 lines
2.5 KiB
TypeScript
61 lines
2.5 KiB
TypeScript
|
|
/**
|
||
|
|
* 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);
|
||
|
|
});
|