79 lines
2.6 KiB
JavaScript
79 lines
2.6 KiB
JavaScript
import test from "node:test";
|
|
import assert from "node:assert/strict";
|
|
import { registerHooks } from "node:module";
|
|
|
|
const state = { user: null, updates: [] };
|
|
const defaultHeads = Array.from({ length: 17 }, (_, index) => index + 1);
|
|
|
|
globalThis.__drawHeadCloudMock = {
|
|
database: () => ({
|
|
collection: () => ({
|
|
where: () => ({
|
|
getOne: async () => ({ data: state.user }),
|
|
update: async (payload) => { state.updates.push(payload); },
|
|
}),
|
|
}),
|
|
}),
|
|
};
|
|
globalThis.__drawHeadUtilsMock = {
|
|
checkToken: (received, expected) => received === expected,
|
|
};
|
|
|
|
registerHooks({
|
|
resolve(specifier, context, nextResolve) {
|
|
const mock = specifier === "@lafjs/cloud" ? "__drawHeadCloudMock"
|
|
: specifier === "@/Utils" ? "__drawHeadUtilsMock" : null;
|
|
return mock
|
|
? { url: `data:text/javascript,export default globalThis.${mock}`, shortCircuit: true }
|
|
: nextResolve(specifier, context);
|
|
},
|
|
});
|
|
|
|
const { default: drawHead } = await import(
|
|
new URL("../functions/drawHead.ts", import.meta.url)
|
|
);
|
|
|
|
async function draw(user) {
|
|
state.user = { _id: "u1", token: "secret", ...user };
|
|
state.updates = [];
|
|
const originalRandom = Math.random;
|
|
Math.random = () => 0;
|
|
try {
|
|
return await drawHead({ body: { uid: "u1", token: "secret" } });
|
|
} finally {
|
|
Math.random = originalRandom;
|
|
}
|
|
}
|
|
|
|
test("spring draw loads and charges 100 from 105 film after six owned rewards", async () => {
|
|
const owned = [...defaultHeads, 19, 20, 21, 22, 23, 24];
|
|
const result = await draw({ headArr: [...owned], film: 105 });
|
|
|
|
assert.equal(result.code, 1);
|
|
assert.equal(result.data.reward, 25);
|
|
assert.equal(owned.includes(result.data.reward), false);
|
|
assert.equal(result.data.film, 5);
|
|
assert.deepEqual(result.data.headArr, [...owned, 25]);
|
|
assert.deepEqual(state.updates, [{ headArr: [...owned, 25], film: 5 }]);
|
|
});
|
|
|
|
test("legacy users receive the default heads and one spring reward", async () => {
|
|
const result = await draw({ film: 105 });
|
|
|
|
assert.equal(result.code, 1);
|
|
assert.equal(result.data.reward, 19);
|
|
assert.equal(result.data.film, 100);
|
|
assert.deepEqual(result.data.headArr, [...defaultHeads, 19]);
|
|
assert.deepEqual(state.updates, [{ headArr: [...defaultHeads, 19], film: 100 }]);
|
|
});
|
|
|
|
test("insufficient film does not grant a reward or update the user", async () => {
|
|
const owned = [...defaultHeads, 19, 20, 21, 22, 23, 24];
|
|
const result = await draw({ headArr: [...owned], film: 99 });
|
|
|
|
assert.equal(result.code, 0);
|
|
assert.deepEqual(result.data, { film: 99, cost: 100 });
|
|
assert.deepEqual(state.user.headArr, owned);
|
|
assert.deepEqual(state.updates, []);
|
|
});
|