Модуль безопасности Playframework: как «войти», чтобы протестировать защищенный контроллер в FunctionalTest?

EDIT : Я использую Play! Версия 1.2 (производственный выпуск)

Я хочу протестировать действия контроллера, которые защищены модулем Secure m с помощью Play! версия 1.2 (производственный выпуск) Я хочу протестировать действия контроллера, которые защищены классом модуля Secure, поэтому мне нужно войти в систему до тестирования моего контроллера (в противном случае я ...

EDIT : Я использую Play! Версия 1.2 (производственный выпуск)

Я хочу протестировать действия контроллера, которые защищены модулем Secure m с помощью Play! версия 1.2 (производственный выпуск) Я хочу протестировать действия контроллера, которые защищены классом модуля Secure, поэтому мне нужно войти в систему перед тестированием моего контроллера (в противном случае я ...

EDIT : Я использую Play! Версия 1.2 (производственный выпуск)

Я хочу протестировать действия контроллера, которые защищены модулем Secure class, поэтому мне нужно войти в систему перед тестированием моего контроллера (в противном случае я буду перенаправлен на страницу входа).

Я пытался войти в систему перед вызовом защищенного действия. Вот как выглядит мой FunctionalTest:

@Test
public void someTestOfASecuredAction() {
    Map<String, String> loginUserParams = new HashMap<String, String>(); 
    loginUserParams.put("username", "admin"); 
    loginUserParams.put("password", "admin");

    // Login here so the following request will be authenticated:
    Response response = POST("/login", loginUserParams);

    // The following is an action that requires an authenticated user:
    Map<String, String> params;
    params.put("someparam", "somevalue");
    response = POST("/some/secured/action", params);

    assertIsOk(response); // this always fails because it is a 302 redirecting to /login
}

Пройдя по коду, я убедился, что сообщение о входе работает - оно вызывает ответ перенаправления с указанием местоположения на домашней странице (что указывает на успешный вход).

Но затем при последующем вызове защищенного действия я всегда перенаправляюсь на Страница "/ login" - указывает на то, что мой предыдущий логин не использовался для второго запроса POST.

Заглянув в исходный код FunctionalTest, я обнаружил, что существует перехватчик @Before, который очищает все файлы cookie. Я попытался переопределить этот перехватчик в моем собственном промежуточном суперклассе (чтобы сохранить файлы cookie), но это тоже не сработало.

РЕДАКТИРОВАТЬ : Я перепутал перехватчик play.mvc.Before с org.junit.Before - первый для использования с Play! контроллеры, последний для тестов JUnit. @Before в FuncitonTest - это перехватчик JUnit, поэтому он должен иметь какое-либо влияние на файлы cookie (поскольку он запускается один раз перед запуском теста).

Я не хочу писать тест Selenium для каждого защищенного действие - поскольку почти все будет обеспечено. Есть ли способ «обмануть» модуль Secure, чтобы он поверил вам? повторно аутентифицирован? Или, может быть, какой-нибудь другой очень очевидный способ обработки этого (на первый взгляд распространенного) сценария в FunctionalTest?

Заранее спасибо,

Марк

ИЗМЕНИТЬ : Рабочий код, ответ Codemwnci отмечен как правильный

Codemwnci's ответ правильный. Вот мой обходной путь для сохранения файлов cookie от одного запроса к другому:

@Test
public void someTestOfASecuredAction() {
    Map<String, String> loginUserParams = new HashMap<String, String>();
    loginUserParams.put("username", "admin");
    loginUserParams.put("password", "admin");
    Response loginResponse = POST("/login", loginUserParams);

    Request request = newRequest();
    request.cookies = loginResponse.cookies; // this makes the request authenticated
    request.url = "/some/secured/action";
    request.method = "POST";
    request.params.put("someparam", "somevalue");
    Response response = makeRequest(request);
    assertIsOk(response); // Passes!
}
17
задан SBerg413 27 September 2013 в 21:28
поделиться