EDIT: я использую Play! версия 1.2 (выпуск продукции)
Я хочу проверить действия контроллера, защищенные модулем Secure класс, поэтому мне нужно войти в систему до тестирования моего контроллера (иначе я буду перенаправлен на страницу входа).
Я попытался войти в систему до вызова защищенного действия. Вот как выглядит мой 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. Я попытался переопределить этот intercepter в моем собственном промежуточном суперклассе (чтобы сохранить файлы cookie), но это тоже не сработало.
РЕДАКТИРОВАТЬ: я сбивал с толку play.mvc.Before перед перехватчиком с org.junit. Прежде - первый для использования с Play! контроллеров, последний для тестов JUnit. @Before в FuncitonTest является перехватчиком JUnit, поэтому он должен иметь какое-либо влияние на файлы cookie (поскольку он запускается один раз до запуска теста).
Я не хочу писать тест Selenium для каждого защищенного действия - так как почти все будут защищены. Есть ли способ "обмануть" модуль Secure, полагая, что вы прошли проверку подлинности? Или, может быть, какой-то другой очень очевидный способ справиться с этим (казалось бы, общим) сценарием в FunctionalTest?
Спасибо заранее,
Марк
EDIT: рабочий код, ответ Codemwnci помечен как правильный
Ответ Codemwnci правильный. Вот мой способ обхода файлов 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!
}