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.
90 lines
2.8 KiB
TypeScript
90 lines
2.8 KiB
TypeScript
// frontend/tests/tasks/KanbanCard.test.tsx
|
|
import { render } from "@testing-library/react";
|
|
import { describe, expect, it } from "vitest";
|
|
import { KanbanCard } from "@/components/tasks/KanbanCard";
|
|
import type { Person, Project, Task } from "@/lib/types";
|
|
|
|
const people: Record<string, Person> = {
|
|
jiwoo: { id: "jiwoo", name: "지우", initial: "지", color: "var(--blue)", is_me: true },
|
|
};
|
|
const projects: Record<string, Project> = {
|
|
"biz-report": {
|
|
id: "biz-report",
|
|
folder_id: "work",
|
|
parent_id: "biz",
|
|
name: "분기 리포트",
|
|
tone: "coral",
|
|
sort_order: 0,
|
|
pinned: false,
|
|
task_count: 0,
|
|
children: [],
|
|
},
|
|
};
|
|
|
|
function mk(over: Partial<Task> = {}): Task {
|
|
return {
|
|
id: "k1",
|
|
project_id: "biz-report",
|
|
parent_id: null,
|
|
title: "분기 리포트 초안 마무리",
|
|
status: "doing",
|
|
assignee_id: "jiwoo",
|
|
due: "2026-06-08",
|
|
prio: "높음",
|
|
notes: "",
|
|
est: "",
|
|
delegated: false,
|
|
sort_order: 0,
|
|
created_at: "",
|
|
updated_at: "",
|
|
comments: [],
|
|
children: [],
|
|
...over,
|
|
};
|
|
}
|
|
|
|
describe("KanbanCard", () => {
|
|
it("제목/프로젝트태그/담당아바타/마감/우선순위 렌더", () => {
|
|
const { container, getByText } = render(
|
|
<KanbanCard task={mk()} people={people} projects={projects} onOpen={() => {}} />,
|
|
);
|
|
expect(getByText("분기 리포트 초안 마무리")).toBeInTheDocument();
|
|
expect(getByText("분기 리포트")).toBeInTheDocument(); // 프로젝트 태그
|
|
expect(getByText("지")).toBeInTheDocument(); // 담당 아바타
|
|
expect(getByText("6/8")).toBeInTheDocument(); // 마감
|
|
expect(container.querySelector(".prio-높음")).toBeTruthy();
|
|
});
|
|
|
|
it("하위작업 있으면 진행바+N/M", () => {
|
|
const task = mk({
|
|
children: [mk({ id: "a", status: "done" }), mk({ id: "b", status: "todo" })],
|
|
});
|
|
const { container, getByText } = render(
|
|
<KanbanCard task={task} people={people} projects={projects} onOpen={() => {}} />,
|
|
);
|
|
expect(container.querySelector(".bar")).toBeTruthy();
|
|
expect(getByText("1/2")).toBeInTheDocument();
|
|
});
|
|
|
|
it("마감 임박(06-08, doing) → .due.soon", () => {
|
|
const { container } = render(
|
|
<KanbanCard task={mk()} people={people} projects={projects} onOpen={() => {}} />,
|
|
);
|
|
expect(container.querySelector(".due.soon")).toBeTruthy();
|
|
});
|
|
|
|
it("완료 카드 → .done-card", () => {
|
|
const { container } = render(
|
|
<KanbanCard task={mk({ status: "done" })} people={people} projects={projects} onOpen={() => {}} />,
|
|
);
|
|
expect(container.querySelector(".kcard.done-card")).toBeTruthy();
|
|
});
|
|
|
|
it("위임 → .deleg-chip", () => {
|
|
const { getByText } = render(
|
|
<KanbanCard task={mk({ delegated: true })} people={people} projects={projects} onOpen={() => {}} />,
|
|
);
|
|
expect(getByText("위임")).toBeInTheDocument();
|
|
});
|
|
});
|