Files
ulitka/src/modules/comment/application/use-cases/watch-issue-comments/watch-issue-comments.use-case.spec.ts
T
vadim 5cfc8986d7
Gitea Actions Demo / Deploy (push) Successful in 1m34s
prettier
2026-10-01 12:04:21 +03:00

43 lines
2.0 KiB
TypeScript

import { beforeEach, describe, expect, it, vi } from 'vitest';
import type { IIssueRepository } from '../../../../issue/domain/repositories/issue.repository.interface.js';
import { IssueNotFoundException } from '../../../../issue/domain/exceptions/issue-not-found.exception.js';
import { CommentEventsService, type CommentEvent } from '../../services/comment-events.service.js';
import { CommentApplicationMapper } from '../../mappers/comment-application.mapper.js';
import { WatchIssueCommentsUseCase } from './watch-issue-comments.use-case.js';
import { WatchIssueCommentsQuery } from './watch-issue-comments.query.js';
import { buildComment, buildIssue, mockIssueRepository } from '../test-helpers.js';
const dtoForIssue = (issueId: number) =>
CommentApplicationMapper.toDto(buildComment({ id: `comment-of-${issueId}`, issueId }), new Map());
describe('WatchIssueCommentsUseCase', () => {
let issueRepository: IIssueRepository;
let commentEventsService: CommentEventsService;
let useCase: WatchIssueCommentsUseCase;
beforeEach(() => {
issueRepository = mockIssueRepository();
commentEventsService = new CommentEventsService();
useCase = new WatchIssueCommentsUseCase(issueRepository, commentEventsService);
});
it('streams only events of the requested issue', async () => {
vi.mocked(issueRepository.findById).mockResolvedValue(buildIssue());
const received: CommentEvent[] = [];
const events$ = await useCase.execute(new WatchIssueCommentsQuery(1, 'user-1'));
events$.subscribe((event) => received.push(event));
commentEventsService.emit('comment.created', dtoForIssue(1));
commentEventsService.emit('comment.created', dtoForIssue(2));
expect(received.map((event) => event.comment.id)).toEqual(['comment-of-1']);
});
it('throws IssueNotFoundException when the issue is not visible to the user', async () => {
vi.mocked(issueRepository.findById).mockResolvedValue(null);
await expect(useCase.execute(new WatchIssueCommentsQuery(1, 'user-2'))).rejects.toThrow(IssueNotFoundException);
});
});