workspace-ui-kit/__tests__/schema.test.ts
snc777 7cb2209735 feat: Pane2にD&Dとアーカイブを追加
- Pane2 の候補者カードを D&D で並び替え・アーカイブできるように
- README のサンプル画面スクリーンショットを最新版に差し替え
2026-05-09 16:12:21 +09:00

114 lines
3.1 KiB
TypeScript

import { describe, it, expect } from "vitest";
import {
candidatesSchema,
departmentsSchema,
workspaceSchema,
} from "@/lib/schema";
import positionsData from "@/data/positions.json";
import candidatesData from "@/data/candidates.json";
import workspaceData from "@/data/workspace.json";
describe("data/*.json schema validation", () => {
it("data/positions.json は departmentsSchema を満たす", () => {
const result = departmentsSchema.safeParse(positionsData);
expect(result.success).toBe(true);
});
it("data/candidates.json は candidatesSchema を満たす", () => {
const result = candidatesSchema.safeParse(candidatesData);
expect(result.success).toBe(true);
});
it("data/workspace.json は workspaceSchema を満たす", () => {
const result = workspaceSchema.safeParse(workspaceData);
expect(result.success).toBe(true);
});
});
describe("schema rejects invalid data", () => {
it("departmentsSchema は配列を期待する", () => {
expect(departmentsSchema.safeParse({}).success).toBe(false);
expect(departmentsSchema.safeParse(null).success).toBe(false);
});
it("candidate は stage が StageKey でないと不可", () => {
expect(
candidatesSchema.safeParse([
{
id: "x",
profile: {
name: "x",
birthday: "",
source: "",
email: "",
phone: "",
address: "",
recruiter: "",
desiredSalaryMin: "",
desiredSalaryMax: "",
availableStartDate: "",
careerText: "",
motivationFull: "",
},
scorecards: [],
stage: "unknown-stage",
},
]).success,
).toBe(false);
});
it("workspaceSchema は name と icon を要求する", () => {
expect(workspaceSchema.safeParse({ name: "" }).success).toBe(false);
expect(workspaceSchema.safeParse({ icon: "" }).success).toBe(false);
});
});
describe("candidate.archived の取り扱い", () => {
const baseCandidate = {
id: "c-archived-test",
profile: {
name: "テスト 太郎",
birthday: "",
source: "",
email: "",
phone: "",
address: "",
recruiter: "",
desiredSalaryMin: "",
desiredSalaryMax: "",
availableStartDate: "",
careerText: "",
motivationFull: "",
},
scorecards: [],
stage: "screening" as const,
};
it("archived 未指定なら false がデフォルトで埋まる", () => {
const result = candidatesSchema.safeParse([baseCandidate]);
expect(result.success).toBe(true);
if (result.success) {
expect(result.data[0].archived).toBe(false);
}
});
it("archived: true を許容する", () => {
const result = candidatesSchema.safeParse([
{ ...baseCandidate, archived: true },
]);
expect(result.success).toBe(true);
if (result.success) {
expect(result.data[0].archived).toBe(true);
}
});
it("archived が boolean でなければ不可", () => {
const result = candidatesSchema.safeParse([
{ ...baseCandidate, archived: "yes" },
]);
expect(result.success).toBe(false);
});
});