import { beforeEach, describe, expect, it, vi } from 'vitest'; import type { IIssueRepository } from '../../../domain/repositories/issue.repository.interface.js'; import { GetIssueStatsUseCase } from './get-issue-stats.use-case.js'; describe('GetIssueStatsUseCase', () => { let repository: IIssueRepository; let useCase: GetIssueStatsUseCase; beforeEach(() => { repository = { findById: vi.fn(), findByCKey: vi.fn(), findAll: vi.fn(), countByStatus: vi.fn(), create: vi.fn(), update: vi.fn(), delete: vi.fn(), }; useCase = new GetIssueStatsUseCase(repository); }); it('returns counts for every known status, including those with zero issues', async () => { vi.mocked(repository.countByStatus).mockResolvedValue([ { status: 'OPEN', count: 5 }, { status: 'DONE', count: 2 }, ]); const stats = await useCase.execute('user-1'); expect(stats.total).toBe(7); expect(stats.byStatus).toEqual([ { status: 'OPEN', label: 'Open', count: 5 }, { status: 'IN_PROGRESS', label: 'In progress', count: 0 }, { status: 'DONE', label: 'Done', count: 2 }, { status: 'CANCELLED', label: 'Cancelled', count: 0 }, ]); }); it('returns all-zero stats when there are no issues', async () => { vi.mocked(repository.countByStatus).mockResolvedValue([]); const stats = await useCase.execute('user-1'); expect(stats.total).toBe(0); expect(stats.byStatus.every((entry) => entry.count === 0)).toBe(true); }); });