Files
NianAIGC/tests/data-store-minimax-billing.test.ts
2026-09-11 15:33:18 +08:00

71 lines
2.0 KiB
TypeScript

import { beforeEach, describe, expect, it, vi } from "vitest";
const { queryDatabase } = vi.hoisted(() => ({ queryDatabase: vi.fn() }));
vi.mock("@/lib/server/database", () => ({
isPostgresBackend: () => true,
queryDatabase,
withDatabaseTransaction: vi.fn()
}));
import { getGenerationJob } from "@/lib/server/data-store";
describe("generation job MiniMax billing mapping", () => {
beforeEach(() => queryDatabase.mockReset());
it("retains MiniMax actual usage when a PostgreSQL job is read", async () => {
queryDatabase.mockResolvedValueOnce({
rows: [{
id: "job-h3",
owner_id: "account-1",
capability: "video.generate",
provider: "minimax",
req_key: "MiniMax-H3",
status: "succeeded",
input_asset_ids: [],
input_urls: [],
output_asset_ids: ["asset-1"],
request_payload: {},
billing: {
priceRuleId: "base-minimax-h3-2k",
provider: "minimax",
capability: "video.generate",
reqKey: "MiniMax-H3",
unit: "video_second",
quantity: 5,
standardUnitPriceFen: 80,
markupMultiplier: 1.2,
amountFen: 480,
currency: "CNY",
status: "charged",
settlementStatus: "settled",
providerUsage: {
model: "MiniMax-H3",
resolution: "2K",
outputSeconds: 5,
inputVideoSeconds: 0,
inputImageCount: 1,
videoPriceFenPerSecond: 80
}
},
created_at: new Date("2026-09-04T01:00:00.000Z"),
updated_at: new Date("2026-09-04T01:05:00.000Z")
}]
});
const job = await getGenerationJob("job-h3");
expect(job?.billing?.providerUsage).toEqual({
resolution: "2K",
model: "MiniMax-H3",
completionTokens: undefined,
inputVideo: undefined,
tokenPriceFenPerMillion: undefined,
outputSeconds: 5,
inputVideoSeconds: 0,
inputImageCount: 1,
videoPriceFenPerSecond: 80
});
});
});