import { test, expect } from "@playwright/test"; // QA reference: qa/reasoning-default.md // Demo source: src/app/demos/reasoning-default/page.tsx // // This cell does NOT override the `reasoningMessage` slot. CopilotKit's // built-in `CopilotChatReasoningMessage` renders the reasoning as a // collapsible card. The page exposes a "Show reasoning" suggestion pill // whose message matches the aimock fixture in showcase/aimock/d5-all.json, // so streaming is deterministic in CI. test.describe("Reasoning: Default", () => { test.setTimeout(120_000); test.beforeEach(async ({ page }) => { await page.goto("/demos/reasoning-default"); }); test("page renders without errors", async ({ page }) => { await expect( page.locator('[data-testid="copilot-chat-input"]'), ).toBeVisible(); }); test("Show reasoning pill renders a reasoning-role message", async ({ page, }) => { const pill = page.getByRole("button", { name: /Show reasoning/i }).first(); await expect(pill).toBeVisible({ timeout: 30_000 }); await pill.click(); // The cell uses CopilotKit's default `CopilotChatReasoningMessage`, // which doesn't emit a testid — its visible signal is the // streaming/complete header label ("Thinking…" while streaming, // "Thought for …" once complete). Asserting on either label proves // the reasoning collapsible mounted. await expect(page.getByText(/Thinking…|Thought for/i).first()).toBeVisible({ timeout: 60_000, }); }); });