diff --git a/apps/api/src/services/gameService.test.ts b/apps/api/src/services/gameService.test.ts index d1453f4..66b7470 100644 --- a/apps/api/src/services/gameService.test.ts +++ b/apps/api/src/services/gameService.test.ts @@ -126,6 +126,14 @@ describe("createGameSession", () => { expect(mockGetDistractors).toHaveBeenCalledTimes(3); }); + + it("propagates unexpected errors from getGameTerms", async () => { + mockGetGameTerms.mockRejectedValue(new Error("connection refused")); + + await expect(createGameSession(validRequest)).rejects.toThrow( + "connection refused", + ); + }); }); describe("evaluateAnswer", () => { diff --git a/apps/api/src/services/lobbyService.test.ts b/apps/api/src/services/lobbyService.test.ts index c998c12..c5de043 100644 --- a/apps/api/src/services/lobbyService.test.ts +++ b/apps/api/src/services/lobbyService.test.ts @@ -87,6 +87,14 @@ describe("createLobby", () => { "Could not generate a unique lobby code", ); }); + + it("re-throws non-unique-violation errors immediately", async () => { + const dbError = new Error("connection refused"); + mockCreateLobby.mockRejectedValue(dbError); + + await expect(createLobby("user-1")).rejects.toThrow("connection refused"); + expect(mockCreateLobby).toHaveBeenCalledTimes(1); + }); }); describe("joinLobby", () => { @@ -173,4 +181,22 @@ describe("joinLobby", () => { "Lobby is full", ); }); + + it("throws ConflictError when addPlayer returns falsy (race condition)", async () => { + mockAddPlayer.mockResolvedValue(undefined); + + await expect(joinLobby("ABC123", "user-2")).rejects.toThrow( + "Lobby is no longer available", + ); + }); + + it("throws AppError when lobby disappears after addPlayer succeeds", async () => { + mockGetLobbyByCodeWithPlayers + .mockResolvedValueOnce(fakeLobbyWithPlayers) + .mockResolvedValueOnce(undefined); + + await expect(joinLobby("ABC123", "user-2")).rejects.toThrow( + "Lobby disappeared during join", + ); + }); });