aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Warski <adam@warski.org>2018-03-28 13:25:29 +0200
committerGitHub <noreply@github.com>2018-03-28 13:25:29 +0200
commit3d8b615c89c276ff1c2db349688079a6d9f5405c (patch)
treebd4e4f30e743ecdc873d7614a74c9329be6b5e99
parent9081387e3f2134c6cf3e321f64b833f7a0b911a8 (diff)
parent09e2a6f1e998bc7f5f0cd2a27dd8c10a37df4602 (diff)
downloadsttp-3d8b615c89c276ff1c2db349688079a6d9f5405c.tar.gz
sttp-3d8b615c89c276ff1c2db349688079a6d9f5405c.tar.bz2
sttp-3d8b615c89c276ff1c2db349688079a6d9f5405c.zip
Merge pull request #75 from softwaremill/stub-response-from-request
Added overloaded thenRespondWrapped which can return response monad but takes request as parameter
-rw-r--r--core/src/main/scala/com/softwaremill/sttp/testing/SttpBackendStub.scala6
-rw-r--r--core/src/test/scala/com/softwaremill/sttp/testing/SttpBackendStubTests.scala10
-rw-r--r--docs/testing.rst10
3 files changed, 26 insertions, 0 deletions
diff --git a/core/src/main/scala/com/softwaremill/sttp/testing/SttpBackendStub.scala b/core/src/main/scala/com/softwaremill/sttp/testing/SttpBackendStub.scala
index d7d1034..d6119a9 100644
--- a/core/src/main/scala/com/softwaremill/sttp/testing/SttpBackendStub.scala
+++ b/core/src/main/scala/com/softwaremill/sttp/testing/SttpBackendStub.scala
@@ -107,6 +107,12 @@ class SttpBackendStub[R[_], S] private (rm: MonadError[R],
}
new SttpBackendStub(rm, matchers.orElse(m), fallback)
}
+ def thenRespondWrapped(resp: Request[_, _] => R[Response[_]]): SttpBackendStub[R, S] = {
+ val m: PartialFunction[Request[_, _], R[Response[_]]] = {
+ case r if p(r) => resp(r)
+ }
+ new SttpBackendStub(rm, matchers.orElse(m), fallback)
+ }
}
}
diff --git a/core/src/test/scala/com/softwaremill/sttp/testing/SttpBackendStubTests.scala b/core/src/test/scala/com/softwaremill/sttp/testing/SttpBackendStubTests.scala
index 1299cae..772757e 100644
--- a/core/src/test/scala/com/softwaremill/sttp/testing/SttpBackendStubTests.scala
+++ b/core/src/test/scala/com/softwaremill/sttp/testing/SttpBackendStubTests.scala
@@ -26,6 +26,8 @@ class SttpBackendStubTests extends FlatSpec with Matchers with ScalaFutures {
})
.whenRequestMatches(_.uri.port.exists(_ == 8080))
.thenRespondWrapped(Response(Right("OK from monad"), 200, "OK", Nil, Nil))
+ .whenRequestMatches(_.uri.port.exists(_ == 8081))
+ .thenRespondWrapped(r => Response(Right(s"OK from request. Request was sent to host: ${r.uri.host}"), 200, "OK", Nil, Nil))
"backend stub" should "use the first rule if it matches" in {
implicit val b = testingStub
@@ -58,6 +60,14 @@ class SttpBackendStubTests extends FlatSpec with Matchers with ScalaFutures {
r.body.right.get should be("OK from monad")
}
+ it should "respond with monad with response created from request" in {
+ implicit val b = testingStub
+ val r = sttp.post(uri"http://example.org:8081").send()
+ r.is200 should be(true)
+ r.body should be('right)
+ r.body.right.get should be("OK from request. Request was sent to host: example.org")
+ }
+
it should "use the default response if no rule matches" in {
implicit val b = testingStub
val r = sttp.put(uri"http://example.org/d").send()
diff --git a/docs/testing.rst b/docs/testing.rst
index 9afcd0e..2a6d37b 100644
--- a/docs/testing.rst
+++ b/docs/testing.rst
@@ -60,6 +60,16 @@ Another way to specify the behaviour is passing response wrapped in the result m
val responseFuture = sttp.get(uri"http://example.org").send()
// responseFuture will complete after 5 seconds with "OK" response
+The returned response may also depend on the request: ::
+
+ implicit val testingBackend = SttpBackendStub(HttpURLConnectionBackend()).whenAnyRequest
+ .thenRespondWrapped(req =>
+ Response(Right("OK, got request sent to ${req.uri.host}"), 200, "", Nil, Nil)
+ )
+
+ val response = sttp.get(uri"http://example.org").send()
+ // response.body will be Right("OK, got request sent to example.org")
+
Simulating exceptions
---------------------