55 lines
2.4 KiB
JavaScript
55 lines
2.4 KiB
JavaScript
import assert from "node:assert/strict";
|
|
import { mkdtempSync, rmSync } from "node:fs";
|
|
import os from "node:os";
|
|
import path from "node:path";
|
|
import test from "node:test";
|
|
import { GameDatabaseError, openGameDatabase } from "./database.mjs";
|
|
|
|
function withDatabase(run) {
|
|
const directory = mkdtempSync(path.join(os.tmpdir(), "healer-man-db-test-"));
|
|
const database = openGameDatabase({ dataDir: directory, sessionTtlDays: 1 });
|
|
return Promise.resolve(run(database)).finally(() => {
|
|
database.close();
|
|
rmSync(directory, { recursive: true, force: true });
|
|
});
|
|
}
|
|
|
|
test("registers, authenticates, and revokes an account session", () => withDatabase(async (database) => {
|
|
const registered = await database.register("CaveHealer", "serpent-pass");
|
|
assert.equal(registered.account.username, "CaveHealer");
|
|
assert.equal(database.authenticate(registered.token).id, registered.account.id);
|
|
|
|
const loggedIn = await database.login("cavehealer", "serpent-pass");
|
|
assert.equal(loggedIn.account.id, registered.account.id);
|
|
database.logout(loggedIn.token);
|
|
assert.throws(() => database.authenticate(loggedIn.token), (error) => (
|
|
error instanceof GameDatabaseError && error.status === 401
|
|
));
|
|
}));
|
|
|
|
test("rejects duplicate usernames and incorrect passwords", () => withDatabase(async (database) => {
|
|
await database.register("PartyLead", "eight-plus");
|
|
await assert.rejects(database.register("partylead", "another-pass"), (error) => (
|
|
error instanceof GameDatabaseError && error.status === 409
|
|
));
|
|
await assert.rejects(database.login("PartyLead", "wrong-pass"), (error) => (
|
|
error instanceof GameDatabaseError && error.status === 401
|
|
));
|
|
}));
|
|
|
|
test("persists opaque cloud roster data with increasing revisions", () => withDatabase(async (database) => {
|
|
const registered = await database.register("CloudPriest", "cloud-pass");
|
|
assert.equal(database.getCloudSave(registered.account.id).revision, 0);
|
|
const first = database.putCloudSave(registered.account.id, {
|
|
version: 1,
|
|
characters: [{ id: "character-one", name: "Mendwell" }],
|
|
});
|
|
const second = database.putCloudSave(registered.account.id, {
|
|
version: 1,
|
|
characters: [{ id: "character-one", name: "Mendbetter" }],
|
|
});
|
|
assert.equal(first.revision, 1);
|
|
assert.equal(second.revision, 2);
|
|
assert.equal(database.getCloudSave(registered.account.id).data.characters[0].name, "Mendbetter");
|
|
}));
|