Files
ttstd-infinite-canvas/web/test/channel-model-import-selection.test.ts
xupengchong-del e70fe1b9c9 feat(admin): 系统模型 - 「拉取模型」弹窗支持搜索 (#743)
部分上游端点会返回几百个模型,弹窗里铺满复选框后只能靠肉眼滚动查找,
没法按厂商或系列收窄。

- 弹窗顶部新增搜索框(大小写不敏感的子串匹配、自动聚焦、可一键清空);
- 搜索时「全选 / 取消选中」只作用于当前匹配集合,按钮文案带出匹配数量;
  关键字之外的勾选状态保留。无关键字时与改动前行为完全一致;
- 无命中时列表区显示空态;汇总行补充匹配数与其中已勾选数。

筛选与批量勾选规则抽到 channel-model-import-selection.ts 并配套单测。
2026-10-12 11:05:49 +08:00

53 lines
2.0 KiB
TypeScript

import { expect, test } from "bun:test";
import { deselectVisibleModels, filterImportModels, selectVisibleModels } from "../src/pages/admin/components/channel-model-import-selection";
const MODELS = [
"MiniMax-H3",
"004系列/MiniMax-H3(933/10-15秒768P)",
"004系列/sd2.5(30--0-10卡脸4-30秒/720P)",
"gpt-image-1",
"doubao-seedream-4",
];
test("关键字为空时返回全部模型", () => {
expect(filterImportModels(MODELS, "")).toEqual(MODELS);
expect(filterImportModels(MODELS, " ")).toEqual(MODELS);
});
test("按子串匹配,且大小写不敏感", () => {
expect(filterImportModels(MODELS, "minimax")).toEqual([MODELS[0], MODELS[1]]);
expect(filterImportModels(MODELS, "MINIMAX")).toEqual([MODELS[0], MODELS[1]]);
});
test("关键字首尾空白不影响匹配", () => {
expect(filterImportModels(MODELS, " sd2.5 ")).toEqual([MODELS[2]]);
});
test("没有命中时返回空数组(弹窗据此显示空态)", () => {
expect(filterImportModels(MODELS, "不存在的模型")).toEqual([]);
});
test("全选只并入当前可见集合,关键字外的勾选保留", () => {
const visible = filterImportModels(MODELS, "minimax");
expect(selectVisibleModels(["gpt-image-1"], visible)).toEqual(["gpt-image-1", MODELS[0], MODELS[1]]);
});
test("全选不会产生重复项", () => {
const visible = filterImportModels(MODELS, "minimax");
expect(selectVisibleModels([MODELS[0]], visible)).toEqual([MODELS[0], MODELS[1]]);
});
test("无关键字时全选等于选中全部,与旧行为一致", () => {
expect(selectVisibleModels([], filterImportModels(MODELS, ""))).toEqual(MODELS);
});
test("取消选中只移除可见的,隐藏的勾选不动", () => {
const visible = filterImportModels(MODELS, "minimax");
expect(deselectVisibleModels([MODELS[0], MODELS[1], "gpt-image-1"], visible)).toEqual(["gpt-image-1"]);
});
test("无关键字时取消选中等于清空,与旧行为一致", () => {
expect(deselectVisibleModels(MODELS, filterImportModels(MODELS, ""))).toEqual([]);
});