The following Spec is failing and failing over again. I've tried everything but can't get it to work. If I test it manually all looks fine :( Some help/tips would be really nice!
The join-action should add an logged-in user to an guild/group if he/she got the right token (in the url). If the user isn't logged in the action redirects to the login-page and saves the token and the id to cookies. After login the user gets redirected to the join-page if the cookies are set.
I've found out that the current_user get lost during the test. The session-variable is still present. I'am a standard Authlogic setup and all other tests are passing so I really don't know whats going wrong. I'am new to rspec/capybara but the cucumber/capybara test (from which I'am migrating) are also failing so I think it's a capybara issue.
Failing Spec:
describe GuildsController do
fixtures :roles
def login
@user = Factory(:User)
visit login_path
fill_in 'Login', :with => @user.login
fill_in 'Password', :with => 'password'
click 'Login'
page.should have_css(".notice")
end
def assing_user_to_guild_as(role)
role_id = Role.where(:name => role).first.id
@guild.assignments << Assignment.new(:role_id => role_id, :user_id => @user.id, :guild_id => @guild.id)
end
before(:each) do
@guild = Guild.first || Factory(:Guild).build
visit root_path
end
context "a user" do
before(:each) do
login
end
it "should be able to join a guild with a valid token" do
visit "guilds/#{@guild.id}/join/#{@guild.token}"
@guild.members.include?(@user.login).should be_true
page.should have_css(".notice")
end
it "shouldn't be able to join a guild with a invalid token" do
visit "guilds/#{@guild.id}/join/#{@guild.token+"invalid"}"
@guild.members.include?(@user.login).should be_false
page.should have_css(".error")
end
end
end
Controller Action:
def join
@guild = Guild.find(params[:id])
respond_to do |format|
if current_user.nil?
flash[:error] = t("have_to_be_logged_in")
unless params[:token].nil?
cookies[:rguilds_jg_token] = params[:token]
cookies[:rguilds_jg_gid] = params[:id]
end
format.html { redirect_to(login_path) }
else
unless cookies[:rguilds_jg_token].nil? && cookies[:rguilds_jg_gid].nil?
cookies.delete(:rguilds_jg_token)
cookies.delete(:rguilds_jg_gid)
end
if @guild.verified?
if params[:token] == @guild.token
unless @guild.users.include?(current_user)
@guild.assignments << Assignment.create(:user_id => current_user.id, :role_id => Role.find_by_name("member").id)
flash[:notice] = t('guilds.joined')
format.html { redirect_to(@guild) }
else
flash[:error] = t('guilds.already_joined')
format.html { redirect_to(@guild) }
end
else
flash[:error] = t('guilds.invalid_token')
format.html { redirect_to(@guild) }
end
else
flash[:error] = t('guilds.not_verified')
format.html { redirect_to(@guild) }
end
end
end
end
"rake spec" result:
...................FF.....................................................................
Failures:
1) GuildsController a user should be able to join a guild with a valid token
Failure/Error: @guild.members.include?(@user.login).should be_true
expected false to be true
# ./spec/integration/guilds_spec.rb:72:in `block (3 levels) in <top (required)>'
2) GuildsController a user shouldn't be able to join a guild with a invalid token
Failure/Error: page.should have_css(".error")
expected #has_css?(".error") to return true, got false
# ./spec/integration/guilds_spec.rb:79:in `block (3 levels) in <top (required)>'
Finished in 7.87 seconds
90 examples, 2 failures
Gems:
gem 'rails', '3.0.0.rc'
gem "mocha"
gem "rspec-rails", ">= 2.0.0.beta.19"
gem "factory_girl_rails"
gem 'capybara'
gem "authlogic", :git => "http://github.com/odorcicd/authlogic.git", :branch => "rails3"