diff --git a/pom.xml b/pom.xml index d785977..fa5c911 100644 --- a/pom.xml +++ b/pom.xml @@ -38,6 +38,11 @@ org.springframework.boot spring-boot-starter-validation + + com.andrascsanyi + bean-validation-extensions + 0.1.6 + org.springframework.boot @@ -72,11 +77,18 @@ 1.5.5.Final + + org.springframework.boot spring-boot-starter-test test + + org.junit.platform + junit-platform-suite + test + org.springframework spring-webflux @@ -125,20 +137,51 @@ + + + io.github.kobylynskyi + graphql-codegen-maven-plugin + 5.10.0 + + + document-schema-generation + generate-sources + + generate + + + + ${project.basedir}/src/main/resources/graphql/document + .*\.graphqls? + true + + + ${project.build.directory}/generated-sources/graphql/document + + + ${project.basedir}/schemaConfigs/gql/document.json + + + + + + org.codehaus.mojo build-helper-maven-plugin 3.4.0 - add-source + add-document-schema-source-folder generate-sources add-source - target/generate-sources + + ${project.build.directory}/generate-sources/graphql/document/ + diff --git a/schemaConfigs/gql/document.json b/schemaConfigs/gql/document.json new file mode 100644 index 0000000..289a48d --- /dev/null +++ b/schemaConfigs/gql/document.json @@ -0,0 +1,24 @@ +{ + "packageName": "com.andrascsanyi.encyclopediagalactica.document.api.graphql.entities", + "modelValidationAnnotation": "@jakarta.validation.constraints.NotNull", + "apiInterfaceStrategy": "DO_NOT_GENERATE", + "addGeneratedAnnotation": true, + "generatedAnnotation": "jakarta.annotation.Generated", + "generateBuilder": true, + "generateJacksonTypeIdResolver": true, + "customAnnotationsMapping": { + "ApplicationInput.id": [ + "com.andrascsanyi.beanvalidatorextensions.LongAsStringMustBeZero(groups = {com.andrascsanyi.encyclopediagalactica.document.api.graphql.scenarios.AddApplicationScenario.class})" + ], + "ApplicationInput.name": [ + "com.andrascsanyi.beanvalidatorextensions.TrimmedNotBlank(groups = {com.andrascsanyi.encyclopediagalactica.document.api.graphql.scenarios.AddApplicationScenario.class})", + "com.andrascsanyi.beanvalidatorextensions.TrimmedNotEmpty(groups = {com.andrascsanyi.encyclopediagalactica.document.api.graphql.scenarios.AddApplicationScenario.class})", + "com.andrascsanyi.beanvalidatorextensions.TrimmedSize(min = 3, max = 255, groups = {com.andrascsanyi.encyclopediagalactica.document.api.graphql.scenarios.AddApplicationScenario.class})" + ], + "ApplicationInput.description": [ + "com.andrascsanyi.beanvalidatorextensions.TrimmedNotBlank(groups = {com.andrascsanyi.encyclopediagalactica.document.api.graphql.scenarios.AddApplicationScenario.class})", + "com.andrascsanyi.beanvalidatorextensions.TrimmedNotEmpty(groups = {com.andrascsanyi.encyclopediagalactica.document.api.graphql.scenarios.AddApplicationScenario.class})", + "com.andrascsanyi.beanvalidatorextensions.TrimmedSize(min = 3, max = 255, groups = {com.andrascsanyi.encyclopediagalactica.document.api.graphql.scenarios.AddApplicationScenario.class})" + ] + } +} diff --git a/src/main/java/com/andrascsanyi/encyclopediagalactica/common/validation/LongAsStringMustBeGreaterOrEqualToOne.java b/src/main/java/com/andrascsanyi/encyclopediagalactica/common/validation/LongAsStringMustBeGreaterOrEqualToOne.java deleted file mode 100644 index 06cc136..0000000 --- a/src/main/java/com/andrascsanyi/encyclopediagalactica/common/validation/LongAsStringMustBeGreaterOrEqualToOne.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.andrascsanyi.encyclopediagalactica.common.validation; - -import jakarta.validation.Constraint; -import jakarta.validation.Payload; - -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Validates if the provided input {@link String} is equal or greater than 0 when it is parsed as - * Long. - * - *

This validation annotation is used to check values coming via GraphQL where the ID is {@link - * String} - * - *

The validation judges the null, empty or blank string values to be valid. The validation - * judges the negative value to be invalid. - */ -@Target({ElementType.FIELD}) -@Retention(RetentionPolicy.RUNTIME) -@Constraint(validatedBy = LongAsStringMustBeGreaterOrEqualToOneValidator.class) -@Documented -public @interface LongAsStringMustBeGreaterOrEqualToOne { - String message() default - "{javax.validation.constraints.LongAsStringMustBeGreaterOrEqualToOne.message=" - + "The Long -{value}- provided as string must be zero!}"; - - Class[] groups() default {}; - - Class[] payload() default {}; -} diff --git a/src/main/java/com/andrascsanyi/encyclopediagalactica/common/validation/LongAsStringMustBeGreaterOrEqualToOneValidator.java b/src/main/java/com/andrascsanyi/encyclopediagalactica/common/validation/LongAsStringMustBeGreaterOrEqualToOneValidator.java deleted file mode 100644 index 8de4cd6..0000000 --- a/src/main/java/com/andrascsanyi/encyclopediagalactica/common/validation/LongAsStringMustBeGreaterOrEqualToOneValidator.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.andrascsanyi.encyclopediagalactica.common.validation; - -import jakarta.validation.ConstraintValidator; -import jakarta.validation.ConstraintValidatorContext; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class LongAsStringMustBeGreaterOrEqualToOneValidator - implements ConstraintValidator { - - private final Logger log = LoggerFactory.getLogger(LongAsStringMustBeGreaterOrEqualToOne.class); - - @Override - public boolean isValid(String value, ConstraintValidatorContext context) { - if (value == null || value.isEmpty() || value.isBlank() || value.trim().isEmpty()) { - return true; - } - - try { - long longValue = Long.parseLong(value); - - boolean isValid = longValue >= 1; - - if (!isValid) { - context.disableDefaultConstraintViolation(); - context.buildConstraintViolationWithTemplate( - "{javax.validation.constraints.LongAsStringMustBeZero.message}") - .addConstraintViolation(); - } - - return isValid; - - } catch (NumberFormatException e) { - log.warn("Could not parse long value: {}", value); - } - return false; - } - - @Override - public void initialize(LongAsStringMustBeGreaterOrEqualToOne constraintAnnotation) { - ConstraintValidator.super.initialize(constraintAnnotation); - } -} diff --git a/src/main/java/com/andrascsanyi/encyclopediagalactica/common/validation/LongAsStringMustBeZero.java b/src/main/java/com/andrascsanyi/encyclopediagalactica/common/validation/LongAsStringMustBeZero.java deleted file mode 100644 index 687c129..0000000 --- a/src/main/java/com/andrascsanyi/encyclopediagalactica/common/validation/LongAsStringMustBeZero.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.andrascsanyi.encyclopediagalactica.common.validation; - -import jakarta.validation.Constraint; -import jakarta.validation.Payload; - -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Validates if the provided input {@link String} is equal to 0 when it is parsed as Long. - * - *

This validation annotation is used to check values coming via GraphQL where the ID is {@link - * String}. - * - *

The validation judges the negative value, the null, empty or blank string values to be valid. - */ -@Target({ElementType.FIELD}) -@Retention(RetentionPolicy.RUNTIME) -@Constraint(validatedBy = LongAsStringMustBeZeroValidator.class) -@Documented -public @interface LongAsStringMustBeZero { - String message() default - "{javax.validation.constraints.LongAsStringMustBeZero.message=" - + "The Long -{value}- provided as string must be zero!}"; - - Class[] groups() default {}; - - Class[] payload() default {}; -} diff --git a/src/main/java/com/andrascsanyi/encyclopediagalactica/common/validation/LongAsStringMustBeZeroValidator.java b/src/main/java/com/andrascsanyi/encyclopediagalactica/common/validation/LongAsStringMustBeZeroValidator.java deleted file mode 100644 index 53fc5b6..0000000 --- a/src/main/java/com/andrascsanyi/encyclopediagalactica/common/validation/LongAsStringMustBeZeroValidator.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.andrascsanyi.encyclopediagalactica.common.validation; - -import jakarta.validation.ConstraintValidator; -import jakarta.validation.ConstraintValidatorContext; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class LongAsStringMustBeZeroValidator - implements ConstraintValidator { - - private final Logger log = LoggerFactory.getLogger(LongAsStringMustBeZeroValidator.class); - - @Override - public void initialize(LongAsStringMustBeZero constraintAnnotation) { - ConstraintValidator.super.initialize(constraintAnnotation); - } - - @Override - public boolean isValid(String value, ConstraintValidatorContext context) { - if (value == null || value.isEmpty() || value.isBlank() || value.trim().isEmpty()) { - return true; - } - - try { - long longValue = Long.parseLong(value); - - boolean isValid = longValue == 0; - - if (!isValid) { - context.disableDefaultConstraintViolation(); - context.buildConstraintViolationWithTemplate( - "{javax.validation.constraints.LongAsStringMustBeZero.message}") - .addConstraintViolation(); - } - - return isValid; - - } catch (NumberFormatException e) { - log.warn("Could not parse long value: {}", value); - } - return false; - } -} diff --git a/src/main/java/com/andrascsanyi/encyclopediagalactica/common/validation/TrimmedNotBlank.java b/src/main/java/com/andrascsanyi/encyclopediagalactica/common/validation/TrimmedNotBlank.java deleted file mode 100644 index 84ae9c9..0000000 --- a/src/main/java/com/andrascsanyi/encyclopediagalactica/common/validation/TrimmedNotBlank.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.andrascsanyi.encyclopediagalactica.common.validation; - -import jakarta.validation.Constraint; -import jakarta.validation.Payload; - -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Validates if the provided {@link String} value is empty after it is trimmed. - *

- * The validator judges null to be invalid value. - */ -@Target({ElementType.FIELD}) -@Retention(RetentionPolicy.RUNTIME) -@Constraint(validatedBy = TrimmedNotBlankValidator.class) -@Documented -public @interface TrimmedNotBlank { - - String message() default "{com.andrascsanyi.encyclopediagalactica.common.validation" + - ".TrimmedNotBlank.message=" + - "When the provided string -{value}- is trimmed it must not be blank.}"; - - Class[] groups() default {}; - - Class[] payload() default {}; -} diff --git a/src/main/java/com/andrascsanyi/encyclopediagalactica/common/validation/TrimmedNotBlankValidator.java b/src/main/java/com/andrascsanyi/encyclopediagalactica/common/validation/TrimmedNotBlankValidator.java deleted file mode 100644 index 347ff0a..0000000 --- a/src/main/java/com/andrascsanyi/encyclopediagalactica/common/validation/TrimmedNotBlankValidator.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.andrascsanyi.encyclopediagalactica.common.validation; - -import jakarta.validation.ConstraintValidator; -import jakarta.validation.ConstraintValidatorContext; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class TrimmedNotBlankValidator - implements ConstraintValidator { - - private final static Logger log = LoggerFactory.getLogger(TrimmedNotBlankValidator.class); - - @Override - public boolean isValid(String value, ConstraintValidatorContext context) { - if (value == null) { - context.disableDefaultConstraintViolation(); - context.buildConstraintViolationWithTemplate( - "{com.andrascsanyi.encyclopediagalactica.common.validation.TrimmedNotBlank=" + - "The provided value (-{value}-) is null.}" - ).addConstraintViolation(); - return false; - - } - - if (value.trim().isBlank()) { - context.disableDefaultConstraintViolation(); - context.buildConstraintViolationWithTemplate( - "{javax.validation.constraints.NotBlank.message=" + - "When the provided string -{value}- is trimmed it must not be blank.}" - ).addConstraintViolation(); - return false; - } - return true; - } - - @Override - public void initialize(TrimmedNotBlank constraintAnnotation) { - ConstraintValidator.super.initialize(constraintAnnotation); - } -} diff --git a/src/main/java/com/andrascsanyi/encyclopediagalactica/common/validation/TrimmedNotEmptyValidator.java b/src/main/java/com/andrascsanyi/encyclopediagalactica/common/validation/TrimmedNotEmptyValidator.java deleted file mode 100644 index d30f1d6..0000000 --- a/src/main/java/com/andrascsanyi/encyclopediagalactica/common/validation/TrimmedNotEmptyValidator.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.andrascsanyi.encyclopediagalactica.common.validation; - -import jakarta.validation.ConstraintValidator; -import jakarta.validation.ConstraintValidatorContext; - -public class TrimmedNotEmptyValidator - implements ConstraintValidator { - - @Override - public boolean isValid(String value, ConstraintValidatorContext context) { - if (value == null || value.trim().isEmpty()) { - context.disableDefaultConstraintViolation(); - context.buildConstraintViolationWithTemplate( - "{javax.validation.constraints.NotEmpty.message=" + - "When the provided string -{value}- is trimmed it must not be empty}" - ).addConstraintViolation(); - return false; - } - return true; - } - - @Override - public void initialize(TrimmedNotEmtpy constraintAnnotation) { - ConstraintValidator.super.initialize(constraintAnnotation); - } -} diff --git a/src/main/java/com/andrascsanyi/encyclopediagalactica/common/validation/TrimmedNotEmtpy.java b/src/main/java/com/andrascsanyi/encyclopediagalactica/common/validation/TrimmedNotEmtpy.java deleted file mode 100644 index 05cab57..0000000 --- a/src/main/java/com/andrascsanyi/encyclopediagalactica/common/validation/TrimmedNotEmtpy.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.andrascsanyi.encyclopediagalactica.common.validation; - -import jakarta.validation.Constraint; -import jakarta.validation.Payload; - -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Validates if the provided {@link String} value is empty after it is trimmed. - *

