import { PbProfileRepository } from '@app/infrastructure/profiles/pb-profile.repository'; import { Profile } from '@app/domain/profiles/profile.model'; import { ProfileDTO } from '@app/domain/profiles/dto/create-profile.dto'; import PocketBase from 'pocketbase'; import { mockProfilePaginated, mockProfiles } from '@app/testing/profile.mock'; jest.mock('pocketbase'); // on mock le module PocketBase describe('PbProfileRepository', () => { let repo: PbProfileRepository; let mockPocketBase: any; let mockCollection: any; beforeEach(() => { // Création d’un faux client PocketBase avec les méthodes dont on a besoin mockCollection = { getList: jest.fn(), getFirstListItem: jest.fn(), create: jest.fn(), update: jest.fn(), }; mockPocketBase = { collection: jest.fn().mockReturnValue(mockCollection), }; (PocketBase as jest.Mock).mockImplementation(() => mockPocketBase); // on récupère une "collection" simulée mockCollection = mockPocketBase.collection('profiles'); repo = new PbProfileRepository(); }); // ------------------------------------------ // 🔹 TEST : list() // ------------------------------------------ it('devrait appeler pb.collection("profiles").getList() avec un tri par profession', (done) => { mockCollection.getList.mockResolvedValue(mockProfilePaginated); const options = { expand: 'utilisateur,secteur', filter: "utilisateur.verified = true && utilisateur.name != '' && profession != 'Profession non renseignée' && secteur != ''", sort: '-created', }; repo.list().subscribe((result) => { expect(mockPocketBase.collection).toHaveBeenCalledWith('profiles'); expect(mockCollection.getList).toHaveBeenCalledWith(undefined, undefined, options); expect(result).toEqual(mockProfilePaginated); done(); }); }); // ------------------------------------------ // 🔹 TEST : getByUserId() // ------------------------------------------ it('devrait appeler pb.collection("profiles").getFirstListItem() avec le bon filtre utilisateur', () => { const userId = '1'; mockCollection.getFirstListItem.mockResolvedValue(mockProfiles); repo.getByUserId(userId).subscribe((result) => { expect(mockCollection.getFirstListItem).toHaveBeenCalledWith(`utilisateur="${userId}"`); expect(result).toEqual(mockProfiles[0]); }); }); // ------------------------------------------ // 🔹 TEST : create() // ------------------------------------------ it('devrait appeler pb.collection("profiles").create() avec le DTO du profil', (done) => { const dto: ProfileDTO = { utilisateur: 'user', profession: 'DevOps', reseaux: {} as JSON, }; const fakeResponse: Profile = { id: '123', created: '2025-01-01T00:00:00Z', updated: '2025-01-01T00:00:00Z', estVerifier: true, secteur: 'Création', bio: 'Bio', cv: '', projets: [], apropos: 'À propos...', ...dto, }; mockCollection.create.mockResolvedValue(fakeResponse); repo.create(dto).subscribe((result) => { expect(mockCollection.create).toHaveBeenCalledWith(dto); expect(result).toEqual(fakeResponse); done(); }); }); // ------------------------------------------ // 🔹 TEST : update() // ------------------------------------------ it('devrait appeler pb.collection("profiles").update() avec ID et données partielle', (done) => { const id = '1'; const data = { bio: 'Bio mise à jour' }; const updatedProfile: Profile = { id, created: '', updated: '', profession: 'Dev', utilisateur: 'user_001', estVerifier: false, secteur: 'Tech', reseaux: {} as JSON, bio: data.bio!, cv: '', projets: [], apropos: '', }; mockCollection.update.mockResolvedValue(updatedProfile); repo.update(id, data).subscribe((result) => { expect(mockCollection.update).toHaveBeenCalledWith(id, data); expect(result.bio).toBe('Bio mise à jour'); done(); }); }); });