Michael Hoennig
2022-10-21 8eab3b7cd55ba45cd589f7f5e5aef95be190270c
add HsOfficeMembershipControllerRestTest and make mainDebitorUuid mandatory
1 files added
2 files modified
138 ■■■■ changed files
src/main/resources/api-definition/hs-office/hs-office-membership-schemas.yaml 2 ●●● patch | view | raw | blame | history
src/test/java/net/hostsharing/hsadminng/hs/office/membership/HsOfficeMembershipControllerAcceptanceTest.java 13 ●●●●● patch | view | raw | blame | history
src/test/java/net/hostsharing/hsadminng/hs/office/membership/HsOfficeMembershipControllerRestTest.java 123 ●●●●● patch | view | raw | blame | history
src/main/resources/api-definition/hs-office/hs-office-membership-schemas.yaml
@@ -70,6 +70,6 @@
                    $ref: '#/components/schemas/HsOfficeReasonForTermination'
            required:
                - partnerUuid
                - debitorUuid
                - mainDebitorUuid
                - validFrom
            additionalProperties: false
src/test/java/net/hostsharing/hsadminng/hs/office/membership/HsOfficeMembershipControllerAcceptanceTest.java
@@ -154,19 +154,6 @@
            assertThat(newUserUuid).isNotNull();
            assertThat(membershipRepo.findByUuid(newUserUuid)).isPresent();
        }
        // TODO.test: move validation tests to a ...WebMvcTest
        @Test
        void globalAdmin_canNotAddMembershipWhenDebitorUuidIsMissing() {
        }
        @Test
        void globalAdmin_canNotAddMembership_ifPartnerDoesNotExist() {
        }
        @Test
        void globalAdmin_canNotAddMembership_ifPersonDoesNotExist() {
        }
    }
    @Nested
src/test/java/net/hostsharing/hsadminng/hs/office/membership/HsOfficeMembershipControllerRestTest.java
New file
@@ -0,0 +1,123 @@
package net.hostsharing.hsadminng.hs.office.membership;
import net.hostsharing.hsadminng.context.Context;
import net.hostsharing.hsadminng.hs.office.coopassets.HsOfficeCoopAssetsTransactionRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.http.MediaType;
import org.springframework.orm.jpa.JpaObjectRetrievalFailureException;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import javax.persistence.EntityManager;
import javax.persistence.EntityNotFoundException;
import java.util.UUID;
import static org.hamcrest.Matchers.is;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@WebMvcTest(HsOfficeMembershipController.class)
public class HsOfficeMembershipControllerRestTest {
    @Autowired
    MockMvc mockMvc;
    @MockBean
    Context contextMock;
    @MockBean
    EntityManager em;
    @MockBean
    HsOfficeCoopAssetsTransactionRepository coopAssetsTransactionRepo;
    @MockBean
    HsOfficeMembershipRepository membershipRepo;
    @Test
    void respondBadRequest_ifPartnerUuidIsMissing() throws Exception {
        // when
        mockMvc.perform(MockMvcRequestBuilders
                        .post("/api/hs/office/memberships")
                        .header("current-user", "superuser-alex@hostsharing.net")
                        .contentType(MediaType.APPLICATION_JSON)
                        .content("""
                                   {
                                       "partnerUuid": null,
                                       "mainDebitorUuid": "%s",
                                       "memberNumber": 20001,
                                       "validFrom": "2022-10-13"
                                     }
                                """.formatted(UUID.randomUUID()))
                        .accept(MediaType.APPLICATION_JSON))
                // then
                .andExpect(status().is4xxClientError())
                .andExpect(jsonPath("status", is(400)))
                .andExpect(jsonPath("error", is("Bad Request")))
                .andExpect(jsonPath("message", is("[partnerUuid must not be null but is \"null\"]")));
    }
    @Test
    void respondBadRequest_ifDebitorUuidIsMissing() throws Exception {
        // when
        mockMvc.perform(MockMvcRequestBuilders
                        .post("/api/hs/office/memberships")
                        .header("current-user", "superuser-alex@hostsharing.net")
                        .contentType(MediaType.APPLICATION_JSON)
                        .content("""
                                   {
                                       "partnerUuid": "%s",
                                       "mainDebitorUuid": null,
                                       "memberNumber": 20001,
                                       "validFrom": "2022-10-13"
                                     }
                                """.formatted(UUID.randomUUID()))
                        .accept(MediaType.APPLICATION_JSON))
                // then
                .andExpect(status().is4xxClientError())
                .andExpect(jsonPath("status", is(400)))
                .andExpect(jsonPath("error", is("Bad Request")))
                .andExpect(jsonPath("message", is("[mainDebitorUuid must not be null but is \"null\"]")));
    }
    @Test
    void respondBadRequest_ifAnyGivenUuidCannotBeResolved() throws Exception {
        // given
        when(membershipRepo.save(any())).thenThrow(
                new JpaObjectRetrievalFailureException(
                        new EntityNotFoundException(
                                // same would happen with HsOfficePartnerEntity which could not be resolved
                                "Unable to find net.hostsharing.hsadminng.hs.office.debitor.HsOfficeDebitorEntity with id ...")));
        // when
        mockMvc.perform(MockMvcRequestBuilders
                        .post("/api/hs/office/memberships")
                        .header("current-user", "superuser-alex@hostsharing.net")
                        .contentType(MediaType.APPLICATION_JSON)
                        .content("""
                                   {
                                       "partnerUuid": "%s",
                                       "mainDebitorUuid": "%s",
                                       "memberNumber": 20001,
                                       "validFrom": "2022-10-13"
                                     }
                                """.formatted(UUID.randomUUID(), UUID.randomUUID()))
                        .accept(MediaType.APPLICATION_JSON))
                // then
                .andExpect(status().is4xxClientError())
                .andExpect(jsonPath("status", is(400)))
                .andExpect(jsonPath("error", is("Bad Request")))
                .andExpect(jsonPath("message", is("Unable to find Debitor with uuid ...")));
    }
}