improved test coverage
This commit is contained in:
parent
f2183f0d15
commit
bce36b5ab4
|
|
@ -28,3 +28,4 @@ temp_dbs
|
||||||
|
|
||||||
deploy.sh
|
deploy.sh
|
||||||
sqlite.db
|
sqlite.db
|
||||||
|
coverage
|
||||||
|
|
|
||||||
|
|
@ -4,9 +4,14 @@ import { Game } from "../schema";
|
||||||
import {
|
import {
|
||||||
getCurrentGame,
|
getCurrentGame,
|
||||||
getGame,
|
getGame,
|
||||||
|
getGames,
|
||||||
getGamesCount,
|
getGamesCount,
|
||||||
|
getTotalGamesPlayed,
|
||||||
|
parseGameState,
|
||||||
upsertGame,
|
upsertGame,
|
||||||
|
upsertGameState,
|
||||||
} from "./gameRepository";
|
} from "./gameRepository";
|
||||||
|
import { encode } from "@msgpack/msgpack";
|
||||||
|
|
||||||
describe("GameRepository", () => {
|
describe("GameRepository", () => {
|
||||||
it("should get game by uuid", async () => {
|
it("should get game by uuid", async () => {
|
||||||
|
|
@ -136,4 +141,115 @@ describe("GameRepository", () => {
|
||||||
started: started + 1,
|
started: started + 1,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("should get finished games for user", async () => {
|
||||||
|
const db = getTestDb();
|
||||||
|
const started = Date.now();
|
||||||
|
await db.insert(Game).values({
|
||||||
|
uuid: "TestUuid1",
|
||||||
|
user: "TestUser",
|
||||||
|
stage: 1,
|
||||||
|
gameState: Buffer.from("ANY"),
|
||||||
|
finished: 1,
|
||||||
|
started,
|
||||||
|
});
|
||||||
|
await db.insert(Game).values({
|
||||||
|
uuid: "TestUuid2",
|
||||||
|
user: "TestUser",
|
||||||
|
stage: 2,
|
||||||
|
gameState: Buffer.from("ANY"),
|
||||||
|
finished: 0,
|
||||||
|
started: started + 1,
|
||||||
|
});
|
||||||
|
await db.insert(Game).values({
|
||||||
|
uuid: "TestUuid3",
|
||||||
|
user: "OtherUser",
|
||||||
|
stage: 1,
|
||||||
|
gameState: Buffer.from("ANY"),
|
||||||
|
finished: 1,
|
||||||
|
started: started + 2,
|
||||||
|
});
|
||||||
|
const games = await getGames(db, "TestUser");
|
||||||
|
expect(games).toHaveLength(1);
|
||||||
|
expect(games[0].uuid).toBe("TestUuid1");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should get total games played for user", async () => {
|
||||||
|
const db = getTestDb();
|
||||||
|
const started = Date.now();
|
||||||
|
await db.insert(Game).values({
|
||||||
|
uuid: "TestUuid1",
|
||||||
|
user: "TestUser",
|
||||||
|
stage: 1,
|
||||||
|
gameState: Buffer.from("ANY"),
|
||||||
|
finished: 1,
|
||||||
|
started,
|
||||||
|
});
|
||||||
|
await db.insert(Game).values({
|
||||||
|
uuid: "TestUuid2",
|
||||||
|
user: "TestUser",
|
||||||
|
stage: 2,
|
||||||
|
gameState: Buffer.from("ANY"),
|
||||||
|
finished: 0,
|
||||||
|
started: started + 1,
|
||||||
|
});
|
||||||
|
const totalGames = await getTotalGamesPlayed(db, "TestUser");
|
||||||
|
expect(totalGames).toBe(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should get total games played for all users", async () => {
|
||||||
|
const db = getTestDb();
|
||||||
|
const started = Date.now();
|
||||||
|
await db.insert(Game).values({
|
||||||
|
uuid: "TestUuid1",
|
||||||
|
user: "TestUser",
|
||||||
|
stage: 1,
|
||||||
|
gameState: Buffer.from("ANY"),
|
||||||
|
finished: 1,
|
||||||
|
started,
|
||||||
|
});
|
||||||
|
await db.insert(Game).values({
|
||||||
|
uuid: "TestUuid2",
|
||||||
|
user: "OtherUser",
|
||||||
|
stage: 2,
|
||||||
|
gameState: Buffer.from("ANY"),
|
||||||
|
finished: 1,
|
||||||
|
started: started + 1,
|
||||||
|
});
|
||||||
|
const totalGames = await getTotalGamesPlayed(db);
|
||||||
|
expect(totalGames).toBe(2);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should parse game state", () => {
|
||||||
|
const gameData = { test: "data", number: 42 };
|
||||||
|
const buffer = Buffer.from(encode(gameData));
|
||||||
|
const parsed = parseGameState(buffer);
|
||||||
|
expect(parsed).toEqual(gameData);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should upsert game state", async () => {
|
||||||
|
const db = getTestDb();
|
||||||
|
const serverGame = {
|
||||||
|
uuid: "TestUuid",
|
||||||
|
user: "TestUser",
|
||||||
|
stage: 1,
|
||||||
|
finished: 1,
|
||||||
|
started: Date.now(),
|
||||||
|
// Other ServerGame properties don't matter for this test
|
||||||
|
mines: [[false]],
|
||||||
|
width: 1,
|
||||||
|
height: 1,
|
||||||
|
isRevealed: [[false]],
|
||||||
|
isFlagged: [[false]],
|
||||||
|
isQuestionMark: [[false]],
|
||||||
|
minesCount: 0,
|
||||||
|
lastClick: [0, 0] as [number, number],
|
||||||
|
theme: "default" as const,
|
||||||
|
};
|
||||||
|
await upsertGameState(db, serverGame);
|
||||||
|
const game = await getGame(db, "TestUuid");
|
||||||
|
expect(game?.uuid).toBe("TestUuid");
|
||||||
|
expect(game?.user).toBe("TestUser");
|
||||||
|
expect(game?.stage).toBe(1);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -82,7 +82,7 @@ export const upsertGameState = async (
|
||||||
game: ServerGame,
|
game: ServerGame,
|
||||||
) => {
|
) => {
|
||||||
const { uuid, user, stage, finished, started } = game;
|
const { uuid, user, stage, finished, started } = game;
|
||||||
upsertGame(db, {
|
await upsertGame(db, {
|
||||||
uuid,
|
uuid,
|
||||||
user,
|
user,
|
||||||
stage,
|
stage,
|
||||||
|
|
|
||||||
|
|
@ -37,4 +37,55 @@ describe("ScoreRepository", () => {
|
||||||
const result = await getScoreBoard(db);
|
const result = await getScoreBoard(db);
|
||||||
expect(result).toEqual([{ stage: 10, user: "TestUser" }]);
|
expect(result).toEqual([{ stage: 10, user: "TestUser" }]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("should return empty array when no finished games exist", async () => {
|
||||||
|
const db = getTestDb();
|
||||||
|
await db.insert(User).values({
|
||||||
|
name: "TestUser2",
|
||||||
|
password: "test",
|
||||||
|
});
|
||||||
|
await db.insert(Game).values({
|
||||||
|
user: "TestUser2",
|
||||||
|
uuid: crypto.randomUUID(),
|
||||||
|
stage: 5,
|
||||||
|
gameState: Buffer.from("ANY"),
|
||||||
|
finished: 0,
|
||||||
|
started: Date.now(),
|
||||||
|
});
|
||||||
|
const result = await getScoreBoard(db);
|
||||||
|
expect(result).toEqual([]);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should handle multiple users and sort by highest stage", async () => {
|
||||||
|
const db = getTestDb();
|
||||||
|
await db.insert(User).values({
|
||||||
|
name: "User1",
|
||||||
|
password: "test",
|
||||||
|
});
|
||||||
|
await db.insert(User).values({
|
||||||
|
name: "User2",
|
||||||
|
password: "test",
|
||||||
|
});
|
||||||
|
await db.insert(Game).values({
|
||||||
|
user: "User1",
|
||||||
|
uuid: crypto.randomUUID(),
|
||||||
|
stage: 15,
|
||||||
|
gameState: Buffer.from("ANY"),
|
||||||
|
finished: 1,
|
||||||
|
started: Date.now(),
|
||||||
|
});
|
||||||
|
await db.insert(Game).values({
|
||||||
|
user: "User2",
|
||||||
|
uuid: crypto.randomUUID(),
|
||||||
|
stage: 25,
|
||||||
|
gameState: Buffer.from("ANY"),
|
||||||
|
finished: 1,
|
||||||
|
started: Date.now(),
|
||||||
|
});
|
||||||
|
const result = await getScoreBoard(db);
|
||||||
|
expect(result).toEqual([
|
||||||
|
{ stage: 25, user: "User2" },
|
||||||
|
{ stage: 15, user: "User1" }
|
||||||
|
]);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import { describe, it, expect } from "bun:test";
|
import { describe, it, expect } from "bun:test";
|
||||||
import { getTestDb } from "../database/getTestDb";
|
import { getTestDb } from "../database/getTestDb";
|
||||||
import { getUser, loginUser, registerUser } from "./userRepository";
|
import { getUser, getUserCount, getUserSettings, loginUser, registerUser, upsertUserSettings } from "./userRepository";
|
||||||
|
|
||||||
describe("UserRepository", () => {
|
describe("UserRepository", () => {
|
||||||
it("should register a user", async () => {
|
it("should register a user", async () => {
|
||||||
|
|
@ -45,4 +45,72 @@ describe("UserRepository", () => {
|
||||||
password: undefined,
|
password: undefined,
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("should throw error if password is incorrect", async () => {
|
||||||
|
const db = getTestDb();
|
||||||
|
await registerUser(db, "TestUser", "test");
|
||||||
|
expect(loginUser(db, "TestUser", "wrongpassword")).rejects.toThrow(
|
||||||
|
"Incorrect password",
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should handle getUser for nonexistent user", async () => {
|
||||||
|
const db = getTestDb();
|
||||||
|
const user = await getUser(db, "NonexistentUser");
|
||||||
|
expect(user.name).toBeUndefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should get user count", async () => {
|
||||||
|
const db = getTestDb();
|
||||||
|
await registerUser(db, "TestUser1", "test");
|
||||||
|
await registerUser(db, "TestUser2", "test");
|
||||||
|
const count = await getUserCount(db);
|
||||||
|
expect(count).toBe(2);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should get default user settings", async () => {
|
||||||
|
const db = getTestDb();
|
||||||
|
const settings = await getUserSettings(db, "TestUser");
|
||||||
|
expect(settings).toEqual({
|
||||||
|
placeQuestionMark: false,
|
||||||
|
longPressOnDesktop: false,
|
||||||
|
showRevealAnimation: true,
|
||||||
|
soundEnabled: true,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should upsert user settings - insert", async () => {
|
||||||
|
const db = getTestDb();
|
||||||
|
const newSettings = {
|
||||||
|
placeQuestionMark: true,
|
||||||
|
longPressOnDesktop: true,
|
||||||
|
showRevealAnimation: false,
|
||||||
|
soundEnabled: false,
|
||||||
|
};
|
||||||
|
await upsertUserSettings(db, "TestUser", newSettings);
|
||||||
|
const settings = await getUserSettings(db, "TestUser");
|
||||||
|
expect(settings).toEqual(newSettings);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should upsert user settings - update", async () => {
|
||||||
|
const db = getTestDb();
|
||||||
|
const initialSettings = {
|
||||||
|
placeQuestionMark: false,
|
||||||
|
longPressOnDesktop: false,
|
||||||
|
showRevealAnimation: true,
|
||||||
|
soundEnabled: true,
|
||||||
|
};
|
||||||
|
await upsertUserSettings(db, "TestUser", initialSettings);
|
||||||
|
|
||||||
|
const updatedSettings = {
|
||||||
|
placeQuestionMark: true,
|
||||||
|
longPressOnDesktop: true,
|
||||||
|
showRevealAnimation: false,
|
||||||
|
soundEnabled: false,
|
||||||
|
};
|
||||||
|
await upsertUserSettings(db, "TestUser", updatedSettings);
|
||||||
|
|
||||||
|
const settings = await getUserSettings(db, "TestUser");
|
||||||
|
expect(settings).toEqual(updatedSettings);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import { describe, it, expect } from "bun:test";
|
import { describe, it, expect } from "bun:test";
|
||||||
import { getValue, ServerGame, serverToClientGame } from "./game";
|
import { getValue, isServerGame, isClientGame, ServerGame, ClientGame, serverToClientGame } from "./game";
|
||||||
|
|
||||||
describe("Game", () => {
|
describe("Game", () => {
|
||||||
it("should get value", () => {
|
it("should get value", () => {
|
||||||
|
|
@ -15,6 +15,46 @@ describe("Game", () => {
|
||||||
expect(getValue(mines, 1, 3)).toEqual(8);
|
expect(getValue(mines, 1, 3)).toEqual(8);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("should identify server game", () => {
|
||||||
|
const serverGame: ServerGame = {
|
||||||
|
theme: "default",
|
||||||
|
mines: [[false]],
|
||||||
|
minesCount: 0,
|
||||||
|
isRevealed: [[false]],
|
||||||
|
isFlagged: [[false]],
|
||||||
|
isQuestionMark: [[false]],
|
||||||
|
started: Date.now(),
|
||||||
|
finished: 0,
|
||||||
|
lastClick: [0, 0],
|
||||||
|
uuid: "test-uuid",
|
||||||
|
width: 1,
|
||||||
|
height: 1,
|
||||||
|
user: "TestUser",
|
||||||
|
stage: 1,
|
||||||
|
};
|
||||||
|
expect(isServerGame(serverGame)).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should identify client game", () => {
|
||||||
|
const clientGame: ClientGame = {
|
||||||
|
theme: "default",
|
||||||
|
minesCount: 0,
|
||||||
|
isRevealed: [[false]],
|
||||||
|
isFlagged: [[false]],
|
||||||
|
isQuestionMark: [[false]],
|
||||||
|
values: [[0]],
|
||||||
|
started: Date.now(),
|
||||||
|
lastClick: [0, 0],
|
||||||
|
uuid: "test-uuid",
|
||||||
|
width: 1,
|
||||||
|
height: 1,
|
||||||
|
user: "TestUser",
|
||||||
|
stage: 1,
|
||||||
|
};
|
||||||
|
expect(isClientGame(clientGame)).toBe(true);
|
||||||
|
expect(isServerGame(clientGame)).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
it("should convert server to client game", () => {
|
it("should convert server to client game", () => {
|
||||||
const serverGame: ServerGame = {
|
const serverGame: ServerGame = {
|
||||||
theme: "default",
|
theme: "default",
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue