Cannot log in/authenticate within RSpec Story

I’ve been slamming my head against a wall for a while now, and would
like some help. I believe this is session related.

I have a story that looks like:


Given that a post exists
And I am logged in
When I visit the post details page
Then there should be a link to add a new comment

I am using the following RSpec story functions to assist this scenario
(along with others):


Given(“I am logged in”) do
post ‘/login/login’, {:name => ‘domain\username’, :password =>
‘password’}
follow_redirect if redirect?
end

When “I visit the post details page” do
get(’/posts/1’)
end

Then “there should be a link to add a new comment” do
response.should have_text(/.Add New Comment./)
end


The “Add New Comment” text will only show up within the view if
!session[‘username’].nil?

The login controller looks like this:


def login
if request.get?
session[‘username’] = nil
else
# Split username on domain and alias
split_username = params[:name].split(’\’, 2)
if split_username.length != 2
flash[:notice] = “You did not enter a properly formatted domain
and alias”
redirect_to :action => ‘login’
else
# Authenticate username and password
domain = split_username[0]
username = split_username[1]
password = params[:password]
isAuthenticated = authenticate(domain, username, password)
if isAuthenticated
# User has been authenticated
session[‘username’] = username
redirect_back({:controller => ‘posts’, :action => ‘index’})
else
flash[:notice] = “Incorrect username or password”
redirect_to :action => ‘login’
end
end
end
end


After the post to login/login occurs, I’ve attempted to check the
session variable everywhere I could think to, and it does not contain a
username in the data hash.

Additionally, I’m told that session is a nil object within the login
controller if I try something like:


Given(“I am logged in”) do
@lc = LoginController.new
@lc.authenticate(‘domain’, ‘username’, ‘password’)
end


I’ve also tried setting the session variable directly, but after that
particular Given … do clause is finished, any settings I make directly
seem to be lost.

Questions:

  1. Can controllers within rspec stories set/get session data?
  2. What is the scope of the persistence of sessions in rspec? (Scenario?
    Story?)
  3. Any ideas on why my LoginController sets the session[‘username’]
    variable, only to have my PostsController unable to read it?

Also, keep in mind that the code works when I’m actually using the site,
but the rspec story fails because it’s not displaying an “Add New
Comment” link when it should be due to the PostsController thinking that
the user isn’t logged in.

Ben M. wrote:

Then there should be a link to add a new comment

‘password’}

if request.get?
    domain = split_username[0]
    end

Additionally, I’m told that session is a nil object within the login

Also, keep in mind that the code works when I’m actually using the site,
but the rspec story fails because it’s not displaying an “Add New
Comment” link when it should be due to the PostsController thinking that
the user isn’t logged in.

I don’t have time to parse your entire post or send a lengthy reply.
However, this blog post walks through how to do exactly what you are
attempting:
http://www.glennfu.com/2008/03/31/easy-plaintext-stories-in-ruby-on-rails-using-webrat/

Good luck.

-Ben

Ben M. wrote:

I don’t have time to parse your entire post or send a lengthy reply.
However, this blog post walks through how to do exactly what you are
attempting:

http://www.glennfu.com/2008/03/31/easy-plaintext-stories-in-ruby-on-rails-using-webrat/

I wrote the login “Given” clause using Webrat and now the tests are
working, though it does feel like a workaround rather than a solution.
I’ve read over your Webrat post, as well as the linked article, and am
happy using Webrat in the manner you’ve written about, though I’d still
like to know why the session variables weren’t set upon trying to read
them later when not using Webrat…