Files
omo-bot/tests/integration/mileage-engine-flow.test.ts
T
zwitschi f6efd96733
CI-CD / Bot Lint Test Build (push) Failing after 11s
CI-CD / Dashboard Lint Build (push) Successful in 14s
CI-CD / Deploy to Coolify (push) Has been skipped
feat: Add deployment guide and update README for Coolify setup; include dotenv for environment variable management
2026-05-17 17:31:25 +02:00

87 lines
2.0 KiB
TypeScript

import { GuildMember } from "discord.js";
const mockClient = {
query: jest.fn(),
release: jest.fn(),
};
const mockPool = {
connect: jest.fn(async () => mockClient),
query: jest.fn(),
end: jest.fn(),
};
jest.mock("pg", () => ({
Pool: jest.fn(() => mockPool),
}));
import { MileageEngine } from "../../src/mileage";
describe("MileageEngine flow", () => {
beforeEach(() => {
jest.clearAllMocks();
mockClient.query.mockImplementation(async (query: string) => {
if (query.includes("RETURNING total_miles")) {
return { rows: [{ total_miles: 120 }] };
}
return { rows: [] };
});
});
it("awards miles, persists event, and upgrades role when threshold reached", async () => {
const roleAdd = jest.fn().mockResolvedValue(undefined);
const member = {
roles: {
cache: {
has: jest.fn().mockReturnValue(false),
},
add: roleAdd,
},
guild: {
members: {
me: {
roles: {
highest: {
position: 100,
},
},
},
},
roles: {
fetch: jest.fn().mockResolvedValue({
id: "role-1",
position: 10,
}),
},
},
} as unknown as GuildMember;
const engine = new MileageEngine({
databaseUrl: "postgres://test",
roleTiers: [{ roleId: "role-1", minMiles: 100 }],
eventScores: { command_execute: 10 },
});
const result = await engine.awardMiles({
guildId: "guild-1",
userId: "user-1",
eventType: "command_execute",
member,
});
expect(result).toEqual({
awardedMiles: 10,
totalMiles: 120,
upgradedRoleIds: ["role-1"],
});
expect(mockClient.query).toHaveBeenCalledWith("BEGIN");
expect(mockClient.query).toHaveBeenCalledWith("COMMIT");
expect(roleAdd).toHaveBeenCalledWith(
expect.objectContaining({ id: "role-1" }),
"Mileage upgrade: reached 100 miles",
);
});
});