Rails/RSpec: reset_session не изменяет значение HTTP-заголовка Set-Cookie во время интеграционных тестов

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

Я вручную проверил, что reset_session фактически запускается в логике аутентификации, и, кроме того, cookie действительно меняется, когда я вхожу в свой веб-браузер (таким образом, я больше не уязвим для фиксации сеанса), но я не могу успешно выполнить мой тест интеграции RSpec проверьте это.

Вот мой тест интеграции RSpec.

require 'spec_helper'

describe "security" do

  self.use_transactional_fixtures = false

  append_after(:each) do
    ALL_MODELS.each &:delete_all
  end

  describe "session fixation" do
    it "should change the cookie session id after logging in" do

      u = test_user :active_user => true,
                    :username => "nobody@example.com",
                    :password => "asdfasdf"
      u.save!

      https!

      get_via_redirect "/login"
      assert_response :success
      cookie = response.header["Set-Cookie"].split(";").select{|x| x.match(/_session/)}[0].split("=")[1].strip

      post_via_redirect "/login", "user[email]" => "nobody@example.com",
                                  "user[password]" => "asdfasdf",
                                  "user[remember_me]" => "1"
      assert_response :success
      path.should eql("/dashboard")
      cookie.should_not eql(response.header["Set-Cookie"].split(";").select{|x| x.match(/_session/)}[0].split("=")[1].strip)
    end
  end
end

Все работает, кроме самого последнего утверждения. Печенье не меняется.

Существуют ли известные проблемы с интеграционными тестами RSpec/Rails, когда reset_session не работает, как ожидалось? Что я могу сделать, чтобы написать тест, который проверяет фиксацию сеанса, не является проблемой?

1 ответ

Решение

Так что в конце концов я понял это.

Я пытался редактировать заголовок ответа напрямую, чтобы проверить куки, но я думаю, что это не так.

В любом случае, в интеграционных тестах с Rails 2.x есть хеш cookie, который вы можете использовать. Вот как в итоге выглядел тест:

  u = test_user :active_user => true,
                :username => "nobody@example.com",
                :password => "asdfasdf"
  u.save!

  https!

  get_via_redirect "/login"
  assert_response :success
  cookie = cookies['_session']
  cookie.should be_present
  path.should == "/login"

  post_via_redirect "/login", "user[email]" => "nobody@example.com",
                              "user[password]" => "asdfasdf",
                              "user[remember_me]" => "1"
  assert_response :success
  path.should eql("/?login_success=1")
  new_cookie = cookies['_session']
  new_cookie.should be_present
  cookie.should_not eql(new_cookie)
Другие вопросы по тегам