evOo-local/apps/web/e2e/teaching-composer.spec.ts
cynarAI e4b995ec14
Production readiness Phase 2: DE profile facts, mobile audit, route matrix E2E (#176)
* feat(web): Phase 2 production readiness — locale, mobile, E2E matrix

Localize onboarding focus facts by profile locale (DE assertion).
Add mobile overflow/touch audits, deep-link matrix, extended console
checks, and E2E for empty project, session unavailable, and teaching
composer. Safe-area and Heute header layout on 390px viewports.

Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>

* fix(e2e): stabilize Phase 2 specs for mobile shell and empty project

Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>

* fix(api): satisfy typecheck for focusFactValue

Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>

* fix(api): type-safe focusFactValue lookup

Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>

* fix(api): narrow focus fact locale key

Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>

* fix(api): use FocusOptionId union for fact lookup

Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>

* test(web): align Shell header control assertions with touch targets

Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>

* style(web): format desktop header control test

Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>

* fix(web): stabilize Phase 2 E2E (settings i18n, empty project, chart plot load)

Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>

* fix(web): empty project E2E simulates pre-start bootstrap; relax module recovery wait

Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>

* fix(web): format empty-project E2E; stabilize chart-links cold Plot load

Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>

* test(web): run chart-links E2E serially to reuse warmed Plot module

Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>

* style(web): format chart-links E2E

Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: cynarAI <cynarAI@users.noreply.github.com>
2026-10-07 15:26:09 +02:00

31 lines
1.4 KiB
TypeScript

import { expect, test } from "@playwright/test";
import { activeBotId, completeOnboarding, signup, waitForChatComposer } from "./helpers";
test("blocks the composer while a skill is being taught", async ({ page }) => {
const stamp = Date.now();
await signup(page, `teach-composer-${stamp}@rakazo.test`, "password12", "Teach Composer");
await completeOnboarding(page);
await waitForChatComposer(page);
await page.getByTitle("Agent computer").click();
const sidePanel = page.getByTestId("side-panel");
await expect(sidePanel).toHaveAttribute("data-panel", "computer");
const openButton = sidePanel.getByTestId("computer-preview-open");
await expect(openButton).toBeVisible();
await openButton.click();
const chrome = page.getByTestId("computer-chrome");
await chrome.getByTestId("teach-start-button").click();
await page.getByTestId("teach-goal-input").fill("Export weekly list");
await page.getByRole("button", { name: "Start recording" }).click();
await expect(page.getByTestId("teach-recording-overlay")).toBeVisible();
await expect(
page.getByText(
/Teaching in progress\. Stop teaching before sending a new message|Aufgabe wird angelernt\. Beende das Anlernen, bevor du eine neue Nachricht sendest\./i,
),
).toBeVisible();
const composer = page.getByRole("combobox", { name: /^Message$|^Nachricht$/i });
await expect(composer).toBeDisabled();
expect(activeBotId(page)).toBeTruthy();
});