From 33a57dd147f33ffa905a07482932ab9dd5432405 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Tue, 21 Jun 2016 10:37:15 +0200 Subject: [PATCH] Added tests for messaging --- .../camel/StubRunnerCamelProcessor.groovy | 9 ++- .../camel/StubRunnerCamelProcessorSpec.groovy | 67 +++++++++++++++++++ .../StubRunnerIntegrationTransformer.groovy | 2 +- ...tubRunnerIntegrationTransformerSpec.groovy | 64 ++++++++++++++++++ .../stream/StubRunnerStreamTransformer.groovy | 2 +- .../StubRunnerStreamTransformerSpec.groovy | 64 ++++++++++++++++++ .../verifier/util/BodyAsStringUtil.groovy | 4 +- 7 files changed, 205 insertions(+), 7 deletions(-) create mode 100644 spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner-messaging/spring-cloud-contract-stub-runner-camel/src/test/groovy/org/springframework/cloud/contract/stubrunner/messaging/camel/StubRunnerCamelProcessorSpec.groovy create mode 100644 spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner-messaging/spring-cloud-contract-stub-runner-integration/src/test/groovy/org/springframework/cloud/contract/stubrunner/messaging/integration/StubRunnerIntegrationTransformerSpec.groovy create mode 100644 spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner-messaging/spring-cloud-contract-stub-runner-stream/src/test/groovy/org/springframework/cloud/contract/stubrunner/messaging/stream/StubRunnerStreamTransformerSpec.groovy diff --git a/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner-messaging/spring-cloud-contract-stub-runner-camel/src/main/groovy/org/springframework/cloud/contract/stubrunner/messaging/camel/StubRunnerCamelProcessor.groovy b/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner-messaging/spring-cloud-contract-stub-runner-camel/src/main/groovy/org/springframework/cloud/contract/stubrunner/messaging/camel/StubRunnerCamelProcessor.groovy index 7bf6113f9b..b081115b52 100644 --- a/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner-messaging/spring-cloud-contract-stub-runner-camel/src/main/groovy/org/springframework/cloud/contract/stubrunner/messaging/camel/StubRunnerCamelProcessor.groovy +++ b/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner-messaging/spring-cloud-contract-stub-runner-camel/src/main/groovy/org/springframework/cloud/contract/stubrunner/messaging/camel/StubRunnerCamelProcessor.groovy @@ -41,11 +41,14 @@ class StubRunnerCamelProcessor implements Processor { @Override void process(Exchange exchange) throws Exception { Message input = exchange.in - input.body = BodyAsStringUtil.extractClientValueFrom(groovyDsl.outputMessage.body) - groovyDsl.input.messageHeaders.entries.each { + groovyDsl.input.messageHeaders?.entries?.each { input.removeHeader(it.name) } - groovyDsl.outputMessage.headers.entries.each { + if (!groovyDsl.outputMessage) { + return + } + input.body = BodyAsStringUtil.extractStubValueFrom(groovyDsl.outputMessage.body) + groovyDsl.outputMessage.headers?.entries?.each { input.setHeader(it.name, it.clientValue) } } diff --git a/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner-messaging/spring-cloud-contract-stub-runner-camel/src/test/groovy/org/springframework/cloud/contract/stubrunner/messaging/camel/StubRunnerCamelProcessorSpec.groovy b/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner-messaging/spring-cloud-contract-stub-runner-camel/src/test/groovy/org/springframework/cloud/contract/stubrunner/messaging/camel/StubRunnerCamelProcessorSpec.groovy new file mode 100644 index 0000000000..4ef4464ae9 --- /dev/null +++ b/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner-messaging/spring-cloud-contract-stub-runner-camel/src/test/groovy/org/springframework/cloud/contract/stubrunner/messaging/camel/StubRunnerCamelProcessorSpec.groovy @@ -0,0 +1,67 @@ +package org.springframework.cloud.contract.stubrunner.messaging.camel + +import org.apache.camel.CamelContext +import org.apache.camel.Exchange +import org.apache.camel.builder.ExchangeBuilder +import org.apache.camel.spring.SpringCamelContext +import org.springframework.cloud.contract.verifier.dsl.Contract +import spock.lang.Specification + +class StubRunnerCamelProcessorSpec extends Specification { + + CamelContext camelContext = new SpringCamelContext() + Exchange message = ExchangeBuilder.anExchange(camelContext).build() + + def noOutputMessageContract = Contract.make { + label 'return_book_2' + input { + messageFrom('bookStorage') + messageBody([ + bookId: $(consumer(regex('[0-9]+')), producer('123')) + ]) + messageHeaders { + header('sample', 'header') + } + } + } + + def 'should not process the message if there is no output message'() { + given: + StubRunnerCamelProcessor processor = new StubRunnerCamelProcessor(noOutputMessageContract) + when: + processor.process(message) + then: + noExceptionThrown() + } + + def dsl = Contract.make { + label 'return_book_2' + input { + messageFrom('bookStorage') + messageBody([ + bookId: $(consumer(regex('[0-9]+')), producer('123')) + ]) + messageHeaders { + header('sample', 'header') + } + } + outputMessage { + sentTo('returnBook') + body([ + responseId: $(producer(regex('[0-9]+')), consumer('123')) + ]) + headers { + header('BOOK-NAME', 'foo') + } + } + } + + def 'should process message when it has an output message section'() { + given: + StubRunnerCamelProcessor processor = new StubRunnerCamelProcessor(dsl) + when: + processor.process(message) + then: + message.getIn().getBody(String) == '{"responseId":"123"}' + } +} diff --git a/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner-messaging/spring-cloud-contract-stub-runner-integration/src/main/groovy/org/springframework/cloud/contract/stubrunner/messaging/integration/StubRunnerIntegrationTransformer.groovy b/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner-messaging/spring-cloud-contract-stub-runner-integration/src/main/groovy/org/springframework/cloud/contract/stubrunner/messaging/integration/StubRunnerIntegrationTransformer.groovy index d45dafcc81..3a88865e72 100644 --- a/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner-messaging/spring-cloud-contract-stub-runner-integration/src/main/groovy/org/springframework/cloud/contract/stubrunner/messaging/integration/StubRunnerIntegrationTransformer.groovy +++ b/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner-messaging/spring-cloud-contract-stub-runner-integration/src/main/groovy/org/springframework/cloud/contract/stubrunner/messaging/integration/StubRunnerIntegrationTransformer.groovy @@ -41,7 +41,7 @@ class StubRunnerIntegrationTransformer implements GenericTransformer, if (!groovyDsl.outputMessage) { return source } - String payload = BodyAsStringUtil.extractClientValueFrom(groovyDsl.outputMessage.body) + String payload = BodyAsStringUtil.extractStubValueFrom(groovyDsl.outputMessage.body) Map headers = groovyDsl.outputMessage.headers.asStubSideMap() return MessageBuilder.createMessage(payload, new MessageHeaders(headers)) } diff --git a/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner-messaging/spring-cloud-contract-stub-runner-integration/src/test/groovy/org/springframework/cloud/contract/stubrunner/messaging/integration/StubRunnerIntegrationTransformerSpec.groovy b/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner-messaging/spring-cloud-contract-stub-runner-integration/src/test/groovy/org/springframework/cloud/contract/stubrunner/messaging/integration/StubRunnerIntegrationTransformerSpec.groovy new file mode 100644 index 0000000000..2a16bff2df --- /dev/null +++ b/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner-messaging/spring-cloud-contract-stub-runner-integration/src/test/groovy/org/springframework/cloud/contract/stubrunner/messaging/integration/StubRunnerIntegrationTransformerSpec.groovy @@ -0,0 +1,64 @@ +package org.springframework.cloud.contract.stubrunner.messaging.integration + +import org.springframework.cloud.contract.verifier.dsl.Contract +import org.springframework.messaging.Message +import org.springframework.messaging.support.MessageBuilder +import spock.lang.Specification + +class StubRunnerIntegrationTransformerSpec extends Specification { + + Message message = MessageBuilder.withPayload("hello").build() + + def noOutputMessageContract = Contract.make { + label 'return_book_2' + input { + messageFrom('bookStorage') + messageBody([ + bookId: $(consumer(regex('[0-9]+')), producer('123')) + ]) + messageHeaders { + header('sample', 'header') + } + } + } + + def 'should not transform the message if there is no output message'() { + given: + StubRunnerIntegrationTransformer transformer = new StubRunnerIntegrationTransformer(noOutputMessageContract) + when: + def result = transformer.transform(message) + then: + result.is(message) + } + + def dsl = Contract.make { + label 'return_book_2' + input { + messageFrom('bookStorage') + messageBody([ + bookId: $(consumer(regex('[0-9]+')), producer('123')) + ]) + messageHeaders { + header('sample', 'header') + } + } + outputMessage { + sentTo('returnBook') + body([ + responseId: $(producer(regex('[0-9]+')), consumer('123')) + ]) + headers { + header('BOOK-NAME', 'foo') + } + } + } + + def 'should convert dsl into message'() { + given: + StubRunnerIntegrationTransformer transformer = new StubRunnerIntegrationTransformer(dsl) + when: + def result = transformer.transform(message) + then: + result.payload == '{"responseId":"123"}' + } +} diff --git a/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner-messaging/spring-cloud-contract-stub-runner-stream/src/main/groovy/org/springframework/cloud/contract/stubrunner/messaging/stream/StubRunnerStreamTransformer.groovy b/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner-messaging/spring-cloud-contract-stub-runner-stream/src/main/groovy/org/springframework/cloud/contract/stubrunner/messaging/stream/StubRunnerStreamTransformer.groovy index 949304099c..fb304ca301 100644 --- a/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner-messaging/spring-cloud-contract-stub-runner-stream/src/main/groovy/org/springframework/cloud/contract/stubrunner/messaging/stream/StubRunnerStreamTransformer.groovy +++ b/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner-messaging/spring-cloud-contract-stub-runner-stream/src/main/groovy/org/springframework/cloud/contract/stubrunner/messaging/stream/StubRunnerStreamTransformer.groovy @@ -41,7 +41,7 @@ class StubRunnerStreamTransformer implements GenericTransformer, Mess if (!groovyDsl.outputMessage) { return source } - String payload = BodyAsStringUtil.extractClientValueFrom(groovyDsl.outputMessage.body) + String payload = BodyAsStringUtil.extractStubValueFrom(groovyDsl.outputMessage.body) Map headers = groovyDsl.outputMessage.headers.asStubSideMap() return MessageBuilder.createMessage(payload, new MessageHeaders(headers)) } diff --git a/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner-messaging/spring-cloud-contract-stub-runner-stream/src/test/groovy/org/springframework/cloud/contract/stubrunner/messaging/stream/StubRunnerStreamTransformerSpec.groovy b/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner-messaging/spring-cloud-contract-stub-runner-stream/src/test/groovy/org/springframework/cloud/contract/stubrunner/messaging/stream/StubRunnerStreamTransformerSpec.groovy new file mode 100644 index 0000000000..29029a39db --- /dev/null +++ b/spring-cloud-contract-stub-runner/spring-cloud-contract-stub-runner-messaging/spring-cloud-contract-stub-runner-stream/src/test/groovy/org/springframework/cloud/contract/stubrunner/messaging/stream/StubRunnerStreamTransformerSpec.groovy @@ -0,0 +1,64 @@ +package org.springframework.cloud.contract.stubrunner.messaging.stream + +import org.springframework.cloud.contract.verifier.dsl.Contract +import org.springframework.messaging.Message +import org.springframework.messaging.support.MessageBuilder +import spock.lang.Specification + +class StubRunnerStreamTransformerSpec extends Specification { + + Message message = MessageBuilder.withPayload("hello").build() + + def noOutputMessageContract = Contract.make { + label 'return_book_2' + input { + messageFrom('bookStorage') + messageBody([ + bookId: $(consumer(regex('[0-9]+')), producer('123')) + ]) + messageHeaders { + header('sample', 'header') + } + } + } + + def 'should not transform the message if there is no output message'() { + given: + StubRunnerStreamTransformer streamTransformer = new StubRunnerStreamTransformer(noOutputMessageContract) + when: + def result = streamTransformer.transform(message) + then: + result.is(message) + } + + def dsl = Contract.make { + label 'return_book_2' + input { + messageFrom('bookStorage') + messageBody([ + bookId: $(consumer(regex('[0-9]+')), producer('123')) + ]) + messageHeaders { + header('sample', 'header') + } + } + outputMessage { + sentTo('returnBook') + body([ + responseId: $(producer(regex('[0-9]+')), consumer('123')) + ]) + headers { + header('BOOK-NAME', 'foo') + } + } + } + + def 'should convert dsl into message'() { + given: + StubRunnerStreamTransformer streamTransformer = new StubRunnerStreamTransformer(dsl) + when: + def result = streamTransformer.transform(message) + then: + result.payload == '{"responseId":"123"}' + } +} diff --git a/spring-cloud-contract-verifier/spring-cloud-contract-verifier-core/src/main/groovy/org/springframework/cloud/contract/verifier/util/BodyAsStringUtil.groovy b/spring-cloud-contract-verifier/spring-cloud-contract-verifier-core/src/main/groovy/org/springframework/cloud/contract/verifier/util/BodyAsStringUtil.groovy index 44963c84b3..e6bfe085fd 100644 --- a/spring-cloud-contract-verifier/spring-cloud-contract-verifier-core/src/main/groovy/org/springframework/cloud/contract/verifier/util/BodyAsStringUtil.groovy +++ b/spring-cloud-contract-verifier/spring-cloud-contract-verifier-core/src/main/groovy/org/springframework/cloud/contract/verifier/util/BodyAsStringUtil.groovy @@ -40,7 +40,7 @@ class BodyAsStringUtil { * That means that all the interpolations etc. will be resolved for the * server side. */ - static String extractServerValueFrom(Object body) { + static String extractTestValueFrom(Object body) { Object bodyValue = extractServerValueFromBody(body) String json = new JsonOutput().toJson(bodyValue) json = StringEscapeUtils.unescapeJavaScript(json) @@ -52,7 +52,7 @@ class BodyAsStringUtil { * That means that all the interpolations etc. will be resolved for the * client side. */ - static String extractClientValueFrom(Object body) { + static String extractStubValueFrom(Object body) { Object bodyValue = extractClientValueFromBody(body); String json = new JsonOutput().toJson(bodyValue) json = StringEscapeUtils.unescapeJavaScript(json)