diff --git a/accurest-messaging/accurest-messaging-camel/src/main/java/io/codearte/accurest/messaging/camel/AccurestCamelMessaging.java b/accurest-messaging/accurest-messaging-camel/src/main/java/io/codearte/accurest/messaging/camel/AccurestCamelMessaging.java index bf1eef7dc1..914d962f47 100644 --- a/accurest-messaging/accurest-messaging-camel/src/main/java/io/codearte/accurest/messaging/camel/AccurestCamelMessaging.java +++ b/accurest-messaging/accurest-messaging-camel/src/main/java/io/codearte/accurest/messaging/camel/AccurestCamelMessaging.java @@ -1,8 +1,8 @@ package io.codearte.accurest.messaging.camel; -import io.codearte.accurest.messaging.AccurestMessage; -import io.codearte.accurest.messaging.AccurestMessageBuilder; -import io.codearte.accurest.messaging.AccurestMessaging; +import java.util.Map; +import java.util.concurrent.TimeUnit; + import org.apache.camel.CamelContext; import org.apache.camel.ConsumerTemplate; import org.apache.camel.Exchange; @@ -14,8 +14,9 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import java.util.Map; -import java.util.concurrent.TimeUnit; +import io.codearte.accurest.messaging.AccurestMessage; +import io.codearte.accurest.messaging.AccurestMessageBuilder; +import io.codearte.accurest.messaging.AccurestMessaging; /** * @author Marcin Grzejszczak @@ -49,6 +50,12 @@ public class AccurestCamelMessaging implements AccurestMessaging } } + @Override + @SuppressWarnings("unchecked") + public void send(T payload, Map headers, String destination) { + send(builder.create(payload, headers), destination); + } + @Override @SuppressWarnings("unchecked") public AccurestMessage receiveMessage(String destination, long timeout, TimeUnit timeUnit) { diff --git a/accurest-messaging/accurest-messaging-core/src/main/java/io/codearte/accurest/messaging/AccurestMessaging.java b/accurest-messaging/accurest-messaging-core/src/main/java/io/codearte/accurest/messaging/AccurestMessaging.java index 226f800046..17ee2e40bf 100644 --- a/accurest-messaging/accurest-messaging-core/src/main/java/io/codearte/accurest/messaging/AccurestMessaging.java +++ b/accurest-messaging/accurest-messaging-core/src/main/java/io/codearte/accurest/messaging/AccurestMessaging.java @@ -1,5 +1,6 @@ package io.codearte.accurest.messaging; +import java.util.Map; import java.util.concurrent.TimeUnit; /** @@ -15,6 +16,11 @@ public interface AccurestMessaging extends Accure */ void send(AccurestMessage message, String destination); + /** + * Sends the given payload with headers, to the given destination. + */ + void send(PAYLOAD payload, Map headers, String destination); + /** * Receives the {@link AccurestMessage} from the given destination. You can provide the timeout * for receiving that message. diff --git a/accurest-messaging/accurest-messaging-core/src/main/java/io/codearte/accurest/messaging/noop/NoOpAccurestMessaging.java b/accurest-messaging/accurest-messaging-core/src/main/java/io/codearte/accurest/messaging/noop/NoOpAccurestMessaging.java index b99efe7a49..77d186bcd8 100644 --- a/accurest-messaging/accurest-messaging-core/src/main/java/io/codearte/accurest/messaging/noop/NoOpAccurestMessaging.java +++ b/accurest-messaging/accurest-messaging-core/src/main/java/io/codearte/accurest/messaging/noop/NoOpAccurestMessaging.java @@ -1,11 +1,11 @@ package io.codearte.accurest.messaging.noop; -import io.codearte.accurest.messaging.AccurestMessage; -import io.codearte.accurest.messaging.AccurestMessaging; - import java.util.Map; import java.util.concurrent.TimeUnit; +import io.codearte.accurest.messaging.AccurestMessage; +import io.codearte.accurest.messaging.AccurestMessaging; + /** * @author Marcin Grzejszczak */ @@ -15,6 +15,11 @@ public class NoOpAccurestMessaging implements AccurestMessaging { } + @Override + public void send(Object payload, Map headers, String destination) { + + } + @Override public AccurestMessage receiveMessage(String destination, long timeout, TimeUnit timeUnit) { return null; diff --git a/accurest-messaging/accurest-messaging-integration/src/main/java/io/codearte/accurest/messaging/integration/AccurestIntegrationMessaging.java b/accurest-messaging/accurest-messaging-integration/src/main/java/io/codearte/accurest/messaging/integration/AccurestIntegrationMessaging.java index 2486080560..b977036e36 100644 --- a/accurest-messaging/accurest-messaging-integration/src/main/java/io/codearte/accurest/messaging/integration/AccurestIntegrationMessaging.java +++ b/accurest-messaging/accurest-messaging-integration/src/main/java/io/codearte/accurest/messaging/integration/AccurestIntegrationMessaging.java @@ -1,8 +1,8 @@ package io.codearte.accurest.messaging.integration; -import io.codearte.accurest.messaging.AccurestMessage; -import io.codearte.accurest.messaging.AccurestMessageBuilder; -import io.codearte.accurest.messaging.AccurestMessaging; +import java.util.Map; +import java.util.concurrent.TimeUnit; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -12,8 +12,9 @@ import org.springframework.messaging.MessageChannel; import org.springframework.messaging.PollableChannel; import org.springframework.stereotype.Component; -import java.util.Map; -import java.util.concurrent.TimeUnit; +import io.codearte.accurest.messaging.AccurestMessage; +import io.codearte.accurest.messaging.AccurestMessageBuilder; +import io.codearte.accurest.messaging.AccurestMessaging; /** * @author Marcin Grzejszczak @@ -33,6 +34,12 @@ public class AccurestIntegrationMessaging implements AccurestMessaging headers, String destination) { + send(builder.create(payload, headers), destination); + } + @Override public void send(AccurestMessage> message, String destination) { try { diff --git a/accurest-messaging/accurest-messaging-stream/src/main/java/io/codearte/accurest/messaging/stream/AccurestStreamMessaging.java b/accurest-messaging/accurest-messaging-stream/src/main/java/io/codearte/accurest/messaging/stream/AccurestStreamMessaging.java index 368a7d5cd0..a300178cc0 100644 --- a/accurest-messaging/accurest-messaging-stream/src/main/java/io/codearte/accurest/messaging/stream/AccurestStreamMessaging.java +++ b/accurest-messaging/accurest-messaging-stream/src/main/java/io/codearte/accurest/messaging/stream/AccurestStreamMessaging.java @@ -1,8 +1,8 @@ package io.codearte.accurest.messaging.stream; -import io.codearte.accurest.messaging.AccurestMessage; -import io.codearte.accurest.messaging.AccurestMessageBuilder; -import io.codearte.accurest.messaging.AccurestMessaging; +import java.util.Map; +import java.util.concurrent.TimeUnit; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -11,8 +11,9 @@ import org.springframework.context.ApplicationContext; import org.springframework.messaging.Message; import org.springframework.messaging.MessageChannel; -import java.util.Map; -import java.util.concurrent.TimeUnit; +import io.codearte.accurest.messaging.AccurestMessage; +import io.codearte.accurest.messaging.AccurestMessageBuilder; +import io.codearte.accurest.messaging.AccurestMessaging; /** * @author Marcin Grzejszczak @@ -33,6 +34,12 @@ public class AccurestStreamMessaging implements AccurestMessaging headers, String destination) { + send(builder.create(payload, headers), destination); + } + @Override public void send(AccurestMessage> message, String destination) { try { diff --git a/samples/messaging-integration/build.gradle b/samples/messaging-integration/build.gradle index 5096207045..d583c1e803 100644 --- a/samples/messaging-integration/build.gradle +++ b/samples/messaging-integration/build.gradle @@ -13,7 +13,6 @@ dependencies { compile project(':accurest-core') compile 'org.springframework.boot:spring-boot-starter-actuator:1.3.3.RELEASE' compile 'org.springframework.boot:spring-boot-starter-integration:1.3.3.RELEASE' - compile 'org.springframework:spring-messaging:[4.0.0.RELEASE,)' testCompile project(':accurest-messaging-root:accurest-messaging-integration') testCompile 'org.springframework.boot:spring-boot-starter-test:1.3.3.RELEASE' diff --git a/samples/messaging-spring/src/test/groovy/io/codearte/accurest/samples/spring/config/AccurestSpringMessaging.groovy b/samples/messaging-spring/src/test/groovy/io/codearte/accurest/samples/spring/config/AccurestSpringMessaging.groovy index 8604d1e641..7599cbbb7f 100644 --- a/samples/messaging-spring/src/test/groovy/io/codearte/accurest/samples/spring/config/AccurestSpringMessaging.groovy +++ b/samples/messaging-spring/src/test/groovy/io/codearte/accurest/samples/spring/config/AccurestSpringMessaging.groovy @@ -29,6 +29,12 @@ public class AccurestSpringMessaging implements AccurestMessaging this.jmsTemplate = jmsTemplate } + @Override + @SuppressWarnings("unchecked") + public void send(T payload, Map headers, String destination) { + send(builder.create(payload, headers), destination); + } + @Override public void send(AccurestMessage message, String destination) { try { diff --git a/stub-runner/stub-runner-messaging/stub-runner-messaging-camel/src/test/groovy/io/codearte/accurest/stubrunner/messaging/camel/CamelStubRunnerSpec.groovy b/stub-runner/stub-runner-messaging/stub-runner-messaging-camel/src/test/groovy/io/codearte/accurest/stubrunner/messaging/camel/CamelStubRunnerSpec.groovy index c55cbe1440..b578196da2 100644 --- a/stub-runner/stub-runner-messaging/stub-runner-messaging-camel/src/test/groovy/io/codearte/accurest/stubrunner/messaging/camel/CamelStubRunnerSpec.groovy +++ b/stub-runner/stub-runner-messaging/stub-runner-messaging-camel/src/test/groovy/io/codearte/accurest/stubrunner/messaging/camel/CamelStubRunnerSpec.groovy @@ -1,6 +1,6 @@ package io.codearte.accurest.stubrunner.messaging.camel -import com.fasterxml.jackson.databind.ObjectMapper +import groovy.json.JsonOutput import groovy.json.JsonSlurper import io.codearte.accurest.stubrunner.StubFinder import org.apache.activemq.camel.component.ActiveMQComponent @@ -34,7 +34,7 @@ class CamelStubRunnerSpec extends Specification { Exchange receivedMessage = camelContext.createConsumerTemplate().receive('jms:output', 5000) and: receivedMessage != null - receivedMessage.in.body == '{"bookName":"foo"}' + assertJsons(receivedMessage.in.body) receivedMessage.in.headers.get('BOOK-NAME') == 'foo' } @@ -45,7 +45,7 @@ class CamelStubRunnerSpec extends Specification { Exchange receivedMessage = camelContext.createConsumerTemplate().receive('jms:output', 5000) and: receivedMessage != null - receivedMessage.in.body == '{ "bookName" : "foo" }' + assertJsons(receivedMessage.in.body) receivedMessage.in.headers.get('BOOK-NAME') == 'foo' } @@ -56,7 +56,7 @@ class CamelStubRunnerSpec extends Specification { Exchange receivedMessage = camelContext.createConsumerTemplate().receive('jms:output', 5000) and: receivedMessage != null - receivedMessage.in.body == '{ "bookName" : "foo" }' + assertJsons(receivedMessage.in.body) receivedMessage.in.headers.get('BOOK-NAME') == 'foo' } @@ -67,7 +67,7 @@ class CamelStubRunnerSpec extends Specification { Exchange receivedMessage = camelContext.createConsumerTemplate().receive('jms:output', 5000) and: receivedMessage != null - receivedMessage.in.body == '{ "bookName" : "foo" }' + assertJsons(receivedMessage.in.body) receivedMessage.in.headers.get('BOOK-NAME') == 'foo' } @@ -90,20 +90,23 @@ class CamelStubRunnerSpec extends Specification { } def 'should trigger messages by running all triggers'() { - given: - ObjectMapper objectMapper = new ObjectMapper() when: stubFinder.trigger() then: Exchange receivedMessage = camelContext.createConsumerTemplate().receive('jms:output', 5000) and: receivedMessage != null - new JsonSlurper().parseText( - objectMapper.writeValueAsString( - receivedMessage.in.body)) == new JsonSlurper().parseText('{"bookName":"foo"}') + assertJsons(receivedMessage.in.body) receivedMessage.in.headers.get('BOOK-NAME') == 'foo' } + private boolean assertJsons(Object payload) { + String objectAsString = payload instanceof String ? payload : + JsonOutput.toJson(payload) + def json = new JsonSlurper().parseText(objectAsString) + return json.bookName == 'foo' + } + @Bean ActiveMQComponent activeMQComponent(@Value('${activemq.url:vm://localhost?broker.persistent=false}') String url) { return new ActiveMQComponent(brokerURL: url) diff --git a/stub-runner/stub-runner-messaging/stub-runner-messaging-integration/build.gradle b/stub-runner/stub-runner-messaging/stub-runner-messaging-integration/build.gradle new file mode 100644 index 0000000000..89699fedfe --- /dev/null +++ b/stub-runner/stub-runner-messaging/stub-runner-messaging-integration/build.gradle @@ -0,0 +1,22 @@ +repositories { + mavenLocal() + jcenter() + maven { + url "http://repo.spring.io/snapshot" + } + maven { + url "http://repo.spring.io/milestone" + } +} + +dependencies { + compile project(':stub-runner-root:stub-runner-spring') + compile project(':accurest-messaging-root:accurest-messaging-integration') + compile 'org.springframework.integration:spring-integration-java-dsl:[1.1.2.RELEASE,)' + + testCompile 'org.springframework.boot:spring-boot-starter-integration:1.3.3.RELEASE' + testCompile 'org.springframework.boot:spring-boot-starter-test:1.3.3.RELEASE' + testCompile('org.spockframework:spock-spring:1.0-groovy-2.4') { + exclude(group: 'org.codehaus.groovy') + } +} \ No newline at end of file diff --git a/stub-runner/stub-runner-messaging/stub-runner-messaging-integration/src/main/groovy/io/codearte/accurest/stubrunner/messaging/integration/StubRunnerIntegrationConfiguration.groovy b/stub-runner/stub-runner-messaging/stub-runner-messaging-integration/src/main/groovy/io/codearte/accurest/stubrunner/messaging/integration/StubRunnerIntegrationConfiguration.groovy new file mode 100644 index 0000000000..581dc1e98d --- /dev/null +++ b/stub-runner/stub-runner-messaging/stub-runner-messaging-integration/src/main/groovy/io/codearte/accurest/stubrunner/messaging/integration/StubRunnerIntegrationConfiguration.groovy @@ -0,0 +1,46 @@ +package io.codearte.accurest.stubrunner.messaging.integration + +import io.codearte.accurest.dsl.GroovyDsl +import io.codearte.accurest.stubrunner.BatchStubRunner +import io.codearte.accurest.stubrunner.StubConfiguration +import org.springframework.beans.factory.config.AutowireCapableBeanFactory +import org.springframework.context.Lifecycle +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration +import org.springframework.integration.dsl.FilterEndpointSpec +import org.springframework.integration.dsl.GenericEndpointSpec +import org.springframework.integration.dsl.IntegrationFlow +import org.springframework.integration.dsl.IntegrationFlows +import org.springframework.stereotype.Service +/** + * Spring Integration configuration that iterates over the downloaded Groovy DSLs + * and registers a flow for each DSL. + * + * @author Marcin Grzejszczak + */ +@Configuration +class StubRunnerIntegrationConfiguration { + + @Bean + FlowRegistrar service(AutowireCapableBeanFactory beanFactory, BatchStubRunner batchStubRunner) { + Map> accurestContracts = batchStubRunner.accurestContracts + accurestContracts.each { StubConfiguration key, Collection value -> + String name = "${key.groupId}_${key.artifactId}" + value.findAll { it?.input?.messageFrom && it?.outputMessage?.sentTo }.each { GroovyDsl dsl -> + String flowName = "${name}_${dsl.label}_${dsl.hashCode()}" + IntegrationFlow integrationFlow = IntegrationFlows.from(dsl.input.messageFrom) + .filter(new StubRunnerIntegrationMessageSelector(dsl), { FilterEndpointSpec e -> e.id("${flowName}.filter") } ) + .transform(new StubRunnerIntegrationTransformer(dsl), { GenericEndpointSpec e -> e.id("${flowName}.transformer") }) + .channel(dsl.outputMessage.sentTo) + .get() + beanFactory.initializeBean(integrationFlow, "${name}_${dsl.label}_${dsl.hashCode()}") + beanFactory.getBean("${flowName}.filter", Lifecycle.class).start(); + beanFactory.getBean("${flowName}.transformer", Lifecycle.class).start(); + } + } + return new FlowRegistrar() + } + + @Service + static class FlowRegistrar {} +} diff --git a/stub-runner/stub-runner-messaging/stub-runner-messaging-integration/src/main/groovy/io/codearte/accurest/stubrunner/messaging/integration/StubRunnerIntegrationMessageSelector.groovy b/stub-runner/stub-runner-messaging/stub-runner-messaging-integration/src/main/groovy/io/codearte/accurest/stubrunner/messaging/integration/StubRunnerIntegrationMessageSelector.groovy new file mode 100644 index 0000000000..976edb9909 --- /dev/null +++ b/stub-runner/stub-runner-messaging/stub-runner-messaging-integration/src/main/groovy/io/codearte/accurest/stubrunner/messaging/integration/StubRunnerIntegrationMessageSelector.groovy @@ -0,0 +1,58 @@ +package io.codearte.accurest.stubrunner.messaging.integration + +import com.fasterxml.jackson.databind.ObjectMapper +import com.jayway.jsonpath.DocumentContext +import com.jayway.jsonpath.JsonPath +import com.toomuchcoding.jsonassert.JsonAssertion +import com.toomuchcoding.jsonassert.JsonVerifiable +import groovy.transform.CompileStatic +import io.codearte.accurest.dsl.GroovyDsl +import io.codearte.accurest.util.JsonPaths +import io.codearte.accurest.util.JsonToJsonPathsConverter +import org.springframework.integration.core.MessageSelector +import org.springframework.messaging.Message + +/** + * Passes through a message that matches the one defined in the DSL + * + * @author Marcin Grzejszczak + */ +@CompileStatic +class StubRunnerIntegrationMessageSelector implements MessageSelector { + + private final GroovyDsl groovyDsl + private final ObjectMapper objectMapper = new ObjectMapper() + + StubRunnerIntegrationMessageSelector(GroovyDsl groovyDsl) { + this.groovyDsl = groovyDsl + } + + @Override + boolean accept(Message message) { + if(!headersMatch(message)){ + return false + } + Object inputMessage = message.getPayload() + JsonPaths jsonPaths = JsonToJsonPathsConverter.transformToJsonPathWithStubsSideValues(groovyDsl.input.messageBody) + DocumentContext parsedJson = JsonPath.parse(objectMapper.writeValueAsString(inputMessage)) + return jsonPaths.every { matchesJsonPath(parsedJson, it) } + } + + private boolean matchesJsonPath(DocumentContext parsedJson, JsonVerifiable jsonVerifiable) { + try { + JsonAssertion.assertThat(parsedJson).matchesJsonPath(jsonVerifiable.jsonPath()) + return true + } catch (Exception e) { + return false + } + } + + private boolean headersMatch(Message message) { + Map headers = message.getHeaders() + return groovyDsl.input.messageHeaders.entries.every { + String name = it.name + Object value = it.clientValue + return headers.get(name) == value + } + } +} diff --git a/stub-runner/stub-runner-messaging/stub-runner-messaging-integration/src/main/groovy/io/codearte/accurest/stubrunner/messaging/integration/StubRunnerIntegrationTransformer.groovy b/stub-runner/stub-runner-messaging/stub-runner-messaging-integration/src/main/groovy/io/codearte/accurest/stubrunner/messaging/integration/StubRunnerIntegrationTransformer.groovy new file mode 100644 index 0000000000..e90cab0ca3 --- /dev/null +++ b/stub-runner/stub-runner-messaging/stub-runner-messaging-integration/src/main/groovy/io/codearte/accurest/stubrunner/messaging/integration/StubRunnerIntegrationTransformer.groovy @@ -0,0 +1,29 @@ +package io.codearte.accurest.stubrunner.messaging.integration + +import io.codearte.accurest.builder.BodyAsString +import io.codearte.accurest.dsl.GroovyDsl +import org.springframework.integration.transformer.GenericTransformer +import org.springframework.messaging.Message +import org.springframework.messaging.MessageHeaders +import org.springframework.messaging.support.MessageBuilder + +/** + * Sends forward a message defined in the DSL. + * + * @author Marcin Grzejszczak + */ +class StubRunnerIntegrationTransformer implements GenericTransformer, Message> { + + private final GroovyDsl groovyDsl + + StubRunnerIntegrationTransformer(GroovyDsl groovyDsl) { + this.groovyDsl = groovyDsl + } + + @Override + Message transform(Message source) { + String payload = BodyAsString.extractClientValueFrom(groovyDsl.outputMessage.body) + Map headers = groovyDsl.outputMessage.headers.asStubSideMap() + return MessageBuilder.createMessage(payload, new MessageHeaders(headers)) + } +} diff --git a/stub-runner/stub-runner-messaging/stub-runner-messaging-integration/src/main/resources/META-INF/spring.factories b/stub-runner/stub-runner-messaging/stub-runner-messaging-integration/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000000..dfd989c8bc --- /dev/null +++ b/stub-runner/stub-runner-messaging/stub-runner-messaging-integration/src/main/resources/META-INF/spring.factories @@ -0,0 +1,3 @@ +# Auto Configuration +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +io.codearte.accurest.stubrunner.messaging.integration.StubRunnerIntegrationConfiguration diff --git a/stub-runner/stub-runner-messaging/stub-runner-messaging-integration/src/test/groovy/io/codearte/accurest/stubrunner/messaging/integration/BookReturned.groovy b/stub-runner/stub-runner-messaging/stub-runner-messaging-integration/src/test/groovy/io/codearte/accurest/stubrunner/messaging/integration/BookReturned.groovy new file mode 100644 index 0000000000..c5826c848d --- /dev/null +++ b/stub-runner/stub-runner-messaging/stub-runner-messaging-integration/src/test/groovy/io/codearte/accurest/stubrunner/messaging/integration/BookReturned.groovy @@ -0,0 +1,16 @@ +package io.codearte.accurest.stubrunner.messaging.integration + +import com.fasterxml.jackson.annotation.JsonCreator +import groovy.transform.CompileStatic +import groovy.transform.EqualsAndHashCode + +@CompileStatic +@EqualsAndHashCode +class BookReturned implements Serializable { + final String bookName + + @JsonCreator(mode = JsonCreator.Mode.PROPERTIES) + BookReturned(String bookName) { + this.bookName = bookName + } +} diff --git a/stub-runner/stub-runner-messaging/stub-runner-messaging-integration/src/test/groovy/io/codearte/accurest/stubrunner/messaging/integration/IntegrationStubRunnerSpec.groovy b/stub-runner/stub-runner-messaging/stub-runner-messaging-integration/src/test/groovy/io/codearte/accurest/stubrunner/messaging/integration/IntegrationStubRunnerSpec.groovy new file mode 100644 index 0000000000..f9e81b6846 --- /dev/null +++ b/stub-runner/stub-runner-messaging/stub-runner-messaging-integration/src/test/groovy/io/codearte/accurest/stubrunner/messaging/integration/IntegrationStubRunnerSpec.groovy @@ -0,0 +1,114 @@ +package io.codearte.accurest.stubrunner.messaging.integration + +import groovy.json.JsonOutput +import groovy.json.JsonSlurper +import io.codearte.accurest.messaging.AccurestMessage +import io.codearte.accurest.messaging.AccurestMessaging +import io.codearte.accurest.stubrunner.StubFinder +import org.springframework.beans.factory.BeanNotOfRequiredTypeException +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.autoconfigure.EnableAutoConfiguration +import org.springframework.boot.test.SpringApplicationContextLoader +import org.springframework.context.annotation.ComponentScan +import org.springframework.context.annotation.Configuration +import org.springframework.context.annotation.ImportResource +import org.springframework.test.context.ContextConfiguration +import spock.lang.Specification + +import java.util.concurrent.TimeUnit +/** + * @author Marcin Grzejszczak + */ +@Configuration +@ComponentScan +@EnableAutoConfiguration +@ContextConfiguration(classes = IntegrationStubRunnerSpec, loader = SpringApplicationContextLoader) +@ImportResource("classpath*:integration-context.xml") +class IntegrationStubRunnerSpec extends Specification { + + @Autowired StubFinder stubFinder + @Autowired AccurestMessaging messaging + + def 'should download the stub and register a route for it'() { + when: + messaging.send(new BookReturned('foo'), [sample: 'header'], 'input') + then: + AccurestMessage receivedMessage = messaging.receiveMessage('outputTest') + and: + receivedMessage != null + assertJsons(receivedMessage.payload) + receivedMessage.headers.get('BOOK-NAME') == 'foo' + } + + def 'should trigger a message by label'() { + when: + stubFinder.trigger('return_book_1') + then: + AccurestMessage receivedMessage = messaging.receiveMessage('outputTest') + and: + receivedMessage != null + assertJsons(receivedMessage.payload) + receivedMessage.headers.get('BOOK-NAME') == 'foo' + } + + def 'should trigger a label for the existing groupId:artifactId'() { + when: + stubFinder.trigger('io.codearte.accurest.stubs:integrationService', 'return_book_1') + then: + AccurestMessage receivedMessage = messaging.receiveMessage('outputTest') + and: + receivedMessage != null + assertJsons(receivedMessage.payload) + receivedMessage.headers.get('BOOK-NAME') == 'foo' + } + + def 'should trigger a label for the existing artifactId'() { + when: + stubFinder.trigger('integrationService', 'return_book_1') + then: + AccurestMessage receivedMessage = messaging.receiveMessage('outputTest') + and: + receivedMessage != null + assertJsons(receivedMessage.payload) + receivedMessage.headers.get('BOOK-NAME') == 'foo' + } + + def 'should not run any wrong trigger when missing label is passed'() { + given: + stubFinder.trigger('missing label') + when: + messaging.receiveMessage('output', 100, TimeUnit.MILLISECONDS) + then: + Exception e = thrown(RuntimeException) + e.cause.class == BeanNotOfRequiredTypeException + } + + def 'should not run any wrong trigger when missing label and artifactid is passed'() { + given: + stubFinder.trigger('some:service', 'return_book_1') + when: + messaging.receiveMessage('output', 100, TimeUnit.MILLISECONDS) + then: + Exception e = thrown(RuntimeException) + e.cause.class == BeanNotOfRequiredTypeException + } + + def 'should trigger messages by running all triggers'() { + when: + stubFinder.trigger() + then: + AccurestMessage receivedMessage = messaging.receiveMessage('outputTest') + and: + receivedMessage != null + assertJsons(receivedMessage.payload) + receivedMessage.headers.get('BOOK-NAME') == 'foo' + } + + private boolean assertJsons(Object payload) { + String objectAsString = payload instanceof String ? payload : + JsonOutput.toJson(payload) + def json = new JsonSlurper().parseText(objectAsString) + return json.bookName == 'foo' + } + +} diff --git a/stub-runner/stub-runner-messaging/stub-runner-messaging-integration/src/test/resources/application.yml b/stub-runner/stub-runner-messaging/stub-runner-messaging-integration/src/test/resources/application.yml new file mode 100644 index 0000000000..890cbe6dd8 --- /dev/null +++ b/stub-runner/stub-runner-messaging/stub-runner-messaging-integration/src/test/resources/application.yml @@ -0,0 +1,2 @@ +stubrunner.stubs.repository.root: classpath:m2repo/repository/ +stubrunner.stubs.ids: io.codearte.accurest.stubs:integrationService \ No newline at end of file diff --git a/stub-runner/stub-runner-messaging/stub-runner-messaging-integration/src/test/resources/integration-context.xml b/stub-runner/stub-runner-messaging/stub-runner-messaging-integration/src/test/resources/integration-context.xml new file mode 100644 index 0000000000..c342dc9e94 --- /dev/null +++ b/stub-runner/stub-runner-messaging/stub-runner-messaging-integration/src/test/resources/integration-context.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/stub-runner/stub-runner-messaging/stub-runner-messaging-integration/src/test/resources/m2repo/repository/io/codearte/accurest/stubs/integrationService/0.0.1-SNAPSHOT/integrationService-0.0.1-SNAPSHOT-stubs.jar b/stub-runner/stub-runner-messaging/stub-runner-messaging-integration/src/test/resources/m2repo/repository/io/codearte/accurest/stubs/integrationService/0.0.1-SNAPSHOT/integrationService-0.0.1-SNAPSHOT-stubs.jar new file mode 100644 index 0000000000..86c61d52ec Binary files /dev/null and b/stub-runner/stub-runner-messaging/stub-runner-messaging-integration/src/test/resources/m2repo/repository/io/codearte/accurest/stubs/integrationService/0.0.1-SNAPSHOT/integrationService-0.0.1-SNAPSHOT-stubs.jar differ diff --git a/stub-runner/stub-runner-messaging/stub-runner-messaging-integration/src/test/resources/m2repo/repository/io/codearte/accurest/stubs/integrationService/0.0.1-SNAPSHOT/integrationService-0.0.1-SNAPSHOT.pom b/stub-runner/stub-runner-messaging/stub-runner-messaging-integration/src/test/resources/m2repo/repository/io/codearte/accurest/stubs/integrationService/0.0.1-SNAPSHOT/integrationService-0.0.1-SNAPSHOT.pom new file mode 100644 index 0000000000..84d7a5b7d7 --- /dev/null +++ b/stub-runner/stub-runner-messaging/stub-runner-messaging-integration/src/test/resources/m2repo/repository/io/codearte/accurest/stubs/integrationService/0.0.1-SNAPSHOT/integrationService-0.0.1-SNAPSHOT.pom @@ -0,0 +1,9 @@ + + + 4.0.0 + io.codearte.accurest.stubs + integrationService + 0.0.1-SNAPSHOT + pom + diff --git a/stub-runner/stub-runner-messaging/stub-runner-messaging-integration/src/test/resources/m2repo/repository/io/codearte/accurest/stubs/integrationService/0.0.1-SNAPSHOT/maven-metadata-local.xml b/stub-runner/stub-runner-messaging/stub-runner-messaging-integration/src/test/resources/m2repo/repository/io/codearte/accurest/stubs/integrationService/0.0.1-SNAPSHOT/maven-metadata-local.xml new file mode 100644 index 0000000000..20ba9761d8 --- /dev/null +++ b/stub-runner/stub-runner-messaging/stub-runner-messaging-integration/src/test/resources/m2repo/repository/io/codearte/accurest/stubs/integrationService/0.0.1-SNAPSHOT/maven-metadata-local.xml @@ -0,0 +1,12 @@ + + + io.codearte.accurest.stubs + integrationService + 0.0.1-SNAPSHOT + + + true + + 20160409062112 + + diff --git a/stub-runner/stub-runner-messaging/stub-runner-messaging-integration/src/test/resources/m2repo/repository/io/codearte/accurest/stubs/integrationService/maven-metadata-local.xml b/stub-runner/stub-runner-messaging/stub-runner-messaging-integration/src/test/resources/m2repo/repository/io/codearte/accurest/stubs/integrationService/maven-metadata-local.xml new file mode 100644 index 0000000000..b93b655f1f --- /dev/null +++ b/stub-runner/stub-runner-messaging/stub-runner-messaging-integration/src/test/resources/m2repo/repository/io/codearte/accurest/stubs/integrationService/maven-metadata-local.xml @@ -0,0 +1,12 @@ + + + io.codearte.accurest.stubs + integrationService + 0.0.1-SNAPSHOT + + + 0.0.1-SNAPSHOT + + 20160409062112 + +