89 lines
2.7 KiB
JavaScript
89 lines
2.7 KiB
JavaScript
"use strict";
|
|
|
|
const assert = require("assert");
|
|
const fs = require("fs");
|
|
const path = require("path");
|
|
|
|
const toDataModuleUrl = (source) =>
|
|
`data:text/javascript;base64,${Buffer.from(source).toString("base64")}`;
|
|
|
|
const run = async () => {
|
|
const sessionPath = path.join(__dirname, "../utils/session.js");
|
|
const contextPath = path.join(__dirname, "../utils/genealogy-context.js");
|
|
const contextUrl = toDataModuleUrl(fs.readFileSync(contextPath, "utf8"));
|
|
const originalSessionSource = fs.readFileSync(sessionPath, "utf8");
|
|
const sessionSource = originalSessionSource.replace(
|
|
/from\s+["']\.\/genealogy-context\.js["']\s*;/,
|
|
`from "${contextUrl}";`,
|
|
);
|
|
|
|
assert.notStrictEqual(
|
|
sessionSource,
|
|
originalSessionSource,
|
|
"session 必须消费唯一的当前家谱上下文所有者",
|
|
);
|
|
|
|
const storage = new Map();
|
|
const removals = [];
|
|
globalThis.uni = {
|
|
getStorageSync: (key) => storage.get(key) || "",
|
|
setStorageSync: (key, value) => storage.set(key, value),
|
|
removeStorageSync: (key) => {
|
|
removals.push(key);
|
|
storage.delete(key);
|
|
},
|
|
};
|
|
|
|
const { session } = await import(toDataModuleUrl(sessionSource));
|
|
assert.throws(
|
|
() => session.saveToken(""),
|
|
/会话令牌/,
|
|
"空令牌不能覆盖现有会话",
|
|
);
|
|
session.saveToken("token-1");
|
|
globalThis.uni.setStorageSync("jiapu_current_genealogy_id", "genealogy-1");
|
|
assert.strictEqual(session.getToken(), "token-1");
|
|
|
|
session.saveToken("token-1");
|
|
assert.strictEqual(
|
|
globalThis.uni.getStorageSync("jiapu_current_genealogy_id"),
|
|
"genealogy-1",
|
|
"同一会话重复保存不得清掉用户当前家谱",
|
|
);
|
|
|
|
session.saveToken("token-2");
|
|
assert.strictEqual(session.getToken(), "token-2");
|
|
assert.strictEqual(
|
|
globalThis.uni.getStorageSync("jiapu_current_genealogy_id"),
|
|
"",
|
|
"账号令牌变化必须先清理旧账号的家谱上下文",
|
|
);
|
|
|
|
globalThis.uni.setStorageSync("jiapu_current_genealogy_id", "genealogy-2");
|
|
|
|
session.clear();
|
|
assert.deepStrictEqual(
|
|
removals,
|
|
[
|
|
"jiapu_current_genealogy_id",
|
|
"jiapu_current_genealogy_invalidated",
|
|
"jiapu_current_genealogy_id",
|
|
"jiapu_current_genealogy_invalidated",
|
|
"jiapu_token",
|
|
"jiapu_current_genealogy_id",
|
|
"jiapu_current_genealogy_invalidated",
|
|
],
|
|
"换账号与退出必须按唯一 owner 清理旧家谱上下文",
|
|
);
|
|
assert.strictEqual(session.getToken(), "");
|
|
assert.strictEqual(globalThis.uni.getStorageSync("jiapu_current_genealogy_id"), "");
|
|
assert.strictEqual(globalThis.uni.getStorageSync("jiapu_current_genealogy_invalidated"), "");
|
|
|
|
process.stdout.write("SESSION-RUNTIME-SMOKE PASS\n");
|
|
};
|
|
|
|
run().catch((error) => {
|
|
process.stderr.write(`${error.stack || error.message}\n`);
|
|
process.exit(1);
|
|
});
|