au.com.dius.pact.consumer.dispatch.HttpClient.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.11 Show documentation
Show all versions of pact-jvm-consumer-specs2_2.11 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.11"
```
or if you are using Gradle:
```groovy
dependencies {
testCompile "au.com.dius:pact-jvm-consumer-specs2_2.11:3.2.11"
}
```
__*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.dispatch
import java.nio.charset.Charset
import java.util
import java.util.concurrent.CompletableFuture
import au.com.dius.pact.model.{OptionalBody, Request, Response}
import org.apache.commons.lang3.StringUtils
import org.asynchttpclient.{DefaultAsyncHttpClient, RequestBuilder}
import scala.collection.JavaConversions._
object HttpClient {
def run(request: Request): CompletableFuture[Response] = {
val req = new RequestBuilder(request.getMethod)
.setUrl(request.getPath)
.setQueryParams(request.getQuery)
for (header <- request.getHeaders) {
req.addHeader(header._1, header._2)
}
if (request.getBody.isPresent) {
req.setBody(request.getBody.getValue)
}
val asyncHttpClient = new DefaultAsyncHttpClient
asyncHttpClient.executeRequest(req).toCompletableFuture.thenApply(new java.util.function.Function[org.asynchttpclient.Response, Response] {
override def apply(res: org.asynchttpclient.Response): Response = {
val headers = new util.HashMap[String, String]()
for (name <- res.getHeaders.names()) {
headers.put(name, res.getHeader(name))
}
val contentType = if (StringUtils.isEmpty(res.getContentType))
org.apache.http.entity.ContentType.APPLICATION_JSON
else
org.apache.http.entity.ContentType.parse(res.getContentType)
val charset = if (contentType.getCharset == null) Charset.forName("UTF-8") else contentType.getCharset
val body = if (res.hasResponseBody) {
OptionalBody.body(res.getResponseBody(charset))
} else {
OptionalBody.empty()
}
new Response(res.getStatusCode, headers, body)
}
})
}
}