import { inject, injectable, type TypeToken } from "@codemation/core"; import { ApplicationTokens } from "../../applicationTokens"; import type { TestAssertionRepository } from "../../domain/runs/TestAssertionRepository"; import type { TestSuiteRunRepository } from "../../domain/runs/TestSuiteRunRepository"; import type { WorkflowRunRepository } from "../../domain/runs/WorkflowRunRepository"; import { AssertionResultGuard } from "./AssertionResultGuard"; import { TestAssertionIdFactory } from "./TestAssertionIdFactory"; import { TestSuiteRunTracker, type TestSuiteRunTrackerArgs } from "./TestSuiteRunTracker"; export const TestSuiteRunRepositoryToken = Symbol.for( "codemation.application.testing.TestSuiteRunRepository", ) as unknown as TypeToken; export const TestAssertionRepositoryToken = Symbol.for( "codemation.application.testing.TestAssertionRepository", ) as unknown as TypeToken; @injectable() export class TestSuiteRunTrackerFactory { constructor( @inject(TestSuiteRunRepositoryToken) private readonly suiteRepo: TestSuiteRunRepository, @inject(TestAssertionRepositoryToken) private readonly assertionRepo: TestAssertionRepository, @inject(ApplicationTokens.WorkflowRunRepository) private readonly runRepo: WorkflowRunRepository, @inject(TestAssertionIdFactory) private readonly assertionIdFactory: TestAssertionIdFactory, @inject(AssertionResultGuard) private readonly assertionResultGuard: AssertionResultGuard, ) {} create(args: Pick): TestSuiteRunTracker { return new TestSuiteRunTracker({ workflow: args.workflow, suiteRepo: this.suiteRepo, runRepo: this.runRepo, assertionRepo: this.assertionRepo, assertionIdFactory: this.assertionIdFactory, assertionResultGuard: this.assertionResultGuard, }); } }