From 09e2a6f1e998bc7f5f0cd2a27dd8c10a37df4602 Mon Sep 17 00:00:00 2001 From: Paweł Stawicki Date: Tue, 27 Mar 2018 16:42:54 +0200 Subject: Added overloaded thenRespondWrapped which can return response monad but takes request as parameter --- .../scala/com/softwaremill/sttp/testing/SttpBackendStub.scala | 6 ++++++ .../com/softwaremill/sttp/testing/SttpBackendStubTests.scala | 10 ++++++++++ docs/testing.rst | 10 ++++++++++ 3 files changed, 26 insertions(+) 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 --------------------- -- cgit v1.2.3