Files

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, []);
});