Cookie inspection in Rspec and Capybara


#1

Hi.
I’m trying to inspect an authentication cookie inside of a test.
My goal is to test a remember me functionality, so I would like to test
for the expiration date of the set cookie.
This turns out to be extremely difficult (for me at least).

The farthest I managed to get so far is the following:

describe “cookies” do
let(:user) { FactoryGirl.create(:user)}
before { controller.sign_in(user) }
specify { cookies.should be_nil }
end

which fails as follows:

  1. UsersController specify and controller variables
    Failure/Error: specify { cookies.should be_nil }
    expected: nil
    got: #<ActionDispatch::Cookies::CookieJar:0x0000000381f670
    @secret=“1a5f7c9bbff386831db09dfdfc3a4c6b820e3ae8ddf210cc246d0df4cde6492e7c05132eca91bbe0a56b5cf9b266367b834f016c899d1bf6c5ef1f6cdbf78de5”,
    @set_cookies={“remember_token”=>{:value=>“odLMhlC4aXMmRGw62naMcA”,
    :expires=>Thu, 21 Apr 2033 07:04:12 UTC +00:00, :path=>"/"}},
    @delete_cookies={}, @host=“test.host”, @secure=false, @closed=false,
    @cookies={“remember_token”=>“odLMhlC4aXMmRGw62naMcA”},
    @permanent=#<ActionDispatch::Cookies::PermanentCookieJar:0x00000003828d10
    @parent_jar=#<ActionDispatch::Cookies::CookieJar:0x0000000381f670 …>,
    @secret=“1a5f7c9bbff386831db09dfdfc3a4c6b820e3ae8ddf210cc246d0df4cde6492e7c05132eca91bbe0a56b5cf9b266367b834f016c899d1bf6c5ef1f6cdbf78de5”>>

    ./spec/controllers/users_controller_spec.rb:212:in `block (3

levels) in <top (required)>’

As you can see the information I’m interested in is buried inside this
‘cookies’ object in an instance variable @set_cookies

@set_cookies={“remember_token”=>{:value=>“odLMhlC4aXMmRGw62naMcA”,
:expires=>Thu, 21 Apr 2033 07:04:12 UTC +00:00, :path=>"/"}

However, so far I am unable to extract the relevant data (i.e. the
‘expires’) out of this object.
How does one do that?

I read somewhere online that the cookies are buried inside the
‘response.headers’ object, but at least inside the users controller this
object is an empty hash.

describe “cookies” do
before { get user_path(user) }
specify {response.headers[“Set-Cookie”].should =~ /remember_token/}
end

Interestingly enough the same test as an integration test (under the
spec directory) does yield a non empty hash but the cookie i’m looking
for is not there, only the session cookie.

So there it is, what seems to me like a pretty elementary check turns
out to be very hard to implement in Rspec.
I find that hard to believe and thus expect that this is just a
testimony of my poor coding abilities.

Can anyone please shed some light on this issue?
What am I doing wrong here?
How does one test for cookies’ ‘expire’ in Rspec?
How can I extract the ‘expire’ data from the cookie object above?

Thanks a lot!

–Assaf.