完成50%

This commit is contained in:
2026-07-23 08:23:59 +08:00
parent 9b0ad62df4
commit f1edc6b533
218 changed files with 24318 additions and 5514 deletions
+83
View File
@@ -0,0 +1,83 @@
"use strict";
const assert = require("assert");
const fs = require("fs");
const path = require("path");
const loadMockModule = async () => {
const source = fs.readFileSync(path.join(__dirname, "../data/mock.js"), "utf8");
const contractSource = fs.readFileSync(
path.join(__dirname, "../utils/genealogy-contracts.js"),
"utf8",
);
const contractUrl = `data:text/javascript;base64,${Buffer.from(contractSource).toString("base64")}`;
return import(`data:text/javascript;base64,${Buffer.from(source.replace("../utils/genealogy-contracts.js", contractUrl)).toString("base64")}`);
};
const assertScopedOwner = ({ list, find, idField, ids, nestedField = "" }) => {
assert.deepStrictEqual(list("1001").map((item) => item[idField]), ids);
assert.deepStrictEqual(list("1002"), []);
assert.strictEqual(find("1002", ids[0]), null);
assert.strictEqual(find("1001", "unknown"), null);
assert.strictEqual(find("", ids[0]), null);
assert.strictEqual(find("1001", ""), null);
const listed = list("1001");
listed[0].__mutated = true;
assert.strictEqual(find("1001", ids[0]).__mutated, undefined);
if (nestedField) {
listed[0][nestedField][0].__mutated = true;
assert.strictEqual(find("1001", ids[0])[nestedField][0].__mutated, undefined);
}
for (const item of list("1001")) {
assert.strictEqual(typeof item[idField], "string");
assert.strictEqual(item.genealogyId, "1001");
}
};
(async () => {
const fixtures = await loadMockModule();
const contracts = [
["listRelativeRecordFixtures", "findRelativeRecordFixture", "relativeId", ["301", "302"]],
["listCeremonyFixtures", "findCeremonyFixture", "ceremonyId", ["501", "502", "503"], "invitees"],
["listGrowthRecordFixtures", "findGrowthRecordFixture", "recordId", ["701", "702"]],
["listMemoFixtures", "findMemoFixture", "memoId", ["801", "802"]],
["listMeritRecordFixtures", "findMeritRecordFixture", "meritId", ["901", "902"]],
];
for (const [listName, findName, idField, ids, nestedField] of contracts) {
assert.strictEqual(typeof fixtures[listName], "function", `${listName} missing`);
assert.strictEqual(typeof fixtures[findName], "function", `${findName} missing`);
assertScopedOwner({
list: fixtures[listName],
find: fixtures[findName],
idField,
ids,
nestedField,
});
}
const personGrowth = fixtures.listGrowthRecordFixtures("1001", "104");
assert(personGrowth.length > 0);
assert(personGrowth.every((record) => record.lineagePersonId === "104"));
assert.deepStrictEqual(fixtures.listGrowthRecordFixtures("1001", "999"), []);
const memberOptions = fixtures.listTreeMemberFixtures("1001");
const memberAppUserIds = new Set(memberOptions.map((member) => member.appUserId));
assert.strictEqual(memberAppUserIds.size, memberOptions.length);
for (const ceremony of fixtures.listCeremonyFixtures("1001")) {
for (const invitee of ceremony.invitees) {
assert.deepStrictEqual(
Object.keys(invitee).sort(),
["inviteStatus", "inviteeUserId"],
"ceremony invite fixture must retain only live invitation fields",
);
assert(memberAppUserIds.has(invitee.inviteeUserId));
assert.strictEqual(typeof invitee.inviteStatus, "string");
}
}
process.stdout.write("RECORDS-FIXTURE-RUNTIME-SMOKE PASS\n");
})().catch((error) => {
process.stderr.write(`${error.stack || error.message}\n`);
process.exit(1);
});