refactor: move contact servicesto services folder

This commit is contained in:
2025-12-19 21:02:57 -03:00
parent 0c0f4024df
commit 08e07ab3d0
11 changed files with 35 additions and 28 deletions

View File

@@ -1,88 +0,0 @@
import { TestBed } from '@angular/core/testing';
import { Response } from '../../models/Response';
import { ContactService } from './contact.service';
import { provideHttpClient } from '@angular/common/http';
import { HttpTestingController, provideHttpClientTesting } from '@angular/common/http/testing';
import { environment } from '../../../environments/environment';
import { ContactDTO } from '../../models/ContactDTO';
describe('ContactService', () => {
let service: ContactService;
let httpTestingController: HttpTestingController;
let RES_MOCK: Response<any>;
let endpointURL = environment.apiUrl + '/contacts';
beforeEach(() => {
TestBed.configureTestingModule({
imports: [],
providers: [provideHttpClient(), provideHttpClientTesting()],
});
service = TestBed.inject(ContactService);
httpTestingController = TestBed.inject(HttpTestingController);
RES_MOCK = {
data: null,
errors: [],
message: '',
success: true,
};
});
it('should be created', () => {
expect(service).toBeTruthy();
});
it('should GET contacts from the contacts ep', () => {
const CONTACTS_MOCK = [new ContactDTO(1, 'mock1'), new ContactDTO(2, 'mock2')];
service.getAll().subscribe();
const req = httpTestingController.expectOne(endpointURL);
expect(req.request.method).toEqual('GET');
RES_MOCK.data = CONTACTS_MOCK;
req.flush(RES_MOCK);
httpTestingController.verify();
});
it('should POST contact to the contacts ep', () => {
const CONTACT_MOCK = new ContactDTO(undefined, 'mock');
service.save(CONTACT_MOCK).subscribe();
const postReq = httpTestingController.expectOne(endpointURL);
expect(postReq.request.method).toEqual('POST');
expect(postReq.request.body).toEqual(CONTACT_MOCK);
CONTACT_MOCK.id = 1;
RES_MOCK.data = CONTACT_MOCK;
postReq.flush(RES_MOCK);
const getReq = httpTestingController.expectOne(endpointURL);
expect(getReq.request.method).toEqual('GET');
RES_MOCK.data = [CONTACT_MOCK];
getReq.flush(RES_MOCK);
httpTestingController.verify();
});
it('should PUT contact with the given ID to the contacts ep ', () => {
const UPDATE_CONTACT_MOCK = new ContactDTO(1, 'mock', 'mock', 'mock');
service.update(UPDATE_CONTACT_MOCK).subscribe();
const putReq = httpTestingController.expectOne(`${endpointURL}/${UPDATE_CONTACT_MOCK.id}`);
expect(putReq.request.method).toEqual('PUT');
expect(putReq.request.body).toEqual(UPDATE_CONTACT_MOCK);
putReq.flush({
message: 'Contact updated successfully',
success: true,
});
httpTestingController.verify();
});
it('should DELETE with the given ID to the contacts ep', () => {
const ID_MOCK = 1;
service.delete(ID_MOCK).subscribe();
const deleteReq = httpTestingController.expectOne(`${endpointURL}/${ID_MOCK}`);
expect(deleteReq.request.method).toEqual('DELETE');
RES_MOCK.message = 'Contact deleted successfully';
deleteReq.flush(RES_MOCK);
const getReq = httpTestingController.expectOne(endpointURL);
expect(getReq.request.method).toEqual('GET');
RES_MOCK.data = [];
RES_MOCK.message = '';
getReq.flush(RES_MOCK);
});
});

View File

@@ -1,47 +0,0 @@
import { HttpClient } from '@angular/common/http';
import { inject, Injectable } from '@angular/core';
import { environment } from '../../../environments/environment';
import { ContactDTO } from '../../models/ContactDTO';
import { Response } from '../../models/Response';
import { BehaviorSubject, map, switchMap, tap } from 'rxjs';
@Injectable({
providedIn: 'root',
})
export class ContactService {
private readonly httpClient = inject(HttpClient);
private readonly contacts = new BehaviorSubject<ContactDTO[]>([]);
readonly contacts$ = this.contacts.asObservable();
delete(id: number) {
return this.httpClient
.delete<Response<string>>(`${environment.apiUrl}/contacts/${id}`)
.pipe(switchMap(() => this.getAll()));
}
findById(id: string) {
return this.httpClient.get<Response<ContactDTO | null>>(`${environment.apiUrl}/contacts/${id}`);
}
getAll() {
return this.httpClient
.get<Response<ContactDTO[] | null>>(environment.apiUrl + '/contacts')
.pipe(
map((response) => response.data ?? []),
tap((contacts) => this.contacts.next(contacts))
);
}
save(contact: ContactDTO) {
return this.httpClient
.post<Response<ContactDTO[] | null>>(environment.apiUrl + '/contacts', contact)
.pipe(switchMap(() => this.getAll()));
}
update(contact: ContactDTO) {
return this.httpClient.put<Response<ContactDTO[] | null>>(
`${environment.apiUrl}/contacts/${contact.id}`,
contact
);
}
}

View File

@@ -3,7 +3,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing';
import { Main } from './main';
import { STRINGS_INJECTOR } from '../../app.config';
import { strings } from '../../strings';
import { ContactService } from './contact.service';
import { ContactService } from '../../services/contact.service';
import { ContactList } from '../../components/contact-list/contact-list';
import { of } from 'rxjs';
import { ContactDTO } from '../../models/ContactDTO';
@@ -14,7 +14,7 @@ describe('Main', () => {
let component: Main;
let fixture: ComponentFixture<Main>;
let contactService: jasmine.SpyObj<ContactService>;
beforeEach(async () => {
contactService = jasmine.createSpyObj(ContactList.name, ['getAll', 'save']);
contactService.getAll.and.returnValue(of([]));
@@ -22,7 +22,7 @@ describe('Main', () => {
imports: [Main],
providers: [
{ provide: STRINGS_INJECTOR, useValue: strings },
{ provide: ContactService, useValue: contactService }
{ provide: ContactService, useValue: contactService },
],
}).compileComponents();
fixture = TestBed.createComponent(Main);
@@ -37,8 +37,10 @@ describe('Main', () => {
it('should call save on contact event', () => {
contactService.save.and.returnValue(of([]));
const saveSpy = spyOn(component, 'save').and.callThrough();
const CONTACT_MOCK = new ContactDTO()
const contactForm: ContactForm = fixture.debugElement.query(By.css('app-contact-form')).componentInstance;
const CONTACT_MOCK = new ContactDTO();
const contactForm: ContactForm = fixture.debugElement.query(
By.css('app-contact-form')
).componentInstance;
contactForm.contact.emit(CONTACT_MOCK);
expect(saveSpy).toHaveBeenCalledOnceWith(CONTACT_MOCK);
});

View File

@@ -2,7 +2,7 @@ import { Component, inject } from '@angular/core';
import { Card } from '../../components/card/card';
import { ContactForm } from '../../components/contact-form/contact-form';
import { ContactList } from '../../components/contact-list/contact-list';
import { ContactService } from './contact.service';
import { ContactService } from '../../services/contact.service';
import { ContactDTO } from '../../models/ContactDTO';
import { FormHeader } from '../../components/form-header/form-header';
import { STRINGS_INJECTOR } from '../../app.config';