Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I use Cucumber to test Devise's Rememberable functionality?

I'd like to have a Cucumber feature testing the rememberable functionality of devise (a remember me cookie).

It is easy to check the remember me check box using capybara but how should I simulate a user returning to the site after closing their window?

like image 283
srboisvert Avatar asked Aug 12 '10 13:08

srboisvert


2 Answers

I came up with the following rack-test hack, and slightly cleaner selenium api use, to test Devise remember-me functionality in cucumber/capybara. It just tells the driver to manually erase the session cookie. Not all drivers are supported, I only implemented the two I've used:

http://gist.github.com/484787

This assumes cookie storage of the session. Remove @announce tag from the scenario to get rid of the verbosity.

Another option, suggested by Matt Wynne in the mailing list discussion, may be looking at other cookie stores, and deleting them by query or file deletion:

lifted from agile rails book:

config.action_controller.session_store = CGI::Session::PStore (or just :p_store)
config.action_controller.session_options[:tmpdir] = "/Users/dave/tmp" 
config.action_controller.session_options[:prefix] = "myapp_session_"

or

rake db:sessions:create
config.action_controller.session_store = :active_record_store

Rails also has a reset session method, but I believe we don't have access to this because we can't hook into the rails session when testing with capybara.

Hope this helps,

Nick

like image 79
nruth Avatar answered Nov 07 '22 05:11

nruth


nruth's gist was really helpful but I felt like deleting the cookie by name was cheating. I created a step that deletes the cookies a browser would delete when it was closed and restarted (any cookie without an expiry date set and set in the future).

You can see it in this commit (though I've only done it for the RackTest driver as I don't have Selenium setup). You can also see my login/remember_me feature in this commit. And I refactored the classes to separate files in this commit.

I hope that's helpful.

like image 21
jim Avatar answered Nov 07 '22 04:11

jim