Files
triggerdotdev--trigger.dev/apps/webapp/test/billingLimitConvergeEnvironments.test.ts
T
2026-07-13 13:32:57 +08:00

108 lines
3.5 KiB
TypeScript

import type { PrismaClient } from "@trigger.dev/database";
import { EnvironmentPauseSource } from "@trigger.dev/database";
import { describe, expect, vi } from "vitest";
import { postgresTest } from "@internal/testcontainers";
import { convergeBillingLimitEnvironmentsForOrg } from "~/v3/services/billingLimit/billingLimitConvergeEnvironments.server";
import {
createRuntimeEnvironment,
createTestOrgProjectWithMember,
uniqueId,
} from "./fixtures/environmentVariablesFixtures";
vi.setConfig({ testTimeout: 60_000 });
async function createBillingPausedProductionEnv(prisma: PrismaClient) {
const { organization, project } = await createTestOrgProjectWithMember(prisma);
const environment = await createRuntimeEnvironment(prisma, {
projectId: project.id,
organizationId: organization.id,
type: "PRODUCTION",
slug: uniqueId("prod"),
});
await prisma.runtimeEnvironment.update({
where: { id: environment.id },
data: {
paused: true,
pauseSource: EnvironmentPauseSource.BILLING_LIMIT,
},
});
return { organization, environment };
}
describe("convergeBillingLimitEnvironmentsForOrg", () => {
postgresTest("unpauses billable environments paused by billing limit", async ({ prisma }) => {
const { organization, environment } = await createBillingPausedProductionEnv(prisma);
const result = await convergeBillingLimitEnvironmentsForOrg(organization.id, "ok", {
prismaClient: prisma,
updateConcurrency: async () => undefined,
});
expect(result).toEqual({ paused: 0, unpaused: 1 });
const envAfter = await prisma.runtimeEnvironment.findUniqueOrThrow({
where: { id: environment.id },
});
expect(envAfter.paused).toBe(false);
expect(envAfter.pauseSource).toBeNull();
});
postgresTest("rolls back pause when concurrency update fails", async ({ prisma }) => {
const { organization, project } = await createTestOrgProjectWithMember(prisma);
const environment = await createRuntimeEnvironment(prisma, {
projectId: project.id,
organizationId: organization.id,
type: "PRODUCTION",
slug: uniqueId("prod"),
});
await expect(
convergeBillingLimitEnvironmentsForOrg(organization.id, "grace", {
prismaClient: prisma,
updateConcurrency: async () => {
throw new Error("run queue unavailable");
},
})
).rejects.toThrow("run queue unavailable");
const envAfter = await prisma.runtimeEnvironment.findUniqueOrThrow({
where: { id: environment.id },
});
expect(envAfter.paused).toBe(false);
expect(envAfter.pauseSource).toBeNull();
});
postgresTest("does not unpause environments paused for other reasons", async ({ prisma }) => {
const { organization, project } = await createTestOrgProjectWithMember(prisma);
const environment = await createRuntimeEnvironment(prisma, {
projectId: project.id,
organizationId: organization.id,
type: "PRODUCTION",
slug: uniqueId("prod"),
});
await prisma.runtimeEnvironment.update({
where: { id: environment.id },
data: {
paused: true,
pauseSource: null,
},
});
const result = await convergeBillingLimitEnvironmentsForOrg(organization.id, "ok", {
prismaClient: prisma,
updateConcurrency: async () => undefined,
});
expect(result).toEqual({ paused: 0, unpaused: 0 });
const envAfter = await prisma.runtimeEnvironment.findUniqueOrThrow({
where: { id: environment.id },
});
expect(envAfter.paused).toBe(true);
expect(envAfter.pauseSource).toBeNull();
});
});