import type { ColorSupportLevel } from "chalk"; import { renderTui } from "./ui-test-helpers.js"; import { Markdown } from "../src/components/chat/terminal-chat-response-item.js"; import React from "react"; import { describe, afterEach, beforeEach, it, expect, vi } from "vitest"; import chalk from "chalk"; /** Simple sanity check that the Markdown component renders bold/italic text. * We strip ANSI codes, so the output should contain the raw words. */ it("renders basic markdown", () => { const { lastFrameStripped } = renderTui( **bold** _italic_, ); const frame = lastFrameStripped(); expect(frame).toContain("bold"); expect(frame).toContain("italic"); }); describe("ensure produces content with correct ANSI escape codes", () => { let chalkOriginalLevel: ColorSupportLevel = 0; beforeEach(() => { chalkOriginalLevel = chalk.level; chalk.level = 3; vi.mock("supports-hyperlinks", () => ({ default: {}, supportsHyperlink: () => true, stdout: true, stderr: true, })); }); afterEach(() => { vi.resetAllMocks(); chalk.level = chalkOriginalLevel; }); it("renders basic markdown with ansi", () => { const { lastFrame } = renderTui( **bold** _italic_, ); const frame = lastFrame(); const BOLD = "\x1B[1m"; const BOLD_OFF = "\x1B[22m"; const ITALIC = "\x1B[3m"; const ITALIC_OFF = "\x1B[23m"; expect(frame).toBe(`${BOLD}bold${BOLD_OFF} ${ITALIC}italic${ITALIC_OFF}`); }); it("citations should get converted to hyperlinks when stdout supports them", () => { const { lastFrame } = renderTui( File with TODO: 【F:src/approvals.ts†L40】 , ); const BLUE = "\x1B[34m"; const LINK_ON = "\x1B[4m"; const LINK_OFF = "\x1B[24m"; const COLOR_OFF = "\x1B[39m"; const expected = `File with TODO: ${BLUE}src/approvals.ts (${LINK_ON}vscode://file/foo/bar/src/approvals.ts:40${LINK_OFF})${COLOR_OFF}`; const outputWithAnsi = lastFrame(); expect(outputWithAnsi).toBe(expected); }); });