From 3fbf717bd5795136bcb3f384e0cf0f765254c95c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bernhard=20M=C3=BCller?= Date: Thu, 23 Jul 2026 13:59:53 +0200 Subject: [PATCH] feat(community): add GET /admin/memberships endpoint with tests --- .../community/api/MembershipController.java | 8 ++ .../api/MembershipControllerTest.java | 107 ++++++++++++++++++ 2 files changed, 115 insertions(+) create mode 100644 eeg_backend/src/test/java/at/mueller/eeg/backend/community/api/MembershipControllerTest.java diff --git a/eeg_backend/src/main/java/at/mueller/eeg/backend/community/api/MembershipController.java b/eeg_backend/src/main/java/at/mueller/eeg/backend/community/api/MembershipController.java index b96beba..04af854 100644 --- a/eeg_backend/src/main/java/at/mueller/eeg/backend/community/api/MembershipController.java +++ b/eeg_backend/src/main/java/at/mueller/eeg/backend/community/api/MembershipController.java @@ -54,6 +54,14 @@ public class MembershipController { return ResponseEntity.ok(membershipService.getPendingMemberships()); } + @GetMapping("/admin/memberships") + @PreAuthorize("hasRole('ADMIN')") + @io.swagger.v3.oas.annotations.Operation(summary = "Alle Mitgliedschaften abrufen") + @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "Liste aller Mitgliedschaften") + public ResponseEntity> getAllMemberships() { + return ResponseEntity.ok(membershipService.getAllMemberships()); + } + @PutMapping("/admin/memberships/{id}/approve") @PreAuthorize("hasRole('ADMIN')") public ResponseEntity approveMembership(@PathVariable UUID id) { diff --git a/eeg_backend/src/test/java/at/mueller/eeg/backend/community/api/MembershipControllerTest.java b/eeg_backend/src/test/java/at/mueller/eeg/backend/community/api/MembershipControllerTest.java new file mode 100644 index 0000000..295b67c --- /dev/null +++ b/eeg_backend/src/test/java/at/mueller/eeg/backend/community/api/MembershipControllerTest.java @@ -0,0 +1,107 @@ +package at.mueller.eeg.backend.community.api; + +import at.mueller.eeg.backend.community.api.dto.PendingMembershipResponse; +import at.mueller.eeg.backend.community.service.MembershipService; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.http.ResponseEntity; + +import java.time.LocalDate; +import java.util.List; +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class MembershipControllerTest { + + @Mock + private MembershipService membershipService; + + @InjectMocks + private MembershipController membershipController; + + @Test + void getPendingMemberships() { + PendingMembershipResponse response = new PendingMembershipResponse( + UUID.randomUUID(), "user@example.com", "Max", "Mustermann", + "AT000000123456", "Test-Community", 1, "PENDING", + null, null + ); + when(membershipService.getPendingMemberships()).thenReturn(List.of(response)); + + ResponseEntity> result = membershipController.getPendingMemberships(); + + assertEquals(200, result.getStatusCode().value()); + assertEquals(1, result.getBody().size()); + assertEquals("PENDING", result.getBody().get(0).status()); + verify(membershipService).getPendingMemberships(); + } + + @Test + void getPendingMemberships_empty() { + when(membershipService.getPendingMemberships()).thenReturn(List.of()); + + ResponseEntity> result = membershipController.getPendingMemberships(); + + assertEquals(200, result.getStatusCode().value()); + assertTrue(result.getBody().isEmpty()); + } + + @Test + void getAllMemberships() { + PendingMembershipResponse pending = new PendingMembershipResponse( + UUID.randomUUID(), "pending@example.com", "Anna", "Test", + "AT000000111111", "Community A", 1, "PENDING", + null, null + ); + PendingMembershipResponse active = new PendingMembershipResponse( + UUID.randomUUID(), "active@example.com", "Bob", "Test", + "AT000000222222", "Community B", 2, "ACTIVE", + LocalDate.of(2025, 1, 15), null + ); + when(membershipService.getAllMemberships()).thenReturn(List.of(pending, active)); + + ResponseEntity> result = membershipController.getAllMemberships(); + + assertEquals(200, result.getStatusCode().value()); + assertEquals(2, result.getBody().size()); + assertEquals("PENDING", result.getBody().get(0).status()); + assertEquals("ACTIVE", result.getBody().get(1).status()); + verify(membershipService).getAllMemberships(); + } + + @Test + void getAllMemberships_empty() { + when(membershipService.getAllMemberships()).thenReturn(List.of()); + + ResponseEntity> result = membershipController.getAllMemberships(); + + assertEquals(200, result.getStatusCode().value()); + assertTrue(result.getBody().isEmpty()); + } + + @Test + void getAllMemberships_mixedStatuses() { + List mixed = List.of( + new PendingMembershipResponse(UUID.randomUUID(), "a@x.com", "A", "B", + "AT001", "C1", 1, "PENDING", null, null), + new PendingMembershipResponse(UUID.randomUUID(), "b@x.com", "C", "D", + "AT002", "C2", 1, "ACTIVE", LocalDate.of(2025, 6, 1), null), + new PendingMembershipResponse(UUID.randomUUID(), "c@x.com", "E", "F", + "AT003", "C3", 2, "INACTIVE", null, LocalDate.of(2025, 3, 1)) + ); + when(membershipService.getAllMemberships()).thenReturn(mixed); + + ResponseEntity> result = membershipController.getAllMemberships(); + + assertEquals(3, result.getBody().size()); + assertEquals("PENDING", result.getBody().get(0).status()); + assertEquals("ACTIVE", result.getBody().get(1).status()); + assertEquals("INACTIVE", result.getBody().get(2).status()); + } +}