48 lines
1.5 KiB
TypeScript
48 lines
1.5 KiB
TypeScript
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);
|
|
});
|
|
});
|