From 1754b96b180c301bc8513535609bca05ed41695d Mon Sep 17 00:00:00 2001 From: Marcel Date: Tue, 28 Apr 2026 16:58:26 +0200 Subject: [PATCH] test(stammbaum): happy-path controller tests for GET /api/network, GET inferred-rels, POST+DELETE relationships Co-Authored-By: Claude Sonnet 4.6 --- .../RelationshipControllerTest.java | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/backend/src/test/java/org/raddatz/familienarchiv/relationship/RelationshipControllerTest.java b/backend/src/test/java/org/raddatz/familienarchiv/relationship/RelationshipControllerTest.java index b4ef3303..b1b35f5e 100644 --- a/backend/src/test/java/org/raddatz/familienarchiv/relationship/RelationshipControllerTest.java +++ b/backend/src/test/java/org/raddatz/familienarchiv/relationship/RelationshipControllerTest.java @@ -3,6 +3,10 @@ package org.raddatz.familienarchiv.relationship; import org.junit.jupiter.api.Test; import org.raddatz.familienarchiv.config.SecurityConfig; import org.raddatz.familienarchiv.exception.ErrorCode; +import org.raddatz.familienarchiv.relationship.dto.InferredRelationshipWithPersonDTO; +import org.raddatz.familienarchiv.relationship.dto.NetworkDTO; +import org.raddatz.familienarchiv.relationship.dto.PersonNodeDTO; +import org.raddatz.familienarchiv.relationship.dto.RelationshipDTO; import org.raddatz.familienarchiv.security.PermissionAspect; import org.raddatz.familienarchiv.service.CustomUserDetailsService; import org.raddatz.familienarchiv.service.UserService; @@ -15,10 +19,12 @@ import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.web.servlet.MockMvc; +import java.util.List; import java.util.Optional; import java.util.UUID; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.when; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @@ -82,4 +88,64 @@ class RelationshipControllerTest { .content("{\"familyMember\":true}")) .andExpect(status().isForbidden()); } + + @Test + @WithMockUser(username = "testuser", authorities = {"READ_ALL"}) + void getNetwork_returns200_with_NetworkDTO_for_authenticated_user() throws Exception { + PersonNodeDTO node = new PersonNodeDTO(PERSON_ID, "Alice Müller", 1900, 1980, true); + RelationshipDTO edge = new RelationshipDTO( + UUID.randomUUID(), PERSON_ID, OTHER_ID, + "Alice Müller", 1900, 1980, + "Bob Müller", 1930, null, + RelationType.PARENT_OF, null, null, null); + when(relationshipService.getFamilyNetwork()) + .thenReturn(new NetworkDTO(List.of(node), List.of(edge))); + + mockMvc.perform(get("/api/network")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.nodes[0].displayName").value("Alice Müller")) + .andExpect(jsonPath("$.edges[0].relationType").value("PARENT_OF")); + } + + @Test + @WithMockUser(username = "testuser", authorities = {"READ_ALL"}) + void getInferredRelationships_returns200_with_list_for_authenticated_user() throws Exception { + PersonNodeDTO relative = new PersonNodeDTO(OTHER_ID, "Bob Müller", 1930, null, true); + InferredRelationshipWithPersonDTO inferred = + new InferredRelationshipWithPersonDTO(relative, "Großvater", 2); + when(relationshipService.getInferredRelationships(PERSON_ID)) + .thenReturn(List.of(inferred)); + + mockMvc.perform(get("/api/persons/{id}/inferred-relationships", PERSON_ID)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$[0].label").value("Großvater")) + .andExpect(jsonPath("$[0].hops").value(2)); + } + + @Test + @WithMockUser(username = "testuser", authorities = {"WRITE_ALL"}) + void addRelationship_returns201_with_RelationshipDTO_for_WRITE_ALL_user() throws Exception { + RelationshipDTO created = new RelationshipDTO( + UUID.randomUUID(), PERSON_ID, OTHER_ID, + "Alice Müller", null, null, + "Bob Müller", null, null, + RelationType.PARENT_OF, null, null, null); + when(relationshipService.addRelationship(any(), any())).thenReturn(created); + + mockMvc.perform(post("/api/persons/{id}/relationships", PERSON_ID) + .contentType(MediaType.APPLICATION_JSON) + .content("{\"relatedPersonId\":\"" + OTHER_ID + "\",\"relationType\":\"PARENT_OF\"}")) + .andExpect(status().isCreated()) + .andExpect(jsonPath("$.relationType").value("PARENT_OF")); + } + + @Test + @WithMockUser(username = "testuser", authorities = {"WRITE_ALL"}) + void deleteRelationship_returns204_for_WRITE_ALL_user() throws Exception { + UUID relId = UUID.randomUUID(); + doNothing().when(relationshipService).deleteRelationship(any(), any()); + + mockMvc.perform(delete("/api/persons/{id}/relationships/{relId}", PERSON_ID, relId)) + .andExpect(status().isNoContent()); + } }