From 8605d4c4f16ab33626823d741307fee1ddc25ef8 Mon Sep 17 00:00:00 2001 From: Michael Hoennig Date: Thu, 4 Aug 2022 09:26:01 +0200 Subject: [PATCH] PackageController+Repository with name search option --- .../hs/hscustomer/CustomerController.java | 3 +- .../hs/hscustomer/CustomerRepository.java | 2 +- .../hs/hspackage/PackageController.java | 14 +++------ .../hs/hspackage/PackageRepository.java | 8 +++-- .../CustomerControllerRestTest.java | 4 +-- .../CustomerControllerUnitTest.java | 4 +-- .../CustomerRepositoryIntegrationTest.java | 18 +++++------ .../hspackage/PackageControllerRestTest.java | 31 ++++++++++++++++--- 8 files changed, 53 insertions(+), 31 deletions(-) diff --git a/src/main/java/net/hostsharing/hsadminng/hs/hscustomer/CustomerController.java b/src/main/java/net/hostsharing/hsadminng/hs/hscustomer/CustomerController.java index e3b2362a..6088f82d 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/hscustomer/CustomerController.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/hscustomer/CustomerController.java @@ -29,11 +29,10 @@ public class CustomerController { if (assumedRoles != null && !assumedRoles.isBlank()) { context.assumeRoles(assumedRoles); } - return customerRepository.findCustomerByOptionalPrefix(prefix); + return customerRepository.findCustomerByOptionalPrefixLike(prefix); } @PostMapping(value = "/api/customers") - @ResponseStatus @Transactional public CustomerEntity addCustomer( @RequestHeader(value = "current-user") String userName, diff --git a/src/main/java/net/hostsharing/hsadminng/hs/hscustomer/CustomerRepository.java b/src/main/java/net/hostsharing/hsadminng/hs/hscustomer/CustomerRepository.java index 51ed90d9..b28dc8cf 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/hscustomer/CustomerRepository.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/hscustomer/CustomerRepository.java @@ -14,7 +14,7 @@ public interface CustomerRepository extends Repository { Optional findByUuid(UUID id); @Query("SELECT c FROM CustomerEntity c WHERE :prefix is null or c.prefix like concat(:prefix, '%')") - List findCustomerByOptionalPrefix(@Param("prefix") String prefix); + List findCustomerByOptionalPrefixLike(@Param("prefix") String prefix); CustomerEntity save(final CustomerEntity entity); diff --git a/src/main/java/net/hostsharing/hsadminng/hs/hspackage/PackageController.java b/src/main/java/net/hostsharing/hsadminng/hs/hspackage/PackageController.java index 63b071e9..9d29f53c 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/hspackage/PackageController.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/hspackage/PackageController.java @@ -2,16 +2,12 @@ package net.hostsharing.hsadminng.hs.hspackage; import net.hostsharing.hsadminng.context.Context; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestHeader; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.*; import javax.transaction.Transactional; import java.util.List; -@Controller +@RestController public class PackageController { @Autowired @@ -20,18 +16,18 @@ public class PackageController { @Autowired private PackageRepository packageRepository; - @ResponseBody @RequestMapping(value = "/api/packages", method = RequestMethod.GET) @Transactional public List listPackages( @RequestHeader(value = "current-user") String userName, - @RequestHeader(value = "assumed-roles", required = false) String assumedRoles + @RequestHeader(value = "assumed-roles", required = false) String assumedRoles, + @RequestParam(required = false) String name ) { context.setCurrentUser(userName); if (assumedRoles != null && !assumedRoles.isBlank()) { context.assumeRoles(assumedRoles); } - return packageRepository.findAll(); + return packageRepository.findAllByOptionalNameLike(name); } } diff --git a/src/main/java/net/hostsharing/hsadminng/hs/hspackage/PackageRepository.java b/src/main/java/net/hostsharing/hsadminng/hs/hspackage/PackageRepository.java index 125bd63a..bafe0882 100644 --- a/src/main/java/net/hostsharing/hsadminng/hs/hspackage/PackageRepository.java +++ b/src/main/java/net/hostsharing/hsadminng/hs/hspackage/PackageRepository.java @@ -1,9 +1,13 @@ package net.hostsharing.hsadminng.hs.hspackage; -import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.Repository; +import java.util.List; import java.util.UUID; -public interface PackageRepository extends JpaRepository { +public interface PackageRepository extends Repository { + @Query("SELECT p FROM PackageEntity p WHERE :name is null or p.name like concat(:name, '%')") + List findAllByOptionalNameLike(final String name); } diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hscustomer/CustomerControllerRestTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hscustomer/CustomerControllerRestTest.java index c646d389..7bb58746 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hscustomer/CustomerControllerRestTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hscustomer/CustomerControllerRestTest.java @@ -30,7 +30,7 @@ class CustomerControllerRestTest { void apiCustomersWillReturnAllCustomersFromRepositoryIfNoCriteriaGiven() throws Exception { // given - when(customerRepositoryMock.findCustomerByOptionalPrefix(null)).thenReturn(asList(TestCustomer.xxx, TestCustomer.yyy)); + when(customerRepositoryMock.findCustomerByOptionalPrefixLike(null)).thenReturn(asList(TestCustomer.xxx, TestCustomer.yyy)); // when mockMvc.perform(MockMvcRequestBuilders @@ -49,7 +49,7 @@ class CustomerControllerRestTest { void apiCustomersWillReturnMatchingCustomersFromRepositoryIfCriteriaGiven() throws Exception { // given - when(customerRepositoryMock.findCustomerByOptionalPrefix("x")).thenReturn(asList(TestCustomer.xxx)); + when(customerRepositoryMock.findCustomerByOptionalPrefixLike("x")).thenReturn(asList(TestCustomer.xxx)); // when mockMvc.perform(MockMvcRequestBuilders diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hscustomer/CustomerControllerUnitTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hscustomer/CustomerControllerUnitTest.java index 30541c50..3a5af0c7 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hscustomer/CustomerControllerUnitTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hscustomer/CustomerControllerUnitTest.java @@ -27,7 +27,7 @@ class CustomerControllerUnitTest { void apiCustomersWillReturnCustomersFromRepository() throws Exception { // given - when(customerRepositoryMock.findCustomerByOptionalPrefix(null)).thenReturn(asList(TestCustomer.xxx, TestCustomer.yyy)); + when(customerRepositoryMock.findCustomerByOptionalPrefixLike(null)).thenReturn(asList(TestCustomer.xxx, TestCustomer.yyy)); // when final var pacs = customerController.listCustomers("mike@hostsharing.net", null, null); @@ -42,7 +42,7 @@ class CustomerControllerUnitTest { void findAllWithAssumedCustomerAdminRole() throws Exception { // given - when(customerRepositoryMock.findCustomerByOptionalPrefix(null)).thenReturn(singletonList(TestCustomer.yyy)); + when(customerRepositoryMock.findCustomerByOptionalPrefixLike(null)).thenReturn(singletonList(TestCustomer.yyy)); // when final var pacs = customerController.listCustomers("mike@hostsharing.net", "customer#yyy.admin", null); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hscustomer/CustomerRepositoryIntegrationTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hscustomer/CustomerRepositoryIntegrationTest.java index 7c510b0d..75691819 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hscustomer/CustomerRepositoryIntegrationTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hscustomer/CustomerRepositoryIntegrationTest.java @@ -104,7 +104,7 @@ class CustomerRepositoryIntegrationTest { currentUser("mike@hostsharing.net"); // when - final var result = customerRepository.findCustomerByOptionalPrefix(null); + final var result = customerRepository.findCustomerByOptionalPrefixLike(null); // then exactlyTheseCustomersAreReturned(result, "aaa", "aab", "aac"); @@ -117,7 +117,7 @@ class CustomerRepositoryIntegrationTest { assumedRoles("global#hostsharing.admin"); // when - final var result = customerRepository.findCustomerByOptionalPrefix(null); + final var result = customerRepository.findCustomerByOptionalPrefixLike(null); then: exactlyTheseCustomersAreReturned(result, "aaa", "aab", "aac"); @@ -129,7 +129,7 @@ class CustomerRepositoryIntegrationTest { currentUser("admin@aaa.example.com"); // when: - final var result = customerRepository.findCustomerByOptionalPrefix(null); + final var result = customerRepository.findCustomerByOptionalPrefixLike(null); // then: exactlyTheseCustomersAreReturned(result, "aaa"); @@ -140,7 +140,7 @@ class CustomerRepositoryIntegrationTest { currentUser("admin@aaa.example.com"); assumedRoles("package#aaa00.admin"); - final var result = customerRepository.findCustomerByOptionalPrefix(null); + final var result = customerRepository.findCustomerByOptionalPrefixLike(null); exactlyTheseCustomersAreReturned(result, "aaa"); } @@ -154,7 +154,7 @@ class CustomerRepositoryIntegrationTest { // when final var attempt = attempt( em, - () -> customerRepository.findCustomerByOptionalPrefix(null)); + () -> customerRepository.findCustomerByOptionalPrefixLike(null)); // then attempt.assertExceptionWithRootCauseMessage( @@ -168,7 +168,7 @@ class CustomerRepositoryIntegrationTest { final var attempt = attempt( em, - () -> customerRepository.findCustomerByOptionalPrefix(null)); + () -> customerRepository.findCustomerByOptionalPrefixLike(null)); attempt.assertExceptionWithRootCauseMessage( JpaSystemException.class, @@ -183,7 +183,7 @@ class CustomerRepositoryIntegrationTest { final var attempt = attempt( em, - () -> customerRepository.findCustomerByOptionalPrefix(null)); + () -> customerRepository.findCustomerByOptionalPrefixLike(null)); attempt.assertExceptionWithRootCauseMessage( JpaSystemException.class, @@ -201,7 +201,7 @@ class CustomerRepositoryIntegrationTest { currentUser("mike@hostsharing.net"); // when - final var result = customerRepository.findCustomerByOptionalPrefix("aab"); + final var result = customerRepository.findCustomerByOptionalPrefixLike("aab"); // then exactlyTheseCustomersAreReturned(result, "aab"); @@ -213,7 +213,7 @@ class CustomerRepositoryIntegrationTest { currentUser("admin@aaa.example.com"); // when: - final var result = customerRepository.findCustomerByOptionalPrefix("aab"); + final var result = customerRepository.findCustomerByOptionalPrefixLike("aab"); // then: exactlyTheseCustomersAreReturned(result); diff --git a/src/test/java/net/hostsharing/hsadminng/hs/hspackage/PackageControllerRestTest.java b/src/test/java/net/hostsharing/hsadminng/hs/hspackage/PackageControllerRestTest.java index bc7691f1..92ebd1ef 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/hspackage/PackageControllerRestTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/hspackage/PackageControllerRestTest.java @@ -9,7 +9,8 @@ import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; -import static java.util.Arrays.asList; +import java.util.List; + import static org.hamcrest.Matchers.hasSize; import static org.hamcrest.Matchers.is; import static org.mockito.Mockito.verify; @@ -28,11 +29,11 @@ class PackageControllerRestTest { PackageRepository packageRepositoryMock; @Test - void findAll() throws Exception { + void listPackagesWithoutNameParameter() throws Exception { // given - final var givenPacs = asList(TestPackage.xxx00, TestPackage.xxx01, TestPackage.xxx02); - when(packageRepositoryMock.findAll()).thenReturn(givenPacs); + final var givenPacs = List.of(TestPackage.xxx00, TestPackage.xxx01, TestPackage.xxx02); + when(packageRepositoryMock.findAllByOptionalNameLike(null)).thenReturn(givenPacs); // when final var pacs = mockMvc.perform(MockMvcRequestBuilders @@ -52,4 +53,26 @@ class PackageControllerRestTest { verify(contextMock).assumeRoles("customer#xxx.admin"); } + @Test + void listPackagesWithNameParameter() throws Exception { + + // given + final var givenPacs = List.of(TestPackage.xxx01); + when(packageRepositoryMock.findAllByOptionalNameLike("xxx01")).thenReturn(givenPacs); + + // when + final var pacs = mockMvc.perform(MockMvcRequestBuilders + .get("/api/packages?name=xxx01") + .header("current-user", "mike@hostsharing.net") + .header("assumed-roles", "customer#xxx.admin") + .accept(MediaType.APPLICATION_JSON)) + + // then + .andExpect(status().isOk()) + .andExpect(jsonPath("$", hasSize(1))) + .andExpect(jsonPath("$[0].name", is("xxx01"))); + + verify(contextMock).setCurrentUser("mike@hostsharing.net"); + verify(contextMock).assumeRoles("customer#xxx.admin"); + } }