Search code examples
asynchronousscalatestplayframework-2.6

PlaySpec test passing even though the result doesn't match


I have written the following spec. Surprisingly it passes even though the result doesn't match

code snippet

  val controller = new UserController(mockUserRepository,mockControllerComponents,mockSilhouette)
  //val request = FakeRequest[AnyContentAsJson]("POST", "/ws/users/signup").withJsonBody(Json.parse("""{"bad": "field"}"""))//FakeRequest(POST,"/ws/users/signup").withJsonBody(Json.parse("""{"bad":"field"}"""));
  val request = FakeRequest("POST","ws/users/signup")
  println("sending request",request)
  //val result = controller.someMethod()
  val result = controller.signupUser(request)

  Await.result(result,Duration("10 secs"))
  result.map(response => {
    println("response from controller:"+response)
    response mustBe play.api.mvc.Results.BadRequest
  })

console prints (sending request,POST ws/users/signup)

print in controller. (received request,POST ws/users/signup)

Controller returns 200OK but I am matching it with BadRequest. Still the test passes! response from controller:Result(200, Map())

I suspect that I am not matching the result correctly. I am doing response mustBe play.api.mvc.Results.BadRequest. I know that response is Results but BadRequest is Status. But I don'w know how else to match and also why the test doesn't fail. I also tried following and can see the the values are different but even then the test passes.

  println("response from controller:"+response.header.status+" compared with "+play.api.mvc.Results.BadRequest.header.status)
        response.header.status mustBe play.api.mvc.Results.BadRequest.header.status

console print - response from controller:200 compared with 400


Solution

  • Importing members of Helpers object like so

    import play.api.test.Helpers._
    

    gives access to various utility methods to extract results from Future[Result] in tests. For example, Helpers.status can be used to extract status code like so:

    val result: Future[Result] = controller.signupUser(request)
    status(result) mustBe BAD_REQUEST
    

    Another option is to use whenReady from ScalaFutures:

    val result: Future[Result] = controller.signupUser(request)
    whenReady(result) { _.header.status mustBe BAD_REQUEST }
    

    Another option is to extend AsyncWordSpec and then you can map over the Future like so:

    val result: Future[Result] = controller.signupUser(request)
    result.map(_.header.status mustBe BAD_REQUEST)