You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

67 lines
2.3 KiB
TypeScript

// frontend/tests/tasks/RiskRadar.test.tsx
import { fireEvent, render, screen } from "@testing-library/react";
import { describe, expect, it, vi } from "vitest";
import { RiskRadar } from "@/components/tasks/RiskRadar";
import type { Risk } from "@/lib/types";
const RISKS: Risk[] = [
{
kind: "지연 위험",
icon: "clock",
tone: "coral",
text: "**분기 리포트 초안 마무리** — 오늘(6/8) 마감인데 아직 진행 중이에요",
task_id: "k1",
cta: "작업 열기",
},
{
kind: "업무 쏠림",
icon: "scale",
tone: "amber",
text: "미완료 작업 **9건**이 내게 몰려 있어요",
task_id: null,
cta: null,
},
{
kind: "의존성",
icon: "link",
tone: "violet",
text: "**예산 섹션 작성**이(가) 늦어지면 함께 밀려요",
task_id: "k1b",
cta: "후속 작업 보기",
},
];
describe("RiskRadar", () => {
it("risks=[] → null 렌더", () => {
const { container } = render(<RiskRadar risks={[]} onOpen={() => {}} />);
expect(container.querySelector(".rradar")).toBeNull();
});
it("3종 카드 tone 클래스", () => {
const { container } = render(<RiskRadar risks={RISKS} onOpen={() => {}} />);
expect(container.querySelector(".rr-item.t-coral")).toBeTruthy();
expect(container.querySelector(".rr-item.t-amber")).toBeTruthy();
expect(container.querySelector(".rr-item.t-violet")).toBeTruthy();
});
it("**굵게** → <b> 변환 (dangerouslySetInnerHTML 미사용)", () => {
const { container } = render(<RiskRadar risks={RISKS} onOpen={() => {}} />);
const bolds = container.querySelectorAll(".rr-text b");
expect(bolds.length).toBeGreaterThan(0);
expect([...bolds].some((b) => b.textContent === "분기 리포트 초안 마무리")).toBe(true);
});
it("task_id 있으면 CTA, 클릭 시 onOpen", () => {
const onOpen = vi.fn();
render(<RiskRadar risks={RISKS} onOpen={onOpen} />);
fireEvent.click(screen.getByRole("button", { name: /작업 열기/ }));
expect(onOpen).toHaveBeenCalledWith("k1");
});
it("업무 쏠림(task_id null)은 CTA 없음", () => {
render(<RiskRadar risks={RISKS} onOpen={() => {}} />);
// 작업 열기 / 후속 작업 보기 두 개만 (쏠림은 CTA 없음)
expect(screen.queryByRole("button", { name: /몰려/ })).toBeNull();
});
});