- * The validator judges null to be invalid value. - */ -@Target({ElementType.FIELD}) -@Retention(RetentionPolicy.RUNTIME) -@Constraint(validatedBy = TrimmedNotEmptyValidator.class) -@Documented -public @interface TrimmedNotEmtpy { - - String message() default "{javax.validation.constraints.NotEmpty.message=" + - "When the provided string -{value}- is trimmed it must not be empty}"; - - Class[] groups() default {}; - - Class[] payload() default {}; -} diff --git a/src/main/java/com/andrascsanyi/encyclopediagalactica/common/validation/TrimmedSize.java b/src/main/java/com/andrascsanyi/encyclopediagalactica/common/validation/TrimmedSize.java deleted file mode 100644 index d8b8afc..0000000 --- a/src/main/java/com/andrascsanyi/encyclopediagalactica/common/validation/TrimmedSize.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.andrascsanyi.encyclopediagalactica.common.validation; - -import jakarta.validation.Constraint; -import jakarta.validation.Payload; - -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Target({ElementType.FIELD}) -@Retention(RetentionPolicy.RUNTIME) -@Constraint(validatedBy = TrimmedSizeValidator.class) -@Documented -public @interface TrimmedSize { - String message() default "{com.andrascsanyi.encyclopediagalactica.common.validation" + - ".TrimmedSize.message=" + - "When the provided string -{value}- is trimmed it must be longer than and shorter than.}"; - - Class[] groups() default {}; - - Class[] payload() default {}; - - int min() default 0; - - int max() default Integer.MAX_VALUE; -} diff --git a/src/main/java/com/andrascsanyi/encyclopediagalactica/common/validation/TrimmedSizeValidator.java b/src/main/java/com/andrascsanyi/encyclopediagalactica/common/validation/TrimmedSizeValidator.java deleted file mode 100644 index c5e8377..0000000 --- a/src/main/java/com/andrascsanyi/encyclopediagalactica/common/validation/TrimmedSizeValidator.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.andrascsanyi.encyclopediagalactica.common.validation; - -import jakarta.validation.ConstraintValidator; -import jakarta.validation.ConstraintValidatorContext; - -public class TrimmedSizeValidator implements ConstraintValidator { - - private int min; - private int max; - - @Override - public boolean isValid(String value, ConstraintValidatorContext context) { - if (value == null) { - context.disableDefaultConstraintViolation(); - context.buildConstraintViolationWithTemplate( - "com.andrascsanyi.encyclopediagalactica.common.validation.TrimmedSizeValidator.message=" + - "The provided value(-{value}-} is null." - ).addConstraintViolation(); - return false; - } - - if (value.trim().length() < min || value.trim().length() > max) { - context.disableDefaultConstraintViolation(); - context.buildConstraintViolationWithTemplate( - "com.andrascsanyi.encyclopediagalactica.common.validation.TrimmedSizeValidator.message=" + - "The provided value(-{value}-} trimmed length is either " + - "longer than {max} or shorter than {min}." - ).addConstraintViolation(); - return false; - } - return true; - } - - @Override - public void initialize(TrimmedSize constraintAnnotation) { - min = constraintAnnotation.min(); - max = constraintAnnotation.max(); - } -} diff --git a/src/main/java/com/andrascsanyi/encyclopediagalactica/common/validation/ValidationConstraintsHelper.java b/src/main/java/com/andrascsanyi/encyclopediagalactica/common/validation/ValidationConstraintsHelper.java deleted file mode 100644 index a98937d..0000000 --- a/src/main/java/com/andrascsanyi/encyclopediagalactica/common/validation/ValidationConstraintsHelper.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.andrascsanyi.encyclopediagalactica.common.validation; - -import com.andrascsanyi.encyclopediagalactica.document.api.graphql.input.ApplicationInput; -import jakarta.validation.ConstraintViolation; - -import java.util.Set; - -public final class ValidationConstraintsHelper { - public static String getViolationsAsString(Set> validationResult) { - StringBuilder stringBuilder = new StringBuilder(); - validationResult.forEach(i -> { - stringBuilder.append(i.getMessage()).append(" "); - }); - return stringBuilder.toString(); - } -} diff --git a/src/main/java/com/andrascsanyi/encyclopediagalactica/common/validation/ValidationHelpers.java b/src/main/java/com/andrascsanyi/encyclopediagalactica/common/validation/ValidationHelpers.java new file mode 100644 index 0000000..3450c54 --- /dev/null +++ b/src/main/java/com/andrascsanyi/encyclopediagalactica/common/validation/ValidationHelpers.java @@ -0,0 +1,20 @@ +package com.andrascsanyi.encyclopediagalactica.common.validation; + +public class ValidationHelpers { + + /** + * Returns the provided annotation package and annotation name as {@link String}. + *

+ * For example: In case of {@link LongValueMustBe} it will return + * com.andrascsanyi.encyclopediagalactica.common.validator.LongValueMustBe + * + * @param annotation The annotation + * + * @return the annotation package and name as string separated by dots + */ + public static String getPackageAndAnnotationName(Class annotation) { + return annotation.getPackage() + + "." + + annotation.getName(); + } +} diff --git a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/controllers/ApplicationController.java b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/controllers/ApplicationGraphqlController.java similarity index 70% rename from src/main/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/controllers/ApplicationController.java rename to src/main/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/controllers/ApplicationGraphqlController.java index 73cb85e..1a2ba3e 100644 --- a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/controllers/ApplicationController.java +++ b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/controllers/ApplicationGraphqlController.java @@ -1,30 +1,26 @@ package com.andrascsanyi.encyclopediagalactica.document.api.graphql.controllers; -import com.andrascsanyi.encyclopediagalactica.document.api.graphql.input.ApplicationInput; -import com.andrascsanyi.encyclopediagalactica.document.api.graphql.output.ApplicationOutput; -import com.andrascsanyi.encyclopediagalactica.document.api.graphql.output.ApplicationResponse; -import com.andrascsanyi.encyclopediagalactica.document.sagas.AddApplicationSaga; -import com.andrascsanyi.encyclopediagalactica.document.sagas.GetAllApplicationsSaga; +import com.andrascsanyi.encyclopediagalactica.document.api.graphql.entities.ApplicationInput; +import com.andrascsanyi.encyclopediagalactica.document.api.graphql.entities.ApplicationListResponse; +import com.andrascsanyi.encyclopediagalactica.document.api.graphql.entities.ApplicationResponse; +import com.andrascsanyi.encyclopediagalactica.document.api.graphql.sagas.AddApplicationSaga; +import com.andrascsanyi.encyclopediagalactica.document.api.graphql.sagas.GetAllApplicationsSaga; +import lombok.AllArgsConstructor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.graphql.data.method.annotation.Argument; import org.springframework.graphql.data.method.annotation.MutationMapping; import org.springframework.graphql.data.method.annotation.QueryMapping; import org.springframework.stereotype.Controller; -import java.util.List; - @Controller -public class ApplicationController { +@AllArgsConstructor +public class ApplicationGraphqlController { - @Autowired private AddApplicationSaga addApplicationSaga; - - @Autowired private GetAllApplicationsSaga getAllApplicationsSaga; - private final Logger log = LoggerFactory.getLogger(ApplicationController.class); + private final Logger log = LoggerFactory.getLogger(ApplicationGraphqlController.class); @MutationMapping("addApplication") public ApplicationResponse addApplication( @@ -34,7 +30,7 @@ public ApplicationResponse addApplication( } @QueryMapping("getApplications") - public ApplicationResponse getApplications() { + public ApplicationListResponse getApplications() { return getAllApplicationsSaga.execute(); } } diff --git a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/input/ApplicationInput.java b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/input/ApplicationInput.java deleted file mode 100644 index 655ab6d..0000000 --- a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/input/ApplicationInput.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.andrascsanyi.encyclopediagalactica.document.api.graphql.input; - -import com.andrascsanyi.encyclopediagalactica.common.validation.LongAsStringMustBeZero; -import com.andrascsanyi.encyclopediagalactica.common.validation.TrimmedNotBlank; -import com.andrascsanyi.encyclopediagalactica.common.validation.TrimmedNotEmtpy; -import com.andrascsanyi.encyclopediagalactica.common.validation.TrimmedSize; -import com.andrascsanyi.encyclopediagalactica.document.validation.AddApplicationScenario; -import jakarta.validation.constraints.NotNull; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -@Getter -@Setter -@AllArgsConstructor -@NoArgsConstructor -@Builder -public class ApplicationInput { - - @LongAsStringMustBeZero(groups = {AddApplicationScenario.class}) - private String id; - - @NotNull(groups = {AddApplicationScenario.class}) - @TrimmedNotEmtpy(groups = {AddApplicationScenario.class}) - @TrimmedNotBlank(groups = {AddApplicationScenario.class}) - @TrimmedSize(min = 3, max = 255, groups = {AddApplicationScenario.class}) - private String name; - - @NotNull(groups = {AddApplicationScenario.class}) - @TrimmedNotEmtpy(groups = {AddApplicationScenario.class}) - @TrimmedNotBlank(groups = {AddApplicationScenario.class}) - @TrimmedSize(min = 3, max = 255, groups = {AddApplicationScenario.class}) - private String description; -} diff --git a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/mappers/ApplicationMapper.java b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/mappers/ApplicationMapper.java new file mode 100644 index 0000000..b3cc77e --- /dev/null +++ b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/mappers/ApplicationMapper.java @@ -0,0 +1,44 @@ +package com.andrascsanyi.encyclopediagalactica.document.api.graphql.mappers; + +import com.andrascsanyi.encyclopediagalactica.document.api.graphql.entities.ApplicationInput; +import com.andrascsanyi.encyclopediagalactica.document.api.graphql.entities.ApplicationListOutputItem; +import com.andrascsanyi.encyclopediagalactica.document.api.graphql.entities.ApplicationOutput; +import com.andrascsanyi.encyclopediagalactica.document.core.entities.Application; +import org.mapstruct.BeanMapping; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.ReportingPolicy; + +import java.util.List; + +@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.WARN) +public interface ApplicationMapper { + + @Mapping(source = "id", target = "id") + @Mapping(source = "name", target = "name") + @Mapping(source = "description", target = "description") + @BeanMapping(ignoreByDefault = true) + Application toApplicationEntity(ApplicationInput applicationInput); + + @Mapping(source = "id", target = "id") + @Mapping(source = "name", target = "name") + @Mapping(source = "description", target = "description") + @BeanMapping(ignoreByDefault = true) + ApplicationOutput toApplicationOutput(Application applicationEntity); + + @Mapping(source = "id", target = "id") + @Mapping(source = "name", target = "name") + @Mapping(source = "description", target = "description") + @BeanMapping(ignoreByDefault = true) + ApplicationListOutputItem toApplicationListOutputItem(Application applicationEntity); + + default List toApplicationListOutputItems( + List applicationEntities + ) { + return applicationEntities.stream().map(this::toApplicationListOutputItem).toList(); + } + + default List toApplicationOutputList(List result) { + return result.stream().map(this::toApplicationOutput).toList(); + } +} diff --git a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/output/ApplicationListOutput.java b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/output/ApplicationListOutput.java deleted file mode 100644 index 7106210..0000000 --- a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/output/ApplicationListOutput.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.andrascsanyi.encyclopediagalactica.document.api.graphql.output; - -import java.util.List; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -@Getter -@Setter -@NoArgsConstructor -@AllArgsConstructor -@Builder -public class ApplicationListOutput implements ApplicationResponse { - - private List applicationList; -} diff --git a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/output/ApplicationOutput.java b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/output/ApplicationOutput.java deleted file mode 100644 index a19e11f..0000000 --- a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/output/ApplicationOutput.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.andrascsanyi.encyclopediagalactica.document.api.graphql.output; - -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Size; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -@Getter -@Setter -@AllArgsConstructor -@NoArgsConstructor -@Builder -public class ApplicationOutput implements ApplicationResponse { - - @NotNull - @NotEmpty - @NotBlank - private String id; - - @NotNull - @NotEmpty - @NotBlank - @Size(min = 3, max = 255) - private String name; - - @NotNull - @NotEmpty - @NotBlank - @Size(min = 3, max = 255) - private String description; -} diff --git a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/output/DocumentErrorOutput.java b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/output/DocumentErrorOutput.java deleted file mode 100644 index d6b104b..0000000 --- a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/output/DocumentErrorOutput.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.andrascsanyi.encyclopediagalactica.document.api.graphql.output; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -@Getter -@Setter -@NoArgsConstructor -@AllArgsConstructor -@Builder -public class DocumentErrorOutput implements ApplicationResponse { - private String message; - private String errorDetails; -} diff --git a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/sagas/AddApplicationSaga.java b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/sagas/AddApplicationSaga.java new file mode 100644 index 0000000..2b6cacd --- /dev/null +++ b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/sagas/AddApplicationSaga.java @@ -0,0 +1,58 @@ +package com.andrascsanyi.encyclopediagalactica.document.api.graphql.sagas; + +import com.andrascsanyi.beanvalidatorextensions.ValidationConstraintsHelper; +import com.andrascsanyi.encyclopediagalactica.document.api.graphql.entities.ApplicationInput; +import com.andrascsanyi.encyclopediagalactica.document.api.graphql.entities.ApplicationResponse; +import com.andrascsanyi.encyclopediagalactica.document.api.graphql.entities.DocumentErrorOutput; +import com.andrascsanyi.encyclopediagalactica.document.api.graphql.mappers.ApplicationMapper; +import com.andrascsanyi.encyclopediagalactica.document.api.graphql.scenarios.AddApplicationScenario; +import com.andrascsanyi.encyclopediagalactica.document.core.commands.AddApplicationCommand; +import com.andrascsanyi.encyclopediagalactica.document.core.entities.Application; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validator; +import lombok.AllArgsConstructor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.util.Set; + +@Service +@AllArgsConstructor +public class AddApplicationSaga { + + private AddApplicationCommand addApplicationCommand; + private ApplicationMapper applicationMapper; + private Validator validator; + + private static final Logger log = LoggerFactory.getLogger(AddApplicationSaga.class); + + public ApplicationResponse execute(ApplicationInput input) { + try { + validateInput(input); + Application applicationEntity = applicationMapper.toApplicationEntity(input); + Application result = addApplicationCommand.addApplication(applicationEntity); + return applicationMapper.toApplicationOutput(result); + } catch (Exception e) { + + StringBuilder builder = new StringBuilder(); + builder.append("Error happened while executing ") + .append(AddApplicationSaga.class.getSimpleName()); + + return DocumentErrorOutput.builder() + .setMessage(builder.toString()) + .setErrorDetails(e.toString()) + .build(); + } + } + + private void validateInput(ApplicationInput input) { + Set> violations = validator.validate( + input, + AddApplicationScenario.class); + if (!violations.isEmpty()) { + String message = ValidationConstraintsHelper.getViolationsAsString(violations); + throw new AddApplicationSagaException(message); + } + } +} diff --git a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/sagas/AddApplicationSagaException.java b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/sagas/AddApplicationSagaException.java similarity index 89% rename from src/main/java/com/andrascsanyi/encyclopediagalactica/document/sagas/AddApplicationSagaException.java rename to src/main/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/sagas/AddApplicationSagaException.java index ad3939b..2f7b72a 100644 --- a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/sagas/AddApplicationSagaException.java +++ b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/sagas/AddApplicationSagaException.java @@ -1,4 +1,4 @@ -package com.andrascsanyi.encyclopediagalactica.document.sagas; +package com.andrascsanyi.encyclopediagalactica.document.api.graphql.sagas; public class AddApplicationSagaException extends RuntimeException { public AddApplicationSagaException() { diff --git a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/sagas/GetAllApplicationsSaga.java b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/sagas/GetAllApplicationsSaga.java new file mode 100644 index 0000000..1bec62f --- /dev/null +++ b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/sagas/GetAllApplicationsSaga.java @@ -0,0 +1,40 @@ +package com.andrascsanyi.encyclopediagalactica.document.api.graphql.sagas; + +import com.andrascsanyi.encyclopediagalactica.document.api.graphql.entities.ApplicationListOutput; +import com.andrascsanyi.encyclopediagalactica.document.api.graphql.entities.ApplicationListOutputItem; +import com.andrascsanyi.encyclopediagalactica.document.api.graphql.entities.ApplicationListResponse; +import com.andrascsanyi.encyclopediagalactica.document.api.graphql.entities.DocumentErrorOutput; +import com.andrascsanyi.encyclopediagalactica.document.api.graphql.mappers.ApplicationMapper; +import com.andrascsanyi.encyclopediagalactica.document.core.commands.GetAllApplicationsCommand; +import com.andrascsanyi.encyclopediagalactica.document.core.entities.Application; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@AllArgsConstructor +public class GetAllApplicationsSaga { + + private GetAllApplicationsCommand getAllApplicationsCommand; + + private ApplicationMapper applicationMapper; + + public ApplicationListResponse execute() { + try { + List applications = getAllApplicationsCommand.getAllApplications(); + List applicationListOutputItems = applicationMapper + .toApplicationListOutputItems(applications); + return ApplicationListOutput.builder() + .setApplicationList(applicationListOutputItems).build(); + } catch (Exception e) { + StringBuilder b = new StringBuilder(); + b.append("Error happened while executing ").append(GetAllApplicationsCommand.class); + + return DocumentErrorOutput.builder() + .setMessage(b.toString()) + .setErrorDetails(e.toString()) + .build(); + } + } +} diff --git a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/sagas/GetallApplicationsSagaException.java b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/sagas/GetallApplicationsSagaException.java similarity index 89% rename from src/main/java/com/andrascsanyi/encyclopediagalactica/document/sagas/GetallApplicationsSagaException.java rename to src/main/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/sagas/GetallApplicationsSagaException.java index 741a158..2723cf3 100644 --- a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/sagas/GetallApplicationsSagaException.java +++ b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/sagas/GetallApplicationsSagaException.java @@ -1,4 +1,4 @@ -package com.andrascsanyi.encyclopediagalactica.document.sagas; +package com.andrascsanyi.encyclopediagalactica.document.api.graphql.sagas; public class GetallApplicationsSagaException extends RuntimeException { public GetallApplicationsSagaException() { diff --git a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/output/ApplicationResponse.java b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/scenarios/AddApplicationScenario.java similarity index 54% rename from src/main/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/output/ApplicationResponse.java rename to src/main/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/scenarios/AddApplicationScenario.java index 188d183..00c67fb 100644 --- a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/output/ApplicationResponse.java +++ b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/scenarios/AddApplicationScenario.java @@ -1,4 +1,4 @@ -package com.andrascsanyi.encyclopediagalactica.document.api.graphql.output; +package com.andrascsanyi.encyclopediagalactica.document.api.graphql.scenarios; -public interface ApplicationResponse { +public interface AddApplicationScenario { } diff --git a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/commands/AddApplicationCommand.java b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/commands/AddApplicationCommand.java deleted file mode 100644 index 7547311..0000000 --- a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/commands/AddApplicationCommand.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.andrascsanyi.encyclopediagalactica.document.commands; - -import com.andrascsanyi.encyclopediagalactica.common.validation.ValidationConstraintsHelper; -import com.andrascsanyi.encyclopediagalactica.document.api.graphql.input.ApplicationInput; -import com.andrascsanyi.encyclopediagalactica.document.api.graphql.output.ApplicationOutput; -import com.andrascsanyi.encyclopediagalactica.document.entities.ApplicationEntity; -import com.andrascsanyi.encyclopediagalactica.document.mappers.ApplicationMapper; -import com.andrascsanyi.encyclopediagalactica.document.repositories.ApplicationRepository; -import com.andrascsanyi.encyclopediagalactica.document.validation.AddApplicationScenario; -import jakarta.validation.ConstraintViolation; -import jakarta.validation.Validator; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.Set; - -@Service -public class AddApplicationCommand { - - private final ApplicationMapper applicationMapper; - - private final ApplicationRepository applicationRepository; - - private final Validator validator; - - @Autowired - public AddApplicationCommand( - ApplicationMapper applicationMapper, - ApplicationRepository applicationRepository, - Validator validator) { - this.applicationMapper = applicationMapper; - this.applicationRepository = applicationRepository; - this.validator = validator; - } - - public ApplicationOutput addApplication(ApplicationInput applicationInput) - throws AddApplicationCommandException { - try { - validateInputAndThrow(applicationInput); - ApplicationEntity input = applicationMapper.toApplicationEntity(applicationInput); - ApplicationEntity applicationEntity = applicationRepository.save(input); - return applicationMapper.toApplicationOutput(applicationEntity); - } catch (Throwable e) { - throw new AddApplicationCommandException(e.getMessage(), e); - } - } - - private void validateInputAndThrow(ApplicationInput applicationInput) - throws AddApplicationCommandException { - if (applicationInput == null) { - throw new AddApplicationCommandException("Application input is null"); - } - - Set> validationResult = - validator.validate(applicationInput, AddApplicationScenario.class); - - if (!validationResult.isEmpty()) { - String violations = ValidationConstraintsHelper.getViolationsAsString(validationResult); - throw new AddApplicationCommandException(violations); - } - } -} diff --git a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/commands/GetAllApplicationsCommand.java b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/commands/GetAllApplicationsCommand.java deleted file mode 100644 index 0aca496..0000000 --- a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/commands/GetAllApplicationsCommand.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.andrascsanyi.encyclopediagalactica.document.commands; - -import com.andrascsanyi.encyclopediagalactica.document.api.graphql.output.ApplicationOutput; -import com.andrascsanyi.encyclopediagalactica.document.entities.ApplicationEntity; -import com.andrascsanyi.encyclopediagalactica.document.mappers.ApplicationMapper; -import com.andrascsanyi.encyclopediagalactica.document.repositories.ApplicationRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; - -@Service -public class GetAllApplicationsCommand { - - @Autowired - private ApplicationMapper applicationMapper; - - @Autowired - private ApplicationRepository applicationRepository; - - public List getAllApplications() throws GetAllApplicationsCommandException { - try { - List result = new ArrayList<>(); - applicationRepository.findAll().forEach(result::add); - return applicationMapper.toApplicationOutputList(result); - } catch (Exception e) { - throw new GetAllApplicationsCommandException( - "Error happened while executing " + GetAllApplicationsCommand.class.getName(), - e - ); - } - } -} diff --git a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/core/commands/AddApplicationCommand.java b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/core/commands/AddApplicationCommand.java new file mode 100644 index 0000000..b68e309 --- /dev/null +++ b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/core/commands/AddApplicationCommand.java @@ -0,0 +1,23 @@ +package com.andrascsanyi.encyclopediagalactica.document.core.commands; + +import com.andrascsanyi.encyclopediagalactica.document.core.entities.Application; +import com.andrascsanyi.encyclopediagalactica.document.core.repositories.ApplicationRepository; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@AllArgsConstructor +public class AddApplicationCommand { + + private final ApplicationRepository applicationRepository; + + public Application addApplication(Application applicationEntityInput) + throws AddApplicationCommandException { + try { + Application applicationEntity = applicationRepository.save(applicationEntityInput); + return applicationEntity; + } catch (Throwable e) { + throw new AddApplicationCommandException(e.getMessage(), e); + } + } +} diff --git a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/commands/AddApplicationCommandException.java b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/core/commands/AddApplicationCommandException.java similarity index 90% rename from src/main/java/com/andrascsanyi/encyclopediagalactica/document/commands/AddApplicationCommandException.java rename to src/main/java/com/andrascsanyi/encyclopediagalactica/document/core/commands/AddApplicationCommandException.java index 70514a0..09de930 100644 --- a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/commands/AddApplicationCommandException.java +++ b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/core/commands/AddApplicationCommandException.java @@ -1,4 +1,4 @@ -package com.andrascsanyi.encyclopediagalactica.document.commands; +package com.andrascsanyi.encyclopediagalactica.document.core.commands; public class AddApplicationCommandException extends Exception { public AddApplicationCommandException() {} diff --git a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/core/commands/GetAllApplicationsCommand.java b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/core/commands/GetAllApplicationsCommand.java new file mode 100644 index 0000000..79ea686 --- /dev/null +++ b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/core/commands/GetAllApplicationsCommand.java @@ -0,0 +1,29 @@ +package com.andrascsanyi.encyclopediagalactica.document.core.commands; + +import com.andrascsanyi.encyclopediagalactica.document.core.entities.Application; +import com.andrascsanyi.encyclopediagalactica.document.core.repositories.ApplicationRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class GetAllApplicationsCommand { + + @Autowired + private ApplicationRepository applicationRepository; + + public List getAllApplications() throws GetAllApplicationsCommandException { + try { + List result = new ArrayList<>(); + applicationRepository.findAll().forEach(result::add); + return result; + } catch (Exception e) { + throw new GetAllApplicationsCommandException( + "Error happened while executing " + GetAllApplicationsCommand.class.getName(), + e + ); + } + } +} diff --git a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/commands/GetAllApplicationsCommandException.java b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/core/commands/GetAllApplicationsCommandException.java similarity index 90% rename from src/main/java/com/andrascsanyi/encyclopediagalactica/document/commands/GetAllApplicationsCommandException.java rename to src/main/java/com/andrascsanyi/encyclopediagalactica/document/core/commands/GetAllApplicationsCommandException.java index 2d18233..0761f0d 100644 --- a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/commands/GetAllApplicationsCommandException.java +++ b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/core/commands/GetAllApplicationsCommandException.java @@ -1,4 +1,4 @@ -package com.andrascsanyi.encyclopediagalactica.document.commands; +package com.andrascsanyi.encyclopediagalactica.document.core.commands; public class GetAllApplicationsCommandException extends Exception { public GetAllApplicationsCommandException() { diff --git a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/core/entities/Application.java b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/core/entities/Application.java new file mode 100644 index 0000000..1221f14 --- /dev/null +++ b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/core/entities/Application.java @@ -0,0 +1,68 @@ +package com.andrascsanyi.encyclopediagalactica.document.core.entities; + +import com.andrascsanyi.beanvalidatorextensions.LongValueMustBe; +import com.andrascsanyi.beanvalidatorextensions.TrimmedNotBlank; +import com.andrascsanyi.beanvalidatorextensions.TrimmedNotEmpty; +import com.andrascsanyi.beanvalidatorextensions.TrimmedSize; +import com.andrascsanyi.encyclopediagalactica.document.core.validation.AddApplicationEntityScenario; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +/** + * The {@link Application} defines a domain within the Encyclopedia Galactica system. + *

+ * A usage domain describes a set of usage like: + * + *

    + *
  • Starmap
  • + *
  • Finance
  • + *
+ */ +@Getter +@Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Table(name = "application") +public class Application { + + /** + * The unique identifier of the entity. + */ + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + @LongValueMustBe(mustBe = 0L, groups = {AddApplicationEntityScenario.class}) + private Long id; + + /** + * The name of the domain. + */ + @Column(name = "name") + @NotNull(message = "Name cannot be null") + @TrimmedNotBlank(groups = AddApplicationEntityScenario.class) + @TrimmedNotEmpty(groups = AddApplicationEntityScenario.class) + @TrimmedSize(min = 3, max = 255, groups = AddApplicationEntityScenario.class) + private String name; + + /** + * The description of the domain. + */ + @Column(name = "description") + @NotNull(message = "Description cannot be null.") + @TrimmedNotBlank(groups = AddApplicationEntityScenario.class) + @TrimmedNotEmpty(groups = AddApplicationEntityScenario.class) + @TrimmedSize(min = 3, max = 255, groups = AddApplicationEntityScenario.class) + private String description; +} diff --git a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/core/repositories/ApplicationRepository.java b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/core/repositories/ApplicationRepository.java new file mode 100644 index 0000000..ba07ad6 --- /dev/null +++ b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/core/repositories/ApplicationRepository.java @@ -0,0 +1,7 @@ +package com.andrascsanyi.encyclopediagalactica.document.core.repositories; + +import com.andrascsanyi.encyclopediagalactica.document.core.entities.Application; +import org.springframework.data.repository.CrudRepository; + +public interface ApplicationRepository extends CrudRepository { +} diff --git a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/core/scenarios/AddApplicationScenario.java b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/core/scenarios/AddApplicationScenario.java new file mode 100644 index 0000000..d10eb38 --- /dev/null +++ b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/core/scenarios/AddApplicationScenario.java @@ -0,0 +1,46 @@ +package com.andrascsanyi.encyclopediagalactica.document.core.scenarios; + +import com.andrascsanyi.beanvalidatorextensions.ValidationConstraintsHelper; +import com.andrascsanyi.encyclopediagalactica.document.core.commands.AddApplicationCommand; +import com.andrascsanyi.encyclopediagalactica.document.core.entities.Application; +import com.andrascsanyi.encyclopediagalactica.document.core.validation.AddApplicationEntityScenario; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validator; +import lombok.AllArgsConstructor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import java.util.Set; + +@Service +@AllArgsConstructor +public class AddApplicationScenario { + + private final AddApplicationCommand addApplicationCommand; + private final Validator validator; + private final Logger log = LoggerFactory.getLogger(AddApplicationScenario.class); + + public Application execute(Application applicationEntity) { + + try { + validateInput(applicationEntity); + return addApplicationCommand.addApplication(applicationEntity); + } catch (Throwable t) { + + String errorMessage = String.format("Failed to add application: %s", applicationEntity); + log.error(errorMessage, t); + throw new AddApplicationScenarioException(errorMessage, t); + } + } + + private void validateInput(Application applicationEntity) { + Set> violations = validator.validate( + applicationEntity, + AddApplicationEntityScenario.class); + if (!violations.isEmpty()) { + String error = ValidationConstraintsHelper.getViolationsAsString(violations); + throw new AddApplicationScenarioException(error); + } + } +} diff --git a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/core/scenarios/AddApplicationScenarioException.java b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/core/scenarios/AddApplicationScenarioException.java new file mode 100644 index 0000000..6ab8d7f --- /dev/null +++ b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/core/scenarios/AddApplicationScenarioException.java @@ -0,0 +1,22 @@ +package com.andrascsanyi.encyclopediagalactica.document.core.scenarios; + +public class AddApplicationScenarioException extends RuntimeException { + public AddApplicationScenarioException() { + } + + public AddApplicationScenarioException(String message) { + super(message); + } + + public AddApplicationScenarioException(String message, Throwable cause) { + super(message, cause); + } + + public AddApplicationScenarioException(Throwable cause) { + super(cause); + } + + public AddApplicationScenarioException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/core/scenarios/GetAllApplicationsScenario.java b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/core/scenarios/GetAllApplicationsScenario.java new file mode 100644 index 0000000..6e34d21 --- /dev/null +++ b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/core/scenarios/GetAllApplicationsScenario.java @@ -0,0 +1,29 @@ +package com.andrascsanyi.encyclopediagalactica.document.core.scenarios; + +import com.andrascsanyi.encyclopediagalactica.document.core.commands.GetAllApplicationsCommand; +import com.andrascsanyi.encyclopediagalactica.document.core.entities.Application; +import lombok.AllArgsConstructor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +@AllArgsConstructor +public class GetAllApplicationsScenario { + + private final GetAllApplicationsCommand getAllApplicationsCommand; + private final Logger log = LoggerFactory.getLogger(GetAllApplicationsScenario.class); + + public List execute() { + try { + return getAllApplicationsCommand.getAllApplications(); + } catch (Throwable t) { + log.error("Error while executing getAllApplicationsCommand", t); + throw new GetAllApplicationsScenarioException( + "Error while executing getAllApplicationsCommand", t + ); + } + } +} diff --git a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/core/scenarios/GetAllApplicationsScenarioException.java b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/core/scenarios/GetAllApplicationsScenarioException.java new file mode 100644 index 0000000..89adfcc --- /dev/null +++ b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/core/scenarios/GetAllApplicationsScenarioException.java @@ -0,0 +1,22 @@ +package com.andrascsanyi.encyclopediagalactica.document.core.scenarios; + +public class GetAllApplicationsScenarioException extends RuntimeException { + public GetAllApplicationsScenarioException() { + } + + public GetAllApplicationsScenarioException(String message) { + super(message); + } + + public GetAllApplicationsScenarioException(String message, Throwable cause) { + super(message, cause); + } + + public GetAllApplicationsScenarioException(Throwable cause) { + super(cause); + } + + public GetAllApplicationsScenarioException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/core/validation/AddApplicationEntityScenario.java b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/core/validation/AddApplicationEntityScenario.java new file mode 100644 index 0000000..37fff5c --- /dev/null +++ b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/core/validation/AddApplicationEntityScenario.java @@ -0,0 +1,6 @@ +package com.andrascsanyi.encyclopediagalactica.document.core.validation; + +import jakarta.validation.groups.Default; + +public interface AddApplicationEntityScenario extends Default { +} diff --git a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/entities/ApplicationEntity.java b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/entities/ApplicationEntity.java deleted file mode 100644 index 298d5eb..0000000 --- a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/entities/ApplicationEntity.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.andrascsanyi.encyclopediagalactica.document.entities; - -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.Table; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -/** - * The {@link ApplicationEntity} defines a domain within the Encyclopedia - * Galactica system. - * - * A usage domain describes a set of usage like: - * - *
    - *
  • Starmap
  • - *
  • Finance
  • - *
- * - */ -@Getter -@Setter -@Builder -@NoArgsConstructor -@AllArgsConstructor -@Entity -@Table(name = "application") -public class ApplicationEntity { - - /** - * The unique identifier of the entity. - */ - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "id") - private Long id; - - /** - * The name of the domain. - */ - @Column(name = "name") - private String name; - - /** - * The description of the domain. - */ - @Column(name = "description") - private String description; -} diff --git a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/mappers/ApplicationMapper.java b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/mappers/ApplicationMapper.java deleted file mode 100644 index 249ac29..0000000 --- a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/mappers/ApplicationMapper.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.andrascsanyi.encyclopediagalactica.document.mappers; - -import com.andrascsanyi.encyclopediagalactica.document.api.graphql.input.ApplicationInput; -import com.andrascsanyi.encyclopediagalactica.document.api.graphql.output.ApplicationOutput; -import com.andrascsanyi.encyclopediagalactica.document.entities.ApplicationEntity; -import org.mapstruct.BeanMapping; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.ReportingPolicy; - -import java.util.List; - -@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.WARN) -public interface ApplicationMapper { - - @Mapping(source = "id", target = "id") - @Mapping(source = "name", target = "name") - @Mapping(source = "description", target = "description") - @BeanMapping(ignoreByDefault = true) - ApplicationEntity toApplicationEntity(ApplicationInput applicationInput); - - @Mapping(source = "id", target = "id") - @Mapping(source = "name", target = "name") - @Mapping(source = "description", target = "description") - @BeanMapping(ignoreByDefault = true) - ApplicationOutput toApplicationOutput(ApplicationEntity applicationEntity); - - default List toApplicationOutputList(List result) { - return result.stream().map(this::toApplicationOutput).toList(); - } -} diff --git a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/repositories/ApplicationRepository.java b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/repositories/ApplicationRepository.java deleted file mode 100644 index 61c07f2..0000000 --- a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/repositories/ApplicationRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.andrascsanyi.encyclopediagalactica.document.repositories; - -import com.andrascsanyi.encyclopediagalactica.document.entities.ApplicationEntity; -import org.springframework.data.repository.CrudRepository; - -public interface ApplicationRepository extends CrudRepository { -} diff --git a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/sagas/AddApplicationSaga.java b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/sagas/AddApplicationSaga.java deleted file mode 100644 index c3ea94c..0000000 --- a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/sagas/AddApplicationSaga.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.andrascsanyi.encyclopediagalactica.document.sagas; - -import com.andrascsanyi.encyclopediagalactica.document.api.graphql.input.ApplicationInput; -import com.andrascsanyi.encyclopediagalactica.document.api.graphql.output.ApplicationResponse; -import com.andrascsanyi.encyclopediagalactica.document.api.graphql.output.DocumentErrorOutput; -import com.andrascsanyi.encyclopediagalactica.document.commands.AddApplicationCommand; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -@Service -public class AddApplicationSaga { - - @Autowired private AddApplicationCommand addApplicationCommand; - - private static final Logger log = LoggerFactory.getLogger(AddApplicationSaga.class); - - public ApplicationResponse execute(ApplicationInput input) { - try { - return addApplicationCommand.addApplication(input); - } catch (Exception e) { - - StringBuilder builder = new StringBuilder(); - builder.append("Error happened while executing ") - .append(AddApplicationSaga.class.getSimpleName()); - - return DocumentErrorOutput.builder() - .message(builder.toString()) - .errorDetails(e.toString()) - .build(); - } - } -} diff --git a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/sagas/GetAllApplicationsSaga.java b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/sagas/GetAllApplicationsSaga.java deleted file mode 100644 index 8abb5c0..0000000 --- a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/sagas/GetAllApplicationsSaga.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.andrascsanyi.encyclopediagalactica.document.sagas; - -import com.andrascsanyi.encyclopediagalactica.document.api.graphql.output.ApplicationListOutput; -import com.andrascsanyi.encyclopediagalactica.document.api.graphql.output.ApplicationOutput; -import com.andrascsanyi.encyclopediagalactica.document.api.graphql.output.ApplicationResponse; -import com.andrascsanyi.encyclopediagalactica.document.api.graphql.output.DocumentErrorOutput; -import com.andrascsanyi.encyclopediagalactica.document.commands.GetAllApplicationsCommand; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.List; - -@Service -public class GetAllApplicationsSaga { - - @Autowired private GetAllApplicationsCommand getAllApplicationsCommand; - - public ApplicationResponse execute() { - try { - List applications = getAllApplicationsCommand.getAllApplications(); - return ApplicationListOutput.builder().applicationList(applications).build(); - } catch (Exception e) { - StringBuilder b = new StringBuilder(); - b.append("Error happened while executing ").append(GetAllApplicationsCommand.class); - - return DocumentErrorOutput.builder() - .message(b.toString()) - .errorDetails(e.toString()) - .build(); - } - } -} diff --git a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/validation/AddApplicationScenario.java b/src/main/java/com/andrascsanyi/encyclopediagalactica/document/validation/AddApplicationScenario.java deleted file mode 100644 index 763f0d7..0000000 --- a/src/main/java/com/andrascsanyi/encyclopediagalactica/document/validation/AddApplicationScenario.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.andrascsanyi.encyclopediagalactica.document.validation; - -import jakarta.validation.groups.Default; - -public interface AddApplicationScenario extends Default { -} diff --git a/src/main/resources/graphql/document/entities/application_list_output.graphqls b/src/main/resources/graphql/document/entities/application_list_output.graphqls index b9b9a9d..d0f108e 100644 --- a/src/main/resources/graphql/document/entities/application_list_output.graphqls +++ b/src/main/resources/graphql/document/entities/application_list_output.graphqls @@ -6,5 +6,5 @@ type ApplicationListOutput { """ Items of result. """ - applicationList: [ApplicationOutput!]! + applicationList: [ApplicationListOutputItem!]! } diff --git a/src/main/resources/graphql/document/entities/application_list_output_item.graphqls b/src/main/resources/graphql/document/entities/application_list_output_item.graphqls new file mode 100644 index 0000000..16c6e0e --- /dev/null +++ b/src/main/resources/graphql/document/entities/application_list_output_item.graphqls @@ -0,0 +1,20 @@ +""" +The list output entity representing Application entity related operations result. +""" +type ApplicationListOutputItem { + + """ + The unique identifier of the entity. + """ + id: ID! + + """ + The name of the entity. + """ + name: String + + """ + The description field is the place to provide further details about the entity. + """ + description: String +} diff --git a/src/main/resources/graphql/document/applicationSchema.graphqls b/src/main/resources/graphql/document/schema.graphqls similarity index 61% rename from src/main/resources/graphql/document/applicationSchema.graphqls rename to src/main/resources/graphql/document/schema.graphqls index 57aeab2..f6fa840 100644 --- a/src/main/resources/graphql/document/applicationSchema.graphqls +++ b/src/main/resources/graphql/document/schema.graphqls @@ -1,7 +1,8 @@ -union ApplicationResponse = ApplicationOutput | ApplicationListOutput | DocumentErrorOutput +union ApplicationResponse = ApplicationOutput | DocumentErrorOutput +union ApplicationListResponse = ApplicationListOutput | DocumentErrorOutput extend type Query { - getApplications: ApplicationResponse!, + getApplications: ApplicationListResponse!, getApplication(id: Int!): ApplicationResponse! } diff --git a/src/test/java/com/andrascsanyi/encyclopediagalactica/common/LongAsStringMustBeGreaterOrEqualToOneEntity.java b/src/test/java/com/andrascsanyi/encyclopediagalactica/common/LongAsStringMustBeGreaterOrEqualToOneEntity.java deleted file mode 100644 index 5df3964..0000000 --- a/src/test/java/com/andrascsanyi/encyclopediagalactica/common/LongAsStringMustBeGreaterOrEqualToOneEntity.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.andrascsanyi.encyclopediagalactica.common; - -import com.andrascsanyi.encyclopediagalactica.common.validation.LongAsStringMustBeGreaterOrEqualToOne; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -@Getter -@Setter -@AllArgsConstructor -@NoArgsConstructor -@Builder -public class LongAsStringMustBeGreaterOrEqualToOneEntity { - - @LongAsStringMustBeGreaterOrEqualToOne - private String id; -} diff --git a/src/test/java/com/andrascsanyi/encyclopediagalactica/common/LongAsStringMustBeGreaterOrEqualToOneTests.java b/src/test/java/com/andrascsanyi/encyclopediagalactica/common/LongAsStringMustBeGreaterOrEqualToOneTests.java deleted file mode 100644 index 3b6dcb4..0000000 --- a/src/test/java/com/andrascsanyi/encyclopediagalactica/common/LongAsStringMustBeGreaterOrEqualToOneTests.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.andrascsanyi.encyclopediagalactica.common; - -import com.andrascsanyi.encyclopediagalactica.EncyclopediaGalacticaApplicationBaseTest; -import jakarta.validation.Validator; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.stream.Stream; - -import static org.assertj.core.api.Assertions.assertThat; - -public class LongAsStringMustBeGreaterOrEqualToOneTests extends EncyclopediaGalacticaApplicationBaseTest { - - @Autowired - private Validator validator; - - public static Stream testData() { - return Stream.of( - Arguments.of(LongAsStringMustBeGreaterOrEqualToOneEntity.builder().id("0").build(), 1), - Arguments.of(LongAsStringMustBeGreaterOrEqualToOneEntity.builder().id("1").build(), 0), - Arguments.of(LongAsStringMustBeGreaterOrEqualToOneEntity.builder().id(null).build(), 0), - Arguments.of(LongAsStringMustBeGreaterOrEqualToOneEntity.builder().id("").build(), 0), - Arguments.of(LongAsStringMustBeGreaterOrEqualToOneEntity.builder().id(" ").build(), 0), - Arguments.of(LongAsStringMustBeGreaterOrEqualToOneEntity.builder().id("-1").build(), 1) - ); - } - - @ParameterizedTest - @MethodSource("testData") - public void test(LongAsStringMustBeGreaterOrEqualToOneEntity e, long expected) { - - assertThat(validator.validate(e).size()).isEqualTo(expected); - } -} diff --git a/src/test/java/com/andrascsanyi/encyclopediagalactica/common/LongAsStringMustBeZeroEntity.java b/src/test/java/com/andrascsanyi/encyclopediagalactica/common/LongAsStringMustBeZeroEntity.java deleted file mode 100644 index b5c53ae..0000000 --- a/src/test/java/com/andrascsanyi/encyclopediagalactica/common/LongAsStringMustBeZeroEntity.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.andrascsanyi.encyclopediagalactica.common; - -import com.andrascsanyi.encyclopediagalactica.common.validation.LongAsStringMustBeZero; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -@Builder -@Getter -@Setter -@NoArgsConstructor -@AllArgsConstructor -public class LongAsStringMustBeZeroEntity { - - @LongAsStringMustBeZero - private String id; -} diff --git a/src/test/java/com/andrascsanyi/encyclopediagalactica/common/LongAsStringMustBeZeroTests.java b/src/test/java/com/andrascsanyi/encyclopediagalactica/common/LongAsStringMustBeZeroTests.java deleted file mode 100644 index e1ad421..0000000 --- a/src/test/java/com/andrascsanyi/encyclopediagalactica/common/LongAsStringMustBeZeroTests.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.andrascsanyi.encyclopediagalactica.common; - -import com.andrascsanyi.encyclopediagalactica.EncyclopediaGalacticaApplicationBaseTest; -import jakarta.validation.Validator; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.stream.Stream; - -import static org.assertj.core.api.Assertions.assertThat; - -public class LongAsStringMustBeZeroTests extends EncyclopediaGalacticaApplicationBaseTest { - - public static Stream testData() { - return Stream.of( - Arguments.of(LongAsStringMustBeZeroEntity.builder().id("0").build(), 0), - Arguments.of(LongAsStringMustBeZeroEntity.builder().id("1").build(), 1), - Arguments.of(LongAsStringMustBeZeroEntity.builder().id(null).build(), 0), - Arguments.of(LongAsStringMustBeZeroEntity.builder().id("").build(), 0), - Arguments.of(LongAsStringMustBeZeroEntity.builder().id(" ").build(), 0), - Arguments.of(LongAsStringMustBeZeroEntity.builder().id("-1").build(), 0) - ); - } - - @Autowired - private Validator validator; - - @ParameterizedTest - @MethodSource("testData") - public void test(LongAsStringMustBeZeroEntity e, Integer expected) { - assertThat(validator.validate(e).size()).isGreaterThanOrEqualTo(expected); - } -} diff --git a/src/test/java/com/andrascsanyi/encyclopediagalactica/common/TrimmedNotBlankEntity.java b/src/test/java/com/andrascsanyi/encyclopediagalactica/common/TrimmedNotBlankEntity.java deleted file mode 100644 index f45b5cb..0000000 --- a/src/test/java/com/andrascsanyi/encyclopediagalactica/common/TrimmedNotBlankEntity.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.andrascsanyi.encyclopediagalactica.common; - -import com.andrascsanyi.encyclopediagalactica.common.validation.TrimmedNotBlank; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -@Getter -@Setter -@NoArgsConstructor -@AllArgsConstructor -@Builder -public class TrimmedNotBlankEntity { - - @TrimmedNotBlank - private String id; -} diff --git a/src/test/java/com/andrascsanyi/encyclopediagalactica/common/TrimmedNotBlankTests.java b/src/test/java/com/andrascsanyi/encyclopediagalactica/common/TrimmedNotBlankTests.java deleted file mode 100644 index 9849428..0000000 --- a/src/test/java/com/andrascsanyi/encyclopediagalactica/common/TrimmedNotBlankTests.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.andrascsanyi.encyclopediagalactica.common; - -import com.andrascsanyi.encyclopediagalactica.EncyclopediaGalacticaApplicationBaseTest; -import jakarta.validation.Validator; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.stream.Stream; - -import static org.assertj.core.api.Assertions.assertThat; - -public class TrimmedNotBlankTests extends EncyclopediaGalacticaApplicationBaseTest { - - @Autowired - private Validator validator; - - public static Stream testData() { - return Stream.of( - Arguments.of(TrimmedNotBlankEntity.builder().id("").build(), 1), - Arguments.of(TrimmedNotBlankEntity.builder().id(" ").build(), 1), - Arguments.of(TrimmedNotBlankEntity.builder().id(" ").build(), 1), - Arguments.of(TrimmedNotBlankEntity.builder().id(" ").build(), 1), - Arguments.of(TrimmedNotBlankEntity.builder().id(" \t ").build(), 1), - Arguments.of(TrimmedNotBlankEntity.builder().id(" \n ").build(), 1), - Arguments.of(TrimmedNotBlankEntity.builder().id(" \r ").build(), 1), - Arguments.of(TrimmedNotBlankEntity.builder().id(" \f ").build(), 1), - Arguments.of(TrimmedNotBlankEntity.builder().id(" \s ").build(), 1), - Arguments.of(TrimmedNotBlankEntity.builder().id("a").build(), 0), - Arguments.of(TrimmedNotBlankEntity.builder().id("a ").build(), 0), - Arguments.of(TrimmedNotBlankEntity.builder().id("a ").build(), 0), - Arguments.of(TrimmedNotBlankEntity.builder().id(" a ").build(), 0), - Arguments.of(TrimmedNotBlankEntity.builder().id(" a ").build(), 0) - ); - } - - @ParameterizedTest - @MethodSource("testData") - public void test(TrimmedNotBlankEntity input, int expected) { - - assertThat(validator.validate(input).size()) - .withFailMessage("string value: -" + input.getId() + "-") - .isGreaterThanOrEqualTo(expected); - } -} diff --git a/src/test/java/com/andrascsanyi/encyclopediagalactica/common/TrimmedNotEmptyEntity.java b/src/test/java/com/andrascsanyi/encyclopediagalactica/common/TrimmedNotEmptyEntity.java deleted file mode 100644 index 342025b..0000000 --- a/src/test/java/com/andrascsanyi/encyclopediagalactica/common/TrimmedNotEmptyEntity.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.andrascsanyi.encyclopediagalactica.common; - -import com.andrascsanyi.encyclopediagalactica.common.validation.TrimmedNotEmtpy; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -@Getter -@Setter -@NoArgsConstructor -@AllArgsConstructor -@Builder -public class TrimmedNotEmptyEntity { - - @TrimmedNotEmtpy - private String id; -} diff --git a/src/test/java/com/andrascsanyi/encyclopediagalactica/common/TrimmedNotEmptyTests.java b/src/test/java/com/andrascsanyi/encyclopediagalactica/common/TrimmedNotEmptyTests.java deleted file mode 100644 index 42d4490..0000000 --- a/src/test/java/com/andrascsanyi/encyclopediagalactica/common/TrimmedNotEmptyTests.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.andrascsanyi.encyclopediagalactica.common; - -import com.andrascsanyi.encyclopediagalactica.EncyclopediaGalacticaApplicationBaseTest; -import jakarta.validation.Validator; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.stream.Stream; - -import static org.assertj.core.api.Assertions.assertThat; - -public class TrimmedNotEmptyTests extends EncyclopediaGalacticaApplicationBaseTest { - - @Autowired - private Validator validator; - - public static Stream testData() { - return Stream.of( - Arguments.of(TrimmedNotEmptyEntity.builder().id("").build(), 1), - Arguments.of(TrimmedNotEmptyEntity.builder().id(" ").build(), 1), - Arguments.of(TrimmedNotEmptyEntity.builder().id(" ").build(), 1), - Arguments.of(TrimmedNotEmptyEntity.builder().id(" ").build(), 1), - Arguments.of(TrimmedNotEmptyEntity.builder().id("a").build(), 0), - Arguments.of(TrimmedNotEmptyEntity.builder().id("a ").build(), 0), - Arguments.of(TrimmedNotEmptyEntity.builder().id("a ").build(), 0), - Arguments.of(TrimmedNotEmptyEntity.builder().id(" a ").build(), 0), - Arguments.of(TrimmedNotEmptyEntity.builder().id(" a ").build(), 0) - ); - } - - @ParameterizedTest - @MethodSource("testData") - public void test(TrimmedNotEmptyEntity input, int expected) { - - assertThat(validator.validate(input).size()) - .withFailMessage("string value: -" + input.getId() + "-") - .isGreaterThanOrEqualTo(expected); - } -} diff --git a/src/test/java/com/andrascsanyi/encyclopediagalactica/common/TrimmedSizeEntity.java b/src/test/java/com/andrascsanyi/encyclopediagalactica/common/TrimmedSizeEntity.java deleted file mode 100644 index 8c3619e..0000000 --- a/src/test/java/com/andrascsanyi/encyclopediagalactica/common/TrimmedSizeEntity.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.andrascsanyi.encyclopediagalactica.common; - -import com.andrascsanyi.encyclopediagalactica.common.validation.TrimmedSize; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -@Getter -@Setter -@NoArgsConstructor -@AllArgsConstructor -@Builder -public class TrimmedSizeEntity { - - @TrimmedSize(min = 3, max = 5) - private String value; -} diff --git a/src/test/java/com/andrascsanyi/encyclopediagalactica/common/TrimmedSizeTests.java b/src/test/java/com/andrascsanyi/encyclopediagalactica/common/TrimmedSizeTests.java deleted file mode 100644 index 92a7fd0..0000000 --- a/src/test/java/com/andrascsanyi/encyclopediagalactica/common/TrimmedSizeTests.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.andrascsanyi.encyclopediagalactica.common; - -import com.andrascsanyi.encyclopediagalactica.EncyclopediaGalacticaApplicationBaseTest; -import jakarta.validation.Validator; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; -import org.springframework.beans.factory.annotation.Autowired; - -import java.util.stream.Stream; - -import static org.assertj.core.api.Assertions.assertThat; - -public class TrimmedSizeTests extends EncyclopediaGalacticaApplicationBaseTest { - - @Autowired - private Validator validator; - - public static Stream testData() { - return Stream.of( - // min - Arguments.of(TrimmedSizeEntity.builder().value("qw").build(), 1), - Arguments.of(TrimmedSizeEntity.builder().value("qw ").build(), 1), - Arguments.of(TrimmedSizeEntity.builder().value(" qw").build(), 1), - Arguments.of(TrimmedSizeEntity.builder().value(" qw ").build(), 1), - Arguments.of(TrimmedSizeEntity.builder().value("qww").build(), 0), - // max - Arguments.of(TrimmedSizeEntity.builder().value("qwwww").build(), 0), - Arguments.of(TrimmedSizeEntity.builder().value("qwwww ").build(), 0), - Arguments.of(TrimmedSizeEntity.builder().value(" qwwww").build(), 0), - Arguments.of(TrimmedSizeEntity.builder().value(" qwwww ").build(), 0), - Arguments.of(TrimmedSizeEntity.builder().value("qwwwww").build(), 1) - ); - } - - @ParameterizedTest - @MethodSource("testData") - public void test(TrimmedSizeEntity input, int expectedSize) { - - assertThat(validator.validate(input).size()) - .withFailMessage("value: -" + input.getValue() + "-") - .isGreaterThanOrEqualTo(expectedSize); - } -} diff --git a/src/test/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/AddApplicationEntityTests.java b/src/test/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/AddApplicationGqlApiTests.java similarity index 64% rename from src/test/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/AddApplicationEntityTests.java rename to src/test/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/AddApplicationGqlApiTests.java index da4257f..eac28ec 100644 --- a/src/test/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/AddApplicationEntityTests.java +++ b/src/test/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/AddApplicationGqlApiTests.java @@ -1,9 +1,10 @@ package com.andrascsanyi.encyclopediagalactica.document.api.graphql; import com.andrascsanyi.encyclopediagalactica.EncyclopediaGalacticaApplicationBaseTest; -import com.andrascsanyi.encyclopediagalactica.document.api.graphql.input.ApplicationInput; -import com.andrascsanyi.encyclopediagalactica.document.api.graphql.output.ApplicationOutput; -import com.andrascsanyi.encyclopediagalactica.document.testdata.AddApplicationScenarioInputValidationData; +import com.andrascsanyi.encyclopediagalactica.document.api.graphql.entities.ApplicationInput; +import com.andrascsanyi.encyclopediagalactica.document.api.graphql.entities.ApplicationOutput; +import com.andrascsanyi.encyclopediagalactica.document.api.graphql.entities.ApplicationResponse; +import com.andrascsanyi.encyclopediagalactica.document.api.testdata.AddApplicationViaGraphqlApiScenarioInputValidationData; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ArgumentsSource; @@ -14,7 +15,7 @@ import static org.assertj.core.api.Assertions.assertThat; @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS) -public class AddApplicationEntityTests extends EncyclopediaGalacticaApplicationBaseTest { +public class AddApplicationGqlApiTests extends EncyclopediaGalacticaApplicationBaseTest { @Autowired private HttpGraphQlTester graphQlTester; @@ -23,25 +24,27 @@ public class AddApplicationEntityTests extends EncyclopediaGalacticaApplicationB public void addEntity() { ApplicationInput input = ApplicationInput.builder() - .id("0") - .name("test") - .description("test") + .setId("0") + .setName("test") + .setDescription("test") .build(); graphQlTester.documentName("document/addApplication") .variable("input", input) .execute() .path("data.addApplication") - .entity(ApplicationOutput.class) + .entity(ApplicationResponse.class) .satisfies(result -> { - assertThat(result.getId()).isNotEqualTo("0").isNotBlank().isNotEmpty(); - assertThat(result.getName()).isEqualTo(input.getName()); - assertThat(result.getDescription()).isEqualTo(input.getDescription()); + assertThat(result).isInstanceOf(ApplicationResponse.class); + ApplicationOutput r = (ApplicationOutput) result; + assertThat(r.getId()).isNotEqualTo("0").isNotBlank().isNotEmpty(); + assertThat(r.getName()).isEqualTo(input.getName()); + assertThat(r.getDescription()).isEqualTo(input.getDescription()); }); } @ParameterizedTest - @ArgumentsSource(AddApplicationScenarioInputValidationData.class) + @ArgumentsSource(AddApplicationViaGraphqlApiScenarioInputValidationData.class) public void addEntityInputValidation(ApplicationInput data) { graphQlTester.documentName("document/addApplication") diff --git a/src/test/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/GetAllApplicationsGqlApiTests.java b/src/test/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/GetAllApplicationsGqlApiTests.java new file mode 100644 index 0000000..d71d7fd --- /dev/null +++ b/src/test/java/com/andrascsanyi/encyclopediagalactica/document/api/graphql/GetAllApplicationsGqlApiTests.java @@ -0,0 +1,71 @@ +package com.andrascsanyi.encyclopediagalactica.document.api.graphql; + +import com.andrascsanyi.encyclopediagalactica.EncyclopediaGalacticaApplicationBaseTest; +import com.andrascsanyi.encyclopediagalactica.document.api.graphql.entities.ApplicationInput; +import com.andrascsanyi.encyclopediagalactica.document.api.graphql.entities.ApplicationListOutput; +import com.andrascsanyi.encyclopediagalactica.document.api.graphql.entities.ApplicationListResponse; +import com.andrascsanyi.encyclopediagalactica.document.api.graphql.entities.ApplicationOutput; +import com.andrascsanyi.encyclopediagalactica.document.api.graphql.entities.ApplicationResponse; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.graphql.test.tester.HttpGraphQlTester; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.annotation.DirtiesContext.ClassMode; + +import static org.assertj.core.api.Assertions.assertThat; + +@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD) +public class GetAllApplicationsGqlApiTests extends EncyclopediaGalacticaApplicationBaseTest { + + @Autowired + private HttpGraphQlTester tester; + + @Test + public void testWhenTheDatabaseIsEmpty() { + + tester.documentName("document/getApplications") + .execute() + .path("data.getApplications") + .entity(ApplicationListResponse.class) + .satisfies( + result -> { + assertThat(result).isInstanceOf(ApplicationListResponse.class); + ApplicationListOutput r = (ApplicationListOutput) result; + assertThat(r.getApplicationList()).isEmpty(); + }); + } + + @Test + public void testWhenTheDatabaseHasMultipleItems() { + for (int i = 0; i < 2; i++) { + ApplicationInput input = ApplicationInput.builder() + .setId("0") + .setName("name" + i) + .setDescription("description" + i) + .build(); + + tester.documentName("document/addApplication") + .variable("input", input) + .execute() + .path("data.addApplication") + .entity(ApplicationResponse.class) + .satisfies(result -> { + assertThat(result).isInstanceOf(ApplicationResponse.class); + ApplicationOutput r = (ApplicationOutput) result; + assertThat(r.getName()).isEqualTo(input.getName()); + assertThat(r.getDescription()).isEqualTo(input.getDescription()); + }); + } + + tester.documentName("document/getApplications") + .execute() + .path("data.getApplications") + .entity(ApplicationListResponse.class) + .satisfies( + result -> { + assertThat(result).isInstanceOf(ApplicationListResponse.class); + ApplicationListOutput r = (ApplicationListOutput) result; + assertThat(r.getApplicationList().size()).isEqualTo(2); + }); + } +} diff --git a/src/test/java/com/andrascsanyi/encyclopediagalactica/document/sagas/AddApplicationSagaTests.java b/src/test/java/com/andrascsanyi/encyclopediagalactica/document/api/sagas/AddApplicationSagaTests.java similarity index 67% rename from src/test/java/com/andrascsanyi/encyclopediagalactica/document/sagas/AddApplicationSagaTests.java rename to src/test/java/com/andrascsanyi/encyclopediagalactica/document/api/sagas/AddApplicationSagaTests.java index b152aa8..0af00ed 100644 --- a/src/test/java/com/andrascsanyi/encyclopediagalactica/document/sagas/AddApplicationSagaTests.java +++ b/src/test/java/com/andrascsanyi/encyclopediagalactica/document/api/sagas/AddApplicationSagaTests.java @@ -1,20 +1,21 @@ -package com.andrascsanyi.encyclopediagalactica.document.sagas; +package com.andrascsanyi.encyclopediagalactica.document.api.sagas; import com.andrascsanyi.encyclopediagalactica.EncyclopediaGalacticaApplicationBaseTest; -import com.andrascsanyi.encyclopediagalactica.document.api.graphql.input.ApplicationInput; -import com.andrascsanyi.encyclopediagalactica.document.api.graphql.output.ApplicationListOutput; -import com.andrascsanyi.encyclopediagalactica.document.api.graphql.output.ApplicationOutput; -import com.andrascsanyi.encyclopediagalactica.document.api.graphql.output.ApplicationResponse; -import com.andrascsanyi.encyclopediagalactica.document.api.graphql.output.DocumentErrorOutput; -import com.andrascsanyi.encyclopediagalactica.document.testdata.AddApplicationScenarioInputValidationData; +import com.andrascsanyi.encyclopediagalactica.document.api.graphql.entities.ApplicationInput; +import com.andrascsanyi.encyclopediagalactica.document.api.graphql.entities.ApplicationListOutput; +import com.andrascsanyi.encyclopediagalactica.document.api.graphql.entities.ApplicationListResponse; +import com.andrascsanyi.encyclopediagalactica.document.api.graphql.entities.ApplicationOutput; +import com.andrascsanyi.encyclopediagalactica.document.api.graphql.entities.ApplicationResponse; +import com.andrascsanyi.encyclopediagalactica.document.api.graphql.entities.DocumentErrorOutput; +import com.andrascsanyi.encyclopediagalactica.document.api.graphql.sagas.AddApplicationSaga; +import com.andrascsanyi.encyclopediagalactica.document.api.graphql.sagas.GetAllApplicationsSaga; +import com.andrascsanyi.encyclopediagalactica.document.api.testdata.AddApplicationViaGraphqlApiScenarioInputValidationData; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ArgumentsSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.annotation.DirtiesContext; -import java.util.List; - import static org.assertj.core.api.Assertions.assertThat; @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS) @@ -27,7 +28,7 @@ public class AddApplicationSagaTests extends EncyclopediaGalacticaApplicationBas private GetAllApplicationsSaga getAllApplicationsSaga; @ParameterizedTest - @ArgumentsSource(AddApplicationScenarioInputValidationData.class) + @ArgumentsSource(AddApplicationViaGraphqlApiScenarioInputValidationData.class) public void inputValidation(ApplicationInput input) { ApplicationResponse response = addApplicationSaga.execute(input); @@ -37,11 +38,15 @@ public void inputValidation(ApplicationInput input) { @Test public void createApplication() { - ApplicationInput input = ApplicationInput.builder().name("name").description("description").build(); + ApplicationInput input = ApplicationInput.builder() + .setId("0") + .setName("name") + .setDescription("description") + .build(); ApplicationResponse res = addApplicationSaga.execute(input); assertThat(res).isInstanceOf(ApplicationOutput.class); - ApplicationResponse result = getAllApplicationsSaga.execute(); + ApplicationListResponse result = getAllApplicationsSaga.execute(); assertThat(result).isInstanceOf(ApplicationListOutput.class); ApplicationListOutput r = (ApplicationListOutput) result; diff --git a/src/test/java/com/andrascsanyi/encyclopediagalactica/document/sagas/GetAllApplicationsSagaTests.java b/src/test/java/com/andrascsanyi/encyclopediagalactica/document/api/sagas/GetAllApplicationsSagaTests.java similarity index 58% rename from src/test/java/com/andrascsanyi/encyclopediagalactica/document/sagas/GetAllApplicationsSagaTests.java rename to src/test/java/com/andrascsanyi/encyclopediagalactica/document/api/sagas/GetAllApplicationsSagaTests.java index 19f7ef1..8702d6d 100644 --- a/src/test/java/com/andrascsanyi/encyclopediagalactica/document/sagas/GetAllApplicationsSagaTests.java +++ b/src/test/java/com/andrascsanyi/encyclopediagalactica/document/api/sagas/GetAllApplicationsSagaTests.java @@ -1,68 +1,75 @@ -package com.andrascsanyi.encyclopediagalactica.document.sagas; - -import static org.assertj.core.api.Assertions.assertThat; +package com.andrascsanyi.encyclopediagalactica.document.api.sagas; import com.andrascsanyi.encyclopediagalactica.EncyclopediaGalacticaApplicationBaseTest; -import com.andrascsanyi.encyclopediagalactica.document.api.graphql.input.ApplicationInput; -import com.andrascsanyi.encyclopediagalactica.document.api.graphql.output.ApplicationListOutput; -import com.andrascsanyi.encyclopediagalactica.document.api.graphql.output.ApplicationOutput; -import com.andrascsanyi.encyclopediagalactica.document.api.graphql.output.ApplicationResponse; - +import com.andrascsanyi.encyclopediagalactica.document.api.graphql.entities.ApplicationInput; +import com.andrascsanyi.encyclopediagalactica.document.api.graphql.entities.ApplicationListOutput; +import com.andrascsanyi.encyclopediagalactica.document.api.graphql.entities.ApplicationListResponse; +import com.andrascsanyi.encyclopediagalactica.document.api.graphql.entities.ApplicationOutput; +import com.andrascsanyi.encyclopediagalactica.document.api.graphql.entities.ApplicationResponse; +import com.andrascsanyi.encyclopediagalactica.document.api.graphql.entities.DocumentErrorOutput; +import com.andrascsanyi.encyclopediagalactica.document.api.graphql.sagas.AddApplicationSaga; +import com.andrascsanyi.encyclopediagalactica.document.api.graphql.sagas.GetAllApplicationsSaga; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.annotation.DirtiesContext; -@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) -public class GetAllApplicationsSagaTests extends EncyclopediaGalacticaApplicationBaseTest { - - @Autowired private GetAllApplicationsSaga getAllApplicationsSaga; - - @Autowired private AddApplicationSaga addApplicationSaga; +import static org.assertj.core.api.Assertions.assertThat; +@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) +public class GetAllApplicationsSagaTests extends EncyclopediaGalacticaApplicationBaseTest { + + @Autowired + private GetAllApplicationsSaga getAllApplicationsSaga; + + @Autowired + private AddApplicationSaga addApplicationSaga; + @Test public void testWhenTheDatabaseIsEmpty() { - ApplicationResponse result = getAllApplicationsSaga.execute(); + ApplicationListResponse result = getAllApplicationsSaga.execute(); assertThat(result).isInstanceOf(ApplicationListOutput.class); ApplicationListOutput r = (ApplicationListOutput) result; assertThat(r.getApplicationList()).isEmpty(); } - + @Test public void testWhenThereIsOnlyOneItemInTheDatabase() { - ApplicationInput input = - ApplicationInput.builder().name("name").description("description").build(); + ApplicationInput input = ApplicationInput.builder() + .setName("name") + .setDescription("description") + .build(); ApplicationResponse recordingResult = addApplicationSaga.execute(input); assertThat(recordingResult).isInstanceOf(ApplicationOutput.class); - - ApplicationResponse r = getAllApplicationsSaga.execute(); - + + ApplicationListResponse r = getAllApplicationsSaga.execute(); + assertThat(r).isInstanceOf(ApplicationListOutput.class); + assertThat(r).isNotInstanceOf(DocumentErrorOutput.class); ApplicationListOutput res = (ApplicationListOutput) r; - + assertThat(res.getApplicationList()).isNotEmpty(); assertThat(res.getApplicationList().size()).isEqualTo(1); assertThat(res.getApplicationList().get(0).getId()).isNotEqualTo("0"); assertThat(res.getApplicationList().get(0).getName()).isEqualTo(input.getName()); assertThat(res.getApplicationList().get(0).getDescription()) - .isEqualTo(input.getDescription()); + .isEqualTo(input.getDescription()); } - + @Test public void testWhenThereAreMultipleItemsIntTheDatabase() { for (int i = 0; i < 2; i++) { - ApplicationInput input = - ApplicationInput.builder() - .name("name" + i) - .description("description" + i) - .build(); + ApplicationInput input = ApplicationInput.builder() + .setName("name" + i) + .setDescription("description" + i) + .build(); ApplicationResponse recordingResult = addApplicationSaga.execute(input); assertThat(recordingResult).isInstanceOf(ApplicationOutput.class); } - - ApplicationResponse r = getAllApplicationsSaga.execute(); + + ApplicationListResponse r = getAllApplicationsSaga.execute(); assertThat(r).isInstanceOf(ApplicationListOutput.class); ApplicationListOutput res = (ApplicationListOutput) r; - + assertThat(res.getApplicationList()).isNotEmpty(); assertThat(res.getApplicationList().size()).isEqualTo(2); } diff --git a/src/test/java/com/andrascsanyi/encyclopediagalactica/document/api/testdata/AddApplicationViaGraphqlApiScenarioInputValidationData.java b/src/test/java/com/andrascsanyi/encyclopediagalactica/document/api/testdata/AddApplicationViaGraphqlApiScenarioInputValidationData.java new file mode 100644 index 0000000..4d45253 --- /dev/null +++ b/src/test/java/com/andrascsanyi/encyclopediagalactica/document/api/testdata/AddApplicationViaGraphqlApiScenarioInputValidationData.java @@ -0,0 +1,59 @@ +package com.andrascsanyi.encyclopediagalactica.document.api.testdata; + +import com.andrascsanyi.encyclopediagalactica.document.api.graphql.entities.ApplicationInput; +import com.andrascsanyi.encyclopediagalactica.document.api.graphql.scenarios.AddApplicationScenario; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.ArgumentsProvider; + +import java.util.stream.Stream; + +/** + * Test data for testing input validation of {@link AddApplicationScenario}. + *

+ * The provided test data includes only invalid input parameters. + */ +public class AddApplicationViaGraphqlApiScenarioInputValidationData implements ArgumentsProvider { + @Override + public Stream provideArguments(ExtensionContext context) throws Exception { + return Stream.of( + Arguments.of(ApplicationInput.builder().setId("1").setName("name").setDescription("desc").build()), + + Arguments.of(ApplicationInput.builder().setId("0").setName(null).setDescription("desc").build()), + Arguments.of(ApplicationInput.builder().setId("0").setName("").setDescription("desc").build()), + Arguments.of(ApplicationInput.builder().setId("0").setName(" ").setDescription("desc").build()), + Arguments.of(ApplicationInput.builder().setId("0").setName(" ").setDescription("desc").build()), + Arguments.of(ApplicationInput.builder().setId("0").setName(" ").setDescription("desc").build()), + Arguments.of(ApplicationInput.builder().setId("0").setName("a").setDescription("desc").build()), + Arguments.of(ApplicationInput.builder().setId("0").setName("ab").setDescription("desc").build()), + Arguments.of(ApplicationInput.builder().setId("0").setName("ab ").setDescription("desc").build()), + Arguments.of(ApplicationInput.builder().setId("0").setName(" ab ").setDescription("desc").build()), + Arguments.of(ApplicationInput.builder().setId("0").setName(" ab ").setDescription("desc").build()), + Arguments.of(ApplicationInput.builder().setId("0").setName("a\r").setDescription("desc").build()), + Arguments.of(ApplicationInput.builder().setId("0").setName("aa\r").setDescription("desc").build()), + Arguments.of(ApplicationInput.builder().setId("0").setName("a\t").setDescription("desc").build()), + Arguments.of(ApplicationInput.builder().setId("0").setName("aa\t").setDescription("desc").build()), + Arguments.of(ApplicationInput.builder().setId("0").setName("a\f").setDescription("desc").build()), + Arguments.of(ApplicationInput.builder().setId("0").setName("aa\f").setDescription("desc").build()), + Arguments.of(ApplicationInput.builder().setId("0").setName("a\s").setDescription("desc").build()), + Arguments.of(ApplicationInput.builder().setId("0").setName("aa\s").setDescription("desc").build()), + + Arguments.of(ApplicationInput.builder().setId("0").setDescription("").setName("desc").build()), + Arguments.of(ApplicationInput.builder().setId("0").setDescription(" ").setName("desc").build()), + Arguments.of(ApplicationInput.builder().setId("0").setDescription(" ").setName("desc").build()), + Arguments.of(ApplicationInput.builder().setId("0").setDescription(" ").setName("desc").build()), + Arguments.of(ApplicationInput.builder().setId("0").setDescription("a").setName("desc").build()), + Arguments.of(ApplicationInput.builder().setId("0").setDescription("ab").setName("desc").build()), + Arguments.of(ApplicationInput.builder().setId("0").setDescription("ab ").setName("desc").build()), + Arguments.of(ApplicationInput.builder().setId("0").setDescription(" ab ").setName("desc").build()), + Arguments.of(ApplicationInput.builder().setId("0").setDescription(" ab ").setName("desc").build()), + Arguments.of(ApplicationInput.builder().setId("0").setDescription("a\r").setName("desc").build()), + Arguments.of(ApplicationInput.builder().setId("0").setDescription("aa\r").setName("desc").build()), + Arguments.of(ApplicationInput.builder().setId("0").setDescription("a\t").setName("desc").build()), + Arguments.of(ApplicationInput.builder().setId("0").setDescription("aa\t").setName("desc").build()), + Arguments.of(ApplicationInput.builder().setId("0").setDescription("a\f").setName("desc").build()), + Arguments.of(ApplicationInput.builder().setId("0").setDescription("aa\f").setName("desc").build()), + Arguments.of(ApplicationInput.builder().setId("0").setDescription("a\s").setName("desc").build()), + Arguments.of(ApplicationInput.builder().setId("0").setDescription("aa\s").setName("desc").build())); + } +} diff --git a/src/test/java/com/andrascsanyi/encyclopediagalactica/document/api/validation/AddApplicationScenarioValidationTests.java b/src/test/java/com/andrascsanyi/encyclopediagalactica/document/api/validation/AddApplicationScenarioValidationTests.java new file mode 100644 index 0000000..d63d92a --- /dev/null +++ b/src/test/java/com/andrascsanyi/encyclopediagalactica/document/api/validation/AddApplicationScenarioValidationTests.java @@ -0,0 +1,66 @@ +package com.andrascsanyi.encyclopediagalactica.document.api.validation; + +import com.andrascsanyi.encyclopediagalactica.EncyclopediaGalacticaApplicationBaseTest; +import com.andrascsanyi.encyclopediagalactica.document.api.graphql.entities.ApplicationInput; +import com.andrascsanyi.encyclopediagalactica.document.api.graphql.scenarios.AddApplicationScenario; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validator; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.annotation.DirtiesContext; + +import java.util.Set; +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; + +@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS) +public class AddApplicationScenarioValidationTests extends EncyclopediaGalacticaApplicationBaseTest { + + @Autowired + private Validator validator; + + public static Stream testData() { + return Stream.of( + // id + Arguments.of(ApplicationInput.builder().setId("").setName("asd").setDescription("asd").build(), 0), + Arguments.of(ApplicationInput.builder().setId(" ").setName("asd").setDescription("asd").build(), 0), + Arguments.of(ApplicationInput.builder().setId("0").setName("asd").setDescription("asd").build(), 0), + Arguments.of(ApplicationInput.builder().setId("1").setName("asd").setDescription("asd").build(), 1), + // name + Arguments.of(ApplicationInput.builder().setId("0").setName("asd").setDescription("asd").build(), 0), + Arguments.of(ApplicationInput.builder().setId("0").setName("").setDescription("asd").build(), 1), + Arguments.of(ApplicationInput.builder().setId("0").setName("a").setDescription("asd").build(), 1), + Arguments.of(ApplicationInput.builder().setId("0").setName("as").setDescription("asd").build(), 1), + Arguments.of(ApplicationInput.builder().setId("0").setName("as ").setDescription("asd").build(), 1), + Arguments.of(ApplicationInput.builder().setId("0").setName(" as").setDescription("asd").build(), 1), + Arguments.of(ApplicationInput.builder().setId("0").setName(" ").setDescription("asd").build(), 1), + // description + Arguments.of(ApplicationInput.builder().setId("0").setName("asd").setDescription("asd").build(), 0), + Arguments.of(ApplicationInput.builder().setId("0").setName("asd").setDescription("").build(), 1), + Arguments.of(ApplicationInput.builder().setId("0").setName("asd").setDescription("a").build(), 1), + Arguments.of(ApplicationInput.builder().setId("0").setName("asd").setDescription("as").build(), 1), + Arguments.of(ApplicationInput.builder().setId("0").setName("asd").setDescription("as ").build(), 1), + Arguments.of(ApplicationInput.builder().setId("0").setName("asd").setDescription(" as").build(), 1), + Arguments.of(ApplicationInput.builder().setId("0").setName("asd").setDescription(" ").build(), 1)); + } + + @ParameterizedTest + @MethodSource("testData") + public void test(ApplicationInput applicationInput, Integer errorVolume) { + Set> constraintViolations = validator.validate( + applicationInput, + AddApplicationScenario.class); + + StringBuilder builder = new StringBuilder(); + builder.append("id: -").append(applicationInput.getId()).append("-").append("\n"); + builder.append("name: -").append(applicationInput.getName()).append("-").append("\n"); + builder.append("description: -").append(applicationInput.getDescription()).append("-").append("\n"); + + assertThat(constraintViolations.size()) + .withFailMessage(builder.toString()) + .isGreaterThanOrEqualTo(errorVolume); + } +} diff --git a/src/test/java/com/andrascsanyi/encyclopediagalactica/document/commands/AddApplicationCommandTests.java b/src/test/java/com/andrascsanyi/encyclopediagalactica/document/commands/AddApplicationCommandTests.java deleted file mode 100644 index 68a74aa..0000000 --- a/src/test/java/com/andrascsanyi/encyclopediagalactica/document/commands/AddApplicationCommandTests.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.andrascsanyi.encyclopediagalactica.document.commands; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -import com.andrascsanyi.encyclopediagalactica.EncyclopediaGalacticaApplicationBaseTest; -import com.andrascsanyi.encyclopediagalactica.document.api.graphql.input.ApplicationInput; -import com.andrascsanyi.encyclopediagalactica.document.api.graphql.output.ApplicationOutput; -import com.andrascsanyi.encyclopediagalactica.document.testdata.AddApplicationScenarioInputValidationData; - -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.ArgumentsSource; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.annotation.DirtiesContext; - -import java.util.List; - -@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS) -public class AddApplicationCommandTests extends EncyclopediaGalacticaApplicationBaseTest { - - @Autowired private AddApplicationCommand addApplicationCommand; - - @Autowired private GetAllApplicationsCommand getAllApplicationsCommand; - - @ParameterizedTest - @ArgumentsSource(AddApplicationScenarioInputValidationData.class) - public void inputValidation(ApplicationInput input) { - assertThatThrownBy( - () -> { - addApplicationCommand.addApplication(input); - }) - .isInstanceOf(AddApplicationCommandException.class); - } - - @Test - public void createApplication() - throws GetAllApplicationsCommandException, AddApplicationCommandException { - ApplicationInput input = - ApplicationInput.builder().id("0").name("name").description("desc").build(); - addApplicationCommand.addApplication(input); - List result = - getAllApplicationsCommand.getAllApplications().stream().toList(); - - assertThat(result.size()).isEqualTo(1); - assertThat(result.get(0).getId()).isNotEmpty().isNotBlank().isNotEqualTo("0"); - assertThat(result.get(0).getName()).isEqualTo(input.getName()); - assertThat(result.get(0).getDescription()).isEqualTo(input.getDescription()); - } -} diff --git a/src/test/java/com/andrascsanyi/encyclopediagalactica/document/core/DocumentCoreTestSuite.java b/src/test/java/com/andrascsanyi/encyclopediagalactica/document/core/DocumentCoreTestSuite.java new file mode 100644 index 0000000..f9f2606 --- /dev/null +++ b/src/test/java/com/andrascsanyi/encyclopediagalactica/document/core/DocumentCoreTestSuite.java @@ -0,0 +1,10 @@ +package com.andrascsanyi.encyclopediagalactica.document.core; + +import org.junit.jupiter.api.Tag; +import org.junit.platform.suite.api.SelectPackages; + +@SelectPackages("com.andrascsanyi.encyclopediagalactica.document.core.commands") +@Tag("document") +@Tag("core") +public class DocumentCoreTestSuite { +} diff --git a/src/test/java/com/andrascsanyi/encyclopediagalactica/document/core/commands/AddApplicationCommandTests.java b/src/test/java/com/andrascsanyi/encyclopediagalactica/document/core/commands/AddApplicationCommandTests.java new file mode 100644 index 0000000..fb960ae --- /dev/null +++ b/src/test/java/com/andrascsanyi/encyclopediagalactica/document/core/commands/AddApplicationCommandTests.java @@ -0,0 +1,41 @@ +package com.andrascsanyi.encyclopediagalactica.document.core.commands; + +import com.andrascsanyi.encyclopediagalactica.EncyclopediaGalacticaApplicationBaseTest; +import com.andrascsanyi.encyclopediagalactica.document.core.entities.Application; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.annotation.DirtiesContext; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +@Tag("document") +@Tag("core") +@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) +public class AddApplicationCommandTests extends EncyclopediaGalacticaApplicationBaseTest { + + @Autowired + private AddApplicationCommand addApplicationCommand; + + @Autowired + private GetAllApplicationsCommand getAllApplicationsCommand; + + @Test + public void createApplication() + throws GetAllApplicationsCommandException, AddApplicationCommandException { + Application input = Application.builder() + .id(0L) + .name("name") + .description("desc") + .build(); + addApplicationCommand.addApplication(input); + List result = getAllApplicationsCommand.getAllApplications().stream().toList(); + + assertThat(result.size()).isEqualTo(1); + assertThat(result.get(0).getId()).isNotEqualTo(0L); + assertThat(result.get(0).getName()).isEqualTo(input.getName()); + assertThat(result.get(0).getDescription()).isEqualTo(input.getDescription()); + } +} diff --git a/src/test/java/com/andrascsanyi/encyclopediagalactica/document/commands/GetAllApplicationCommandTests.java b/src/test/java/com/andrascsanyi/encyclopediagalactica/document/core/commands/GetAllApplicationCommandTests.java similarity index 68% rename from src/test/java/com/andrascsanyi/encyclopediagalactica/document/commands/GetAllApplicationCommandTests.java rename to src/test/java/com/andrascsanyi/encyclopediagalactica/document/core/commands/GetAllApplicationCommandTests.java index 948a8b2..8672df9 100644 --- a/src/test/java/com/andrascsanyi/encyclopediagalactica/document/commands/GetAllApplicationCommandTests.java +++ b/src/test/java/com/andrascsanyi/encyclopediagalactica/document/core/commands/GetAllApplicationCommandTests.java @@ -1,8 +1,8 @@ -package com.andrascsanyi.encyclopediagalactica.document.commands; +package com.andrascsanyi.encyclopediagalactica.document.core.commands; import com.andrascsanyi.encyclopediagalactica.EncyclopediaGalacticaApplicationBaseTest; -import com.andrascsanyi.encyclopediagalactica.document.api.graphql.input.ApplicationInput; -import com.andrascsanyi.encyclopediagalactica.document.api.graphql.output.ApplicationOutput; +import com.andrascsanyi.encyclopediagalactica.document.core.entities.Application; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.annotation.DirtiesContext; @@ -11,7 +11,7 @@ import static org.assertj.core.api.Assertions.assertThat; -@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) +@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) public class GetAllApplicationCommandTests extends EncyclopediaGalacticaApplicationBaseTest { @Autowired @@ -20,40 +20,48 @@ public class GetAllApplicationCommandTests extends EncyclopediaGalacticaApplicat @Autowired private AddApplicationCommand addApplicationCommand; + @Tag("document") + @Tag("core") @Test public void testWhenTheDatabaseIsEmpty() throws GetAllApplicationsCommandException { - List result = getAllApplicationsCommand.getAllApplications(); + List result = getAllApplicationsCommand.getAllApplications(); assertThat(result).isEmpty(); } + @Tag("document") + @Tag("core") @Test public void testWhenOnlyASingleItemInTheDatabase() throws AddApplicationCommandException, GetAllApplicationsCommandException { - ApplicationInput input = ApplicationInput.builder() + Application input = Application.builder() + .id(0L) .name("name") .description("description") .build(); addApplicationCommand.addApplication(input); - List resultList = getAllApplicationsCommand.getAllApplications(); + List resultList = getAllApplicationsCommand.getAllApplications(); assertThat(resultList.size()).isEqualTo(1); - assertThat(resultList.get(0).getId()).isGreaterThanOrEqualTo("1").isNotEqualTo("0"); + assertThat(resultList.get(0).getId()).isGreaterThanOrEqualTo(1L).isNotEqualTo(0); assertThat(resultList.get(0).getName()).isEqualTo(input.getName()); assertThat(resultList.get(0).getDescription()).isEqualTo(input.getDescription()); } + @Tag("document") + @Tag("core") @Test public void testWhenMultipleItemsInTheDatabase() throws AddApplicationCommandException, GetAllApplicationsCommandException { for (int i = 0; i < 2; i++) { - ApplicationInput input = ApplicationInput.builder() + Application input = Application.builder() + .id(0L) .name("name" + i) .description("description" + i) .build(); addApplicationCommand.addApplication(input); } - List resultList = getAllApplicationsCommand.getAllApplications(); + List resultList = getAllApplicationsCommand.getAllApplications(); assertThat(resultList.size()).isEqualTo(2); } diff --git a/src/test/java/com/andrascsanyi/encyclopediagalactica/document/core/scenario/AddApplicationScenarioTests.java b/src/test/java/com/andrascsanyi/encyclopediagalactica/document/core/scenario/AddApplicationScenarioTests.java new file mode 100644 index 0000000..8819723 --- /dev/null +++ b/src/test/java/com/andrascsanyi/encyclopediagalactica/document/core/scenario/AddApplicationScenarioTests.java @@ -0,0 +1,49 @@ +package com.andrascsanyi.encyclopediagalactica.document.core.scenario; + + +import com.andrascsanyi.encyclopediagalactica.EncyclopediaGalacticaApplicationBaseTest; +import com.andrascsanyi.encyclopediagalactica.document.core.entities.Application; +import com.andrascsanyi.encyclopediagalactica.document.core.scenarios.AddApplicationScenario; +import com.andrascsanyi.encyclopediagalactica.document.core.scenarios.AddApplicationScenarioException; +import com.andrascsanyi.encyclopediagalactica.document.core.testdata.AddApplicationEntityScenarioInputValidationTestData; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ArgumentsSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.annotation.DirtiesContext; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) +public class AddApplicationScenarioTests extends EncyclopediaGalacticaApplicationBaseTest { + + @Autowired + private AddApplicationScenario addApplicationScenario; + + @Tag("document") + @Tag("core") + @ParameterizedTest + @ArgumentsSource(AddApplicationEntityScenarioInputValidationTestData.class) + public void testValidation(Application applicationEntity) { + assertThatThrownBy(() -> addApplicationScenario.execute(applicationEntity)) + .isInstanceOf(AddApplicationScenarioException.class); + } + + @Tag("document") + @Tag("core") + @Test + public void testAdding() { + Application entity = Application.builder() + .id(0L) + .name("name") + .description("description").build(); + + Application result = addApplicationScenario.execute(entity); + + assertThat(result.getId()).isGreaterThanOrEqualTo(1); + assertThat(result.getName()).isEqualTo(entity.getName()); + assertThat(result.getDescription()).isEqualTo(entity.getDescription()); + } +} diff --git a/src/test/java/com/andrascsanyi/encyclopediagalactica/document/core/scenario/GetAllApplicationsScenarioTests.java b/src/test/java/com/andrascsanyi/encyclopediagalactica/document/core/scenario/GetAllApplicationsScenarioTests.java new file mode 100644 index 0000000..c29f9bc --- /dev/null +++ b/src/test/java/com/andrascsanyi/encyclopediagalactica/document/core/scenario/GetAllApplicationsScenarioTests.java @@ -0,0 +1,66 @@ +package com.andrascsanyi.encyclopediagalactica.document.core.scenario; + +import com.andrascsanyi.encyclopediagalactica.EncyclopediaGalacticaApplicationBaseTest; +import com.andrascsanyi.encyclopediagalactica.document.core.entities.Application; +import com.andrascsanyi.encyclopediagalactica.document.core.scenarios.AddApplicationScenario; +import com.andrascsanyi.encyclopediagalactica.document.core.scenarios.GetAllApplicationsScenario; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.annotation.DirtiesContext; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) +public class GetAllApplicationsScenarioTests extends EncyclopediaGalacticaApplicationBaseTest { + + @Autowired + private GetAllApplicationsScenario getAllApplicationsScenario; + + @Autowired + private AddApplicationScenario addApplicationScenario; + + @Tag("document") + @Tag("core") + @Test + public void testWhenTheDatabaseIsEmpty() { + List applicationEntities = getAllApplicationsScenario.execute(); + assertThat(applicationEntities).isEmpty(); + } + + @Tag("document") + @Tag("core") + @Test + public void testWhenTheDatabaseHasASingleElement() { + Application input = Application.builder() + .id(0L) + .name("name") + .description("description").build(); + + Application result = addApplicationScenario.execute(input); + + List applicationEntities = getAllApplicationsScenario.execute(); + assertThat(applicationEntities).hasSize(1); + assertThat(applicationEntities.get(0).getId()).isGreaterThanOrEqualTo(1); + assertThat(applicationEntities.get(0).getName()).isEqualTo(input.getName()); + assertThat(applicationEntities.get(0).getDescription()).isEqualTo(input.getDescription()); + } + + @Tag("document") + @Tag("core") + @Test + public void testWhenTheDatabaseHasMultipleElements() { + for (int i = 0; i < 2; i++) { + Application input = Application.builder() + .id(0L) + .name("name" + i) + .description("description" + i).build(); + + Application result = addApplicationScenario.execute(input); + } + List applicationEntities = getAllApplicationsScenario.execute(); + assertThat(applicationEntities).hasSize(2); + } +} diff --git a/src/test/java/com/andrascsanyi/encyclopediagalactica/document/core/testdata/AddApplicationEntityScenarioInputValidationTestData.java b/src/test/java/com/andrascsanyi/encyclopediagalactica/document/core/testdata/AddApplicationEntityScenarioInputValidationTestData.java new file mode 100644 index 0000000..eb60981 --- /dev/null +++ b/src/test/java/com/andrascsanyi/encyclopediagalactica/document/core/testdata/AddApplicationEntityScenarioInputValidationTestData.java @@ -0,0 +1,32 @@ +package com.andrascsanyi.encyclopediagalactica.document.core.testdata; + +import com.andrascsanyi.encyclopediagalactica.document.core.entities.Application; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.ArgumentsProvider; + +import java.util.stream.Stream; + +public class AddApplicationEntityScenarioInputValidationTestData implements ArgumentsProvider { + @Override + public Stream provideArguments(ExtensionContext context) throws Exception { + return Stream.of( + Arguments.of(Application.builder().id(1L).name("asd").description("asd").build()), + Arguments.of(Application.builder().id(0L).name(null).description("asd").build()), + Arguments.of(Application.builder().id(0L).name("").description("asd").build()), + Arguments.of(Application.builder().id(0L).name("\t").description("asd").build()), + Arguments.of(Application.builder().id(0L).name("\r").description("asd").build()), + Arguments.of(Application.builder().id(0L).name("\n").description("asd").build()), + Arguments.of(Application.builder().id(0L).name("as").description("asd").build()), + Arguments.of(Application.builder().id(0L).name("as ").description("asd").build()), + Arguments.of(Application.builder().id(0L).name(" as ").description("asd").build()), + Arguments.of(Application.builder().id(0L).name("asd").description(null).build()), + Arguments.of(Application.builder().id(0L).name("asd").description("").build()), + Arguments.of(Application.builder().id(0L).name("asd").description("\t").build()), + Arguments.of(Application.builder().id(0L).name("asd").description("\r").build()), + Arguments.of(Application.builder().id(0L).name("asd").description("\n").build()), + Arguments.of(Application.builder().id(0L).name("asd").description("as ").build()), + Arguments.of(Application.builder().id(0L).name("asd").description(" as ").build()) + ); + } +} diff --git a/src/test/java/com/andrascsanyi/encyclopediagalactica/document/core/validation/AddApplicationEntityScenarioValidationTests.java b/src/test/java/com/andrascsanyi/encyclopediagalactica/document/core/validation/AddApplicationEntityScenarioValidationTests.java new file mode 100644 index 0000000..56ba96d --- /dev/null +++ b/src/test/java/com/andrascsanyi/encyclopediagalactica/document/core/validation/AddApplicationEntityScenarioValidationTests.java @@ -0,0 +1,75 @@ +package com.andrascsanyi.encyclopediagalactica.document.core.validation; + +import com.andrascsanyi.encyclopediagalactica.EncyclopediaGalacticaApplicationBaseTest; +import com.andrascsanyi.encyclopediagalactica.document.core.entities.Application; +import jakarta.validation.ConstraintViolation; +import jakarta.validation.Validator; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.annotation.DirtiesContext; + +import java.util.Set; +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; + +@Tag("document") +@Tag("core") +@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) +public class AddApplicationEntityScenarioValidationTests extends EncyclopediaGalacticaApplicationBaseTest { + + @Autowired + private Validator validator; + + public static Stream data() { + return Stream.of( + Arguments.of(Application.builder().id(1L).name("asd").description("asd").build()), + Arguments.of(Application.builder().id(0L).name(null).description("asd").build()), + Arguments.of(Application.builder().id(0L).name("").description("asd").build()), + Arguments.of(Application.builder().id(0L).name("\t").description("asd").build()), + Arguments.of(Application.builder().id(0L).name("\r").description("asd").build()), + Arguments.of(Application.builder().id(0L).name("\n").description("asd").build()), + Arguments.of(Application.builder().id(0L).name("as").description("asd").build()), + Arguments.of(Application.builder().id(0L).name("as ").description("asd").build()), + Arguments.of(Application.builder().id(0L).name(" as ").description("asd").build()), + Arguments.of(Application.builder().id(0L).name("asd").description(null).build()), + Arguments.of(Application.builder().id(0L).name("asd").description("").build()), + Arguments.of(Application.builder().id(0L).name("asd").description("\t").build()), + Arguments.of(Application.builder().id(0L).name("asd").description("\r").build()), + Arguments.of(Application.builder().id(0L).name("asd").description("\n").build()), + Arguments.of(Application.builder().id(0L).name("asd").description("as ").build()), + Arguments.of(Application.builder().id(0L).name("asd").description(" as ").build()) + ); + } + + @ParameterizedTest + @MethodSource("data") + public void testValidation(Application applicationEntity) { + Set> violations = validator.validate( + applicationEntity, + AddApplicationEntityScenario.class); + + StringBuilder builder = new StringBuilder(); + builder + .append("| Property Name | Property value | \n") + .append("|-------|--------------|\n") + .append("|id |").append(applicationEntity.getId()).append("| \n") + .append("|name: |").append(applicationEntity.getName()).append("| \n") + .append("|desc: |").append(applicationEntity.getDescription()).append("| \n") + .append("|----------|---------------|\n") + .append("|Constraint violations| \n"); + + if (!violations.isEmpty()) { + violations.forEach(i -> { + builder.append("|").append(i.getMessage()).append("|\n"); + }); + } + + assertThat(violations.size()) + .withFailMessage(builder.toString()) + .isGreaterThanOrEqualTo(1); + } +} diff --git a/src/test/java/com/andrascsanyi/encyclopediagalactica/document/testdata/AddApplicationScenarioInputValidationData.java b/src/test/java/com/andrascsanyi/encyclopediagalactica/document/testdata/AddApplicationScenarioInputValidationData.java deleted file mode 100644 index 9eac6cd..0000000 --- a/src/test/java/com/andrascsanyi/encyclopediagalactica/document/testdata/AddApplicationScenarioInputValidationData.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.andrascsanyi.encyclopediagalactica.document.testdata; - -import com.andrascsanyi.encyclopediagalactica.document.api.graphql.input.ApplicationInput; -import com.andrascsanyi.encyclopediagalactica.document.validation.AddApplicationScenario; -import org.junit.jupiter.api.extension.ExtensionContext; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.ArgumentsProvider; - -import java.util.stream.Stream; - -/** - * Test data for testing input validation of {@link AddApplicationScenario}. - *

- * The provided test data includes only invalid input parameters. - */ -public class AddApplicationScenarioInputValidationData implements ArgumentsProvider { - @Override - public Stream provideArguments(ExtensionContext context) throws Exception { - return Stream.of( - Arguments.of(ApplicationInput.builder().id("1").name("name").description("desc").build()), - - Arguments.of(ApplicationInput.builder().id("0").name(null).description("desc").build()), - Arguments.of(ApplicationInput.builder().id("0").name("").description("desc").build()), - Arguments.of(ApplicationInput.builder().id("0").name(" ").description("desc").build()), - Arguments.of(ApplicationInput.builder().id("0").name(" ").description("desc").build()), - Arguments.of(ApplicationInput.builder().id("0").name(" ").description("desc").build()), - Arguments.of(ApplicationInput.builder().id("0").name("a").description("desc").build()), - Arguments.of(ApplicationInput.builder().id("0").name("ab").description("desc").build()), - Arguments.of(ApplicationInput.builder().id("0").name("ab ").description("desc").build()), - Arguments.of(ApplicationInput.builder().id("0").name(" ab ").description("desc").build()), - Arguments.of(ApplicationInput.builder().id("0").name(" ab ").description("desc").build()), - Arguments.of(ApplicationInput.builder().id("0").name("a\r").description("desc").build()), - Arguments.of(ApplicationInput.builder().id("0").name("aa\r").description("desc").build()), - Arguments.of(ApplicationInput.builder().id("0").name("a\t").description("desc").build()), - Arguments.of(ApplicationInput.builder().id("0").name("aa\t").description("desc").build()), - Arguments.of(ApplicationInput.builder().id("0").name("a\f").description("desc").build()), - Arguments.of(ApplicationInput.builder().id("0").name("aa\f").description("desc").build()), - Arguments.of(ApplicationInput.builder().id("0").name("a\s").description("desc").build()), - Arguments.of(ApplicationInput.builder().id("0").name("aa\s").description("desc").build()), - - Arguments.of(ApplicationInput.builder().id("0").description("").name("desc").build()), - Arguments.of(ApplicationInput.builder().id("0").description(" ").name("desc").build()), - Arguments.of(ApplicationInput.builder().id("0").description(" ").name("desc").build()), - Arguments.of(ApplicationInput.builder().id("0").description(" ").name("desc").build()), - Arguments.of(ApplicationInput.builder().id("0").description("a").name("desc").build()), - Arguments.of(ApplicationInput.builder().id("0").description("ab").name("desc").build()), - Arguments.of(ApplicationInput.builder().id("0").description("ab ").name("desc").build()), - Arguments.of(ApplicationInput.builder().id("0").description(" ab ").name("desc").build()), - Arguments.of(ApplicationInput.builder().id("0").description(" ab ").name("desc").build()), - Arguments.of(ApplicationInput.builder().id("0").description("a\r").name("desc").build()), - Arguments.of(ApplicationInput.builder().id("0").description("aa\r").name("desc").build()), - Arguments.of(ApplicationInput.builder().id("0").description("a\t").name("desc").build()), - Arguments.of(ApplicationInput.builder().id("0").description("aa\t").name("desc").build()), - Arguments.of(ApplicationInput.builder().id("0").description("a\f").name("desc").build()), - Arguments.of(ApplicationInput.builder().id("0").description("aa\f").name("desc").build()), - Arguments.of(ApplicationInput.builder().id("0").description("a\s").name("desc").build()), - Arguments.of(ApplicationInput.builder().id("0").description("aa\s").name("desc").build()) - ); - } -} diff --git a/src/test/java/com/andrascsanyi/encyclopediagalactica/document/validation/AddApplicationScenarioValidationTests.java b/src/test/java/com/andrascsanyi/encyclopediagalactica/document/validation/AddApplicationScenarioValidationTests.java deleted file mode 100644 index 4fee3dd..0000000 --- a/src/test/java/com/andrascsanyi/encyclopediagalactica/document/validation/AddApplicationScenarioValidationTests.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.andrascsanyi.encyclopediagalactica.document.validation; - -import com.andrascsanyi.encyclopediagalactica.EncyclopediaGalacticaApplicationBaseTest; -import com.andrascsanyi.encyclopediagalactica.document.api.graphql.input.ApplicationInput; -import jakarta.validation.ConstraintViolation; -import jakarta.validation.Validator; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.annotation.DirtiesContext; - -import java.util.Set; -import java.util.stream.Stream; - -import static org.assertj.core.api.Assertions.assertThat; - -@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS) -public class AddApplicationScenarioValidationTests extends EncyclopediaGalacticaApplicationBaseTest { - - @Autowired - private Validator validator; - - public static Stream testData() { - return Stream.of( - // id - Arguments.of(ApplicationInput.builder().id(null).name("asd").description("asd").build(), 0), - Arguments.of(ApplicationInput.builder().id("").name("asd").description("asd").build(), 0), - Arguments.of(ApplicationInput.builder().id(" ").name("asd").description("asd").build(), 0), - Arguments.of(ApplicationInput.builder().id("0").name("asd").description("asd").build(), 0), - Arguments.of(ApplicationInput.builder().id("1").name("asd").description("asd").build(), 1), - // name - Arguments.of(ApplicationInput.builder().id("0").name("asd").description("asd").build(), 0), - Arguments.of(ApplicationInput.builder().id("0").name(null).description("asd").build(), 1), - Arguments.of(ApplicationInput.builder().id("0").name("").description("asd").build(), 1), - Arguments.of(ApplicationInput.builder().id("0").name("a").description("asd").build(), 1), - Arguments.of(ApplicationInput.builder().id("0").name("as").description("asd").build(), 1), - Arguments.of(ApplicationInput.builder().id("0").name("as ").description("asd").build(), 1), - Arguments.of(ApplicationInput.builder().id("0").name(" as").description("asd").build(), 1), - Arguments.of(ApplicationInput.builder().id("0").name(" ").description("asd").build(), 1), - // description - Arguments.of(ApplicationInput.builder().id("0").name("asd").description("asd").build(), 0), - Arguments.of(ApplicationInput.builder().id("0").name("asd").description(null).build(), 1), - Arguments.of(ApplicationInput.builder().id("0").name("asd").description("").build(), 1), - Arguments.of(ApplicationInput.builder().id("0").name("asd").description("a").build(), 1), - Arguments.of(ApplicationInput.builder().id("0").name("asd").description("as").build(), 1), - Arguments.of(ApplicationInput.builder().id("0").name("asd").description("as ").build(), 1), - Arguments.of(ApplicationInput.builder().id("0").name("asd").description(" as").build(), 1), - Arguments.of(ApplicationInput.builder().id("0").name("asd").description(" ").build(), 1) - ); - } - - @ParameterizedTest - @MethodSource("testData") - public void test(ApplicationInput applicationInput, Integer errorVolume) { - Set> constraintViolations = validator.validate( - applicationInput, - AddApplicationScenario.class); - - StringBuilder builder = new StringBuilder(); - builder.append("id: -").append(applicationInput.getId()).append("-").append("\n"); - builder.append("name: -").append(applicationInput.getName()).append("-").append("\n"); - builder.append("description: -").append(applicationInput.getDescription()).append("-").append("\n"); - - assertThat(constraintViolations.size()) - .withFailMessage(builder.toString()) - .isGreaterThanOrEqualTo(errorVolume); - } -} diff --git a/src/test/resources/graphql-test/document/getAllApplications.graphql b/src/test/resources/graphql-test/document/getAllApplications.graphql deleted file mode 100644 index 71410fc..0000000 --- a/src/test/resources/graphql-test/document/getAllApplications.graphql +++ /dev/null @@ -1,19 +0,0 @@ -query { - getApplications { - __typename - { - ... on ApplicationListOutput { - applicationList - { - id - name - description - } - } - ... on DocumentErrorOutput { - message - errorDetails - } - } - } -} diff --git a/src/test/resources/graphql-test/document/getApplications.graphql b/src/test/resources/graphql-test/document/getApplications.graphql new file mode 100644 index 0000000..8d995d7 --- /dev/null +++ b/src/test/resources/graphql-test/document/getApplications.graphql @@ -0,0 +1,18 @@ +query { + getApplications { + __typename + ... on ApplicationListOutput + { + applicationList + { + id + name + description + } + } + ... on DocumentErrorOutput { + message + errorDetails + } + } +}