server/laf-cloud/tests/daily-task-debug.test.mjs

94 lines
3.3 KiB
JavaScript

import test from "node:test";
import assert from "node:assert/strict";
import { registerHooks } from "node:module";
const configUrl = new URL("../functions/dailyTaskConfig.ts", import.meta.url);
const serviceUrl = new URL("../functions/dailyTaskService.ts", import.meta.url);
const functionUrl = new URL("../functions/dailyTaskDebug.ts", import.meta.url);
const state = { user: null };
registerHooks({
resolve(specifier, context, nextResolve) {
if (specifier === "@/dailyTaskConfig") return { url: configUrl.href, shortCircuit: true };
if (specifier === "@/dailyTaskService") return { url: serviceUrl.href, shortCircuit: true };
if (specifier === "@/Utils") {
return { url: "data:text/javascript,export default { checkToken: (a, b) => a === b }", shortCircuit: true };
}
if (specifier === "@lafjs/cloud") {
return {
url: `data:text/javascript,export default globalThis.__dailyTaskDebugCloud`,
shortCircuit: true,
};
}
return nextResolve(specifier, context);
},
});
globalThis.__dailyTaskDebugCloud = {
database() {
return {
collection() {
return {
where() {
return {
async getOne() { return { data: state.user }; },
async update(data) { Object.assign(state.user, data); return { updated: 1 }; },
};
},
};
},
};
},
};
process.env.DAILY_TASK_DEBUG_KEY = "debug-key";
const handler = (await import(functionUrl)).default;
function makeUser(isDebug = "true") {
state.user = { _id: "debug-user", token: "token", isDebug, levelAmount: 20, task: null };
}
async function call(action, extra = {}) {
return handler({ body: { uid: "debug-user", token: "token", debugKey: "debug-key", action, ...extra } });
}
test("rejects non-debug users", async () => {
makeUser(false);
const result = await call("complete_all_daily");
assert.equal(result.code, 403);
});
test("rejects an invalid debug key", async () => {
makeUser();
const result = await call("complete_all_daily", { debugKey: "wrong-key" });
assert.equal(result.code, 403);
});
test("completes one daily task by slot", async () => {
makeUser();
const result = await call("complete_daily", { slot: 0 });
assert.equal(result.code, 1);
assert.equal(result.data.task.dailyTasks[0].value, result.data.task.dailyTasks[0].target);
assert.equal(result.data.task.dailyTasks[0].state, 1);
});
test("sets weekly stars and unlocks matching rewards", async () => {
makeUser();
const result = await call("set_weekly_stars", { value: 105 });
assert.equal(result.data.task.weeklyStars, 105);
assert.deepEqual(result.data.task.weeklyRewards.map(item => item.state), [1, 1, 1, 0]);
});
test("daily reset preserves weekly progress and weekly reset preserves daily tasks", async () => {
makeUser();
const weekly = await call("set_weekly_stars", { value: 70 });
state.user.task = JSON.stringify(weekly.data.task);
const resetDaily = await call("reset_daily");
assert.equal(resetDaily.data.task.weeklyStars, 70);
const dailyIds = resetDaily.data.task.dailyTasks.map(item => item.taskId);
state.user.task = JSON.stringify(resetDaily.data.task);
const resetWeekly = await call("reset_weekly");
assert.equal(resetWeekly.data.task.weeklyStars, 0);
assert.deepEqual(resetWeekly.data.task.dailyTasks.map(item => item.taskId), dailyIds);
});