From 794d2f46dc7d7ff8d896d1d31804170727dab70f Mon Sep 17 00:00:00 2001 From: Michael Hoennig Date: Tue, 22 Oct 2024 14:52:50 +0200 Subject: [PATCH] multiple placeholders in @Produce --- .../office/usecases/HsOfficeUseCasesTest.java | 18 ++++---- .../hs/office/usecases/Produces.java | 5 ++- .../hs/office/usecases/UseCaseTest.java | 41 ++++++++++++++++--- .../usecases/partner/CreatePartner.java | 4 +- .../usecases/partner/DeletePartner.java | 4 +- 5 files changed, 53 insertions(+), 19 deletions(-) diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/usecases/HsOfficeUseCasesTest.java b/src/test/java/net/hostsharing/hsadminng/hs/office/usecases/HsOfficeUseCasesTest.java index 9cef534b..eba77db6 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/office/usecases/HsOfficeUseCasesTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/usecases/HsOfficeUseCasesTest.java @@ -25,14 +25,14 @@ class HsOfficeUseCasesTest extends UseCaseTest { @Test @Order(1010) - @Produces("Partner: Test AG") + @Produces(explicitly = "Partner: Test AG", implicitly = "Person: Test AG") void shouldCreatePartner() { new CreatePartner(this, "Partner: Test AG") - .given("partnerNumber", 30001) + .given("partnerNumber", 31010) .given("personType", "LEGAL_PERSON") .given("tradeName", "Test AG") - .given("contactCaption", "Test AG - Bord of Directors") - .given("emailAddress", "bord-of-directors@test-ag.example.org") + .given("contactCaption", "Test AG - Board of Directors") + .given("emailAddress", "board-of-directors@test-ag.example.org") .doRun() .keep(); } @@ -66,7 +66,7 @@ class HsOfficeUseCasesTest extends UseCaseTest { @Test @Order(2011) - @Requires("Partner: Test AG") // FIXME: eigentlich "Person: Test AG" + @Requires("Person: Test AG") @Produces("Debitor: Billing GmbH") void shouldCreateExternalDebitorForPartner() { new CreateExternalDebitorForPartner(this, "Debitor: Billing GmbH") @@ -86,7 +86,7 @@ class HsOfficeUseCasesTest extends UseCaseTest { @Test @Order(2020) - @Requires("Partner: Test AG") // FIXME: eigentlich "Person: Test AG" + @Requires("Person: Test AG") void shouldDeleteDebitor() { new DeleteDebitor(this) .given("partnerNumber", 31020) @@ -96,8 +96,10 @@ class HsOfficeUseCasesTest extends UseCaseTest { @Test @Order(3000) - @Requires("Partner: Test AG") // FIXME: eigentlich "Person: Test AG" + @Requires("Partner: Test AG") void shouldCreateMembershipForPartner() { - new CreateMembership(this).doRun(); + new CreateMembership(this) + + .doRun(); } } diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/usecases/Produces.java b/src/test/java/net/hostsharing/hsadminng/hs/office/usecases/Produces.java index ba148cc7..4c2b526a 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/office/usecases/Produces.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/usecases/Produces.java @@ -4,11 +4,12 @@ import java.lang.annotation.Retention; import java.lang.annotation.Target; import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.RetentionPolicy.CLASS; import static java.lang.annotation.RetentionPolicy.RUNTIME; @Target(METHOD) @Retention(RUNTIME) public @interface Produces { - String value(); + String value() default ""; // same as explicitly, makes it possible to omit the property name + String explicitly() default ""; // same as value + String[] implicitly() default {}; } diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/usecases/UseCaseTest.java b/src/test/java/net/hostsharing/hsadminng/hs/office/usecases/UseCaseTest.java index 408609d5..a9a1b55e 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/office/usecases/UseCaseTest.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/usecases/UseCaseTest.java @@ -7,6 +7,8 @@ import net.hostsharing.hsadminng.hs.office.person.HsOfficePersonRepository; import net.hostsharing.hsadminng.lambda.Reducer; import net.hostsharing.hsadminng.rbac.context.ContextBasedTest; import net.hostsharing.hsadminng.rbac.test.JpaAttempt; +import org.apache.commons.collections4.SetUtils; +import org.hibernate.AssertionFailure; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Order; @@ -20,12 +22,14 @@ import java.io.PrintWriter; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.Map; +import java.util.Set; import java.util.UUID; import java.util.stream.Collectors; -import static java.util.Arrays.stream; +import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; public abstract class UseCaseTest extends ContextBasedTest { @@ -56,7 +60,7 @@ public abstract class UseCaseTest extends ContextBasedTest { @BeforeEach void init(final TestInfo testInfo) { createHostsharingPerson(); - callPrerequisites(testInfo); + callRequiredProducers(testInfo); createTestLogMarkdownFile(testInfo); } @@ -98,7 +102,7 @@ public abstract class UseCaseTest extends ContextBasedTest { log("## Testcase " + testMethodName.replaceAll("([a-z])([A-Z]+)", "$1 $2")); } - private void callPrerequisites(final TestInfo testInfo) throws IllegalAccessException, InvocationTargetException { + private void callRequiredProducers(final TestInfo testInfo) throws IllegalAccessException, InvocationTargetException { final var testMethodRequired = testInfo.getTestMethod() .map(m -> m.getAnnotation(Requires.class)) .map(Requires::value) @@ -107,14 +111,41 @@ public abstract class UseCaseTest extends ContextBasedTest { for (Method testMethod : getClass().getDeclaredMethods()) { final var producesAnnot = testMethod.getAnnotation(Produces.class); if (producesAnnot != null) { - final var testMethodProduct = producesAnnot.value(); - if (testMethodProduct.equals(testMethodRequired)) + final var testMethodProduces = allOf(producesAnnot.value(), producesAnnot.explicitly(), producesAnnot.implicitly()); + if ( // that method can produce something required + testMethodProduces.contains(testMethodRequired) && + + // and it does not produce anything we already have (would cause errors) + SetUtils.intersection(testMethodProduces, knowVariables().keySet()).isEmpty()) + + // then we call the producer method testMethod.invoke(this); } } } } + private Set allOf(final String value, final String explicitly, final String[] implicitly) { + final var all = new HashSet(); + if (!value.isEmpty()) { + all.add(value); + } + if (!explicitly.isEmpty()) { + all.add(explicitly); + } + all.addAll(asList(implicitly)); + return all; + } + + private String oneOf(final String one, final String another) { + if (one != null && another == null) { + return one; + } else if (one == null && another != null) { + return another; + } + throw new AssertionFailure("excactly one value required"); + } + static boolean containsAlias(final String alias) { return aliases.containsKey(alias); } diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/usecases/partner/CreatePartner.java b/src/test/java/net/hostsharing/hsadminng/hs/office/usecases/partner/CreatePartner.java index ddd51efc..bf7a19f6 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/office/usecases/partner/CreatePartner.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/usecases/partner/CreatePartner.java @@ -24,7 +24,7 @@ public class CreatePartner extends UseCase { .expecting(HttpStatus.CREATED).expecting(ContentType.JSON) ); - keep("Contact: %{tradeName} - Bord of Directors", () -> + keep("Contact: %{tradeName} - Board of Directors", () -> httpPost("/api/hs/office/contacts", usingJsonBody(""" { "caption": ${contactCaption}, @@ -42,7 +42,7 @@ public class CreatePartner extends UseCase { "partnerRel": { "anchorUuid": ${Person: Hostsharing eG}, "holderUuid": ${Person: %{tradeName}}, - "contactUuid": ${Contact: %{tradeName} - Bord of Directors} + "contactUuid": ${Contact: %{tradeName} - Board of Directors} }, "details": { "registrationOffice": "Registergericht Hamburg", diff --git a/src/test/java/net/hostsharing/hsadminng/hs/office/usecases/partner/DeletePartner.java b/src/test/java/net/hostsharing/hsadminng/hs/office/usecases/partner/DeletePartner.java index 6e50b7fe..b6f963bc 100644 --- a/src/test/java/net/hostsharing/hsadminng/hs/office/usecases/partner/DeletePartner.java +++ b/src/test/java/net/hostsharing/hsadminng/hs/office/usecases/partner/DeletePartner.java @@ -12,8 +12,8 @@ public class DeletePartner extends UseCase { requires("Partner: Delete AG", alias -> new CreatePartner(testSuite, alias) .given("personType", "LEGAL_PERSON") .given("tradeName", "Delete AG") - .given("contactCaption", "Delete AG - Bord of Directors") - .given("emailAddress", "bord-of-directors@delete-ag.example.org")); + .given("contactCaption", "Delete AG - Board of Directors") + .given("emailAddress", "board-of-directors@delete-ag.example.org")); } @Override