Files
Neo-ZQYY/apps/admin-web/src/__tests__/flowLayers.test.ts

126 lines
4.3 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* Flow 层级与任务兼容性测试
*
* **Validates: Requirements 2.2**
*
* Property 21: 对任意 Flow 类型和任务定义,当 Flow 包含的层不包含该任务所属层时,
* 该任务不应出现在可选列表中;当 Flow 包含该任务所属层时,该任务应出现在可选列表中。
*/
import { describe, it, expect } from "vitest";
import { getFlowLayers } from "../pages/TaskConfig";
/* ------------------------------------------------------------------ */
/* 预期的 Flow 定义(来自设计文档) */
/* ------------------------------------------------------------------ */
const EXPECTED_FLOWS: Record<string, string[]> = {
api_ods: ["ODS"],
api_ods_dwd: ["ODS", "DWD"],
api_full: ["ODS", "DWD", "DWS", "INDEX"],
ods_dwd: ["DWD"],
dwd_dws: ["DWS"],
dwd_dws_index: ["DWS", "INDEX"],
dwd_index: ["INDEX"],
};
describe("getFlowLayers — Flow 层级与任务兼容性", () => {
/* ---- 1. 每个已知 Flow 返回正确的层列表 ---- */
it.each(Object.entries(EXPECTED_FLOWS))(
"Flow '%s' 应返回 %j",
(flowId, expectedLayers) => {
expect(getFlowLayers(flowId)).toEqual(expectedLayers);
},
);
/* ---- 2. 未知 Flow ID 返回空数组 ---- */
it("未知 Flow ID 应返回空数组", () => {
expect(getFlowLayers("unknown_flow")).toEqual([]);
expect(getFlowLayers("")).toEqual([]);
expect(getFlowLayers("API_FULL")).toEqual([]); // 大小写敏感
});
/* ---- 3. 所有 7 种 Flow 都有定义 ---- */
it("应定义全部 7 种 Flow", () => {
const allFlowIds = Object.keys(EXPECTED_FLOWS);
expect(allFlowIds).toHaveLength(7);
for (const flowId of allFlowIds) {
expect(getFlowLayers(flowId).length).toBeGreaterThan(0);
}
});
/* ---- 4. 层级互斥性验证 ---- */
describe("层级互斥性", () => {
it("api_ods 不包含 DWD / DWS / INDEX", () => {
const layers = getFlowLayers("api_ods");
expect(layers).not.toContain("DWD");
expect(layers).not.toContain("DWS");
expect(layers).not.toContain("INDEX");
});
it("ods_dwd 只包含 DWD不包含 ODS / DWS / INDEX", () => {
const layers = getFlowLayers("ods_dwd");
expect(layers).not.toContain("ODS");
expect(layers).not.toContain("DWS");
expect(layers).not.toContain("INDEX");
});
it("dwd_dws 只包含 DWS不包含 ODS / DWD / INDEX", () => {
const layers = getFlowLayers("dwd_dws");
expect(layers).not.toContain("ODS");
expect(layers).not.toContain("DWD");
expect(layers).not.toContain("INDEX");
});
it("dwd_index 只包含 INDEX不包含 ODS / DWD / DWS", () => {
const layers = getFlowLayers("dwd_index");
expect(layers).not.toContain("ODS");
expect(layers).not.toContain("DWD");
expect(layers).not.toContain("DWS");
});
});
/* ---- 5. 任务兼容性:模拟任务按层过滤 ---- */
describe("任务兼容性过滤", () => {
// 模拟任务定义
const mockTasks = [
{ code: "FETCH_ORDERS", layer: "ODS" },
{ code: "LOAD_DWD_ORDERS", layer: "DWD" },
{ code: "AGG_DAILY_REVENUE", layer: "DWS" },
{ code: "CALC_WBI_INDEX", layer: "INDEX" },
];
/**
* 根据 Flow 包含的层过滤任务(与 TaskSelector 组件逻辑一致)
*/
function filterTasksByFlow(flowId: string) {
const layers = getFlowLayers(flowId);
return mockTasks.filter((t) => layers.includes(t.layer));
}
it("api_ods 只显示 ODS 任务", () => {
const visible = filterTasksByFlow("api_ods");
expect(visible.map((t) => t.code)).toEqual(["FETCH_ORDERS"]);
});
it("api_full 显示所有层的任务", () => {
const visible = filterTasksByFlow("api_full");
expect(visible).toHaveLength(4);
});
it("dwd_dws_index 显示 DWS 和 INDEX 任务", () => {
const visible = filterTasksByFlow("dwd_dws_index");
const codes = visible.map((t) => t.code);
expect(codes).toContain("AGG_DAILY_REVENUE");
expect(codes).toContain("CALC_WBI_INDEX");
expect(codes).not.toContain("FETCH_ORDERS");
expect(codes).not.toContain("LOAD_DWD_ORDERS");
});
it("未知 Flow 不显示任何任务", () => {
const visible = filterTasksByFlow("nonexistent");
expect(visible).toHaveLength(0);
});
});
});