0
votes

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 a guild/group if he/she has 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've a standard Authlogic setup and all other tests are passing so I really don't know what's going wrong. I'm new to RSpec/capybara but the cucumber/capybara test (from which I'm migrating) is 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"
1

1 Answers

1
votes
# In your test_helper.rb / spec_helper.rb

class ActiveRecord::Base
  mattr_accessor :shared_connection
  @@shared_connection = nil

  def self.connection
    @@shared_connection || retrieve_connection
  end
end

# Forces all threads to share the same connection. This works on
# Capybara because it starts the web server in a thread.
ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection

This is from http://gist.github.com/470808