Merge remote-tracking branch 'origin/sub_laptop_1' into sub_laptop_3
This commit is contained in:
@@ -0,0 +1,139 @@
|
||||
/**
|
||||
* 항목 고르기 자료 쪽 검증 — 나무 · 찾기 · 돌려줄 summary_item · 폴더 줄 · 가짜 응답(21-1 모양).
|
||||
* 실행: node --experimental-strip-types resources/tester/ui/item-picker-data.test.ts
|
||||
*/
|
||||
import assert from "node:assert/strict";
|
||||
import {
|
||||
buildTree,
|
||||
filterRows,
|
||||
folderLines,
|
||||
isCurrent,
|
||||
pathIds,
|
||||
rowId,
|
||||
toSummary,
|
||||
type TreeLabels,
|
||||
} from "../../../ui_template/ui_template_item_picker_data.ts";
|
||||
import { fakeCopy, fakeItems } from "../../../ui_template/ui_template_item_picker_fake.ts";
|
||||
|
||||
const labels: TreeLabels = {
|
||||
layers: { system: "마스터", company: "회사", personal: "개인" },
|
||||
unclassified: "분류 없음",
|
||||
};
|
||||
const rows = fakeItems();
|
||||
|
||||
// 나무 — 그룹은 늘 마스터 · 회사 · 개인 차례 · 그룹 → 종류 → 분류1 → 잎
|
||||
const tree = buildTree(rows, labels);
|
||||
assert.deepEqual(
|
||||
tree.map((g) => [g.label, g.count]),
|
||||
[
|
||||
["마스터", 5],
|
||||
["회사", 2],
|
||||
["개인", 1],
|
||||
],
|
||||
);
|
||||
const system = tree[0];
|
||||
assert.deepEqual(
|
||||
system.children?.map((k) => [k.label, k.count]),
|
||||
[
|
||||
["돌기슭막이", 3],
|
||||
["콘크리트포장", 1],
|
||||
["관보호공", 1],
|
||||
],
|
||||
);
|
||||
const cat = system.children?.[0].children?.[0];
|
||||
assert.equal(cat?.label, "메쌓기");
|
||||
assert.equal(cat?.count, 2);
|
||||
const leaf = cat?.children?.[0];
|
||||
assert.equal(leaf?.label, "돌기슭막이 메쌓기 1.2m 기초유");
|
||||
assert.equal(leaf?.tip, "SS000001"); // 키는 툴팁
|
||||
assert.equal(leaf?.count, null);
|
||||
assert.ok(leaf?.row);
|
||||
|
||||
// 분류가 빈 항목은 「분류 없음」 한 칸에 모임
|
||||
const company = tree[1];
|
||||
assert.equal(company.children?.[1].children?.[0].label, "분류 없음");
|
||||
|
||||
// 빈 그룹도 한 줄은 남음
|
||||
const onlySystem = buildTree(
|
||||
rows.filter((r) => r.layer === "system"),
|
||||
labels,
|
||||
);
|
||||
assert.deepEqual(
|
||||
onlySystem.map((g) => [g.id, g.count, g.children?.length]),
|
||||
[
|
||||
["system", 5, 3],
|
||||
["company", 0, 0],
|
||||
["personal", 0, 0],
|
||||
],
|
||||
);
|
||||
|
||||
// 잎 id 는 층 · 주인 · 키 — 같은 키라도 층이 다르면 다른 줄
|
||||
const twin = { ...rows[0], layer: "company" as const, owner: "샘플회사" };
|
||||
assert.notEqual(rowId(rows[0]), rowId(twin));
|
||||
|
||||
// 찾기 — 이름 · 키 · 연결 이름 · 여러 낱말은 모두 들어 있어야 함 · 빈 글은 전부
|
||||
assert.equal(filterRows(rows, "").length, rows.length);
|
||||
assert.equal(filterRows(rows, " ").length, rows.length);
|
||||
assert.deepEqual(
|
||||
filterRows(rows, "옹벽").map((r) => r.key),
|
||||
["SS000102"],
|
||||
);
|
||||
assert.deepEqual(
|
||||
filterRows(rows, "ss000004").map((r) => r.key),
|
||||
["SS000004"],
|
||||
);
|
||||
assert.deepEqual(
|
||||
filterRows(rows, "돌기슭막이 개인").map((r) => r.key),
|
||||
["SS000201"],
|
||||
);
|
||||
assert.equal(filterRows(rows, "없는이름").length, 0);
|
||||
|
||||
// 돌려줄 summary_item — 마스터는 owner null · 회사 · 개인은 주인
|
||||
assert.deepEqual(toSummary(rows[0]), {
|
||||
layer: "system",
|
||||
owner: null,
|
||||
key: "SS000001",
|
||||
name: "돌기슭막이 메쌓기 1.2m 기초유",
|
||||
});
|
||||
const mine = rows.find((r) => r.layer === "personal");
|
||||
assert.ok(mine);
|
||||
assert.deepEqual(toSummary(mine), {
|
||||
layer: "personal",
|
||||
owner: "샘플회사/사용자",
|
||||
key: "SS000201",
|
||||
name: "돌기슭막이 메쌓기 1.2m(개인)",
|
||||
});
|
||||
// layer 없는 줄(옛 서버)은 마스터로 봄
|
||||
assert.equal(toSummary({ key: "SS000009", 열: "임시" }).layer, "system");
|
||||
|
||||
// 지금 지정된 항목인지
|
||||
assert.ok(isCurrent(toSummary(mine), mine));
|
||||
assert.ok(!isCurrent(toSummary(mine), rows[0]));
|
||||
assert.ok(!isCurrent(null, rows[0]));
|
||||
|
||||
// 처음 펼칠 자리
|
||||
assert.deepEqual(pathIds(rows[0], labels), [
|
||||
"system",
|
||||
"system|돌기슭막이",
|
||||
"system|돌기슭막이|메쌓기",
|
||||
]);
|
||||
|
||||
// 폴더 모양 — 도면 · 면적산출 · 재료산출은 항목 이름 · 번호는 툴팁 · 값이 없으면 빈 글
|
||||
const lines = folderLines(rows[0]);
|
||||
assert.deepEqual(
|
||||
lines.map((l) => l.kind),
|
||||
["drawing", "area", "material", "combo", "unitPrice"],
|
||||
);
|
||||
assert.equal(lines[0].text, "돌기슭막이 메쌓기 1.2m 기초유");
|
||||
assert.equal(lines[0].tip, "SD000001");
|
||||
assert.equal(folderLines({ key: "SS1", 열: "빈 항목" })[3].text, "");
|
||||
|
||||
// 가짜 복사 — 새 개인 줄이 생기고 키가 겹치지 않음
|
||||
const before = fakeItems();
|
||||
const copied = fakeCopy(before[0]);
|
||||
const after = fakeItems();
|
||||
assert.equal(after.length, before.length + 1);
|
||||
assert.equal(copied.layer, "personal");
|
||||
assert.equal(new Set(after.map(rowId)).size, after.length);
|
||||
|
||||
console.log("항목 고르기 자료 시험 통과");
|
||||
Reference in New Issue
Block a user