From 344587486a2cc8c49da74236fed8fb9adbaa9e52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bernhard=20M=C3=BCller?= Date: Thu, 23 Jul 2026 14:22:35 +0200 Subject: [PATCH] feat(community): add getAllMemberships() to frontend MembershipService Add method to fetch all admin memberships via GET /api/community/admin/memberships with corresponding unit tests using Angular HttpClientTestingModule. --- .../src/app/services/membership.spec.ts | 126 ++++++++++++++++++ eeg_frontend/src/app/services/membership.ts | 4 + 2 files changed, 130 insertions(+) create mode 100644 eeg_frontend/src/app/services/membership.spec.ts diff --git a/eeg_frontend/src/app/services/membership.spec.ts b/eeg_frontend/src/app/services/membership.spec.ts new file mode 100644 index 0000000..4491f4a --- /dev/null +++ b/eeg_frontend/src/app/services/membership.spec.ts @@ -0,0 +1,126 @@ +import { TestBed } from '@angular/core/testing'; +import { provideHttpClient } from '@angular/common/http'; +import { + HttpTestingController, + provideHttpClientTesting, +} from '@angular/common/http/testing'; +import { MembershipService, PendingMembershipResponse } from './membership'; + +describe('MembershipService', () => { + let service: MembershipService; + let httpMock: HttpTestingController; + + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [provideHttpClient(), provideHttpClientTesting()], + }); + service = TestBed.inject(MembershipService); + httpMock = TestBed.inject(HttpTestingController); + }); + + afterEach(() => { + httpMock.verify(); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); + + describe('getAllMemberships', () => { + it('should return all memberships via GET /api/community/admin/memberships', () => { + const mockMemberships: PendingMembershipResponse[] = [ + { + id: '1', + userEmail: 'user1@test.at', + firstName: 'Max', + lastName: 'Mustermann', + atNumber: 'AT0000000000000000001', + communityName: 'Test EG', + priorityLevel: 1, + status: 'PENDING', + }, + { + id: '2', + userEmail: 'user2@test.at', + firstName: 'Anna', + lastName: 'Musterfrau', + atNumber: 'AT0000000000000000002', + communityName: 'Test EG', + priorityLevel: 2, + status: 'ACTIVE', + }, + ]; + + service.getAllMemberships().subscribe((result) => { + expect(result).toEqual(mockMemberships); + expect(result.length).toBe(2); + }); + + const req = httpMock.expectOne( + 'http://localhost:8080/api/community/admin/memberships', + ); + expect(req.request.method).toBe('GET'); + req.flush(mockMemberships); + }); + + it('should return an empty array when no memberships exist', () => { + service.getAllMemberships().subscribe((result) => { + expect(result).toEqual([]); + }); + + const req = httpMock.expectOne( + 'http://localhost:8080/api/community/admin/memberships', + ); + expect(req.request.method).toBe('GET'); + req.flush([]); + }); + + it('should include memberships with all status values', () => { + const mockMemberships: PendingMembershipResponse[] = [ + { + id: '1', + userEmail: 'a@test.at', + firstName: 'A', + lastName: 'B', + atNumber: 'AT001', + communityName: 'EG1', + priorityLevel: 1, + status: 'PENDING', + }, + { + id: '2', + userEmail: 'c@test.at', + firstName: 'C', + lastName: 'D', + atNumber: 'AT002', + communityName: 'EG1', + priorityLevel: 1, + status: 'ACTIVE', + }, + { + id: '3', + userEmail: 'e@test.at', + firstName: 'E', + lastName: 'F', + atNumber: 'AT003', + communityName: 'EG2', + priorityLevel: 1, + status: 'INACTIVE', + }, + ]; + + service.getAllMemberships().subscribe((result) => { + expect(result.length).toBe(3); + const statuses = result.map((m) => m.status); + expect(statuses).toContain('PENDING'); + expect(statuses).toContain('ACTIVE'); + expect(statuses).toContain('INACTIVE'); + }); + + const req = httpMock.expectOne( + 'http://localhost:8080/api/community/admin/memberships', + ); + req.flush(mockMemberships); + }); + }); +}); diff --git a/eeg_frontend/src/app/services/membership.ts b/eeg_frontend/src/app/services/membership.ts index a907293..d44614c 100644 --- a/eeg_frontend/src/app/services/membership.ts +++ b/eeg_frontend/src/app/services/membership.ts @@ -60,6 +60,10 @@ export class MembershipService { return this.http.get(`${this.apiUrl}/admin/memberships/pending`); } + getAllMemberships(): Observable { + return this.http.get(`${this.apiUrl}/admin/memberships`); + } + approveMembership(id: string): Observable { return this.http.put(`${this.apiUrl}/admin/memberships/${id}/approve`, {}); }