test: refactor mocks to use spyOn for better isolation

This commit is contained in:
syntaxbullet
2025-12-19 13:31:14 +01:00
parent 4e228bb7a3
commit 1f7679e5a1
4 changed files with 62 additions and 72 deletions

View File

@@ -1,7 +1,9 @@
import { describe, it, expect, mock, beforeEach } from "bun:test";
import { describe, it, expect, mock, beforeEach, afterEach, spyOn } from "bun:test";
import { inventoryService } from "./inventory.service";
import { inventory, items, userTimers } from "@/db/schema";
import { app } from "@/index"; // We don't need app here, removed.
// Helper to mock resolved value for spyOn
import { economyService } from "@/modules/economy/economy.service";
import { levelingService } from "@/modules/leveling/leveling.service";
// Mock dependencies
const mockFindFirst = mock();
@@ -56,20 +58,6 @@ mock.module("@/lib/DrizzleClient", () => {
};
});
const mockModifyUserBalance = mock();
mock.module("@/modules/economy/economy.service", () => ({
economyService: {
modifyUserBalance: mockModifyUserBalance
}
}));
const mockAddXp = mock();
mock.module("@/modules/leveling/leveling.service", () => ({
levelingService: {
addXp: mockAddXp
}
}));
mock.module("@/lib/config", () => ({
config: {
inventory: {
@@ -80,6 +68,9 @@ mock.module("@/lib/config", () => ({
}));
describe("inventoryService", () => {
let mockModifyUserBalance: any;
let mockAddXp: any;
beforeEach(() => {
mockFindFirst.mockReset();
mockFindMany.mockReset();
@@ -92,9 +83,16 @@ describe("inventoryService", () => {
mockWhere.mockClear();
mockSelect.mockClear();
mockFrom.mockClear();
mockModifyUserBalance.mockClear();
mockAddXp.mockClear();
mockOnConflictDoUpdate.mockClear();
// Setup Spies
mockModifyUserBalance = spyOn(economyService, 'modifyUserBalance').mockResolvedValue({} as any);
mockAddXp = spyOn(levelingService, 'addXp').mockResolvedValue({} as any);
});
afterEach(() => {
mockModifyUserBalance.mockRestore();
mockAddXp.mockRestore();
});
describe("addItem", () => {
@@ -124,7 +122,8 @@ describe("inventoryService", () => {
const result = await inventoryService.addItem("1", 1, 5n);
expect(result.quantity).toBe(15n);
expect(result).toBeDefined();
expect(result?.quantity).toBe(15n);
expect(mockUpdate).toHaveBeenCalledWith(inventory);
expect(mockSet).toHaveBeenCalledWith({ quantity: 15n });
});
@@ -163,7 +162,8 @@ describe("inventoryService", () => {
const result = await inventoryService.removeItem("1", 1, 5n);
expect(mockDelete).toHaveBeenCalledWith(inventory);
expect(result.quantity).toBe(0n);
expect(result).toBeDefined();
expect(result?.quantity).toBe(0n);
});
it("should throw if insufficient quantity", async () => {