fix(application): resolve typecheck errors in estimate-operations tests
CI / Architecture Guardrails (push) Successful in 2m57s
CI / Typecheck (push) Failing after 5m27s
CI / Build (push) Has been skipped
CI / E2E Tests (push) Has been skipped
CI / Fresh-Linux Docker Deploy (push) Has been skipped
CI / Assistant Split Regression (push) Failing after 5m49s
CI / Lint (push) Successful in 6m55s
CI / Unit Tests (push) Failing after 4m37s
CI / Release Images (push) Has been skipped

- Import EstimateStatus enum instead of using "DRAFT" string literal
- Type BASE_VERSION fixture explicitly so lockedAt accepts Date | null
- Add non-null assertion on mock.calls[0] to satisfy strict types
- Reorder id/spread in version fixture to avoid duplicate property warning
This commit is contained in:
2026-04-12 18:04:21 +02:00
parent 561c7bf42d
commit b9c2e0cd2e
@@ -1,4 +1,5 @@
import { describe, expect, it, vi } from "vitest"; import { describe, expect, it, vi } from "vitest";
import { EstimateStatus } from "@capakraken/shared";
import { createEstimate } from "../use-cases/estimate/create-estimate.js"; import { createEstimate } from "../use-cases/estimate/create-estimate.js";
import { cloneEstimate } from "../use-cases/estimate/clone-estimate.js"; import { cloneEstimate } from "../use-cases/estimate/clone-estimate.js";
import { listEstimates } from "../use-cases/estimate/list-estimates.js"; import { listEstimates } from "../use-cases/estimate/list-estimates.js";
@@ -12,7 +13,24 @@ import {
// Shared fixtures // Shared fixtures
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
const BASE_VERSION = { const BASE_VERSION: {
id: string;
estimateId: string;
versionNumber: number;
label: string;
status: string;
lockedAt: Date | null;
notes: string | null;
projectSnapshot: Record<string, unknown>;
createdAt: Date;
updatedAt: Date;
assumptions: never[];
scopeItems: never[];
demandLines: never[];
resourceSnapshots: never[];
metrics: never[];
exports: never[];
} = {
id: "ver_1", id: "ver_1",
estimateId: "est_1", estimateId: "est_1",
versionNumber: 1, versionNumber: 1,
@@ -84,7 +102,7 @@ describe("createEstimate", () => {
projectId: "proj_1", projectId: "proj_1",
name: "My Estimate", name: "My Estimate",
baseCurrency: "USD", baseCurrency: "USD",
status: "DRAFT" as const, status: EstimateStatus.DRAFT,
assumptions: [], assumptions: [],
scopeItems: [], scopeItems: [],
demandLines: [], demandLines: [],
@@ -105,7 +123,7 @@ describe("createEstimate", () => {
const db = makeDb(); const db = makeDb();
await createEstimate(db as never, minimalInput); await createEstimate(db as never, minimalInput);
const createData = db.estimate.create.mock.calls[0][0].data; const createData = db.estimate.create.mock.calls[0]![0].data;
expect(createData.projectId).toBe("proj_1"); expect(createData.projectId).toBe("proj_1");
}); });
@@ -175,7 +193,7 @@ describe("cloneEstimate", () => {
const result = await cloneEstimate(db as never, { sourceEstimateId: "est_src" }); const result = await cloneEstimate(db as never, { sourceEstimateId: "est_src" });
expect(db.estimate.create).toHaveBeenCalledOnce(); expect(db.estimate.create).toHaveBeenCalledOnce();
const createData = db.estimate.create.mock.calls[0][0].data; const createData = db.estimate.create.mock.calls[0]![0].data;
expect(createData.name).toBe("Copy of Original"); expect(createData.name).toBe("Copy of Original");
expect(result.id).toBe("est_clone"); expect(result.id).toBe("est_clone");
}); });
@@ -184,7 +202,7 @@ describe("cloneEstimate", () => {
const db = makeDb(); const db = makeDb();
await cloneEstimate(db as never, { sourceEstimateId: "est_src", name: "Custom Clone" }); await cloneEstimate(db as never, { sourceEstimateId: "est_src", name: "Custom Clone" });
const createData = db.estimate.create.mock.calls[0][0].data; const createData = db.estimate.create.mock.calls[0]![0].data;
expect(createData.name).toBe("Custom Clone"); expect(createData.name).toBe("Custom Clone");
}); });
@@ -245,7 +263,7 @@ describe("listEstimates", () => {
const db = makeDb(); const db = makeDb();
await listEstimates(db as never, { projectId: "proj_1" }); await listEstimates(db as never, { projectId: "proj_1" });
const where = db.estimate.findMany.mock.calls[0][0].where; const where = db.estimate.findMany.mock.calls[0]![0].where;
expect(where.projectId).toBe("proj_1"); expect(where.projectId).toBe("proj_1");
}); });
@@ -253,7 +271,7 @@ describe("listEstimates", () => {
const db = makeDb([]); const db = makeDb([]);
await listEstimates(db as never, { status: "APPROVED" as never }); await listEstimates(db as never, { status: "APPROVED" as never });
const where = db.estimate.findMany.mock.calls[0][0].where; const where = db.estimate.findMany.mock.calls[0]![0].where;
expect(where.status).toBe("APPROVED"); expect(where.status).toBe("APPROVED");
}); });
@@ -261,7 +279,7 @@ describe("listEstimates", () => {
const db = makeDb(); const db = makeDb();
await listEstimates(db as never, { query: "alpha" }); await listEstimates(db as never, { query: "alpha" });
const where = db.estimate.findMany.mock.calls[0][0].where; const where = db.estimate.findMany.mock.calls[0]![0].where;
expect(where.OR).toBeDefined(); expect(where.OR).toBeDefined();
expect(where.OR).toHaveLength(2); expect(where.OR).toHaveLength(2);
}); });
@@ -431,14 +449,12 @@ describe("createEstimateRevision", () => {
) { ) {
const txMock = { const txMock = {
estimateVersion: { estimateVersion: {
create: vi create: vi.fn().mockResolvedValue({
.fn() ...BASE_VERSION,
.mockResolvedValue({ id: "ver_new",
id: "ver_new", versionNumber: 2,
...BASE_VERSION, status: "WORKING",
versionNumber: 2, }),
status: "WORKING",
}),
}, },
estimateAssumption: { createMany: vi.fn().mockResolvedValue({}) }, estimateAssumption: { createMany: vi.fn().mockResolvedValue({}) },
scopeItem: { create: vi.fn().mockResolvedValue({ id: "scope_new" }) }, scopeItem: { create: vi.fn().mockResolvedValue({ id: "scope_new" }) },