feature/use-case-acceptance-tests #116

Merged
hsh-michaelhoennig merged 49 commits from feature/use-case-acceptance-tests into master 2024-10-30 11:40:46 +01:00
6 changed files with 118 additions and 8 deletions
Showing only changes of commit adfa95bf0e - Show all commits

View File

@ -10,6 +10,8 @@ import net.hostsharing.hsadminng.hs.office.usecases.membership.CreateMembership;
import net.hostsharing.hsadminng.hs.office.usecases.partner.CreatePartner;
import net.hostsharing.hsadminng.hs.office.usecases.debitor.DeleteDebitor;
import net.hostsharing.hsadminng.hs.office.usecases.partner.DeletePartner;
import net.hostsharing.hsadminng.hs.office.usecases.subscription.SubscribeToMailinglist;
import net.hostsharing.hsadminng.hs.office.usecases.subscription.UnsubscribeFromMailinglist;
import net.hostsharing.hsadminng.rbac.test.JpaAttempt;
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Order;
@ -132,7 +134,7 @@ class HsOfficeUseCasesTest extends UseCaseTest {
}
@Test
@Order(3000)
@Order(4000)
@Requires("Partner: Test AG")
void shouldCreateMembershipForPartner() {
new CreateMembership(this)
@ -142,4 +144,28 @@ class HsOfficeUseCasesTest extends UseCaseTest {
.given("membershipFeeBillable", "true")
.doRun();
}
@Test
@Order(5000)
@Requires("Person: Test AG")
@Produces("Subscription: Michael Miller to operations-announce")
void shouldSubscribeNewPersonAndContactToMailinglist() {
new SubscribeToMailinglist(this)
.given("partnerPersonUuid", "%{Person: Test AG}")
.given("subscriberFamilyName", "Miller")
.given("subscriberGivenName", "Michael")
.given("subscriberEMailAddress", "michael.miller@example.org")
.given("mailingList", "operations-announce")
.doRun()
.keep();
}
@Test
@Order(5001)
@Requires("Subscription: Michael Miller to operations-announce")
void shouldUnsubscribeNewPersonAndContactToMailinglist() {
new UnsubscribeFromMailinglist(this)
.given("subscriptionUuid", "%{Subscription: Michael Miller to operations-announce}")
.doRun();
}
}

View File

@ -93,7 +93,7 @@ public class TemplateResolver {
private char currentChar() {
if (position >= template.length()) {
throw new IllegalStateException("no more characters. resolved so far: " + resolved);
throw new IllegalStateException("no more characters, maybe closing bracelet missing in template: '''\n" + template + "\n'''");
}
return template.charAt(position);
}

View File

@ -115,7 +115,7 @@ public abstract class UseCase<T extends UseCase<?>> {
}
public final UUID uuid(final String alias) {
return UseCaseTest.getAlias(alias).uuid();
return UseCaseTest.uuid(alias);
}
public static class JsonTemplate {

View File

@ -29,6 +29,7 @@ import java.util.UUID;
import java.util.stream.Collectors;
import static java.util.Arrays.asList;
import static java.util.Optional.ofNullable;
import static org.assertj.core.api.Assertions.assertThat;
public abstract class UseCaseTest extends ContextBasedTest {
@ -151,10 +152,10 @@ public abstract class UseCaseTest extends ContextBasedTest {
return aliases.containsKey(alias);
}
static Alias<?> getAlias(final String name) {
final var alias = aliases.get(name);
assertThat(alias).as("alias '" + name + "' not found in aliases [" +
aliases.keySet().stream().map(v -> "'" + v + "'").collect(Collectors.joining(", ")) + "]"
static UUID uuid(final String name) {
final UUID alias = ofNullable(knowVariables().get(name)).filter(v -> v instanceof UUID).map(UUID.class::cast).orElse(null);
assertThat(alias).as("alias '" + name + "' not found in aliases nor in properties [" +
knowVariables().keySet().stream().map(v -> "'" + v + "'").collect(Collectors.joining(", ")) + "]"
).isNotNull();
return alias;
}
@ -164,7 +165,7 @@ public abstract class UseCaseTest extends ContextBasedTest {
}
static void putProperty(final String name, final Object value) {
properties.put(name, (value instanceof String string) ? resolve(string) : value);
properties.put(name, (value instanceof String string) ? resolveTyped(string) : value);
}
static Map<String, Object> knowVariables() {
@ -179,4 +180,14 @@ public abstract class UseCaseTest extends ContextBasedTest {
return resolved;
}
static Object resolveTyped(final String text) {
final var resolved = resolve(text);
try {
return UUID.fromString(resolved);
} catch (final IllegalArgumentException e) {
// ignore and just use the String value
}
return resolved;
}
}

View File

@ -0,0 +1,53 @@
package net.hostsharing.hsadminng.hs.office.usecases.subscription;
import io.restassured.http.ContentType;
import net.hostsharing.hsadminng.hs.office.usecases.UseCase;
import net.hostsharing.hsadminng.hs.office.usecases.UseCaseTest;
import org.springframework.http.HttpStatus;
import static io.restassured.http.ContentType.JSON;
import static org.springframework.http.HttpStatus.CREATED;
public class SubscribeToMailinglist extends UseCase<SubscribeToMailinglist> {
public SubscribeToMailinglist(final UseCaseTest testSuite) {
super(testSuite);
}
@Override
protected HttpResponse run() {
keep("Person: %{subscriberGivenName} %{subscriberFamilyName}", () ->
httpPost("/api/hs/office/persons", usingJsonBody("""
{
"personType": "NATURAL_PERSON",
"familyName": ${subscriberFamilyName},
"givenName": ${subscriberGivenName}
}
"""))
.expecting(HttpStatus.CREATED).expecting(ContentType.JSON)
);
keep("Contact: %{subscriberGivenName} %{subscriberFamilyName}", () ->
httpPost("/api/hs/office/contacts", usingJsonBody("""
{
"caption": "%{subscriberGivenName} %{subscriberFamilyName}",
"emailAddresses": {
"main": ${subscriberEMailAddress}
}
}
"""))
.expecting(CREATED).expecting(JSON)
);
return httpPost("/api/hs/office/relations", usingJsonBody("""
{
"type": "SUBSCRIBER",
"mark": ${mailingList},
"anchorUuid": ${partnerPersonUuid},
"holderUuid": ${Person: %{subscriberGivenName} %{subscriberFamilyName}},
"contactUuid": ${Contact: %{subscriberGivenName} %{subscriberFamilyName}}
}
"""))
.expecting(CREATED).expecting(JSON);
}
}

View File

@ -0,0 +1,20 @@
package net.hostsharing.hsadminng.hs.office.usecases.subscription;
import net.hostsharing.hsadminng.hs.office.usecases.UseCase;
import net.hostsharing.hsadminng.hs.office.usecases.UseCaseTest;
import static org.springframework.http.HttpStatus.NO_CONTENT;
public class UnsubscribeFromMailinglist extends UseCase<UnsubscribeFromMailinglist> {
public UnsubscribeFromMailinglist(final UseCaseTest testSuite) {
super(testSuite);
}
@Override
protected HttpResponse run() {
return httpDelete("/api/hs/office/relations/" + uuid("subscriptionUuid"))
.expecting(NO_CONTENT);
}
}