Модульное тестирование безопасной социальной аутентификации для контроллеров play2.3.x в scala

Мы используем безопасный модуль для аутентификации в нашем приложении Play 2.3.x.

Я хотел бы провести модульное тестирование контроллеров в моем приложении, которым требуется безопасная социальная аутентификация. Набор тестов недоступен для последней версии.

Может ли кто-нибудь предоставить мне решение для отправки поддельного аутентифицированного запроса всем методам в контроллерах с использованием безопасной социальной аутентификации?

Ниже приведен один из методов в контроллере нашего приложения:

def list = SecuredAction.async { implicit request =>
  val params = request.asInstanceOf[RequestHeader]

  val future = DeviceDAO.listAll(params)
  future.map(list => {
    Ok(ResponseBuilder.getResponseJson(params, Json.toJson(list.devices), list.totalItems))
  })
} 

В настоящее время мы проводим модульное тестирование наших контроллеров, добавляя authtoken в заголовок запроса, как показано ниже:

 "list is empty " in new WithApplication {
    val req = FakeRequest(GET ,"/v1/devices").withHeaders(
      "X-Auth-Token" -> authToken,
      "Content-Type" -> authcontentType
    )
    val home =  route(req).get
    status(home) must equalTo(OK)
    var items = contentAsJson(home) \ "items"
    items.as[JsArray].value.length must equalTo(0)
  }

Поскольку это не идеальный способ проверки аутентификации, мы хотели бы протестировать, используя правильный поддельный аутентифицированный запрос для контроллеров. Старая версия безопасных социальных сетей предоставляет тестовый набор, который можно использовать как:

"Access secured index " in new WithLoggedUser(minimalApp) {
val req: Request[AnyContent] = FakeRequest().
  withHeaders((HeaderNames.CONTENT_TYPE, "application/x-www-form-urlencoded")).
  withCookies(cookie) // Fake cookie from the WithloggedUser trait

val result = Application.index.apply(req)

val actual: Int= status(result)
actual must be equalTo OK

}

Но это не работает для приложений Play 2.3.x. Так может ли кто-нибудь сказать мне, как написать примеры модульных тестов для последней версии безопасной социальной аутентификации вышеописанным способом для приложения Play 2.3.x.


person Bhavya Latha Bandaru    schedule 25.08.2014    source источник


Ответы (1)


Мы уже проводим его модульное тестирование с play 2.3 и SecureSocial. Ниже вы найдете наш класс утилиты входа в систему и реферат WithAppLogin, который мы используем для выполнения аутентификации с помощью запроса POST.

Надеюсь, поможет.

package controllers.common

import org.specs2.execute.AsResult
import org.specs2.execute.Result

import play.api.test.{FakeRequest, WithApplication, Writeables, RouteInvokers}
import play.api.mvc.Cookie
import play.api.test.Helpers
import play.api.test.Helpers.cookies
import play.api.test.Helpers.defaultAwaitTimeout


object LoginUtil extends RouteInvokers with Writeables {

  val loginRequest = FakeRequest(Helpers.POST, "/auth/authenticate/userpass")
                       .withFormUrlEncodedBody(("username", "[email protected]"), ("password", "MyTestPassword"))
  var _cookie: Cookie = _

  def cookie = _cookie

  def login() {
    val credentials = cookies(route(loginRequest).get)
    val idCookie = credentials.get("id")
    _cookie = idCookie.get
  }
}

abstract class WithAppLogin extends WithApplication {
  override def around[T: AsResult](t: => T): Result = super.around {
    LoginUtil.login()
    t
  }
}

Пример теста

package controllers.admin

import org.specs2.mutable.Specification
import org.specs2.mutable._
import play.api.test.WithApplication
import play.api.test._
import play.api.test.Helpers._
import play.api.mvc._
import securesocial.core._
import play.Play
import controllers.common._
import play.api.test.Helpers.defaultAwaitTimeout

class AdminDashboardTest extends Specification {

  "Dashboard" should {

    "should be accessible" in new WithAppLogin {
      //setup
      val request = FakeRequest().withCookies(LoginUtil.cookie)

      //exercise
      val result = controllers.admin.index()(request)

      //verify
      status(result) must equalTo(OK)
      contentAsString(result) must contain("Welcome to the dashboard!")
    }

  }

}
person Patrick Hammer    schedule 25.08.2014
comment
Спасибо за фрагмент кода ... но мое приложение выдает некоторую внутреннюю ошибку, когда я использую приведенный выше код. Можете ли вы просто опубликовать хотя бы пример тестового примера для метода, который использует указанный выше класс util? - person Bhavya Latha Bandaru; 26.08.2014
comment
@bhavya: обновил свой пост примером. Обратите внимание, что в нем есть некоторый пользовательский код, например controllers.admin.index(). Это SecuredAction как данный SecureSocial. - person Patrick Hammer; 26.08.2014
comment
эй, большое спасибо, это было из-за какой-то ошибки базы данных, и код работает нормально .. большое спасибо :) - person Bhavya Latha Bandaru; 27.08.2014