Сохранять сессию в последующих вызовах Java для fakeRequest Play 2.0 - PullRequest
5 голосов
/ 26 марта 2012

Я ищу способ сохранить сеанс при использовании fakeRequest Play 2.0 в моих тестах Java, но мои попытки терпят неудачу при вызове методов в JAR на основе Scala.

На основании запроса на получение, упомянутого в вопросе Scala Добавление значений в Session во время тестирования (FakeRequest, FakeApplication) , я подумал, что в Java может работать следующее:

public Session getSession(Result result) {
  play.api.mvc.Cookies scalaCookies =
      play.api.test.Helpers.cookies(result.getWrappedResult());
  play.api.mvc.Cookie scalaSessionCookie =
      scalaCookies.get(play.api.mvc.Session.COOKIE_NAME()).get();
  scala.Option<play.api.mvc.Cookie> optionalCookie =
      scala.Option.apply(scalaSessionCookie);

  // Compiles fine, but fails with NoSuchMethodError:
  play.api.mvc.Session scalaSession =
      play.api.mvc.Session.decodeFromCookie(optionalCookie);

  return new play.mvc.Http.Session(Scala.asJava(scalaSession.data()));
}

Это компилируется просто отлично, но при выполнении тестов он получает меня:

java.lang.NoSuchMethodError: 
  play.api.mvc.Session.decodeFromCookie(Lscala/Option;)Lplay/api/mvc/Session;

Будучи настоящим новичком в Scala, я действительно понятия не имею, близок ли я. Сеанс Scala раскрывает (черта) этот метод через CookieBaker , я думаю .

Обратите внимание, что я не обязательно ищу способ запустить приведенный выше код; вышесказанное - это действительно первый (возможный) шаг для получения сеанса. Затем я, вероятно, попытался бы использовать что-то вроде play.api.mvc.Session.encodeAsCookie(session) для передачи его последующим запросам. Как и для демоверсии ZenTasks :

@Test
public void testLoginAndMore() {
  Helpers.running(Helpers.fakeApplication(Helpers.inMemoryDatabase()), 
  new Runnable() {
    public void run() {
      Map<String, String> data = new HashMap<String, String>();
      data.put("email", "guillaume@sample.com");
      data.put("password", "secret");

      Result result = 
        callAction(controllers.routes.ref.Application.authenticate(),
          fakeRequest().withFormUrlEncodedBody(data));
      assertThat(status(result)).isEqualTo(Status.SEE_OTHER);
      assertThat(redirectLocation(result)).isEqualTo("/");

      // All fine; we're logged in. Now somehow preserve the cookie. This
      // does NOT do the trick:
      Session session = getSession(result);
      // ...subsequent callAction(..)s, somehow passing the session cookie 
    }
  });
}

Для 1.x, Модуль Playframework Secure: как «войти» для проверки защищенного контроллера в FunctionalTest? помогает, но в 2.0 все изменилось, и я никогда не использовал 1 .x.

Ответы [ 2 ]

6 голосов
/ 28 марта 2012

В конце концов, не нужно много магии.Следующее просто сохраняет заголовок HTTP, который устанавливает файлы cookie, и передает его в следующем запросе:

Map<String, String> data = new HashMap<String, String>();
data.put("email", "guillaume@sample.com");
data.put("password", "secret");

Result result = callAction(controllers.routes.ref.Application.authenticate(),
  fakeRequest().withFormUrlEncodedBody(data));

assertThat(status(result)).isEqualTo(Status.SEE_OTHER);
assertThat(redirectLocation(result)).isEqualTo("/");
// All fine; we're logged in. Preserve the cookies:
String cookies = header(HeaderNames.SET_COOKIE, result);

// Fetch next page, passing the cookies
result = routeAndCall(fakeRequest(GET, redirectLocation(result))
  .withHeader(HeaderNames.COOKIE, cookies));

assertThat(status(result)).isEqualTo(Status.OK);
assertThat(contentAsString(result).contains("Guillaume Bort"));

(см. первая версия этого самого ответа для получения дополнительной информации о получении толькоPLAY_SESSION печенье и его разбор. Хотя это вряд ли нужно.)

3 голосов
/ 21 июня 2014

С текущей версией Play действительно легко использовать сессию в своих тестах.Вы можете использовать статический вспомогательный метод cookies(Result result).

// Route that sets some session data to be used in subsequent requests
Result result = callAction(...);
Http.Cookie[] cookies = FluentIterable.from(cookies(result)).toArray(Http.Cookie.class);

FakeRequest request = new FakeRequest(GET, "/someRoute").withCookies(cookies);
callAction(controllers.routes.ref.Application.requestNeedingSession(), request);
...