Я работаю над проектом, в котором пользователи входят и выходят из системы, я знаю, что это полный шок, и мы гарантируем, что люди смогут выйти из системы, когда закончат. Одна вещь, которую мы заметили, заключается в том, что по разным причинам пользователь может попытаться нажать кнопку выхода, когда система уже вышла из него. (Тайм-аут сеанса, вход в систему из другого браузера или другие причины. Сайт допускает только один одновременный вход для каждого пользователя.)
Итак, что происходит, когда пользователь пытается выполнить POST по URL-адресу выхода, так это то, что он не проходит проверку CSRF, поскольку у него нет действительного сеанса. Мы не можем удалить проверку CSRF из соображений безопасности.
Таким образом, я пытаюсь добавить тест, который позволяет мне проверить это поведение и вместо того, чтобы взорваться с недопустимым токеном CSRF, он молча признает, что пользователь уже вышел из системы, и продолжит свою работу.
То, что я пробовал, в основном это:
context 'user is not logged in' do
before do
Rails.application.config.action_controller.allow_forgery_protection = true
end
it 'does not blow up' do
expect { post :destroy, {}, { some_key: 'val' } }.not_to raise_error
end
it 'redirects to logout path' do
expect(response).to redirect_to(successful_logout_path)
end
end
Который становится зеленым, несмотря на отсутствие каких-либо логических изменений в моем контроллере, и ручное тестирование подтверждает, что он все еще не работает.
Любое предложение о том, как включить проверку CSRF для этого контекста или другой способ проверить это в модульных тестах?