import { provideHttpClient } from '@angular/common/http'; import { HttpTestingController, provideHttpClientTesting } from '@angular/common/http/testing'; import { TestBed } from '@angular/core/testing'; import { MilestonesApiService } from './milestones-api.service'; import { MilestoneEntity } from './milestones.store'; const API = '/api'; const makeMilestone = (overrides: Partial = {}): MilestoneEntity => ({ id: 1, name: 'Sprint 1', description: '', startDate: '', endDate: '', dueDate: '', issueIds: [], dependsOnIds: [], ...overrides, }); describe('MilestonesApiService', () => { let service: MilestonesApiService; let http: HttpTestingController; beforeEach(() => { TestBed.configureTestingModule({ providers: [provideHttpClient(), provideHttpClientTesting()], }); service = TestBed.inject(MilestonesApiService); http = TestBed.inject(HttpTestingController); }); afterEach(() => http.verify()); describe('getAll', () => { it('sends GET /api/milestones and returns milestones', () => { const milestones = [makeMilestone({ id: 1 }), makeMilestone({ id: 2 })]; let result: MilestoneEntity[] | undefined; service.getAll().subscribe((data) => (result = data)); const req = http.expectOne(`${API}/milestones`); expect(req.request.method).toBe('GET'); req.flush(milestones); expect(result).toEqual(milestones); }); }); describe('create', () => { it('sends POST /api/milestones with the body and returns the created milestone', () => { const body = { name: 'Sprint 2', description: '', startDate: '', endDate: '', dueDate: '', issueIds: [], dependsOnIds: [] }; const response = makeMilestone({ id: 2, name: 'Sprint 2' }); let result: MilestoneEntity | undefined; service.create(body).subscribe((data) => (result = data)); const req = http.expectOne(`${API}/milestones`); expect(req.request.method).toBe('POST'); expect(req.request.body).toEqual(body); req.flush(response); expect(result).toEqual(response); }); }); describe('update', () => { it('sends PUT /api/milestones/:id with the body and returns the updated milestone', () => { const milestone = makeMilestone({ id: 1, name: 'Updated Sprint' }); let result: MilestoneEntity | undefined; service.update(1, milestone).subscribe((data) => (result = data)); const req = http.expectOne(`${API}/milestones/1`); expect(req.request.method).toBe('PUT'); expect(req.request.body).toEqual(milestone); req.flush(milestone); expect(result).toEqual(milestone); }); }); describe('remove', () => { it('sends DELETE /api/milestones/:id and completes', () => { let completed = false; service.remove(1).subscribe({ complete: () => (completed = true) }); const req = http.expectOne(`${API}/milestones/1`); expect(req.request.method).toBe('DELETE'); req.flush(null); expect(completed).toBe(true); }); }); });