const assert = require("assert"); const fs = require("fs"); const path = require("path"); const root = path.resolve(__dirname, ".."); const read = (file) => fs.readFileSync(path.join(root, file), "utf8"); const taskPage = read("src/views/teacherEnd/task/index.vue"); const sidebar = read("src/layout/components/Sidebar/index.vue"); const api = read("src/api/teacher.js"); assert(taskPage.includes("listClassTrainingTasks"), "task allocation must use training tasks as its data source"); assert(taskPage.includes("listClassTrainingTasks"), "task allocation must load training tasks for the selected teaching class"); assert(taskPage.includes("await listClassTrainingTasks(classId.value, { enabledOnly: false })"), "class task loading must request disabled and enabled tasks"); assert(taskPage.includes("getTaskPublication"), "task allocation must load the selected class publication state"); assert(taskPage.includes("tasks.value.map((task) => task.taskKey)"), "an unconfigured class must default to all tasks selected"); assert(taskPage.includes("保存发布配置"), "task allocation must require an explicit save"); assert(api.includes("selectTaskPublicationByClassId"), "publication API missing"); assert(sidebar.includes("filterStudentCourseNavigation"), "student menu must be filtered by published training tasks"); assert(sidebar.includes("publishedTaskKeys"), "student menu must retain published task keys"); console.log("task publication front-end contract passed");