Files
paperclip/server/src/__tests__/monthly-spend-service.test.ts
2026-03-16 15:41:48 -05:00

91 lines
2.4 KiB
TypeScript

import { beforeEach, describe, expect, it, vi } from "vitest";
import { companyService } from "../services/companies.ts";
import { agentService } from "../services/agents.ts";
function createSelectSequenceDb(results: unknown[]) {
const pending = [...results];
const chain = {
from: vi.fn(() => chain),
where: vi.fn(() => chain),
leftJoin: vi.fn(() => chain),
groupBy: vi.fn(() => chain),
then: vi.fn((resolve: (value: unknown[]) => unknown) => Promise.resolve(resolve(pending.shift() ?? []))),
};
return {
db: {
select: vi.fn(() => chain),
},
};
}
describe("monthly spend hydration", () => {
beforeEach(() => {
vi.clearAllMocks();
});
it("recomputes company spentMonthlyCents from the current utc month instead of returning stale stored values", async () => {
const dbStub = createSelectSequenceDb([
[{
id: "company-1",
name: "Paperclip",
description: null,
status: "active",
issuePrefix: "PAP",
issueCounter: 1,
budgetMonthlyCents: 5000,
spentMonthlyCents: 999999,
requireBoardApprovalForNewAgents: false,
brandColor: null,
logoAssetId: null,
createdAt: new Date(),
updatedAt: new Date(),
}],
[{
companyId: "company-1",
spentMonthlyCents: 420,
}],
]);
const companies = companyService(dbStub.db as any);
const [company] = await companies.list();
expect(company.spentMonthlyCents).toBe(420);
});
it("recomputes agent spentMonthlyCents from the current utc month instead of returning stale stored values", async () => {
const dbStub = createSelectSequenceDb([
[{
id: "agent-1",
companyId: "company-1",
name: "Budget Agent",
role: "general",
title: null,
reportsTo: null,
capabilities: null,
adapterType: "claude-local",
adapterConfig: {},
runtimeConfig: {},
budgetMonthlyCents: 5000,
spentMonthlyCents: 999999,
metadata: null,
permissions: null,
status: "idle",
pauseReason: null,
pausedAt: null,
createdAt: new Date(),
updatedAt: new Date(),
}],
[{
agentId: "agent-1",
spentMonthlyCents: 175,
}],
]);
const agents = agentService(dbStub.db as any);
const agent = await agents.getById("agent-1");
expect(agent?.spentMonthlyCents).toBe(175);
});
});