Skip to content
This repository was archived by the owner on Sep 9, 2024. It is now read-only.

Commit 66332ac

Browse files
committed
feat: Add ContractDefiner interface
1 parent 50ef39c commit 66332ac

27 files changed

Lines changed: 721 additions & 20 deletions
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package io.contracttesting.contractcase;
2+
3+
import io.contract_testing.contractcase.case_boundary.ContractCaseBoundaryConfig;
4+
import io.contract_testing.contractcase.case_boundary.UserNamePassword;
5+
6+
class BoundaryConfigMapper {
7+
8+
static ContractCaseBoundaryConfig map(final ContractCaseConfig config,
9+
final String testRunId) {
10+
11+
var builder = ContractCaseBoundaryConfig.builder().testRunId(testRunId);
12+
13+
if (config.brokerBaseUrl != null) {
14+
builder.brokerBaseUrl(config.brokerBaseUrl);
15+
}
16+
17+
if (config.providerName != null) {
18+
builder.providerName(config.providerName);
19+
}
20+
21+
if (config.consumerName != null) {
22+
builder.consumerName(config.consumerName);
23+
}
24+
25+
if (config.logLevel != null) {
26+
builder.logLevel(config.logLevel.toString());
27+
}
28+
29+
if (config.contractDir != null) {
30+
builder.contractDir(config.contractDir);
31+
}
32+
33+
if (config.contractFilename != null) {
34+
builder.contractFilename(config.contractFilename);
35+
}
36+
37+
if (config.printResults != null) {
38+
builder.printResults(config.printResults);
39+
}
40+
41+
if (config.throwOnFail != null) {
42+
builder.throwOnFail(config.throwOnFail);
43+
}
44+
45+
if (config.publish != null) {
46+
builder.publish(config.publish.toString());
47+
}
48+
if (config.brokerCiAccessToken != null) {
49+
builder.brokerCiAccessToken(config.brokerCiAccessToken);
50+
}
51+
52+
if (config.brokerBasicAuth != null) {
53+
builder.brokerBasicAuth(
54+
UserNamePassword.builder().password(config.brokerBasicAuth.password())
55+
.username(config.brokerBasicAuth.username()).build());
56+
}
57+
58+
if (config.baseUrlUnderTest != null) {
59+
builder.baseUrlUnderTest(config.baseUrlUnderTest);
60+
}
61+
62+
if (config.triggers != null) {
63+
builder.triggerAndTests(BoundaryTriggerGroupMapper.map(config.triggers));
64+
}
65+
66+
if (config.stateHandlers != null) {
67+
builder.stateHandlers(BoundaryStateHandlerMapper.map(config.stateHandlers));
68+
}
69+
70+
return builder.build();
71+
}
72+
}
73+
74+
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package io.contracttesting.contractcase;
2+
3+
import io.contract_testing.contractcase.case_boundary.BoundaryMockDefinition;
4+
5+
class BoundaryDefinitionMapper {
6+
7+
static BoundaryMockDefinition map(ExampleDefinition definition) {
8+
return new BoundaryMockDefinition.Builder().definition(definition.getDefinition())
9+
.states(definition.getStates()).build();
10+
}
11+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package io.contracttesting.contractcase;
2+
3+
import io.contract_testing.contractcase.case_boundary.BoundaryFailure;
4+
import io.contract_testing.contractcase.case_boundary.BoundaryFailureKindConstants;
5+
import io.contract_testing.contractcase.case_boundary.BoundaryResult;
6+
import java.util.Arrays;
7+
import java.util.stream.Collectors;
8+
9+
class BoundaryExceptionMapper {
10+
11+
private static String stackTraceToString(Exception e) {
12+
return Arrays.stream(e.getStackTrace()).map(StackTraceElement::toString).collect(
13+
Collectors.joining());
14+
}
15+
16+
static BoundaryFailure map(Exception e) {
17+
return new BoundaryFailure(e.getClass().getName(), e.getMessage(), stackTraceToString(e));
18+
}
19+
20+
static BoundaryFailure mapAsTriggerFailure(Exception e) {
21+
return new BoundaryFailure(BoundaryFailureKindConstants.CASE_TRIGGER_ERROR, e.getMessage(),
22+
stackTraceToString(e));
23+
}
24+
25+
static BoundaryFailure mapAsVerifyFailure(Exception e) {
26+
return new BoundaryFailure(BoundaryFailureKindConstants.CASE_VERIFY_RETURN_ERROR,
27+
e.getMessage(),
28+
stackTraceToString(e));
29+
}
30+
31+
public static BoundaryResult mapAsStateFailure(Exception e) {
32+
return new BoundaryFailure(BoundaryFailureKindConstants.CASE_CONFIGURATION_ERROR,
33+
"State handler failed with" + e.getMessage(),
34+
stackTraceToString(e));
35+
}
36+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package io.contracttesting.contractcase;
2+
3+
import io.contract_testing.contractcase.case_boundary.BoundaryFailure;
4+
import io.contract_testing.contractcase.case_boundary.BoundaryFailureKindConstants;
5+
import io.contract_testing.contractcase.case_boundary.BoundaryResult;
6+
import io.contract_testing.contractcase.case_boundary.BoundaryResultTypeConstants;
7+
8+
class BoundaryResultMapper {
9+
10+
public static void map(BoundaryResult result) {
11+
final var resultType = result.getResultType();
12+
13+
if (resultType.equals(BoundaryResultTypeConstants.RESULT_SUCCESS)) {
14+
return;
15+
}
16+
if (resultType.equals(BoundaryResultTypeConstants.RESULT_FAILURE)) {
17+
mapFailure((BoundaryFailure) result);
18+
}
19+
}
20+
21+
private static void mapFailure(BoundaryFailure result) {
22+
String kind = result.getKind();
23+
24+
if (kind.equals(BoundaryFailureKindConstants.CASE_BROKER_ERROR)
25+
|| kind.equals(BoundaryFailureKindConstants.CASE_CONFIGURATION_ERROR)
26+
|| kind.equals(BoundaryFailureKindConstants.CASE_TRIGGER_ERROR)) {
27+
throw new ContractCaseConfigurationError(result.getMessage(), result.getLocation());
28+
} else if (kind.equals(BoundaryFailureKindConstants.CASE_CORE_ERROR)) {
29+
throw new ContractCaseCoreError(result.getMessage(), result.getLocation());
30+
} else if (kind.equals(BoundaryFailureKindConstants.CASE_FAILED_ASSERTION_ERROR)
31+
|| kind.equals(BoundaryFailureKindConstants.CASE_VERIFY_RETURN_ERROR)) {
32+
throw new ContractCaseExpectationsNotMet(result.getMessage(), result.getLocation());
33+
}
34+
35+
throw new ContractCaseCoreError(
36+
"Unhandled error kind (" + kind + "): " + result.getMessage(),
37+
result.getLocation());
38+
}
39+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package io.contracttesting.contractcase;
2+
3+
import io.contract_testing.contractcase.case_boundary.BoundaryResult;
4+
import io.contract_testing.contractcase.case_boundary.BoundaryStateHandler;
5+
import io.contract_testing.contractcase.case_boundary.BoundaryStateHandlerWithTeardown;
6+
import io.contract_testing.contractcase.case_boundary.BoundarySuccess;
7+
import io.contract_testing.contractcase.case_boundary.BoundarySuccessWithMap;
8+
import java.util.HashMap;
9+
import java.util.Map;
10+
import org.jetbrains.annotations.NotNull;
11+
12+
class BoundaryStateHandlerMapper {
13+
14+
public static Map<String, ? extends BoundaryStateHandler> map(
15+
Map<String, StateHandler> stateHandlers) {
16+
var ret = new HashMap<String, BoundaryStateHandler>();
17+
18+
stateHandlers.forEach((key, value) -> ret.put(key, map(value)));
19+
20+
return ret;
21+
}
22+
23+
private static BoundaryStateHandlerWithTeardown map(StateHandler handler) {
24+
25+
return new BoundaryStateHandlerWithTeardown() {
26+
27+
@Override
28+
public @NotNull BoundaryResult setup() {
29+
try {
30+
var config = handler.setup();
31+
if (config == null) {
32+
return new BoundarySuccess();
33+
}
34+
return new BoundarySuccessWithMap(config);
35+
} catch (Exception e) {
36+
return BoundaryExceptionMapper.mapAsStateFailure(e);
37+
}
38+
}
39+
40+
@Override
41+
public @NotNull BoundaryResult teardown() {
42+
try {
43+
handler.teardown();
44+
45+
return new BoundarySuccess();
46+
} catch (Exception e) {
47+
return BoundaryExceptionMapper.mapAsStateFailure(e);
48+
}
49+
}
50+
};
51+
}
52+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package io.contracttesting.contractcase;
2+
3+
import io.contract_testing.contractcase.case_boundary.ITriggerFunction;
4+
import java.util.Map;
5+
6+
class BoundaryTriggerGroupMapper {
7+
8+
static Map<String, ? extends ITriggerFunction> map(TriggerGroups triggers) {
9+
return triggers.toMap();
10+
}
11+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package io.contracttesting.contractcase;
2+
3+
import io.contract_testing.contractcase.case_boundary.BoundarySuccess;
4+
import io.contract_testing.contractcase.case_boundary.ITriggerFunction;
5+
6+
class BoundaryTriggerMapper {
7+
8+
static <T> ITriggerFunction map(
9+
Trigger<T> trigger,
10+
TestResponseFunction<T> testResponseFunction) {
11+
12+
return config -> {
13+
T ret;
14+
try {
15+
ret = trigger.call(config);
16+
} catch (Exception e) {
17+
return BoundaryExceptionMapper.mapAsTriggerFailure(e);
18+
}
19+
20+
try {
21+
testResponseFunction.call(ret);
22+
} catch (Exception e) {
23+
return BoundaryExceptionMapper.mapAsVerifyFailure(e);
24+
}
25+
26+
return new BoundarySuccess();
27+
};
28+
}
29+
30+
static <T> ITriggerFunction map(Trigger<T> trigger,
31+
TestErrorResponseFunction testErrorResponseFunction) {
32+
return config -> {
33+
try {
34+
trigger.call(config);
35+
return BoundaryExceptionMapper.mapAsTriggerFailure(
36+
new RuntimeException("Expected the trigger to fail, but it did not"));
37+
} catch (Exception triggerException) {
38+
try {
39+
testErrorResponseFunction.call(triggerException);
40+
} catch (Exception verifyException) {
41+
return BoundaryExceptionMapper.mapAsVerifyFailure(verifyException);
42+
}
43+
}
44+
45+
return new BoundarySuccess();
46+
};
47+
}
48+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package io.contracttesting.contractcase;
2+
3+
import java.util.List;
4+
5+
class BoundaryVersionGenerator {
6+
7+
// TODO: Figure out how to get versions correctly
8+
static final List<String> VERSIONS =
9+
List.of("Java-DSL@beta");
10+
11+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package io.contracttesting.contractcase;
2+
3+
/**
4+
* Defines credentials for brokers secured with HTTP basic auth
5+
*
6+
* @param username The basic auth username
7+
* @param password The basic auth password
8+
*/
9+
public record BrokerBasicAuthCredentials(String username, String password) {
10+
11+
}

0 commit comments

Comments
 (0)