From b84b32e08b6f89fbfed53e334f870298a43e6d2a Mon Sep 17 00:00:00 2001 From: Martin <git@mail.de> Date: Thu, 3 Apr 2025 15:29:00 +0200 Subject: [PATCH] OZG-7872 use enum instead of string; adjust naming; remove redundant order --- .../common/command/CommandModelAssembler.java | 16 ++-- .../alfa/common/command/CommandProcessor.java | 11 +-- .../PostfachNachrichtCommandProcessor.java | 25 +++-- .../common/command/CommandProcessorTest.java | 93 ++++++++++++++----- ...PostfachNachrichtCommandProcessorTest.java | 8 +- 5 files changed, 98 insertions(+), 55 deletions(-) diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandModelAssembler.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandModelAssembler.java index 467466ef0b..eb69a13aeb 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandModelAssembler.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandModelAssembler.java @@ -58,15 +58,13 @@ class CommandModelAssembler implements RepresentationModelAssembler<Command, Ent static final Predicate<Command> HAS_KNOWN_COMMAND_ORDER = command -> command.getCommandOrder() != CommandOrder.UNBEKANNT; - private static final List<String> NOT_PROCESSABLE_ORDER = List.of( - CommandOrder.RECEIVE_POSTFACH_NACHRICHT.name(), - CommandOrder.RESEND_POSTFACH_MAIL.name(), - CommandOrder.SEND_POSTFACH_MAIL.name(), - CommandOrder.SEND_POSTFACH_NACHRICHT.name(), - CommandOrder.RESEND_POSTFACH_MAIL.name(), - CommandOrder.RECEIVE_POSTFACH_NACHRICHT.name()); - - static final Predicate<Command> IS_PROCESSABLE_ORDER = command -> !NOT_PROCESSABLE_ORDER.contains(command.getOrder()); + private static final List<CommandOrder> ORDER_PROCESSED_SEPERATELY = List.of( + CommandOrder.RECEIVE_POSTFACH_NACHRICHT, + CommandOrder.RESEND_POSTFACH_MAIL, + CommandOrder.SEND_POSTFACH_MAIL, + CommandOrder.SEND_POSTFACH_NACHRICHT); + + static final Predicate<Command> IS_PROCESSABLE_ORDER = command -> !ORDER_PROCESSED_SEPERATELY.contains(command.getCommandOrder()); private final List<CommandProcessor> processors; diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandProcessor.java b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandProcessor.java index a7343b9a3f..77d8d40bf0 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandProcessor.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/common/command/CommandProcessor.java @@ -1,7 +1,6 @@ package de.ozgcloud.alfa.common.command; import java.util.Objects; -import java.util.function.Predicate; import org.springframework.hateoas.EntityModel; import org.springframework.hateoas.LinkRelation; @@ -12,8 +11,6 @@ public abstract class CommandProcessor { static final LinkRelation REL_EFFECTED_RESOURCE = LinkRelation.of("effected_resource"); static final LinkRelation REL_RELATED_RESOURCE = LinkRelation.of("related_resource"); - static final Predicate<Command> HAS_KNOWN_COMMAND_ORDER = command -> command.getCommandOrder() != CommandOrder.UNBEKANNT; - public void process(EntityModel<Command> model) { var command = model.getContent(); @@ -21,17 +18,17 @@ public abstract class CommandProcessor { return; } - model.addIf(CommandHelper.IS_DONE.test(command) && isResponsibleForEffectedResource(command.getOrder()), + model.addIf(CommandHelper.IS_DONE.test(command) && isResponsibleForEffectedResource(command.getCommandOrder()), () -> createEffectedResourceLinkBuilder(command).withRel(REL_EFFECTED_RESOURCE)); - model.addIf(isResponsible(command.getOrder()), + model.addIf(isResponsibleForRelatedResource(command.getCommandOrder()), () -> createRelatedResourceLinkBuilder(command).withRel(REL_RELATED_RESOURCE)); } - public abstract boolean isResponsibleForEffectedResource(String order); + public abstract boolean isResponsibleForEffectedResource(CommandOrder order); public abstract WebMvcLinkBuilder createEffectedResourceLinkBuilder(Command command); - public abstract boolean isResponsible(String order); + public abstract boolean isResponsibleForRelatedResource(CommandOrder order); public abstract WebMvcLinkBuilder createRelatedResourceLinkBuilder(Command command); } \ No newline at end of file diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachNachrichtCommandProcessor.java b/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachNachrichtCommandProcessor.java index 72f871b053..358f358b47 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachNachrichtCommandProcessor.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/postfach/PostfachNachrichtCommandProcessor.java @@ -3,7 +3,6 @@ package de.ozgcloud.alfa.postfach; import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; import java.util.List; -import java.util.Optional; import org.springframework.hateoas.server.mvc.WebMvcLinkBuilder; import org.springframework.stereotype.Component; @@ -15,19 +14,19 @@ import de.ozgcloud.alfa.common.command.CommandProcessor; @Component public class PostfachNachrichtCommandProcessor extends CommandProcessor { - private static final List<String> RESPONSIBLE_ORDER = List.of( - CommandOrder.RECEIVE_POSTFACH_NACHRICHT.name(), - CommandOrder.RESEND_POSTFACH_MAIL.name()); + private static final List<CommandOrder> RESPONSIBLE_ORDER = List.of( + CommandOrder.RECEIVE_POSTFACH_NACHRICHT, + CommandOrder.RESEND_POSTFACH_MAIL); - private static final List<String> RESPONSIBLE_EFFECTED_RESOURCE_ORDER = List.of( - CommandOrder.SEND_POSTFACH_MAIL.name(), - CommandOrder.SEND_POSTFACH_NACHRICHT.name(), - CommandOrder.RESEND_POSTFACH_MAIL.name(), - CommandOrder.RECEIVE_POSTFACH_NACHRICHT.name()); + private static final List<CommandOrder> RESPONSIBLE_EFFECTED_RESOURCE_ORDER = List.of( + CommandOrder.SEND_POSTFACH_MAIL, + CommandOrder.SEND_POSTFACH_NACHRICHT, + CommandOrder.RESEND_POSTFACH_MAIL, + CommandOrder.RECEIVE_POSTFACH_NACHRICHT); @Override - public boolean isResponsible(String order) { - return Optional.ofNullable(order).map(RESPONSIBLE_ORDER::contains).orElse(false); + public boolean isResponsibleForRelatedResource(CommandOrder order) { + return RESPONSIBLE_ORDER.contains(order); } @Override @@ -36,8 +35,8 @@ public class PostfachNachrichtCommandProcessor extends CommandProcessor { } @Override - public boolean isResponsibleForEffectedResource(String order) { - return Optional.ofNullable(order).map(RESPONSIBLE_EFFECTED_RESOURCE_ORDER::contains).orElse(false); + public boolean isResponsibleForEffectedResource(CommandOrder order) { + return RESPONSIBLE_EFFECTED_RESOURCE_ORDER.contains(order); } @Override diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandProcessorTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandProcessorTest.java index 224152f96e..d62ad2e600 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandProcessorTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/common/command/CommandProcessorTest.java @@ -21,6 +21,11 @@ class CommandProcessorTest { @Nested class TestProcess { + private final Command command = CommandTestFactory.create(); + private final EntityModel<Command> model = EntityModel.of(command); + + private final WebMvcLinkBuilder linkBuilder = WebMvcLinkBuilder.linkTo(CommandController.class).slash("id"); + @Test void shouldNotThrowExceptionsOnNullContent() { EntityModel<Command> entityModel = when(mock(EntityModel.class).getContent()).thenReturn(null).getMock(); @@ -28,49 +33,93 @@ class CommandProcessorTest { assertDoesNotThrow(() -> processor.process(entityModel)); } - @DisplayName("effected resource link") + @DisplayName("effected resource") @Nested class TestEffectedResource { + @DisplayName("should verify if responsibility is related to the order") + @Test + void shouldCallIsResponsibleForEffectedResource() { + processor.process(model); + + verify(processor).isResponsibleForEffectedResource(CommandOrder.fromOrder(CommandTestFactory.ORDER)); + } + + @DisplayName("should create link builder for effected resource if the responsibility matches") @Test - void shouldBeAddedIfResponsible() { - var linkBuilder = WebMvcLinkBuilder.linkTo(CommandController.class).slash("id"); - doReturn(true).when(processor).isResponsibleForEffectedResource(any()); + void shouldCallCreateEffectedResourceLinkBuilder() { + when(processor.isResponsibleForEffectedResource(any())).thenReturn(true); doReturn(linkBuilder).when(processor).createEffectedResourceLinkBuilder(any()); - var command = CommandTestFactory.createBuilder().status(CommandStatus.FINISHED).build(); - var entityModel = EntityModel.of(command); - processor.process(entityModel); + processor.process(model); - assertThat(entityModel.getLink(CommandProcessor.REL_EFFECTED_RESOURCE).get().getHref()).isEqualTo("/api/commands/id"); + verify(processor).createEffectedResourceLinkBuilder(command); } - @Test - void shouldNotBeAddedIfCommandNotDone() { - var command = CommandTestFactory.createBuilder().status(CommandStatus.PENDING).build(); - var entityModel = EntityModel.of(command); + @DisplayName("link") + @Nested + class TestEffectedResourceLink { + + @Test + void shouldBeAddedIfResponsible() { + doReturn(true).when(processor).isResponsibleForEffectedResource(any()); + doReturn(linkBuilder).when(processor).createEffectedResourceLinkBuilder(any()); + var finishedCommand = CommandTestFactory.createBuilder().status(CommandStatus.FINISHED).build(); + var entityModel = EntityModel.of(finishedCommand); + + processor.process(entityModel); + + assertThat(entityModel.getLink(CommandProcessor.REL_EFFECTED_RESOURCE).get().getHref()).isEqualTo("/api/commands/id"); + } - processor.process(entityModel); + @Test + void shouldNotBeAddedIfCommandNotDone() { + var pendingCommand = CommandTestFactory.createBuilder().status(CommandStatus.PENDING).build(); + var entityModel = EntityModel.of(pendingCommand); - assertThat(entityModel.getLink(CommandProcessor.REL_EFFECTED_RESOURCE)).isNotPresent(); + processor.process(entityModel); + + assertThat(entityModel.getLink(CommandProcessor.REL_EFFECTED_RESOURCE)).isNotPresent(); + } } } - @DisplayName("related resource link") + @DisplayName("related resource") @Nested class TestRelatedResource { + @DisplayName("should verify if responsibility is related to the order") + @Test + void shouldCallIsResponsibleForRelatedResource() { + processor.process(model); + + verify(processor).isResponsibleForRelatedResource(CommandOrder.fromOrder(CommandTestFactory.ORDER)); + } + + @DisplayName("should create link builder for related resource if the responsibility matches") @Test - void shouldBeAddedIfResponsible() { - var linkBuilder = WebMvcLinkBuilder.linkTo(CommandController.class).slash("id"); - doReturn(true).when(processor).isResponsible(any()); + void shouldCallCreateRelatedResourceLinkBuilder() { + when(processor.isResponsibleForRelatedResource(any())).thenReturn(true); doReturn(linkBuilder).when(processor).createRelatedResourceLinkBuilder(any()); - var command = CommandTestFactory.create(); - var entityModel = EntityModel.of(command); - processor.process(entityModel); + processor.process(model); + + verify(processor).createRelatedResourceLinkBuilder(command); + } + + @DisplayName("link") + @Nested + class TestRelatedResourceLink { + + @Test + void shouldBeAddedIfResponsible() { + doReturn(true).when(processor).isResponsibleForRelatedResource(any()); + doReturn(linkBuilder).when(processor).createRelatedResourceLinkBuilder(any()); + + processor.process(model); - assertThat(entityModel.getLink(CommandProcessor.REL_RELATED_RESOURCE).get().getHref()).isEqualTo("/api/commands/id"); + assertThat(model.getLink(CommandProcessor.REL_RELATED_RESOURCE).get().getHref()).isEqualTo("/api/commands/id"); + } } } } diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/PostfachNachrichtCommandProcessorTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/PostfachNachrichtCommandProcessorTest.java index a4d6b2272e..5b2cbca51b 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/PostfachNachrichtCommandProcessorTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/postfach/PostfachNachrichtCommandProcessorTest.java @@ -29,7 +29,7 @@ class PostfachNachrichtCommandProcessorTest { @EnumSource(mode = Mode.INCLUDE, names = { "RECEIVE_POSTFACH_NACHRICHT", "RESEND_POSTFACH_MAIL" }) @ParameterizedTest(name = "{0}") void shouldReturnTrueOnOrder(CommandOrder order) { - var isResponsible = processor.isResponsible(order.name()); + var isResponsible = processor.isResponsibleForRelatedResource(order); assertThat(isResponsible).isTrue(); } @@ -37,7 +37,7 @@ class PostfachNachrichtCommandProcessorTest { @EnumSource(mode = Mode.EXCLUDE, names = { "RECEIVE_POSTFACH_NACHRICHT", "RESEND_POSTFACH_MAIL" }) @ParameterizedTest(name = "{0}") void shouldReturnFalseOnOrder(CommandOrder order) { - var isResponsible = processor.isResponsible(order.name()); + var isResponsible = processor.isResponsibleForRelatedResource(order); assertThat(isResponsible).isFalse(); } @@ -63,7 +63,7 @@ class PostfachNachrichtCommandProcessorTest { "RECEIVE_POSTFACH_NACHRICHT" }) @ParameterizedTest(name = "{0}") void shouldReturnTrueOnOrder(CommandOrder order) { - var isResponsible = processor.isResponsibleForEffectedResource(order.name()); + var isResponsible = processor.isResponsibleForEffectedResource(order); assertThat(isResponsible).isTrue(); } @@ -72,7 +72,7 @@ class PostfachNachrichtCommandProcessorTest { "RECEIVE_POSTFACH_NACHRICHT" }) @ParameterizedTest(name = "{0}") void shouldReturnFalseOnOrder(CommandOrder order) { - var isResponsible = processor.isResponsibleForEffectedResource(order.name()); + var isResponsible = processor.isResponsibleForEffectedResource(order); assertThat(isResponsible).isFalse(); } -- GitLab