Files
triggerdotdev--trigger.dev/apps/webapp/test/runsRepository.part3.test.ts
nicktrn fa15438e42 perf(ci): speed up unit tests with LPT sharding + container scoping (#3855)
Speeds up and de-flakes the unit-test suite: testcontainers booted once
per vitest worker (per-test isolation kept only where a test runs
background redis work that outlives it), a duration-weighted shard
sequencer so each shard does roughly equal work, the slowest suites
split, two genuine flakes fixed (`streamBatchItems` shared-redis leak;
run-engine waits that relied on fixed sleeps), and transient DockerHub
pulls retried.

**Timings (CI, per-shard wall):** worst unit-test shard ~771s → ~294s;
packages/webapp shards ~250-270s, most internal ~190-240s. All 25 shards
green.

A shard breaks down as ~70s fixed setup (install / image-pull /
generate) + ~70s cold `^build` + the actual container tests. So the
remaining cost is mostly the tests themselves plus that fixed setup.

**Next (separate, timings):**
- **typecheck (~6m24s)** — the slowest check overall; bound by
full-graph `tsc`, not the TS version (a TS6 branch is still ~6m17s). The
real lever is **tsgo** (the Go compiler).
- Possible later: turbo CI caching could trim the ~70s cold build on
*warm* runs, but it's conditional (cold runs rebuild anyway) and doesn't
touch setup or test time — secondary.

`cli-v3` e2e and `sdk-compat` are path-gated (don't run on test-infra
changes) and already comfortably fast.
2026-06-07 12:00:32 +01:00

344 lines
9.7 KiB
TypeScript

import { describe, expect, vi } from "vitest";
// Mock the db prisma client
vi.mock("~/db.server", () => ({
prisma: {},
$replica: {},
}));
import { replicationContainerTest } from "@internal/testcontainers";
import { setTimeout } from "node:timers/promises";
import { RunsRepository } from "~/services/runsRepository/runsRepository.server";
import { setupClickhouseReplication } from "./utils/replicationUtils";
vi.setConfig({ testTimeout: 60_000 });
describe("RunsRepository (part 3/4)", () => {
replicationContainerTest(
"should filter runs by tags",
async ({ clickhouseContainer, redisOptions, postgresContainer, prisma }) => {
const { clickhouse } = await setupClickhouseReplication({
prisma,
databaseUrl: postgresContainer.getConnectionUri(),
clickhouseUrl: clickhouseContainer.getConnectionUrl(),
redisOptions,
});
const organization = await prisma.organization.create({
data: {
title: "test",
slug: "test",
},
});
const project = await prisma.project.create({
data: {
name: "test",
slug: "test",
organizationId: organization.id,
externalRef: "test",
},
});
const runtimeEnvironment = await prisma.runtimeEnvironment.create({
data: {
slug: "test",
type: "DEVELOPMENT",
projectId: project.id,
organizationId: organization.id,
apiKey: "test",
pkApiKey: "test",
shortcode: "test",
},
});
// Create runs with different tags
const taskRun1 = await prisma.taskRun.create({
data: {
friendlyId: "run_urgent",
taskIdentifier: "my-task",
runTags: ["urgent", "production"],
payload: JSON.stringify({ foo: "bar" }),
traceId: "1234",
spanId: "1234",
queue: "test",
runtimeEnvironmentId: runtimeEnvironment.id,
projectId: project.id,
organizationId: organization.id,
environmentType: "DEVELOPMENT",
engine: "V2",
},
});
const taskRun2 = await prisma.taskRun.create({
data: {
friendlyId: "run_regular",
taskIdentifier: "my-task",
runTags: ["regular", "development"],
payload: JSON.stringify({ foo: "bar" }),
traceId: "1235",
spanId: "1235",
queue: "test",
runtimeEnvironmentId: runtimeEnvironment.id,
projectId: project.id,
organizationId: organization.id,
environmentType: "DEVELOPMENT",
engine: "V2",
},
});
const taskRun3 = await prisma.taskRun.create({
data: {
friendlyId: "run_urgent_dev",
taskIdentifier: "my-task",
runTags: ["urgent", "development"],
payload: JSON.stringify({ foo: "bar" }),
traceId: "1236",
spanId: "1236",
queue: "test",
runtimeEnvironmentId: runtimeEnvironment.id,
projectId: project.id,
organizationId: organization.id,
environmentType: "DEVELOPMENT",
engine: "V2",
},
});
await setTimeout(1000);
const runsRepository = new RunsRepository({
prisma,
clickhouse,
});
// Test filtering by tags
const { runs } = await runsRepository.listRuns({
page: { size: 10 },
projectId: project.id,
environmentId: runtimeEnvironment.id,
organizationId: organization.id,
tags: ["urgent"],
});
expect(runs).toHaveLength(2);
expect(runs.map((r) => r.friendlyId).sort()).toEqual(["run_urgent", "run_urgent_dev"]);
}
);
replicationContainerTest(
"should filter runs by scheduleId",
async ({ clickhouseContainer, redisOptions, postgresContainer, prisma }) => {
const { clickhouse } = await setupClickhouseReplication({
prisma,
databaseUrl: postgresContainer.getConnectionUri(),
clickhouseUrl: clickhouseContainer.getConnectionUrl(),
redisOptions,
});
const organization = await prisma.organization.create({
data: {
title: "test",
slug: "test",
},
});
const project = await prisma.project.create({
data: {
name: "test",
slug: "test",
organizationId: organization.id,
externalRef: "test",
},
});
const runtimeEnvironment = await prisma.runtimeEnvironment.create({
data: {
slug: "test",
type: "DEVELOPMENT",
projectId: project.id,
organizationId: organization.id,
apiKey: "test",
pkApiKey: "test",
shortcode: "test",
},
});
// Create runs with different schedule IDs
await prisma.taskRun.create({
data: {
friendlyId: "run_scheduled_1",
taskIdentifier: "my-task",
scheduleId: "schedule_1",
payload: JSON.stringify({ foo: "bar" }),
traceId: "1234",
spanId: "1234",
queue: "test",
runtimeEnvironmentId: runtimeEnvironment.id,
projectId: project.id,
organizationId: organization.id,
environmentType: "DEVELOPMENT",
engine: "V2",
},
});
await prisma.taskRun.create({
data: {
friendlyId: "run_scheduled_2",
taskIdentifier: "my-task",
scheduleId: "schedule_2",
payload: JSON.stringify({ foo: "bar" }),
traceId: "1235",
spanId: "1235",
queue: "test",
runtimeEnvironmentId: runtimeEnvironment.id,
projectId: project.id,
organizationId: organization.id,
environmentType: "DEVELOPMENT",
engine: "V2",
},
});
await prisma.taskRun.create({
data: {
friendlyId: "run_unscheduled",
taskIdentifier: "my-task",
payload: JSON.stringify({ foo: "bar" }),
traceId: "1236",
spanId: "1236",
queue: "test",
runtimeEnvironmentId: runtimeEnvironment.id,
projectId: project.id,
organizationId: organization.id,
environmentType: "DEVELOPMENT",
engine: "V2",
},
});
await setTimeout(1000);
const runsRepository = new RunsRepository({
prisma,
clickhouse,
});
// Test filtering by schedule ID
const { runs } = await runsRepository.listRuns({
page: { size: 10 },
projectId: project.id,
environmentId: runtimeEnvironment.id,
organizationId: organization.id,
scheduleId: "schedule_1",
});
expect(runs).toHaveLength(1);
expect(runs[0].friendlyId).toBe("run_scheduled_1");
}
);
replicationContainerTest(
"should filter runs by isTest flag",
async ({ clickhouseContainer, redisOptions, postgresContainer, prisma }) => {
const { clickhouse } = await setupClickhouseReplication({
prisma,
databaseUrl: postgresContainer.getConnectionUri(),
clickhouseUrl: clickhouseContainer.getConnectionUrl(),
redisOptions,
});
const organization = await prisma.organization.create({
data: {
title: "test",
slug: "test",
},
});
const project = await prisma.project.create({
data: {
name: "test",
slug: "test",
organizationId: organization.id,
externalRef: "test",
},
});
const runtimeEnvironment = await prisma.runtimeEnvironment.create({
data: {
slug: "test",
type: "DEVELOPMENT",
projectId: project.id,
organizationId: organization.id,
apiKey: "test",
pkApiKey: "test",
shortcode: "test",
},
});
// Create test and non-test runs
await prisma.taskRun.create({
data: {
friendlyId: "run_test",
taskIdentifier: "my-task",
isTest: true,
payload: JSON.stringify({ foo: "bar" }),
traceId: "1234",
spanId: "1234",
queue: "test",
runtimeEnvironmentId: runtimeEnvironment.id,
projectId: project.id,
organizationId: organization.id,
environmentType: "DEVELOPMENT",
engine: "V2",
},
});
await prisma.taskRun.create({
data: {
friendlyId: "run_production",
taskIdentifier: "my-task",
isTest: false,
payload: JSON.stringify({ foo: "bar" }),
traceId: "1235",
spanId: "1235",
queue: "test",
runtimeEnvironmentId: runtimeEnvironment.id,
projectId: project.id,
organizationId: organization.id,
environmentType: "DEVELOPMENT",
engine: "V2",
},
});
await setTimeout(1000);
const runsRepository = new RunsRepository({
prisma,
clickhouse,
});
// Test filtering by isTest=true
const testRuns = await runsRepository.listRuns({
page: { size: 10 },
projectId: project.id,
environmentId: runtimeEnvironment.id,
organizationId: organization.id,
isTest: true,
});
expect(testRuns.runs).toHaveLength(1);
expect(testRuns.runs[0].friendlyId).toBe("run_test");
// Test filtering by isTest=false
const productionRuns = await runsRepository.listRuns({
page: { size: 10 },
projectId: project.id,
environmentId: runtimeEnvironment.id,
organizationId: organization.id,
isTest: false,
});
expect(productionRuns.runs).toHaveLength(1);
expect(productionRuns.runs[0].friendlyId).toBe("run_production");
}
);
});