Files
spring-cloud-contract/tests/spring-cloud-contract-stub-runner-stream
Marcin Grzejszczak 59e5f8b1eb Convert Contract Definitions to YAML (#827)
without this change, if you're using some external libraries and you reference them in your DSL, those libraries need to also be used on the consumer side.

with this change, you can set the contractsToYaml property of the plugin, that will convert the contract definitions into YAML, and then generate tests and stubs. We will store the original contract definitions under the originals folder.

fixes #744
2018-12-27 11:14:31 +01:00
..
2018-12-20 21:43:00 +00:00
2017-09-09 09:09:31 +02:00

=== Stub Runner Stream

Spring Cloud Contract Verifier Stub Runner's messaging module gives you an easy way to
integrate with Spring Stream. For the provided artifacts, it automatically downloads the
stubs and registers the required routes.

WARNING: If Stub Runner's integration with Stream the `messageFrom` or `sentTo` Strings
are resolved first as a `destination` of a channel and no such `destination` exists, the
destination is resolved as a channel name.

IMPORTANT: If you want to use Spring Cloud Stream remember, to add a dependency on
`org.springframework.cloud:spring-cloud-stream-test-support`.

[source,xml,indent=0,subs="verbatim,attributes",role="primary"]
.Maven
----
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-stream-test-support</artifactId>
    <scope>test</scope>
</dependency>
----

[source,groovy,indent=0,subs="verbatim,attributes",role="secondary"]
.Gradle
----
testCompile "org.springframework.cloud:spring-cloud-stream-test-support"
----

==== Adding the Runner to the Project

You can have both Spring Cloud Stream and Spring Cloud Contract Stub Runner on the
classpath. Remember to annotate your test class with `@AutoConfigureStubRunner`.

==== Disabling the functionality

If you need to disable this functionality, set the `stubrunner.stream.enabled=false`
property.

Assume that you have the following Maven repository with a deployed stubs for the
`streamService` application:

[source,bash,indent=0]
----
└── .m2
    └── repository
        └── io
            └── codearte
                └── accurest
                    └── stubs
                        └── streamService
                            ├── 0.0.1-SNAPSHOT
                            │   ├── streamService-0.0.1-SNAPSHOT.pom
                            │   ├── streamService-0.0.1-SNAPSHOT-stubs.jar
                            │   └── maven-metadata-local.xml
                            └── maven-metadata-local.xml
----

Further assume the stubs contain the following structure:

[source,bash,indent=0]
----
├── META-INF
│   └── MANIFEST.MF
└── repository
    ├── accurest
    │   ├── bookDeleted.groovy
    │   ├── bookReturned1.groovy
    │   └── bookReturned2.groovy
    └── mappings
----

Consider the following contracts (numbered *1*):

[source,groovy]
----
include::src/test/groovy/org/springframework/cloud/contract/stubrunner/messaging/stream/StreamStubRunnerSpec.groovy[tags=sample_dsl,indent=0]
----

Now consider *2*:

[source,groovy]
----
include::src/test/groovy/org/springframework/cloud/contract/stubrunner/messaging/stream/StreamStubRunnerSpec.groovy[tags=sample_dsl_2,indent=0]
----

Now consider the following Spring configuration:

[source,yaml]
----
include::src/test/resources/application.yml[]
----

These examples lend themselves to three scenarios:

* <<stream-scenario-1>>
* <<stream-scenario-2>>
* <<stream-scenario-3>>

[[stream-scenario-1]]
===== Scenario 1 (no input message)

To trigger a message via the `return_book_1` label, use the `StubTrigger` interface as
follows:

[source,groovy]
----
include::src/test/groovy/org/springframework/cloud/contract/stubrunner/messaging/stream/StreamStubRunnerSpec.groovy[tags=client_trigger,indent=0]
----

To listen to the output of the message sent to a channel whose `destination` is
`returnBook`:

[source,groovy]
----
include::src/test/groovy/org/springframework/cloud/contract/stubrunner/messaging/stream/StreamStubRunnerSpec.groovy[tags=client_trigger_receive,indent=0]
----

The received message passes the following assertions:

[source,groovy]
----
include::src/test/groovy/org/springframework/cloud/contract/stubrunner/messaging/stream/StreamStubRunnerSpec.groovy[tags=client_trigger_message,indent=0]
----

[[stream-scenario-2]]
===== Scenario 2 (output triggered by input)

Since the route is set for you, you can send a message to the `bookStorage`
`destination`:

[source,groovy]
----
include::src/test/groovy/org/springframework/cloud/contract/stubrunner/messaging/stream/StreamStubRunnerSpec.groovy[tags=client_send,indent=0]
----

To listen to the output of the message sent to `returnBook`:

[source,groovy]
----
include::src/test/groovy/org/springframework/cloud/contract/stubrunner/messaging/stream/StreamStubRunnerSpec.groovy[tags=client_receive,indent=0]
----

The received message passes the following assertions:

[source,groovy]
----
include::src/test/groovy/org/springframework/cloud/contract/stubrunner/messaging/stream/StreamStubRunnerSpec.groovy[tags=client_receive_message,indent=0]
----

[[stream-scenario-3]]
===== Scenario 3 (input with no output)

Since the route is set for you, you can send a message to the `{output_name}`
destination:

[source,groovy]
----
include::src/test/groovy/org/springframework/cloud/contract/stubrunner/messaging/stream/StreamStubRunnerSpec.groovy[tags=trigger_no_output,indent=0]
----