import { describe, it, expect, vi } from "vitest"; import { render, screen } from "#/test-utils"; import { MessageBubble } from "#/components/conversation/MessageBubble"; import type { Message } from "#/types/conversation"; describe("MessageBubble", () => { const baseUserMessage: Message = { id: "msg-1", role: "user", content: "Hello, can you help me build a component?", timestamp: new Date("2025-01-01T12:00:00Z"), }; const baseAssistantMessage: Message = { id: "msg-2", role: "assistant", content: "Sure! I can help with that.", timestamp: new Date("2025-01-01T12:00:05Z"), }; const systemMessage: Message = { id: "msg-3", role: "system", content: "System notification", timestamp: new Date("2025-01-01T12:00:10Z"), }; it("renders user messages correctly", () => { render(); expect( screen.getByText("Hello, can you help me build a component?"), ).toBeDefined(); }); it("renders assistant messages correctly", () => { render(); expect(screen.getByText("Sure! I can help with that.")).toBeDefined(); }); it("renders system messages differently", () => { render(); expect(screen.getByText("System notification")).toBeDefined(); }); it("shows loading indicator for loading assistant messages", () => { const loadingMsg: Message = { ...baseAssistantMessage, isLoading: true, }; render(); // Loading indicator elements should be present const loadingDots = document.querySelectorAll(".animate-pulse-glow"); // The component has 3 loading dots when isLoading is true expect(loadingDots.length).toBeGreaterThanOrEqual(1); }); it("shows mode badge when mode is provided", () => { const modeMsg: Message = { ...baseAssistantMessage, mode: "plan", }; render(); expect(screen.getByText("plan")).toBeDefined(); }); it("shows action type tag when actionType is provided", () => { const actionMsg: Message = { ...baseAssistantMessage, actionType: "run", actionTitle: "Running tests", }; render(); expect(screen.getByText("Running tests")).toBeDefined(); }); it("displays the timestamp", () => { render(); // The timestamp should be rendered as locale time string const timeStr = baseUserMessage.timestamp.toLocaleTimeString([], { hour: "2-digit", minute: "2-digit", }); expect(screen.getByText(timeStr)).toBeDefined(); }); });