import { describe, it, expect, vi, beforeEach } from 'vitest'; import { TestBed } from '@angular/core/testing'; import { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; import { of, throwError } from 'rxjs'; import { taskResolver } from '@app/features/tasks/data-access/resolvers/task-resolver'; import { TaskService } from '@app/features/tasks/data-access/services/task'; import { TaskStore } from '@app/features/tasks/data-access/store/task-store'; import { TaskBuilder } from '@tests/builders/task.builder'; describe('taskResolver', () => { let taskService: TaskService; let taskStore: TaskStore; beforeEach(() => { taskService = { getById: vi.fn(), } as unknown as TaskService; taskStore = { setSelectedTask: vi.fn(), } as unknown as TaskStore; TestBed.configureTestingModule({ providers: [ { provide: TaskService, useValue: taskService }, { provide: TaskStore, useValue: taskStore }, ], }); }); function createRoute(id: string | null) { return { paramMap: { get: vi.fn().mockReturnValue(id), }, } as unknown as ActivatedRouteSnapshot; } it('should return null when no id param', async () => { const route = createRoute(null); const result = await TestBed.runInInjectionContext(() => taskResolver(route, {} as RouterStateSnapshot)); expect(result).toBeNull(); }); it('should return task and set it in store when id exists', async () => { const task = new TaskBuilder().withId('task-1').build(); vi.mocked(taskService.getById).mockReturnValue(of(task)); const route = createRoute('task-1'); const result = await TestBed.runInInjectionContext(() => taskResolver(route, {} as RouterStateSnapshot)); expect(result).toEqual(task); expect(taskStore.setSelectedTask).toHaveBeenCalledWith(task); }); it('should return null when service throws error', async () => { vi.mocked(taskService.getById).mockReturnValue(throwError(() => new Error('Not found'))); const route = createRoute('task-1'); const result = await TestBed.runInInjectionContext(() => taskResolver(route, {} as RouterStateSnapshot)); expect(result).toBeNull(); }); });