import type { DatabaseInit } from "../../src/domain/ports/database-init.port.js"; import type { DependencyStore } from "../../src/domain/ports/dependency-store.port.js"; import type { JournalRepository } from "../../src/domain/ports/journal-repository.port.js"; import type { MilestoneStore } from "../../src/domain/ports/milestone-store.port.js"; import type { ProjectStore } from "../../src/domain/ports/project-store.port.js"; import type { ReviewStore } from "../../src/domain/ports/review-store.port.js"; import type { SessionStore } from "../../src/domain/ports/session-store.port.js"; import type { SliceDependencyStore } from "../../src/domain/ports/slice-dependency-store.port.js"; import type { SliceStore } from "../../src/domain/ports/slice-store.port.js"; import type { TaskStore } from "../../src/domain/ports/task-store.port.js"; import type { TransactionRunner } from "../../src/domain/ports/transaction-runner.port.js"; import type { Result } from "@tff/core"; /** * Helper to create a mock result that satisfies the Result type */ export function ok(data: T): Result { return { ok: true, data } as Result; } export function okVoid(): Result { return { ok: true, data: undefined } as Result; } export function err(error: E): Result { return { ok: false, error } as Result; } /** * Create a minimal mock SliceStore for testing. * Methods can be overridden in individual tests with vi.fn(). */ export function createMockSliceStore(): Partial { return { createSlice: vi.fn(), getSlice: vi.fn(), getSliceByNumbers: vi.fn(), listSlices: vi.fn(), updateSlice: vi.fn(), transitionSlice: vi.fn(), }; } /** * Create a minimal mock MilestoneStore for testing. */ export function createMockMilestoneStore(): Partial { return { createMilestone: vi.fn(), getMilestone: vi.fn(), getMilestoneByNumber: vi.fn(), listMilestones: vi.fn(), updateMilestone: vi.fn(), closeMilestone: vi.fn(), }; } /** * Create a minimal mock TaskStore for testing. */ export function createMockTaskStore(): Partial { return { createTask: vi.fn(), getTask: vi.fn(), listTasks: vi.fn(), updateTask: vi.fn(), claimTask: vi.fn(), closeTask: vi.fn(), listReadyTasks: vi.fn(), listStaleClaims: vi.fn(), getExecutorsForSlice: vi.fn(), }; } /** * Create a minimal mock ProjectStore for testing. */ export function createMockProjectStore(): Partial { return { getProject: vi.fn(), saveProject: vi.fn(), }; } /** * Create a minimal mock DependencyStore for testing. */ export function createMockDependencyStore(): Partial { return { addDependency: vi.fn(), removeDependency: vi.fn(), getDependencies: vi.fn(), }; } /** * Create a minimal mock SliceDependencyStore for testing. */ export function createMockSliceDependencyStore(): Partial { return { addSliceDependency: vi.fn(), removeSliceDependency: vi.fn(), getSliceDependencies: vi.fn(), }; } /** * Create a minimal mock SessionStore for testing. */ export function createMockSessionStore(): Partial { return { getSession: vi.fn(), saveSession: vi.fn(), }; } /** * Create a minimal mock ReviewStore for testing. */ export function createMockReviewStore(): Partial { return { recordReview: vi.fn(), getLatestReview: vi.fn(), listReviews: vi.fn(), }; } /** * Create a minimal mock JournalRepository for testing. */ export function createMockJournalRepository(): Partial { return { append: vi.fn(), readAll: vi.fn(), readSince: vi.fn(), count: vi.fn(), }; } /** * Create a minimal mock DatabaseInit + TransactionRunner for testing. * Includes a pass-through transaction() so withTransaction() works against it. */ export function createMockDatabaseInit(): Partial & TransactionRunner { return { init: vi.fn(), transaction: (fn: () => T): T => fn(), }; } import { vi } from "vitest"; import type { StateStores } from "../../src/infrastructure/adapters/sqlite/create-state-stores.js"; /** * Create a complete mock StateStores object for testing. * All stores are partial mocks with vi.fn() stubs. */ export function createMockStateStores(): StateStores { return { db: createMockDatabaseInit() as DatabaseInit & TransactionRunner, projectStore: createMockProjectStore() as ProjectStore, milestoneStore: createMockMilestoneStore() as MilestoneStore, sliceStore: createMockSliceStore() as SliceStore, taskStore: createMockTaskStore() as TaskStore, dependencyStore: createMockDependencyStore() as DependencyStore, sliceDependencyStore: createMockSliceDependencyStore() as SliceDependencyStore, sessionStore: createMockSessionStore() as SessionStore, reviewStore: createMockReviewStore() as ReviewStore, journalRepository: createMockJournalRepository() as JournalRepository, }; }