From 87992d55164930a0d041f5cd74fe1bb2f0dcb564 Mon Sep 17 00:00:00 2001 From: Steve Davis Date: Thu, 7 Jul 2022 08:02:16 +0100 Subject: [PATCH] Initial commit --- java/pom.xml | 1202 +++++++++-------- .../api/v1/impl/QueryMenuControllerImpl.java | 21 +- .../v2/impl/QueryMenuControllerImplV2.java | 11 +- .../menu/mappers/CategoryMapper.java | 13 + .../menu/mappers/DomainToDtoMapper.java | 56 - .../workloads/menu/mappers/ItemMapper.java | 13 + .../workloads/menu/mappers/MenuMapper.java | 14 + .../mappers/SearchMenuResultItemMapper.java | 14 + .../v1/impl/QueryMenuControllerImplTest.java | 34 +- .../impl/QueryMenuControllerImplV2Test.java | 26 +- .../DomainToDtoMapperMapstructTest.java | 200 +++ .../menu/mappers/DomainToDtoMapperTest.java | 33 +- 12 files changed, 959 insertions(+), 678 deletions(-) create mode 100644 java/src/main/java/com/amido/stacks/workloads/menu/mappers/CategoryMapper.java delete mode 100644 java/src/main/java/com/amido/stacks/workloads/menu/mappers/DomainToDtoMapper.java create mode 100644 java/src/main/java/com/amido/stacks/workloads/menu/mappers/ItemMapper.java create mode 100644 java/src/main/java/com/amido/stacks/workloads/menu/mappers/MenuMapper.java create mode 100644 java/src/main/java/com/amido/stacks/workloads/menu/mappers/SearchMenuResultItemMapper.java create mode 100644 java/src/test/java/com/amido/stacks/workloads/menu/mappers/DomainToDtoMapperMapstructTest.java diff --git a/java/pom.xml b/java/pom.xml index 7a40985a..8b0ea8e9 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -1,603 +1,625 @@ - 4.0.0 - - + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + 2.6.1 + + + + + com.amido.stacks.workloads + stacks-api + 1.0.0 + + stacks-api + Demo project for Java + + + 1.0.0 + 1.0.0-SNAPSHOT + + 11 + 1.18.0 + 1.6.1 + 2.6.4 + 3.6.0 + 2.13.0 + 4.1.0 + 1.18.22 + 2.2 + 1.7.3 + 0.8.7 + 3.0.0-M5 + test + 5.8.2 + 3.8.1 + 3.8.1 + 6.5.0 + 1.4.1 + 1.0.11 + 1.2.8 + 2.4.7 + 1.81 + 4.0.10 + + 4.3.2 + 9.9 + 4.2.7 + 2.17.0 + 1.5.2.Final + + 2.13 + 3.1.2 + 9.2 + 4.2.3 + 4.5.2 + 3.0.0 + + 3.5.24 + + + + + JavaMenuAPI + http + localhost + 9000 + + + + + + snapshots + default-maven-virtual + https://amidostacks.jfrog.io/artifactory/default-maven-virtual + + + + + + + io.projectreactor + reactor-bom + 2020.0.14 + pom + + + + + + + + + com.amido.stacks.modules + stacks-core-api + ${stacks.core.api.version} + + + + com.amido.stacks.modules + stacks-core-commons + ${stacks.core.commons.version} + + + + org.springframework.boot + spring-boot-starter-actuator + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springdoc + springdoc-openapi-ui + ${org.springdoc-openapi.version} + + + + org.springdoc + springdoc-openapi-data-rest + ${org.springdoc-openapi.version} + + + net.minidev + json-smart + + + + + + org.apache.logging.log4j + log4j-api + ${log4j-version} + + + + com.fasterxml.jackson.core + jackson-core + ${jackson.version} + + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + + com.fasterxml.jackson.core + jackson-annotations + ${jackson.version} + + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + ${jackson.version} + + + + com.azure.spring + azure-spring-boot + ${azure.springboot.version} + + + net.minidev + json-smart + + + + + + com.microsoft.azure + applicationinsights-spring-boot-starter + ${applicationinsights.version} + runtime + + + + com.microsoft.azure + applicationinsights-logging-logback + ${applicationinsights.version} + runtime + + + ch.qos.logback + logback-core + + + + + + ch.qos.logback + logback-core + ${ch.qos.logback.logback-core.version} + + + + net.minidev + json-smart + ${net.minidev.json-smart-version} + + + + com.beust + jcommander + ${com.beust.jcommander-version} + + + + + com.auth0 + auth0-spring-security-api + ${auth0-spring-security-api.version} + + + + org.projectlombok + lombok + ${lombok.version} + provided + + + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.vintage + junit-vintage-engine + + + junit + junit + + + com.vaadin.external.google + android-json + + + + + + org.junit.jupiter + junit-jupiter-api + ${junit-jupiter.version} + test + + + + org.junit.jupiter + junit-jupiter-engine + ${junit-jupiter.version} + test + + + + org.mockito + mockito-junit-jupiter + ${mockito.version} + test + + + + org.hamcrest + hamcrest + ${hamcrest.version} + test + + + + nl.jqno.equalsverifier + equalsverifier + ${equals-verifier.version} + test + + + + au.com.dius + pact-jvm-provider-spring + ${au.com.dius.pact-jvm-provider-spring.version} + test + + + + au.com.dius.pact + consumer + ${au.com.dius.pact.consumer-version} + test + + + + org.pitest + pitest-parent + ${pitest.version} + pom + + + + com.nimbusds + oauth2-oidc-sdk + ${com.nimbusds.oauth2-oidc-sdk-version} + runtime + + + + + + + + org.apache.maven.plugins + maven-surefire-report-plugin + ${maven-surefire-plugin.version} + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 11 + 11 + + + org.projectlombok + lombok + ${lombok.version} + + + + org.projectlombok + lombok-mapstruct-binding + 0.2.0 + + + + org.mapstruct + mapstruct-processor + ${org.mapstruct.version} + + + true + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + + default-test + + ${maven-surefire-phase} + + + + org.springframework.boot - spring-boot-starter-parent - 2.6.1 - - - - - com.amido.stacks.workloads - stacks-api - 1.0.0 - - stacks-api - Demo project for Java - - - 1.0.0 - - 11 - 1.18.0 - 1.6.1 - 2.6.4 - 3.6.0 - 2.13.0 - 4.1.0 - 1.18.22 - 2.2 - 1.7.3 - 0.8.7 - 3.0.0-M5 - test - 5.8.2 - 3.8.1 - 3.8.1 - 6.5.0 - 1.4.1 - 1.0.11 - 1.2.8 - 2.4.7 - 1.81 - 4.0.10 - 4.3.2 - 9.9 - 4.2.7 - 2.17.0 - - 2.13 - 3.1.2 - 9.2 - 4.2.3 - 4.5.2 - 3.0.0 - - 3.5.24 - - - - - JavaMenuAPI - http - localhost - 9000 - - - - - - snapshots - default-maven-virtual - https://amidostacks.jfrog.io/artifactory/default-maven-virtual - - - - + spring-boot-maven-plugin + + + org.jacoco + jacoco-maven-plugin + ${jacoco.version} + + + **/AuthControllerImpl* + **/ApplicationConfig* + + + + + + prepare-agent + + + + report + prepare-package + + report + + + + default-check + + check + + + + + BUNDLE + + + COMPLEXITY + COVEREDRATIO + 0.00 + + + + + + + + + + au.com.dius.pact.provider + maven + ${au.com.dius.pact.provider.maven-version} + + ${pact.broker.url} + ${pact.broker.token} + + true + + + + + ${pact.api.name} + ${pact.api.protocol} + ${pact.api.host} + ${pact.api.port} + + + + + + + integration-test + + verify + + + + + + com.coveo + fmt-maven-plugin + ${fmt-maven-plugin.version} + + true + true + .*\.java + + false + false + + + + + org.apache.maven.plugins + maven-checkstyle-plugin + ${maven-checkstyle-plugin.version} - - io.projectreactor - reactor-bom - 2020.0.14 - pom - + + + com.puppycrawl.tools + checkstyle + ${puppycrawl-tools-checkstyle.version} + - - - - - - - com.amido.stacks.modules - stacks-core-api - ${stacks.core.api.version} - - - - org.springframework.boot - spring-boot-starter-actuator - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springdoc - springdoc-openapi-ui - ${org.springdoc-openapi.version} - - - - org.springdoc - springdoc-openapi-data-rest - ${org.springdoc-openapi.version} - - - net.minidev - json-smart - - - - - - org.apache.logging.log4j - log4j-api - ${log4j-version} - - - - com.fasterxml.jackson.core - jackson-core - ${jackson.version} - - - - com.fasterxml.jackson.core - jackson-databind - ${jackson.version} - - - - com.fasterxml.jackson.core - jackson-annotations - ${jackson.version} - - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - ${jackson.version} - - - - com.azure.spring - azure-spring-boot - ${azure.springboot.version} - - - net.minidev - json-smart - - - - - - com.microsoft.azure - applicationinsights-spring-boot-starter - ${applicationinsights.version} - runtime - - - - com.microsoft.azure - applicationinsights-logging-logback - ${applicationinsights.version} - runtime - - - ch.qos.logback - logback-core - - - - - - ch.qos.logback - logback-core - ${ch.qos.logback.logback-core.version} - - - - net.minidev - json-smart - ${net.minidev.json-smart-version} - - - - com.beust - jcommander - ${com.beust.jcommander-version} - - - - - com.auth0 - auth0-spring-security-api - ${auth0-spring-security-api.version} - - - - org.projectlombok - lombok - ${lombok.version} - provided - - - - - - org.springframework.boot - spring-boot-starter-test - test - - - org.junit.vintage - junit-vintage-engine - - - junit - junit - - - com.vaadin.external.google - android-json - - - - - - org.junit.jupiter - junit-jupiter-api - ${junit-jupiter.version} - test - - - - org.junit.jupiter - junit-jupiter-engine - ${junit-jupiter.version} - test - - - - org.mockito - mockito-junit-jupiter - ${mockito.version} - test - - - - org.hamcrest - hamcrest - ${hamcrest.version} - test - - - - nl.jqno.equalsverifier - equalsverifier - ${equals-verifier.version} - test - - - - au.com.dius - pact-jvm-provider-spring - ${au.com.dius.pact-jvm-provider-spring.version} - test - - - - au.com.dius.pact - consumer - ${au.com.dius.pact.consumer-version} - test - - - + + google_checks.xml + UTF-8 + true + true + false + + + + validate + validate + + + + + com.github.spotbugs + spotbugs-maven-plugin + ${spotbugs-maven-plugin.version} + + + + com.github.spotbugs + spotbugs + ${spotbugs.version} + + + + + org.pitest + pitest-maven + ${pitest.version} + + org.pitest - pitest-parent - ${pitest.version} - pom - - - - com.nimbusds - oauth2-oidc-sdk - ${com.nimbusds.oauth2-oidc-sdk-version} - runtime - - - - - + pitest-junit5-plugin + 0.15 + + + + + pitest + verify + + mutationCoverage + + + + + 15 + target/pitHistory.txt + target/pitHistory.txt + false + + STRONGER + + + XML + HTML + + + + + + + + + owasp-dependency-check + - - org.apache.maven.plugins - maven-surefire-report-plugin - ${maven-surefire-plugin.version} - + + org.owasp + dependency-check-maven + ${owasp-dependency-check-plugin.version} + + + + check + + + + - - - + + + + test + + true + + spring.profiles.active + test + + + + + local + + + + src/main/resources/local + + + src/main/resources + + + + + + update-permissions + + + !windows + + + - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - 11 - 11 - - - org.projectlombok - lombok - ${lombok.version} - - - true - - - - org.apache.maven.plugins - maven-surefire-plugin - ${maven-surefire-plugin.version} - - - default-test - - ${maven-surefire-phase} - - - - - org.springframework.boot - spring-boot-maven-plugin - - - org.jacoco - jacoco-maven-plugin - ${jacoco.version} - - - **/AuthControllerImpl* - **/ApplicationConfig* - - - - - - prepare-agent - - - - report - prepare-package - - report - - - - default-check - - check - - - - - BUNDLE - - - COMPLEXITY - COVEREDRATIO - 0.00 - - - - - - - - - - au.com.dius.pact.provider - maven - ${au.com.dius.pact.provider.maven-version} - - ${pact.broker.url} - ${pact.broker.token} - - true - - - - - ${pact.api.name} - ${pact.api.protocol} - ${pact.api.host} - ${pact.api.port} - - - - - - - integration-test - - verify - - - - - - com.coveo - fmt-maven-plugin - ${fmt-maven-plugin.version} - - true - true - .*\.java - - false - false - - - - - org.apache.maven.plugins - maven-checkstyle-plugin - ${maven-checkstyle-plugin.version} - - - - com.puppycrawl.tools - checkstyle - ${puppycrawl-tools-checkstyle.version} - - - - google_checks.xml - UTF-8 - true - true - false - - - - validate - validate - - - - - com.github.spotbugs - spotbugs-maven-plugin - ${spotbugs-maven-plugin.version} - - - - com.github.spotbugs - spotbugs - ${spotbugs.version} - - - - - org.pitest - pitest-maven - ${pitest.version} - - - org.pitest - pitest-junit5-plugin - 0.15 - - - - - pitest - verify - - mutationCoverage - - - + + org.codehaus.mojo + exec-maven-plugin + ${exec-maven-plugin.version} + + + Add execution rigths on bash scripts + process-resources + + exec + - 15 - target/pitHistory.txt - target/pitHistory.txt - false - - STRONGER - - - XML - HTML - + chmod + + 755 + ${project.basedir}/mvnw + - + + + - - - - - owasp-dependency-check - - - - org.owasp - dependency-check-maven - ${owasp-dependency-check-plugin.version} - - - - check - - - - - - - - - test - - true - - spring.profiles.active - test - - - - - local - - - - src/main/resources/local - - - src/main/resources - - - - - - update-permissions - - - !windows - - - - - - org.codehaus.mojo - exec-maven-plugin - ${exec-maven-plugin.version} - - - Add execution rigths on bash scripts - process-resources - - exec - - - chmod - - 755 - ${project.basedir}/mvnw - - - - - - - - - + + + diff --git a/java/src/main/java/com/amido/stacks/workloads/menu/api/v1/impl/QueryMenuControllerImpl.java b/java/src/main/java/com/amido/stacks/workloads/menu/api/v1/impl/QueryMenuControllerImpl.java index 99db4098..a478dae7 100644 --- a/java/src/main/java/com/amido/stacks/workloads/menu/api/v1/impl/QueryMenuControllerImpl.java +++ b/java/src/main/java/com/amido/stacks/workloads/menu/api/v1/impl/QueryMenuControllerImpl.java @@ -6,7 +6,8 @@ import com.amido.stacks.workloads.menu.domain.Category; import com.amido.stacks.workloads.menu.domain.Item; import com.amido.stacks.workloads.menu.domain.Menu; -import com.amido.stacks.workloads.menu.mappers.DomainToDtoMapper; +import com.amido.stacks.workloads.menu.mappers.MenuMapper; +import com.amido.stacks.workloads.menu.mappers.SearchMenuResultItemMapper; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -14,6 +15,7 @@ import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RestController; @@ -23,18 +25,13 @@ public class QueryMenuControllerImpl implements QueryMenuController { Logger logger = LoggerFactory.getLogger(QueryMenuControllerImpl.class); - private DomainToDtoMapper mapper; + @Autowired private MenuMapper menuMapper; - public QueryMenuControllerImpl(DomainToDtoMapper mapper) { - this.mapper = mapper; - } + @Autowired private SearchMenuResultItemMapper searchMenuResultItemMapper; @Override public ResponseEntity searchMenu( - final String searchTerm, - final UUID restaurantId, - final Integer pageSize, - final Integer pageNumber) { + String searchTerm, UUID restaurantId, Integer pageSize, Integer pageNumber) { List menuList = new ArrayList<>(); @@ -62,12 +59,12 @@ public ResponseEntity searchMenu( pageSize, pageNumber, menuList.stream() - .map(m -> mapper.toSearchMenuResultItem(m)) + .map(m -> searchMenuResultItemMapper.toDto(m)) .collect(Collectors.toList()))); } @Override - public ResponseEntity getMenu(final UUID id, final String correlationId) { + public ResponseEntity getMenu(UUID id, String correlationId) { final String restaurantId = "58a1df85-6bdc-412a-a118-0f0e394c1342"; final String categoryId = "2c43dbda-7d4d-46fb-b246-bec2bd348ca1"; final String itemId = "7e46a698-080b-45e6-a529-2c196d00791c"; @@ -79,6 +76,6 @@ public ResponseEntity getMenu(final UUID id, final String correlationId new Category(categoryId, "cat name", "cat description", Arrays.asList(item)); menu.addOrUpdateCategory(category); - return ResponseEntity.ok(mapper.toMenuDto(menu)); + return ResponseEntity.ok(menuMapper.toDto(menu)); } } diff --git a/java/src/main/java/com/amido/stacks/workloads/menu/api/v2/impl/QueryMenuControllerImplV2.java b/java/src/main/java/com/amido/stacks/workloads/menu/api/v2/impl/QueryMenuControllerImplV2.java index 8116148e..a4d88422 100644 --- a/java/src/main/java/com/amido/stacks/workloads/menu/api/v2/impl/QueryMenuControllerImplV2.java +++ b/java/src/main/java/com/amido/stacks/workloads/menu/api/v2/impl/QueryMenuControllerImplV2.java @@ -3,20 +3,17 @@ import com.amido.stacks.workloads.menu.api.v1.dto.response.MenuDTO; import com.amido.stacks.workloads.menu.api.v2.QueryMenuControllerV2; import com.amido.stacks.workloads.menu.domain.Menu; -import com.amido.stacks.workloads.menu.mappers.DomainToDtoMapper; +import com.amido.stacks.workloads.menu.mappers.MenuMapper; import java.util.ArrayList; import java.util.UUID; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RestController; @RestController public class QueryMenuControllerImplV2 implements QueryMenuControllerV2 { - private DomainToDtoMapper mapper; - - public QueryMenuControllerImplV2(DomainToDtoMapper mapper) { - this.mapper = mapper; - } + @Autowired private MenuMapper menuMapper; @Override public ResponseEntity getMenu(UUID id, String correlationId) { @@ -26,6 +23,6 @@ public ResponseEntity getMenu(UUID id, String correlationId) { new Menu( id.toString(), restaurantId, "0 Menu", "0 Menu Description", new ArrayList<>(), true); - return ResponseEntity.ok(mapper.toMenuDto(menu)); + return ResponseEntity.ok(menuMapper.toDto(menu)); } } diff --git a/java/src/main/java/com/amido/stacks/workloads/menu/mappers/CategoryMapper.java b/java/src/main/java/com/amido/stacks/workloads/menu/mappers/CategoryMapper.java new file mode 100644 index 00000000..e4172ee0 --- /dev/null +++ b/java/src/main/java/com/amido/stacks/workloads/menu/mappers/CategoryMapper.java @@ -0,0 +1,13 @@ +package com.amido.stacks.workloads.menu.mappers; + +import com.amido.stacks.core.mapping.BaseMapper; +import com.amido.stacks.workloads.menu.api.v1.dto.response.CategoryDTO; +import com.amido.stacks.workloads.menu.domain.Category; +import org.mapstruct.Mapper; +import org.mapstruct.NullValueCheckStrategy; + +@Mapper( + componentModel = "spring", + uses = {ItemMapper.class}, + nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS) +public interface CategoryMapper extends BaseMapper {} diff --git a/java/src/main/java/com/amido/stacks/workloads/menu/mappers/DomainToDtoMapper.java b/java/src/main/java/com/amido/stacks/workloads/menu/mappers/DomainToDtoMapper.java deleted file mode 100644 index 49d87a47..00000000 --- a/java/src/main/java/com/amido/stacks/workloads/menu/mappers/DomainToDtoMapper.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.amido.stacks.workloads.menu.mappers; - -import com.amido.stacks.workloads.menu.api.v1.dto.response.CategoryDTO; -import com.amido.stacks.workloads.menu.api.v1.dto.response.ItemDTO; -import com.amido.stacks.workloads.menu.api.v1.dto.response.MenuDTO; -import com.amido.stacks.workloads.menu.api.v1.dto.response.SearchMenuResultItem; -import com.amido.stacks.workloads.menu.domain.Category; -import com.amido.stacks.workloads.menu.domain.Item; -import com.amido.stacks.workloads.menu.domain.Menu; -import java.util.UUID; -import java.util.stream.Collectors; -import org.springframework.stereotype.Component; - -@Component -public class DomainToDtoMapper { - - public static MenuDTO toMenuDto(Menu menu) { - return new MenuDTO( - UUID.fromString(menu.getId()), - UUID.fromString(menu.getRestaurantId()), - menu.getName(), - menu.getDescription(), - menu.getCategories() != null - ? menu.getCategories().stream() - .map(DomainToDtoMapper::toCategoryDto) - .collect(Collectors.toList()) - : null, - menu.getEnabled()); - } - - public static CategoryDTO toCategoryDto(Category category) { - return new CategoryDTO( - category.getId(), - category.getName(), - category.getDescription(), - category.getItems() != null - ? category.getItems().stream() - .map(DomainToDtoMapper::toItemDto) - .collect(Collectors.toList()) - : null); - } - - public static ItemDTO toItemDto(Item item) { - return new ItemDTO( - item.getId(), item.getName(), item.getDescription(), item.getPrice(), item.getAvailable()); - } - - public static SearchMenuResultItem toSearchMenuResultItem(Menu menu) { - return new SearchMenuResultItem( - UUID.fromString(menu.getId()), - UUID.fromString(menu.getRestaurantId()), - menu.getName(), - menu.getDescription(), - menu.getEnabled()); - } -} diff --git a/java/src/main/java/com/amido/stacks/workloads/menu/mappers/ItemMapper.java b/java/src/main/java/com/amido/stacks/workloads/menu/mappers/ItemMapper.java new file mode 100644 index 00000000..2d8da0d1 --- /dev/null +++ b/java/src/main/java/com/amido/stacks/workloads/menu/mappers/ItemMapper.java @@ -0,0 +1,13 @@ +package com.amido.stacks.workloads.menu.mappers; + +import com.amido.stacks.core.mapping.BaseMapper; +import com.amido.stacks.workloads.menu.api.v1.dto.response.ItemDTO; +import com.amido.stacks.workloads.menu.domain.Item; +import org.mapstruct.Mapper; +import org.mapstruct.NullValueCheckStrategy; + +@Mapper( + componentModel = "spring", + uses = {}, + nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS) +public interface ItemMapper extends BaseMapper {} diff --git a/java/src/main/java/com/amido/stacks/workloads/menu/mappers/MenuMapper.java b/java/src/main/java/com/amido/stacks/workloads/menu/mappers/MenuMapper.java new file mode 100644 index 00000000..001a331c --- /dev/null +++ b/java/src/main/java/com/amido/stacks/workloads/menu/mappers/MenuMapper.java @@ -0,0 +1,14 @@ +package com.amido.stacks.workloads.menu.mappers; + +import com.amido.stacks.core.mapping.BaseMapper; +import com.amido.stacks.core.mapping.MapperUtils; +import com.amido.stacks.workloads.menu.api.v1.dto.response.MenuDTO; +import com.amido.stacks.workloads.menu.domain.Menu; +import org.mapstruct.Mapper; +import org.mapstruct.NullValueCheckStrategy; + +@Mapper( + componentModel = "spring", + uses = {MapperUtils.class, CategoryMapper.class}, + nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS) +public interface MenuMapper extends BaseMapper {} diff --git a/java/src/main/java/com/amido/stacks/workloads/menu/mappers/SearchMenuResultItemMapper.java b/java/src/main/java/com/amido/stacks/workloads/menu/mappers/SearchMenuResultItemMapper.java new file mode 100644 index 00000000..6536061f --- /dev/null +++ b/java/src/main/java/com/amido/stacks/workloads/menu/mappers/SearchMenuResultItemMapper.java @@ -0,0 +1,14 @@ +package com.amido.stacks.workloads.menu.mappers; + +import com.amido.stacks.core.mapping.BaseMapper; +import com.amido.stacks.core.mapping.MapperUtils; +import com.amido.stacks.workloads.menu.api.v1.dto.response.SearchMenuResultItem; +import com.amido.stacks.workloads.menu.domain.Menu; +import org.mapstruct.Mapper; +import org.mapstruct.NullValueCheckStrategy; + +@Mapper( + componentModel = "spring", + uses = {MapperUtils.class, CategoryMapper.class}, + nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS) +public interface SearchMenuResultItemMapper extends BaseMapper {} diff --git a/java/src/test/java/com/amido/stacks/workloads/menu/api/v1/impl/QueryMenuControllerImplTest.java b/java/src/test/java/com/amido/stacks/workloads/menu/api/v1/impl/QueryMenuControllerImplTest.java index ad41c47c..6e05c7a1 100644 --- a/java/src/test/java/com/amido/stacks/workloads/menu/api/v1/impl/QueryMenuControllerImplTest.java +++ b/java/src/test/java/com/amido/stacks/workloads/menu/api/v1/impl/QueryMenuControllerImplTest.java @@ -13,7 +13,14 @@ import com.amido.stacks.workloads.menu.domain.Category; import com.amido.stacks.workloads.menu.domain.Item; import com.amido.stacks.workloads.menu.domain.Menu; -import com.amido.stacks.workloads.menu.mappers.DomainToDtoMapper; +import com.amido.stacks.workloads.menu.mappers.CategoryMapper; +import com.amido.stacks.workloads.menu.mappers.CategoryMapperImpl; +import com.amido.stacks.workloads.menu.mappers.ItemMapper; +import com.amido.stacks.workloads.menu.mappers.ItemMapperImpl; +import com.amido.stacks.workloads.menu.mappers.MenuMapper; +import com.amido.stacks.workloads.menu.mappers.MenuMapperImpl; +import com.amido.stacks.workloads.menu.mappers.SearchMenuResultItemMapper; +import com.amido.stacks.workloads.menu.mappers.SearchMenuResultItemMapperImpl; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -29,7 +36,18 @@ import org.springframework.http.HttpStatus; import org.springframework.test.context.ActiveProfiles; -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +@SpringBootTest( + webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, + classes = { + MenuMapper.class, + MenuMapperImpl.class, + CategoryMapper.class, + CategoryMapperImpl.class, + ItemMapper.class, + ItemMapperImpl.class, + SearchMenuResultItemMapper.class, + SearchMenuResultItemMapperImpl.class + }) @EnableAutoConfiguration @Tag("Integration") @ActiveProfiles("test") @@ -39,6 +57,14 @@ public class QueryMenuControllerImplTest { @Autowired private TestRestTemplate testRestTemplate; + @Autowired private MenuMapper menuMapper; + + @Autowired private CategoryMapper categoryMapper; + + @Autowired private ItemMapper itemMapper; + + @Autowired private SearchMenuResultItemMapper searchMenuResultItemMapper; + final int DEFAULT_PAGE_NUMBER = 1; final int DEFAULT_PAGE_SIZE = 20; @@ -80,7 +106,7 @@ public void listMenusFilteredByRestaurantId() { List expectedMenuList = matching.stream() - .map(DomainToDtoMapper::toSearchMenuResultItem) + .map(m -> searchMenuResultItemMapper.toDto(m)) .collect(Collectors.toList()); SearchMenuResult expectedResponse = @@ -111,7 +137,7 @@ public void getMenuById() { new Category(categoryId, "cat name", "cat description", Arrays.asList(item)); menu.addOrUpdateCategory(category); - MenuDTO expectedResponse = DomainToDtoMapper.toMenuDto(menu); + MenuDTO expectedResponse = menuMapper.toDto(menu); // When var response = diff --git a/java/src/test/java/com/amido/stacks/workloads/menu/api/v2/impl/QueryMenuControllerImplV2Test.java b/java/src/test/java/com/amido/stacks/workloads/menu/api/v2/impl/QueryMenuControllerImplV2Test.java index cb85f728..bd89c9b3 100644 --- a/java/src/test/java/com/amido/stacks/workloads/menu/api/v2/impl/QueryMenuControllerImplV2Test.java +++ b/java/src/test/java/com/amido/stacks/workloads/menu/api/v2/impl/QueryMenuControllerImplV2Test.java @@ -6,7 +6,14 @@ import com.amido.stacks.workloads.menu.api.v1.dto.response.MenuDTO; import com.amido.stacks.workloads.menu.domain.Menu; -import com.amido.stacks.workloads.menu.mappers.DomainToDtoMapper; +import com.amido.stacks.workloads.menu.mappers.CategoryMapper; +import com.amido.stacks.workloads.menu.mappers.CategoryMapperImpl; +import com.amido.stacks.workloads.menu.mappers.ItemMapper; +import com.amido.stacks.workloads.menu.mappers.ItemMapperImpl; +import com.amido.stacks.workloads.menu.mappers.MenuMapper; +import com.amido.stacks.workloads.menu.mappers.MenuMapperImpl; +import com.amido.stacks.workloads.menu.mappers.SearchMenuResultItemMapper; +import com.amido.stacks.workloads.menu.mappers.SearchMenuResultItemMapperImpl; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -16,7 +23,18 @@ import org.springframework.boot.web.server.LocalServerPort; import org.springframework.test.context.ActiveProfiles; -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +@SpringBootTest( + webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, + classes = { + MenuMapper.class, + MenuMapperImpl.class, + CategoryMapper.class, + CategoryMapperImpl.class, + ItemMapper.class, + ItemMapperImpl.class, + SearchMenuResultItemMapper.class, + SearchMenuResultItemMapperImpl.class + }) @EnableAutoConfiguration @Tag("Integration") @ActiveProfiles("test") @@ -28,13 +46,15 @@ class QueryMenuControllerImplV2Test { @Autowired private TestRestTemplate testRestTemplate; + @Autowired private MenuMapper menuMapper; + @Test void getMenuById() { // Given Menu menu = createMenu(0); String restaurantId = "3930ddff-82ce-4f7e-b910-b0709b276cf0"; menu.setRestaurantId(restaurantId); - MenuDTO expectedResponse = DomainToDtoMapper.toMenuDto(menu); + MenuDTO expectedResponse = menuMapper.toDto(menu); // When var response = diff --git a/java/src/test/java/com/amido/stacks/workloads/menu/mappers/DomainToDtoMapperMapstructTest.java b/java/src/test/java/com/amido/stacks/workloads/menu/mappers/DomainToDtoMapperMapstructTest.java new file mode 100644 index 00000000..9b4a573b --- /dev/null +++ b/java/src/test/java/com/amido/stacks/workloads/menu/mappers/DomainToDtoMapperMapstructTest.java @@ -0,0 +1,200 @@ +package com.amido.stacks.workloads.menu.mappers; + +import static java.util.UUID.randomUUID; +import static org.assertj.core.api.Assertions.assertThat; + +import com.amido.stacks.workloads.menu.api.v1.dto.response.CategoryDTO; +import com.amido.stacks.workloads.menu.api.v1.dto.response.ItemDTO; +import com.amido.stacks.workloads.menu.api.v1.dto.response.MenuDTO; +import com.amido.stacks.workloads.menu.api.v1.dto.response.SearchMenuResultItem; +import com.amido.stacks.workloads.menu.domain.Category; +import com.amido.stacks.workloads.menu.domain.Item; +import com.amido.stacks.workloads.menu.domain.Menu; +import java.util.Arrays; +import java.util.Collections; +import java.util.UUID; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +@Tag("Unit") +@SpringBootTest( + classes = { + MenuMapper.class, + MenuMapperImpl.class, + CategoryMapper.class, + CategoryMapperImpl.class, + ItemMapper.class, + ItemMapperImpl.class, + SearchMenuResultItemMapper.class, + SearchMenuResultItemMapperImpl.class + }) +class DomainToDtoMapperMapstructTest { + + @Autowired private MenuMapper menuMapper; + + @Autowired private CategoryMapper categoryMapper; + + @Autowired private ItemMapper itemMapper; + + @Autowired private SearchMenuResultItemMapper searchMenuResultItemMapper; + + @Test + void menuToMenuDto() { + + // Given + UUID id = randomUUID(); + UUID restaurantId = randomUUID(); + String name = "yyyyyyyy"; + String description = "xxxxxxxx"; + Boolean enabled = true; + + Menu menu = + new Menu( + id.toString(), + restaurantId.toString(), + name, + description, + Collections.emptyList(), + enabled); + + // When + MenuDTO menuDTO = menuMapper.toDto(menu); + + // Then + assertThat(menuDTO.getId()).isEqualTo(id); + assertThat(menuDTO.getRestaurantId()).isEqualTo(restaurantId); + assertThat(menuDTO.getName()).isEqualTo(name); + assertThat(menuDTO.getDescription()).isEqualTo(description); + assertThat(menuDTO.getCategories()).isEqualTo(Collections.emptyList()); + assertThat(menuDTO.getEnabled()).isEqualTo(enabled); + } + + @Test + void menuToMenuDtoWithNullCategories() { + + // Given + UUID id = randomUUID(); + UUID restaurantId = randomUUID(); + String name = "yyyyyyyy"; + String description = "xxxxxxxx"; + Boolean enabled = true; + + Menu menu = new Menu(id.toString(), restaurantId.toString(), name, description, null, enabled); + + // When + MenuDTO menuDTO = menuMapper.toDto(menu); + + // Then + assertThat(menuDTO.getId()).isEqualTo(id); + assertThat(menuDTO.getRestaurantId()).isEqualTo(restaurantId); + assertThat(menuDTO.getName()).isEqualTo(name); + assertThat(menuDTO.getDescription()).isEqualTo(description); + assertThat(menuDTO.getCategories()).isEmpty(); + assertThat(menuDTO.getEnabled()).isEqualTo(enabled); + } + + @Test + void menuToMenuDtoWithNullCategoryItems() { + + // Given + UUID id = randomUUID(); + UUID restaurantId = randomUUID(); + String name = "yyyyyyyy"; + String description = "xxxxxxxx"; + Boolean enabled = true; + + UUID categoryId = randomUUID(); + Category category = new Category(categoryId.toString(), "aaaaaa", "bbbbbb", null); + + Menu menu = + new Menu( + id.toString(), + restaurantId.toString(), + name, + description, + Arrays.asList(category), + enabled); + + // When + MenuDTO menuDTO = menuMapper.toDto(menu); + + // Then + assertThat(menuDTO.getId()).isEqualTo(id); + assertThat(menuDTO.getRestaurantId()).isEqualTo(restaurantId); + assertThat(menuDTO.getName()).isEqualTo(name); + assertThat(menuDTO.getDescription()).isEqualTo(description); + assertThat(menuDTO.getEnabled()).isEqualTo(enabled); + assertThat(menuDTO.getCategories().size()).isEqualTo(1); + assertThat(menuDTO.getCategories().get(0).getName()).isEqualTo(category.getName()); + assertThat(menuDTO.getCategories().get(0).getDescription()) + .isEqualTo(category.getDescription()); + assertThat(menuDTO.getCategories().get(0).getId()).isEqualTo(category.getId()); + assertThat(menuDTO.getCategories().get(0).getItems()).isEmpty(); + } + + @Test + void menuToSearchMenuResultItem() { + + // Given + UUID id = randomUUID(); + UUID restaurantId = randomUUID(); + String name = "yyyyyyyy"; + String description = "xxxxxxxx"; + Boolean enabled = true; + + Menu menu = new Menu(id.toString(), restaurantId.toString(), name, description, null, enabled); + + // When + SearchMenuResultItem resultItem = searchMenuResultItemMapper.toDto(menu); + + // Then + assertThat(resultItem.getId()).isEqualTo(id); + assertThat(resultItem.getRestaurantId()).isEqualTo(restaurantId); + assertThat(resultItem.getName()).isEqualTo(name); + assertThat(resultItem.getDescription()).isEqualTo(description); + assertThat(resultItem.getEnabled()).isEqualTo(enabled); + } + + @Test + void itemToItemDto() { + // Given + String id = randomUUID().toString(); + String name = "yyyyyyyy"; + String description = "xxxxxxxx"; + Double price = 15.1d; + Boolean available = true; + + Item item = new Item(id, name, description, price, available); + + // When + ItemDTO itemDTO = itemMapper.toDto(item); + + // Then + assertThat(itemDTO.getId()).isEqualTo(id); + assertThat(itemDTO.getName()).isEqualTo(name); + assertThat(itemDTO.getDescription()).isEqualTo(description); + assertThat(itemDTO.getPrice()).isEqualTo(price); + assertThat(itemDTO.getAvailable()).isEqualTo(available); + } + + @Test + void categoryToCategoryDto() { + // Given + String id = randomUUID().toString(); + String name = "yyyyyyyy"; + String description = "xxxxxxxx"; + + Category category = new Category(id, name, description, Collections.emptyList()); + + // When + CategoryDTO categoryDTO = categoryMapper.toDto(category); + + // Then + assertThat(categoryDTO.getId()).isEqualTo(id); + assertThat(categoryDTO.getName()).isEqualTo(name); + assertThat(categoryDTO.getDescription()).isEqualTo(description); + assertThat(categoryDTO.getItems()).isEqualTo(Collections.emptyList()); + } +} diff --git a/java/src/test/java/com/amido/stacks/workloads/menu/mappers/DomainToDtoMapperTest.java b/java/src/test/java/com/amido/stacks/workloads/menu/mappers/DomainToDtoMapperTest.java index 693ed0b1..4b2750a4 100644 --- a/java/src/test/java/com/amido/stacks/workloads/menu/mappers/DomainToDtoMapperTest.java +++ b/java/src/test/java/com/amido/stacks/workloads/menu/mappers/DomainToDtoMapperTest.java @@ -15,10 +15,31 @@ import java.util.UUID; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; @Tag("Unit") +@SpringBootTest( + classes = { + MenuMapper.class, + MenuMapperImpl.class, + CategoryMapper.class, + CategoryMapperImpl.class, + ItemMapper.class, + ItemMapperImpl.class, + SearchMenuResultItemMapper.class, + SearchMenuResultItemMapperImpl.class + }) class DomainToDtoMapperTest { + @Autowired private MenuMapper menuMapper; + + @Autowired private CategoryMapper categoryMapper; + + @Autowired private ItemMapper itemMapper; + + @Autowired private SearchMenuResultItemMapper searchMenuResultItemMapper; + @Test void menuToMenuDto() { @@ -39,7 +60,7 @@ void menuToMenuDto() { enabled); // When - MenuDTO menuDTO = DomainToDtoMapper.toMenuDto(menu); + MenuDTO menuDTO = menuMapper.toDto(menu); // Then assertThat(menuDTO.getId()).isEqualTo(id); @@ -63,7 +84,7 @@ void menuToMenuDtoWithNullCategories() { Menu menu = new Menu(id.toString(), restaurantId.toString(), name, description, null, enabled); // When - MenuDTO menuDTO = DomainToDtoMapper.toMenuDto(menu); + MenuDTO menuDTO = menuMapper.toDto(menu); // Then assertThat(menuDTO.getId()).isEqualTo(id); @@ -97,7 +118,7 @@ void menuToMenuDtoWithNullCategoryItems() { enabled); // When - MenuDTO menuDTO = DomainToDtoMapper.toMenuDto(menu); + MenuDTO menuDTO = menuMapper.toDto(menu); // Then assertThat(menuDTO.getId()).isEqualTo(id); @@ -126,7 +147,7 @@ void menuToSearchMenuResultItem() { Menu menu = new Menu(id.toString(), restaurantId.toString(), name, description, null, enabled); // When - SearchMenuResultItem resultItem = DomainToDtoMapper.toSearchMenuResultItem(menu); + SearchMenuResultItem resultItem = searchMenuResultItemMapper.toDto(menu); // Then assertThat(resultItem.getId()).isEqualTo(id); @@ -148,7 +169,7 @@ void itemToItemDto() { Item item = new Item(id, name, description, price, available); // When - ItemDTO itemDTO = DomainToDtoMapper.toItemDto(item); + ItemDTO itemDTO = itemMapper.toDto(item); // Then assertThat(itemDTO.getId()).isEqualTo(id); @@ -168,7 +189,7 @@ void categoryToCategoryDto() { Category category = new Category(id, name, description, Collections.emptyList()); // When - CategoryDTO categoryDTO = DomainToDtoMapper.toCategoryDto(category); + CategoryDTO categoryDTO = categoryMapper.toDto(category); // Then assertThat(categoryDTO.getId()).isEqualTo(id);