hs-office-coopshares: refactored RestTest

This commit is contained in:
Michael Hoennig 2022-10-20 08:15:47 +02:00
parent 5f4f50a325
commit e2b6986d2b
2 changed files with 67 additions and 83 deletions

View File

@ -1,6 +1,7 @@
package net.hostsharing.hsadminng.hs.office.coopshares;
import net.hostsharing.hsadminng.context.Context;
import net.hostsharing.test.JsonBuilder;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.EnumSource;
import org.springframework.beans.factory.annotation.Autowired;
@ -11,7 +12,9 @@ import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import java.util.UUID;
import java.util.function.Function;
import static net.hostsharing.test.JsonBuilder.jsonObject;
import static org.hamcrest.Matchers.is;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@ -28,118 +31,73 @@ class HsOfficeCoopSharesTransactionControllerRestTest {
@MockBean
HsOfficeCoopSharesTransactionRepository coopSharesTransactionRepo;
static final String VALID_INSERT_REQUEST_BODY = """
{
"membershipUuid": "%s",
"transactionType": "SUBSCRIPTION",
"sharesCount": 8,
"valueDate": "2022-10-13",
"reference": "valid reference",
"comment": "valid comment"
}
""".formatted(UUID.randomUUID());
enum BadRequestTestCases {
MEMBERSHIP_UUID_MISSING(
"""
{
"transactionType": "SUBSCRIPTION",
"sharesCount": 8,
"valueDate": "2022-10-13",
"reference": "temp ref A"
}
""",
requestBody -> requestBody.without("membershipUuid"),
"[membershipUuid must not be null but is \"null\"]"),
TRANSACTION_TYPE_MISSING(
"""
{
"membershipUuid": "%s",
"sharesCount": 8,
"valueDate": "2022-10-13",
"reference": "temp ref A"
}
""".formatted(UUID.randomUUID()),
requestBody -> requestBody.without("transactionType"),
"[transactionType must not be null but is \"null\"]"),
VALUE_DATE_MISSING(
"""
{
"membershipUuid": "%s",
"transactionType": "SUBSCRIPTION",
"sharesCount": 8,
"reference": "temp ref A"
}
""".formatted(UUID.randomUUID()),
requestBody -> requestBody.without("valueDate"),
"[valueDate must not be null but is \"null\"]"),
SHARES_COUNT_FOR_SUBSCRIPTION_MUST_BE_POSITIVE(
"""
{
"membershipUuid": "%s",
"transactionType": "SUBSCRIPTION",
"sharesCount": -1,
"valueDate": "2022-10-13",
"reference": "temp ref A"
}
""".formatted(UUID.randomUUID()),
requestBody -> requestBody
.with("transactionType", "SUBSCRIPTION")
.with("sharesCount", -1),
"[for SUBSCRIPTION, sharesCount must be positive but is \"-1\"]"),
SHARES_COUNT_FOR_CANCELLATION_MUST_BE_NEGATIVE(
"""
{
"membershipUuid": "%s",
"transactionType": "CANCELLATION",
"sharesCount": 1,
"valueDate": "2022-10-13",
"reference": "temp ref A"
}
""".formatted(UUID.randomUUID()),
requestBody -> requestBody
.with("transactionType", "CANCELLATION")
.with("sharesCount", 1),
"[for CANCELLATION, sharesCount must be negative but is \"1\"]"),
SHARES_COUNT_MUST_NOT_BE_NULL(
"""
{
"membershipUuid": "%s",
"transactionType": "ADJUSTMENT",
"sharesCount": 0,
"valueDate": "2022-10-13",
"reference": "temp ref A"
}
""".formatted(UUID.randomUUID()),
requestBody -> requestBody
.with("transactionType", "ADJUSTMENT")
.with("sharesCount", 0),
"[sharesCount must not be 0 but is \"0\"]"),
REFERENCE_MISSING(
"""
{
"membershipUuid": "%s",
"transactionType": "SUBSCRIPTION",
"sharesCount": 8,
"valueDate": "2022-10-13"
}
""".formatted(UUID.randomUUID()),
requestBody -> requestBody.without("reference"),
"[reference must not be null but is \"null\"]"),
REFERENCE_TOO_SHORT(
"""
{
"membershipUuid": "%s",
"transactionType": "SUBSCRIPTION",
"sharesCount": 8,
"valueDate": "2022-10-13",
"reference": "12345"
}
""".formatted(UUID.randomUUID()),
requestBody -> requestBody.with("reference", "12345"),
"[reference size must be between 6 and 48 but is \"12345\"]"),
REFERENCE_TOO_LONG(
"""
{
"membershipUuid": "%s",
"transactionType": "SUBSCRIPTION",
"sharesCount": 8,
"valueDate": "2022-10-13",
"reference": "0123456789012345678901234567890123456789012345678"
}
""".formatted(UUID.randomUUID()),
requestBody -> requestBody.with("reference", "0123456789012345678901234567890123456789012345678"),
"[reference size must be between 6 and 48 but is \"0123456789012345678901234567890123456789012345678\"]");
private final String givenBody;
private final Function<JsonBuilder, JsonBuilder> givenBodyTransformation;
private final String expectedErrorMessage;
BadRequestTestCases(final String givenBody, final String expectedErrorMessage) {
this.givenBody = givenBody;
BadRequestTestCases(
final Function<JsonBuilder, JsonBuilder> givenBodyTransformation,
final String expectedErrorMessage) {
this.givenBodyTransformation = givenBodyTransformation;
this.expectedErrorMessage = expectedErrorMessage;
}
String givenRequestBody() {
return givenBodyTransformation.apply(jsonObject(VALID_INSERT_REQUEST_BODY)).toString();
}
}
@ParameterizedTest
@ -151,7 +109,7 @@ class HsOfficeCoopSharesTransactionControllerRestTest {
.post("/api/hs/office/coopsharestransactions")
.header("current-user", "superuser-alex@hostsharing.net")
.contentType(MediaType.APPLICATION_JSON)
.content(testCase.givenBody)
.content(testCase.givenRequestBody())
.accept(MediaType.APPLICATION_JSON))
// then

View File

@ -21,7 +21,7 @@ public class JsonBuilder {
}
/**
* Add a property (key/value pair).
* Add a string property (key/value pair).
*
* @param key JSON key
* @param value JSON value
@ -36,6 +36,33 @@ public class JsonBuilder {
return this;
}
/**
* Add a numeric property (key/value pair).
*
* @param key JSON key
* @param value JSON value
* @return this JsonBuilder
*/
public JsonBuilder with(final String key, final Number value) {
try {
jsonObject.put(key, value);
} catch (JSONException e) {
throw new RuntimeException(e);
}
return this;
}
/**
* Removes a property (key/value pair).
*
* @param name JSON key
* @return this JsonBuilder
*/
public JsonBuilder without(final String name) {
jsonObject.remove(name);
return this;
}
@Override
public String toString() {
try {
@ -52,5 +79,4 @@ public class JsonBuilder {
throw new RuntimeException(e);
}
}
}