import { describe, expect, it } from "vitest"; import { readFileSync } from "node:fs"; import { resolve } from "node:path"; const readSubjectDetail = () => readFileSync(resolve(__dirname, "./SubjectDetail.vue"), "utf8"); describe("SubjectDetail medication adherence", () => { it("adds a medication adherence tab with editable actual count", () => { const source = readSubjectDetail(); expect(source).toContain('name="medicationAdherence"'); expect(source).toContain("actual_medication_count"); expect(source).toContain("保存用药次数"); expect(source).toContain("实际用药次数为试验期间实际药物暴露次数"); expect(source).toContain("75%~125% 范围内(包含边界值)"); }); it("uses baseline and termination visit actual dates for adherence calculation", () => { const source = readSubjectDetail(); expect(source).toContain("const medicationStartDate = computed(() => detail.baseline_date || \"\");"); expect(source).toContain('new Set(["终止治疗", "提前终止"])'); expect(source).toContain("return Math.floor((end.getTime() - start.getTime()) / 86400000) + 1;"); }); it("marks adherence outside 75 to 125 percent as abnormal", () => { const source = readSubjectDetail(); expect(source).toContain("if (rate < 75 || rate > 125) return \"danger\";"); expect(source).not.toContain("if (rate < 80 || rate > 120) return \"danger\";"); }); it("provides a dedicated early termination workflow", () => { const source = readSubjectDetail(); expect(source).toContain("openEarlyTerminationDialog"); expect(source).toContain("createEarlyTerminationVisit"); expect(source).toContain("return \"不适用\";"); expect(source).toContain("getVisitStatusLabel"); expect(source).toContain("ElMessage.success(TEXT.common.messages.saveSuccess);"); expect(source).toContain("提前终止已保存,刷新数据失败,请手动刷新页面"); expect(source).toContain("提前终止表示受试者在方案最后一个计划访视窗口期前停止治疗"); expect(source).toContain("validateEarlyTerminationDateInput"); expect(source).toContain("提前终止日期必须早于最后计划访视窗口期开始日"); expect(source).toContain("getVisitPlannedDateLabel"); expect(source).toContain("getVisitWindowRangeLabel"); expect(source).toContain("~"); expect(source).toContain("row.window_start === row.planned_date && row.window_end === row.planned_date"); expect(source).toContain("return \"不适用\";"); }); });