au.com.dius.pact.consumer.UnitSpecsSupport.scala Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of pact-jvm-consumer-specs2_2.10 Show documentation
Show all versions of pact-jvm-consumer-specs2_2.10 Show documentation
pact-jvm-consumer-specs2
========================
## Specs2 Bindings for the pact-jvm library
## Dependency
In the root folder of your project in build.sbt add the line:
```scala
libraryDependencies += "au.com.dius" %% "pact-jvm-consumer-specs2" % "3.2.2"
```
or if you are using Gradle:
```groovy
dependencies {
testCompile "au.com.dius:pact-jvm-consumer-specs2_2.11:3.2.2"
}
```
__*Note:*__ `PactSpec` requires spec2 3.x. Also, for spray users there's an incompatibility between specs2 v3.x and spray.
Follow these instructions to resolve that problem: https://groups.google.com/forum/#!msg/spray-user/2T6SBp4OJeI/AJlnJuAKPRsJ
## Usage
To author a test, mix `PactSpec` into your spec
First we define a service client called `ConsumerService`. In our example this is a simple wrapper for `dispatch`, an HTTP client. The source code can be found in the test folder alongside the `ExamplePactSpec`.
Here is a simple example:
```
import au.com.dius.pact.consumer.PactSpec
class ExamplePactSpec extends Specification with PactSpec {
val consumer = "My Consumer"
val provider = "My Provider"
override def is = uponReceiving("a request for foo")
.matching(path = "/foo")
.willRespondWith(body = "{}")
.withConsumerTest { providerConfig =>
Await.result(ConsumerService(providerConfig.url).simpleGet("/foo"), Duration(1000, MILLISECONDS)) must beEqualTo(200, Some("{}"))
}
}
```
This spec will be run along with the rest of your specs2 unit tests and will output your pact json to
```
/target/pacts/<Consumer>_<Provider>.json
```
The newest version!
package au.com.dius.pact.consumer
import au.com.dius.pact.consumer.dsl.DslPart
import au.com.dius.pact.consumer.specs2.VerificationResultAsResult
import au.com.dius.pact.model._
import org.specs2.mutable.Specification
import org.specs2.specification.core.Fragments
import scala.collection.JavaConverters._
trait UnitSpecsSupport extends Specification {
def pactFragment: PactFragment
protected lazy val pact = pactFragment.toPact
protected val providerConfig = MockProviderConfig.createDefault(PactSpecVersion.V2)
protected val server = DefaultMockProvider(providerConfig)
protected val consumerPactRunner = new ConsumerPactRunner(server)
override def map(fragments: => Fragments) = {
step(server.start(pact)) ^
fragments ^
step(server.stop()) ^
fragmentFactory.example(
"Should match all mock server records",
VerificationResultAsResult(consumerPactRunner.writePact(pact, PactSpecVersion.V2))
)
}
def buildRequest(path: String,
method: String = "GET",
query: String = "",
headers: Map[String, String] = Map(),
body: String = "",
matchers: Map[String, Map[String, String]] = Map()): Request =
new Request(method, path, PactReader.queryStringToMap(query), headers.asJava, OptionalBody.body(body), CollectionUtils.scalaMMapToJavaMMap(matchers))
def buildResponse(status: Int = 200,
headers: Map[String, String] = Map(),
maybeBody: Option[String] = None,
matchers: Map[String, Map[String, String]] = Map()): Response = {
val optionalBody = maybeBody match {
case Some(body) => OptionalBody.body(body)
case None => OptionalBody.missing()
}
new Response(status, headers.asJava, optionalBody, CollectionUtils.scalaMMapToJavaMMap(matchers))
}
def buildResponse(status: Int,
headers: Map[String, String],
bodyAndMatchers: DslPart): Response =
new Response(status, headers.asJava, OptionalBody.body(bodyAndMatchers.toString), bodyAndMatchers.getMatchers)
def buildInteraction(description: String, maybeState: Option[String], request: Request, response: Response): RequestResponseInteraction =
new RequestResponseInteraction(description, maybeState.orNull, request, response)
def buildPactFragment(consumer: String, provider: String, interactions: List[RequestResponseInteraction]): PactFragment =
new PactFragment(new Consumer(consumer), new Provider(provider), interactions)
}