From 22ffbe238729ec567fd707f8f015365f11f0460e Mon Sep 17 00:00:00 2001 From: LeoKaynan Date: Fri, 10 Oct 2025 23:45:24 -0300 Subject: [PATCH 1/4] fix(webapp): runs not appearing in local development --- .../v3/CreateBulkActionPresenter.server.ts | 4 ++-- .../v3/NextRunListPresenter.server.ts | 4 ++-- .../services/runsRepositoryFactory.server.ts | 22 +++++++++++++++++++ .../v3/services/bulk/BulkActionV2.server.ts | 6 ++--- 4 files changed, 29 insertions(+), 7 deletions(-) create mode 100644 apps/webapp/app/services/runsRepositoryFactory.server.ts diff --git a/apps/webapp/app/presenters/v3/CreateBulkActionPresenter.server.ts b/apps/webapp/app/presenters/v3/CreateBulkActionPresenter.server.ts index acf511f0f5..2b1ce987ff 100644 --- a/apps/webapp/app/presenters/v3/CreateBulkActionPresenter.server.ts +++ b/apps/webapp/app/presenters/v3/CreateBulkActionPresenter.server.ts @@ -1,7 +1,7 @@ import { type PrismaClient } from "@trigger.dev/database"; import { CreateBulkActionSearchParams } from "~/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.bulkaction"; import { clickhouseClient } from "~/services/clickhouseInstance.server"; -import { RunsRepository } from "~/services/runsRepository/runsRepository.server"; +import { createRunsRepository } from "~/services/runsRepositoryFactory.server"; import { getRunFiltersFromRequest } from "../RunFilters.server"; import { BasePresenter } from "./basePresenter.server"; @@ -24,7 +24,7 @@ export class CreateBulkActionPresenter extends BasePresenter { Object.fromEntries(new URL(request.url).searchParams) ); - const runsRepository = new RunsRepository({ + const runsRepository = createRunsRepository({ clickhouse: clickhouseClient, prisma: this._replica as PrismaClient, }); diff --git a/apps/webapp/app/presenters/v3/NextRunListPresenter.server.ts b/apps/webapp/app/presenters/v3/NextRunListPresenter.server.ts index 2375ea161a..37442df515 100644 --- a/apps/webapp/app/presenters/v3/NextRunListPresenter.server.ts +++ b/apps/webapp/app/presenters/v3/NextRunListPresenter.server.ts @@ -9,7 +9,7 @@ import { type Direction } from "~/components/ListPagination"; import { timeFilters } from "~/components/runs/v3/SharedFilters"; import { findDisplayableEnvironment } from "~/models/runtimeEnvironment.server"; import { getAllTaskIdentifiers } from "~/models/task.server"; -import { RunsRepository } from "~/services/runsRepository/runsRepository.server"; +import { createRunsRepository } from "~/services/runsRepositoryFactory.server"; import { machinePresetFromRun } from "~/v3/machinePresets.server"; import { ServiceValidationError } from "~/v3/services/baseService.server"; import { isCancellableRunStatus, isFinalRunStatus, isPendingRunStatus } from "~/v3/taskStatus"; @@ -153,7 +153,7 @@ export class NextRunListPresenter { throw new ServiceValidationError("No environment found"); } - const runsRepository = new RunsRepository({ + const runsRepository = createRunsRepository({ clickhouse: this.clickhouse, prisma: this.replica as PrismaClient, }); diff --git a/apps/webapp/app/services/runsRepositoryFactory.server.ts b/apps/webapp/app/services/runsRepositoryFactory.server.ts new file mode 100644 index 0000000000..ae2cdbf1a9 --- /dev/null +++ b/apps/webapp/app/services/runsRepositoryFactory.server.ts @@ -0,0 +1,22 @@ +import type { ClickHouse } from "@internal/clickhouse"; +import type { PrismaClient } from "@trigger.dev/database"; +import { env } from "~/env.server"; +import { RunsRepository } from "./runsRepository/runsRepository.server"; + +export function createRunsRepository(options: { + clickhouse: ClickHouse; + prisma: PrismaClient; +}): RunsRepository { + const isReplicationEnabled = env.RUN_REPLICATION_ENABLED === "1"; + const isClickHouseConfigured = !!env.RUN_REPLICATION_CLICKHOUSE_URL; + + const defaultRepository = isReplicationEnabled && isClickHouseConfigured + ? "clickhouse" + : "postgres"; + + return new RunsRepository({ + ...options, + defaultRepository, + }); +} + diff --git a/apps/webapp/app/v3/services/bulk/BulkActionV2.server.ts b/apps/webapp/app/v3/services/bulk/BulkActionV2.server.ts index 98b6079c10..d3259bb343 100644 --- a/apps/webapp/app/v3/services/bulk/BulkActionV2.server.ts +++ b/apps/webapp/app/v3/services/bulk/BulkActionV2.server.ts @@ -8,10 +8,10 @@ import { import { getRunFiltersFromRequest } from "~/presenters/RunFilters.server"; import { type CreateBulkActionPayload } from "~/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.bulkaction"; import { clickhouseClient } from "~/services/clickhouseInstance.server"; +import { createRunsRepository } from "~/services/runsRepositoryFactory.server"; import { parseRunListInputOptions, type RunListInputFilters, - RunsRepository, } from "~/services/runsRepository/runsRepository.server"; import { BaseService } from "../baseService.server"; import { commonWorker } from "~/v3/commonWorker.server"; @@ -38,7 +38,7 @@ export class BulkActionService extends BaseService { const filters = await getFilters(payload, request); // Count the runs that will be affected by the bulk action - const runsRepository = new RunsRepository({ + const runsRepository = createRunsRepository({ clickhouse: clickhouseClient, prisma: this._replica as PrismaClient, }); @@ -145,7 +145,7 @@ export class BulkActionService extends BaseService { ...(group.params && typeof group.params === "object" ? group.params : {}), }); - const runsRepository = new RunsRepository({ + const runsRepository = createRunsRepository({ clickhouse: clickhouseClient, prisma: this._replica as PrismaClient, }); From 24656789a0c31cb0331009e508011cef05af9523 Mon Sep 17 00:00:00 2001 From: LeoKaynan Date: Fri, 10 Oct 2025 23:54:03 -0300 Subject: [PATCH 2/4] test(webapp): add unit tests for runsRepositoryFactory --- .../webapp/test/runsRepositoryFactory.test.ts | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 apps/webapp/test/runsRepositoryFactory.test.ts diff --git a/apps/webapp/test/runsRepositoryFactory.test.ts b/apps/webapp/test/runsRepositoryFactory.test.ts new file mode 100644 index 0000000000..ba2fbc040f --- /dev/null +++ b/apps/webapp/test/runsRepositoryFactory.test.ts @@ -0,0 +1,86 @@ +import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; +vi.mock("~/env.server", () => ({ + env: {}, +})); +vi.mock("~/db.server", () => ({ + prisma: {}, + $replica: {}, +})); + +import { createRunsRepository } from "~/services/runsRepositoryFactory.server"; +import type { ClickHouse } from "@internal/clickhouse"; +import type { PrismaClient } from "@trigger.dev/database"; + +describe("createRunsRepository", () => { + let mockClickhouse: ClickHouse; + let mockPrisma: PrismaClient; + let originalEnv: Record; + + beforeEach(async () => { + const envModule = await import("~/env.server"); + originalEnv = { ...envModule.env }; + + mockClickhouse = {} as ClickHouse; + mockPrisma = {} as PrismaClient; + }); + + afterEach(async () => { + const envModule = await import("~/env.server"); + Object.assign(envModule.env, originalEnv); + }); + + it("should default to postgres when RUN_REPLICATION_ENABLED is not set", async () => { + const envModule = await import("~/env.server"); + envModule.env.RUN_REPLICATION_ENABLED = "0"; + envModule.env.RUN_REPLICATION_CLICKHOUSE_URL = "http://localhost:8123"; + + const repository = createRunsRepository({ + clickhouse: mockClickhouse, + prisma: mockPrisma, + }); + + expect(repository).toBeDefined(); + expect(repository.listRuns).toBeDefined(); + }); + + it("should default to postgres when RUN_REPLICATION_CLICKHOUSE_URL is not set", async () => { + const envModule = await import("~/env.server"); + envModule.env.RUN_REPLICATION_ENABLED = "1"; + envModule.env.RUN_REPLICATION_CLICKHOUSE_URL = undefined; + + const repository = createRunsRepository({ + clickhouse: mockClickhouse, + prisma: mockPrisma, + }); + + expect(repository).toBeDefined(); + expect(repository.listRuns).toBeDefined(); + }); + + it("should default to clickhouse when both conditions are met", async () => { + const envModule = await import("~/env.server"); + envModule.env.RUN_REPLICATION_ENABLED = "1"; + envModule.env.RUN_REPLICATION_CLICKHOUSE_URL = "http://localhost:8123"; + + const repository = createRunsRepository({ + clickhouse: mockClickhouse, + prisma: mockPrisma, + }); + + expect(repository).toBeDefined(); + expect(repository.listRuns).toBeDefined(); + }); + + it("should create a valid RunsRepository instance", () => { + const repository = createRunsRepository({ + clickhouse: mockClickhouse, + prisma: mockPrisma, + }); + + expect(repository.listRuns).toBeDefined(); + expect(repository.countRuns).toBeDefined(); + expect(typeof repository.listRuns).toBe("function"); + expect(typeof repository.countRuns).toBe("function"); + }); +}); + From e362f079d53349ca4dfed3faa95604a2be2bc570 Mon Sep 17 00:00:00 2001 From: LeoKaynan Date: Sat, 11 Oct 2025 00:03:12 -0300 Subject: [PATCH 3/4] refactor(webapp): enhance runsRepositoryFactory to accept options for replication and ClickHouse configuration --- .../services/runsRepositoryFactory.server.ts | 9 ++- .../webapp/test/runsRepositoryFactory.test.ts | 58 ++++++++----------- 2 files changed, 30 insertions(+), 37 deletions(-) diff --git a/apps/webapp/app/services/runsRepositoryFactory.server.ts b/apps/webapp/app/services/runsRepositoryFactory.server.ts index ae2cdbf1a9..23e4d7e237 100644 --- a/apps/webapp/app/services/runsRepositoryFactory.server.ts +++ b/apps/webapp/app/services/runsRepositoryFactory.server.ts @@ -6,16 +6,19 @@ import { RunsRepository } from "./runsRepository/runsRepository.server"; export function createRunsRepository(options: { clickhouse: ClickHouse; prisma: PrismaClient; + isReplicationEnabled?: boolean; + isClickHouseConfigured?: boolean; }): RunsRepository { - const isReplicationEnabled = env.RUN_REPLICATION_ENABLED === "1"; - const isClickHouseConfigured = !!env.RUN_REPLICATION_CLICKHOUSE_URL; + const isReplicationEnabled = options.isReplicationEnabled ?? env.RUN_REPLICATION_ENABLED === "1"; + const isClickHouseConfigured = options.isClickHouseConfigured ?? !!env.RUN_REPLICATION_CLICKHOUSE_URL; const defaultRepository = isReplicationEnabled && isClickHouseConfigured ? "clickhouse" : "postgres"; return new RunsRepository({ - ...options, + clickhouse: options.clickhouse, + prisma: options.prisma, defaultRepository, }); } diff --git a/apps/webapp/test/runsRepositoryFactory.test.ts b/apps/webapp/test/runsRepositoryFactory.test.ts index ba2fbc040f..f93f6f807b 100644 --- a/apps/webapp/test/runsRepositoryFactory.test.ts +++ b/apps/webapp/test/runsRepositoryFactory.test.ts @@ -1,7 +1,15 @@ -import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; +import { describe, it, expect, vi } from "vitest"; + vi.mock("~/env.server", () => ({ - env: {}, + env: { + RUN_REPLICATION_ENABLED: "0", + RUN_REPLICATION_CLICKHOUSE_URL: undefined, + DATABASE_CONNECTION_LIMIT: 10, + DATABASE_POOL_TIMEOUT: 60, + DATABASE_CONNECTION_TIMEOUT: 20, + }, })); + vi.mock("~/db.server", () => ({ prisma: {}, $replica: {}, @@ -12,69 +20,51 @@ import type { ClickHouse } from "@internal/clickhouse"; import type { PrismaClient } from "@trigger.dev/database"; describe("createRunsRepository", () => { - let mockClickhouse: ClickHouse; - let mockPrisma: PrismaClient; - let originalEnv: Record; - - beforeEach(async () => { - const envModule = await import("~/env.server"); - originalEnv = { ...envModule.env }; - - mockClickhouse = {} as ClickHouse; - mockPrisma = {} as PrismaClient; - }); - - afterEach(async () => { - const envModule = await import("~/env.server"); - Object.assign(envModule.env, originalEnv); - }); - - it("should default to postgres when RUN_REPLICATION_ENABLED is not set", async () => { - const envModule = await import("~/env.server"); - envModule.env.RUN_REPLICATION_ENABLED = "0"; - envModule.env.RUN_REPLICATION_CLICKHOUSE_URL = "http://localhost:8123"; + const mockClickhouse = {} as ClickHouse; + const mockPrisma = {} as PrismaClient; + it("should default to postgres when replication is disabled", () => { const repository = createRunsRepository({ clickhouse: mockClickhouse, prisma: mockPrisma, + isReplicationEnabled: false, + isClickHouseConfigured: true, }); expect(repository).toBeDefined(); expect(repository.listRuns).toBeDefined(); }); - it("should default to postgres when RUN_REPLICATION_CLICKHOUSE_URL is not set", async () => { - const envModule = await import("~/env.server"); - envModule.env.RUN_REPLICATION_ENABLED = "1"; - envModule.env.RUN_REPLICATION_CLICKHOUSE_URL = undefined; - + it("should default to postgres when ClickHouse is not configured", () => { const repository = createRunsRepository({ clickhouse: mockClickhouse, prisma: mockPrisma, + isReplicationEnabled: true, + isClickHouseConfigured: false, }); expect(repository).toBeDefined(); expect(repository.listRuns).toBeDefined(); }); - it("should default to clickhouse when both conditions are met", async () => { - const envModule = await import("~/env.server"); - envModule.env.RUN_REPLICATION_ENABLED = "1"; - envModule.env.RUN_REPLICATION_CLICKHOUSE_URL = "http://localhost:8123"; - + it("should default to clickhouse when both conditions are met", () => { const repository = createRunsRepository({ clickhouse: mockClickhouse, prisma: mockPrisma, + isReplicationEnabled: true, + isClickHouseConfigured: true, }); expect(repository).toBeDefined(); expect(repository.listRuns).toBeDefined(); }); - it("should create a valid RunsRepository instance", () => { + it("should create a valid RunsRepository instance with all required methods", () => { const repository = createRunsRepository({ clickhouse: mockClickhouse, prisma: mockPrisma, + isReplicationEnabled: false, + isClickHouseConfigured: false, }); expect(repository.listRuns).toBeDefined(); From 6244106b45ca5282b01cab1b73b021ac3bff6cc1 Mon Sep 17 00:00:00 2001 From: LeoKaynan Date: Sat, 11 Oct 2025 00:34:00 -0300 Subject: [PATCH 4/4] refactor(webapp): replace runsRepositoryFactory with direct RunsRepository instantiation --- .../v3/CreateBulkActionPresenter.server.ts | 4 +- .../v3/NextRunListPresenter.server.ts | 4 +- .../runsRepository/runsRepository.server.ts | 7 +- .../services/runsRepositoryFactory.server.ts | 25 ------ .../v3/services/bulk/BulkActionV2.server.ts | 6 +- .../webapp/test/runsRepositoryFactory.test.ts | 76 ------------------- 6 files changed, 13 insertions(+), 109 deletions(-) delete mode 100644 apps/webapp/app/services/runsRepositoryFactory.server.ts delete mode 100644 apps/webapp/test/runsRepositoryFactory.test.ts diff --git a/apps/webapp/app/presenters/v3/CreateBulkActionPresenter.server.ts b/apps/webapp/app/presenters/v3/CreateBulkActionPresenter.server.ts index 2b1ce987ff..acf511f0f5 100644 --- a/apps/webapp/app/presenters/v3/CreateBulkActionPresenter.server.ts +++ b/apps/webapp/app/presenters/v3/CreateBulkActionPresenter.server.ts @@ -1,7 +1,7 @@ import { type PrismaClient } from "@trigger.dev/database"; import { CreateBulkActionSearchParams } from "~/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.bulkaction"; import { clickhouseClient } from "~/services/clickhouseInstance.server"; -import { createRunsRepository } from "~/services/runsRepositoryFactory.server"; +import { RunsRepository } from "~/services/runsRepository/runsRepository.server"; import { getRunFiltersFromRequest } from "../RunFilters.server"; import { BasePresenter } from "./basePresenter.server"; @@ -24,7 +24,7 @@ export class CreateBulkActionPresenter extends BasePresenter { Object.fromEntries(new URL(request.url).searchParams) ); - const runsRepository = createRunsRepository({ + const runsRepository = new RunsRepository({ clickhouse: clickhouseClient, prisma: this._replica as PrismaClient, }); diff --git a/apps/webapp/app/presenters/v3/NextRunListPresenter.server.ts b/apps/webapp/app/presenters/v3/NextRunListPresenter.server.ts index 37442df515..2375ea161a 100644 --- a/apps/webapp/app/presenters/v3/NextRunListPresenter.server.ts +++ b/apps/webapp/app/presenters/v3/NextRunListPresenter.server.ts @@ -9,7 +9,7 @@ import { type Direction } from "~/components/ListPagination"; import { timeFilters } from "~/components/runs/v3/SharedFilters"; import { findDisplayableEnvironment } from "~/models/runtimeEnvironment.server"; import { getAllTaskIdentifiers } from "~/models/task.server"; -import { createRunsRepository } from "~/services/runsRepositoryFactory.server"; +import { RunsRepository } from "~/services/runsRepository/runsRepository.server"; import { machinePresetFromRun } from "~/v3/machinePresets.server"; import { ServiceValidationError } from "~/v3/services/baseService.server"; import { isCancellableRunStatus, isFinalRunStatus, isPendingRunStatus } from "~/v3/taskStatus"; @@ -153,7 +153,7 @@ export class NextRunListPresenter { throw new ServiceValidationError("No environment found"); } - const runsRepository = createRunsRepository({ + const runsRepository = new RunsRepository({ clickhouse: this.clickhouse, prisma: this.replica as PrismaClient, }); diff --git a/apps/webapp/app/services/runsRepository/runsRepository.server.ts b/apps/webapp/app/services/runsRepository/runsRepository.server.ts index 7b9bf2a368..d869bd743f 100644 --- a/apps/webapp/app/services/runsRepository/runsRepository.server.ts +++ b/apps/webapp/app/services/runsRepository/runsRepository.server.ts @@ -13,6 +13,7 @@ import { startActiveSpan } from "~/v3/tracer.server"; import { logger } from "../logger.server"; import { ClickHouseRunsRepository } from "./clickhouseRunsRepository.server"; import { PostgresRunsRepository } from "./postgresRunsRepository.server"; +import { env } from "~/env.server"; export type RunsRepositoryOptions = { clickhouse: ClickHouse; @@ -130,7 +131,11 @@ export class RunsRepository implements IRunsRepository { ) { this.clickHouseRunsRepository = new ClickHouseRunsRepository(options); this.postgresRunsRepository = new PostgresRunsRepository(options); - this.defaultRepository = options.defaultRepository ?? "clickhouse"; + this.defaultRepository = + options.defaultRepository ?? + ((env.RUN_REPLICATION_ENABLED === "1" && env.RUN_REPLICATION_CLICKHOUSE_URL) + ? "clickhouse" + : "postgres"); this.logger = options.logger ?? logger; } diff --git a/apps/webapp/app/services/runsRepositoryFactory.server.ts b/apps/webapp/app/services/runsRepositoryFactory.server.ts deleted file mode 100644 index 23e4d7e237..0000000000 --- a/apps/webapp/app/services/runsRepositoryFactory.server.ts +++ /dev/null @@ -1,25 +0,0 @@ -import type { ClickHouse } from "@internal/clickhouse"; -import type { PrismaClient } from "@trigger.dev/database"; -import { env } from "~/env.server"; -import { RunsRepository } from "./runsRepository/runsRepository.server"; - -export function createRunsRepository(options: { - clickhouse: ClickHouse; - prisma: PrismaClient; - isReplicationEnabled?: boolean; - isClickHouseConfigured?: boolean; -}): RunsRepository { - const isReplicationEnabled = options.isReplicationEnabled ?? env.RUN_REPLICATION_ENABLED === "1"; - const isClickHouseConfigured = options.isClickHouseConfigured ?? !!env.RUN_REPLICATION_CLICKHOUSE_URL; - - const defaultRepository = isReplicationEnabled && isClickHouseConfigured - ? "clickhouse" - : "postgres"; - - return new RunsRepository({ - clickhouse: options.clickhouse, - prisma: options.prisma, - defaultRepository, - }); -} - diff --git a/apps/webapp/app/v3/services/bulk/BulkActionV2.server.ts b/apps/webapp/app/v3/services/bulk/BulkActionV2.server.ts index d3259bb343..98b6079c10 100644 --- a/apps/webapp/app/v3/services/bulk/BulkActionV2.server.ts +++ b/apps/webapp/app/v3/services/bulk/BulkActionV2.server.ts @@ -8,10 +8,10 @@ import { import { getRunFiltersFromRequest } from "~/presenters/RunFilters.server"; import { type CreateBulkActionPayload } from "~/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.bulkaction"; import { clickhouseClient } from "~/services/clickhouseInstance.server"; -import { createRunsRepository } from "~/services/runsRepositoryFactory.server"; import { parseRunListInputOptions, type RunListInputFilters, + RunsRepository, } from "~/services/runsRepository/runsRepository.server"; import { BaseService } from "../baseService.server"; import { commonWorker } from "~/v3/commonWorker.server"; @@ -38,7 +38,7 @@ export class BulkActionService extends BaseService { const filters = await getFilters(payload, request); // Count the runs that will be affected by the bulk action - const runsRepository = createRunsRepository({ + const runsRepository = new RunsRepository({ clickhouse: clickhouseClient, prisma: this._replica as PrismaClient, }); @@ -145,7 +145,7 @@ export class BulkActionService extends BaseService { ...(group.params && typeof group.params === "object" ? group.params : {}), }); - const runsRepository = createRunsRepository({ + const runsRepository = new RunsRepository({ clickhouse: clickhouseClient, prisma: this._replica as PrismaClient, }); diff --git a/apps/webapp/test/runsRepositoryFactory.test.ts b/apps/webapp/test/runsRepositoryFactory.test.ts deleted file mode 100644 index f93f6f807b..0000000000 --- a/apps/webapp/test/runsRepositoryFactory.test.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { describe, it, expect, vi } from "vitest"; - -vi.mock("~/env.server", () => ({ - env: { - RUN_REPLICATION_ENABLED: "0", - RUN_REPLICATION_CLICKHOUSE_URL: undefined, - DATABASE_CONNECTION_LIMIT: 10, - DATABASE_POOL_TIMEOUT: 60, - DATABASE_CONNECTION_TIMEOUT: 20, - }, -})); - -vi.mock("~/db.server", () => ({ - prisma: {}, - $replica: {}, -})); - -import { createRunsRepository } from "~/services/runsRepositoryFactory.server"; -import type { ClickHouse } from "@internal/clickhouse"; -import type { PrismaClient } from "@trigger.dev/database"; - -describe("createRunsRepository", () => { - const mockClickhouse = {} as ClickHouse; - const mockPrisma = {} as PrismaClient; - - it("should default to postgres when replication is disabled", () => { - const repository = createRunsRepository({ - clickhouse: mockClickhouse, - prisma: mockPrisma, - isReplicationEnabled: false, - isClickHouseConfigured: true, - }); - - expect(repository).toBeDefined(); - expect(repository.listRuns).toBeDefined(); - }); - - it("should default to postgres when ClickHouse is not configured", () => { - const repository = createRunsRepository({ - clickhouse: mockClickhouse, - prisma: mockPrisma, - isReplicationEnabled: true, - isClickHouseConfigured: false, - }); - - expect(repository).toBeDefined(); - expect(repository.listRuns).toBeDefined(); - }); - - it("should default to clickhouse when both conditions are met", () => { - const repository = createRunsRepository({ - clickhouse: mockClickhouse, - prisma: mockPrisma, - isReplicationEnabled: true, - isClickHouseConfigured: true, - }); - - expect(repository).toBeDefined(); - expect(repository.listRuns).toBeDefined(); - }); - - it("should create a valid RunsRepository instance with all required methods", () => { - const repository = createRunsRepository({ - clickhouse: mockClickhouse, - prisma: mockPrisma, - isReplicationEnabled: false, - isClickHouseConfigured: false, - }); - - expect(repository.listRuns).toBeDefined(); - expect(repository.countRuns).toBeDefined(); - expect(typeof repository.listRuns).toBe("function"); - expect(typeof repository.countRuns).toBe("function"); - }); -}); -