/** * scan all methods for @Pact annotation and execute them, if not already initialized * @return */ protected Map < String, PactFragment > getPacts() { if (fragments == null) { fragments = new HashMap <String, PactFragment> (); for (Method m: target.getClass().getMethods()) { if (conformsToSigniture(m)) { Pact pact = m.getAnnotation(Pact.class); PactDslWithState dslBuilder = ConsumerPactBuilder.consumer(pact.consumer()) .hasPactWith(pact.provider()) .given(pact.state()); try { fragments.put(pact.state(), (PactFragment) m.invoke(target, dslBuilder)); } catch (Exception e) { LOGGER.error("Failed to invoke pact method", e); throw new RuntimeException("Failed to invoke pact method", e); } } } } return fragments; }
/** * Name the provider that the consumer has a pact with * @param provider provider name */ public PactDslWithProvider hasPactWith(String provider) { return new PactDslWithProvider(this, provider); }
private void setupDefaultResponseValues(PactDslWithProvider dslBuilder, Method m) { if (m.getParameterTypes().length == 1 && m.getParameterTypes()[0].isAssignableFrom(PactDslResponse.class)) { PactDslResponse defaults = new PactDslResponse(dslBuilder.getConsumerPactBuilder(), null, null, null); try { m.invoke(target, defaults); } catch (IllegalAccessException| InvocationTargetException e) { throw new RuntimeException("Failed to invoke default response method", e); } dslBuilder.setDefaultResponseValues(defaults); } else { throw new UnsupportedOperationException("Method " + m.getName() + " does not conform required method signature 'public void " + m.getName() + "(PactDslResponse defaultResponse)'"); } }
private void setupDefaultRequestValues(PactDslWithProvider dslBuilder, Method m) { if (m.getParameterTypes().length == 1 && m.getParameterTypes()[0].isAssignableFrom(PactDslRequestWithoutPath.class)) { PactDslRequestWithoutPath defaults = dslBuilder.uponReceiving("defaults"); try { m.invoke(target, defaults); } catch (IllegalAccessException| InvocationTargetException e) { throw new RuntimeException("Failed to invoke default request method", e); } dslBuilder.setDefaultRequestValues(defaults); } else { throw new UnsupportedOperationException("Method " + m.getName() + " does not conform required method signature 'public void " + m.getName() + "(PactDslRequestWithoutPath defaultRequest)'"); } }
private void setupDefaultRequestValues(PactDslWithProvider dslBuilder, Method m) { if (m.getParameterTypes().length == 1 && m.getParameterTypes()[0].isAssignableFrom(PactDslRequestWithoutPath.class)) { PactDslRequestWithoutPath defaults = dslBuilder.uponReceiving("defaults"); try { m.invoke(target, defaults); } catch (IllegalAccessException| InvocationTargetException e) { throw new RuntimeException("Failed to invoke default request method", e); } dslBuilder.setDefaultRequestValues(defaults); } else { throw new UnsupportedOperationException("Method " + m.getName() + " does not conform required method signature 'public void " + m.getName() + "(PactDslRequestWithoutPath defaultRequest)'"); } }
/** * scan all methods for @Pact annotation and execute them, if not already initialized * @return */ protected Map < String, PactFragment > getPacts() { if (fragments == null) { fragments = new HashMap <String, PactFragment> (); for (Method m: target.getClass().getMethods()) { if (conformsToSigniture(m)) { Pact pact = m.getAnnotation(Pact.class); PactDslWithState dslBuilder = ConsumerPactBuilder.consumer(pact.consumer()) .hasPactWith(pact.provider()) .given(pact.state()); try { fragments.put(pact.state(), (PactFragment) m.invoke(target, dslBuilder)); } catch (Exception e) { LOGGER.error("Failed to invoke pact method", e); throw new RuntimeException("Failed to invoke pact method", e); } } } } return fragments; }
private void setupDefaultResponseValues(PactDslWithProvider dslBuilder, Method m) { if (m.getParameterTypes().length == 1 && m.getParameterTypes()[0].isAssignableFrom(PactDslResponse.class)) { PactDslResponse defaults = new PactDslResponse(dslBuilder.getConsumerPactBuilder(), null, null, null); try { m.invoke(target, defaults); } catch (IllegalAccessException| InvocationTargetException e) { throw new RuntimeException("Failed to invoke default response method", e); } dslBuilder.setDefaultResponseValues(defaults); } else { throw new UnsupportedOperationException("Method " + m.getName() + " does not conform required method signature 'public void " + m.getName() + "(PactDslResponse defaultResponse)'"); } }
/** * Name the provider that the consumer has a pact with * @param provider provider name */ public PactDslWithProvider hasPactWith(String provider) { return new PactDslWithProvider(this, provider); }
@Pact(consumer="test_consumer") public PactFragment create500(PactDslWithProvider builder) { return builder .given("test state") .uponReceiving("Create Request causing 500") .matchPath("/entity/default.*") .method("POST") .willRespondWith() .status(500) .toFragment(); }
@Pact(consumer="test_consumer") public PactFragment post500(PactDslWithProvider builder) { return builder .given("test state") .uponReceiving("POST Request causing 500") .matchPath("/entity/default.*") .method("POST") .willRespondWith() .status(500) .toFragment(); }
@Pact(consumer="test_consumer") public PactFragment get500(PactDslWithProvider builder) { return builder .given("test state") .uponReceiving("GET Request causing 500") .matchPath("/entity/default.*") .method("GET") .willRespondWith() .status(500) .toFragment(); }
@Pact(consumer="sample_microservice") public RequestResponsePact createPact(PactDslWithProvider builder) throws IOException { return builder .given("weather forecast data") .uponReceiving("a request for a weather request for Hamburg") .path("/some-test-api-key/53.5511,9.9937") .method("GET") .willRespondWith() .status(200) .body(FileLoader.read("classpath:weatherApiResponse.json"), ContentType.APPLICATION_JSON) .toPact(); }
@Pact(consumer="test_consumer") public PactFragment getNotFound(PactDslWithProvider builder) { return builder .given("test state") .uponReceiving("Find non existent request") .path("/entity/default/" + RequestResponseJsonObjects.aggregateType + "/" + RequestResponseJsonObjects.ENTITY_ID) .method("GET") .willRespondWith() .status(200) .body(RequestResponseJsonObjects.makeFindNonExistentResponse()) .toFragment(); }
@Pact(consumer="test_consumer") public PactFragment find(PactDslWithProvider builder) { return builder .given("test state") .uponReceiving("Find request") .path("/entity/default/" + RequestResponseJsonObjects.aggregateType + "/" + RequestResponseJsonObjects.ENTITY_ID) .method("GET") .willRespondWith() .status(200) .body(RequestResponseJsonObjects.makeFindResponse()) .toFragment(); }
@Pact(consumer="test_consumer") public PactFragment findWithTriggeringEvent(PactDslWithProvider builder) { return builder .given("test state") .uponReceiving("findWithTriggeringEvent request") .path("/entity/default/" + RequestResponseJsonObjects.aggregateType + "/" + RequestResponseJsonObjects.ENTITY_ID) .query("triggeringEventToken=myeventtoken") .method("GET") .willRespondWith() .status(200) .body(RequestResponseJsonObjects.makeFindResponse()) .toFragment(); }
@Pact(consumer="test_consumer") public PactFragment findWithTriggeringEventConflict(PactDslWithProvider builder) { return builder .given("test state") .uponReceiving("findWithTriggeringEventConflict request") .path("/entity/default/" + RequestResponseJsonObjects.aggregateType + "/" + RequestResponseJsonObjects.ENTITY_ID) .query("triggeringEventToken=myeventtoken") .method("GET") .willRespondWith() .status(409) .body(RequestResponseJsonObjects.makeDuplicateEventErrorResponse()) .toFragment(); }
@Pact(state = "provider accepts a new person", provider = "userservice", consumer = "userclient") RequestResponsePact createPersonPact(PactDslWithProvider builder) { // @formatter:off return builder .given("provider accepts a new person") .uponReceiving("a request to POST a person") .path("/user-service/users") .method("POST") .willRespondWith() .status(201) .matchHeader("Content-Type", "application/json") .body(new PactDslJsonBody() .integerType("id", 42)) .toPact(); // @formatter:on }
@Pact(consumer="test_consumer") public PactFragment createWithId(PactDslWithProvider builder) { return builder .given("test state") .uponReceiving("Create with Id request") .path("/entity/default") .method("POST") .matchHeader("Content-Type", "application/json") .body(RequestResponseJsonObjects.makeExpectedCreateWithIdRequest()) .willRespondWith() .status(200) .body(RequestResponseJsonObjects.makeCreateWithIdResponse()) .toFragment(); }
@Pact(consumer="test_consumer") public PactFragment updateWithOptimisticLockingExceptionFollowingRetry(PactDslWithProvider builder) { return builder .given("test state") .uponReceiving("Update with Optimistic Locking request 2") .path("/entity/default/" + RequestResponseJsonObjects.aggregateType + "/" + RequestResponseJsonObjects.ENTITY_ID) .method("POST") .matchHeader("Content-Type", "application/json") .body(RequestResponseJsonObjects.makeExpectedUpdateRequest()) .willRespondWith() .status(409) .body(RequestResponseJsonObjects.makeOptimisticLockingErrorResponse()) .toFragment(); }
@Pact(consumer="test_consumer") public PactFragment createWithDuplicateId(PactDslWithProvider builder) { return builder .given("test state") .uponReceiving("Create with DuplicateId request") .path("/entity/default") .method("POST") .matchHeader("Content-Type", "application/json") .body(RequestResponseJsonObjects.makeExpectedCreateWithIdRequest() ) .willRespondWith() .status(409) .body(RequestResponseJsonObjects.makeEntityExistsErrorResponse()) .toFragment(); }