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.
This commit is contained in:
Bernhard Müller 2026-07-23 14:22:35 +02:00
parent cab55c4abb
commit 344587486a
2 changed files with 130 additions and 0 deletions

View File

@ -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);
});
});
});

View File

@ -60,6 +60,10 @@ export class MembershipService {
return this.http.get<PendingMembershipResponse[]>(`${this.apiUrl}/admin/memberships/pending`);
}
getAllMemberships(): Observable<PendingMembershipResponse[]> {
return this.http.get<PendingMembershipResponse[]>(`${this.apiUrl}/admin/memberships`);
}
approveMembership(id: string): Observable<void> {
return this.http.put<void>(`${this.apiUrl}/admin/memberships/${id}/approve`, {});
}