Search code examples
scalasprayspray-jsonspray-clientspray-test

Spray-Test gzip decode


I try write test for spray

class FullTestKitExampleSpec extends Specification with Specs2RouteTest with UserController with HttpService {
  def actorRefFactory = system

  "The service" should {

    "return a greeting for GET requests to the root path" in {
      Get("/user") ~> `Accept-Encoding`(gzip) ~> userRoute ~> check {
        val responsex = response
        responseAs[String] must contain("Test1")
      }
    }
  }
}

I have follow router

trait UserController extends HttpService with Json4sSupport with CORSSupport{
  override implicit def json4sFormats: Formats = DefaultFormats

  val userRoute = {
    cors {
      compressResponse(Gzip) {
        path("user") {
          get {
            complete {
              "Test1"
            }
          } ~
            post {
              entity(as[UserRegister]) { person =>
                complete {
                  println(person.name)
                  person.name
                }
              }
            }
        }
      }
    }
  }
}

I use GZIP compression for response, but

Could not unmarshal response to type 'java.lang.String' for responseAs assertion: MalformedContent(unknown token Near: ,Some(org.json4s.ParserUtil$ParseException: unknown token Near: ))

How to set autodecode GZIP HttpResponse to String?


Solution

  • Include a decode(Gzip) in your pipeline:

    import spray.httpx.encoding.Gzip
    import spray.httpx.ResponseTransformation
    
    class MySprayRouteSpec extends FlatSpec
        with ShouldMatchers
        with ResponseTransformation
        with ScalatestRouteTest
        {
            Get("/") ~> mapHttpResponse(decode(Gzip))(userRoute) ~> check{
                  response.status should equal(OK)
            }
        }