BigW Consortium Gitlab

access_matchers.rb 1.36 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
# AccessMatchers
#
# The custom matchers contained in this module are used to test a user's access
# to a URL by emulating a specific user or type of user account, visiting the
# URL, and then checking the response status code and resulting path.
module AccessMatchers
  extend RSpec::Matchers::DSL
  include Warden::Test::Helpers

  def emulate_user(user)
    case user
    when :user
      login_as(create(:user))
    when :visitor
      logout
    when :admin
      login_as(create(:admin))
Zeger-Jan van de Weg committed
18 19
    when :external
      login_as(create(:user, external: true))
20 21 22 23 24 25 26 27 28 29 30
    when User
      login_as(user)
    else
      raise ArgumentError, "cannot emulate user #{user}"
    end
  end

  def description_for(user, type)
    if user.kind_of?(User)
      # User#inspect displays too much information for RSpec's description
      # messages
31
      "be #{type} for the specified user"
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
    else
      "be #{type} for #{user}"
    end
  end

  matcher :be_allowed_for do |user|
    match do |url|
      emulate_user(user)
      visit url
      status_code != 404 && current_path != new_user_session_path
    end

    description { description_for(user, 'allowed') }
  end

  matcher :be_denied_for do |user|
    match do |url|
      emulate_user(user)
      visit url
      status_code == 404 || current_path == new_user_session_path
    end

    description { description_for(user, 'denied') }
  end
end