ref: master
test/support/authenticated_test_helper.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 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 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
module AuthenticatedTestHelper # Sets the current user in the session from the user fixtures. def login_as(user) @request.session[:user] = User.find_by(login: user.to_s).id end def logout @request.session.delete(:user) end def content_type(type) @request.env['Content-Type'] = type end def accept(accept) @request.env["HTTP_ACCEPT"] = accept end def authorize_as(user) if user @request.env["HTTP_AUTHORIZATION"] = "Basic #{Base64.encode64("#{users(user).login}:test")}" accept 'application/xml' content_type 'application/xml' else @request.env["HTTP_AUTHORIZATION"] = nil accept nil content_type nil end end # Assert the block redirects to the login # # assert_requires_login(:bob) { |c| c.get :edit, :id => 1 } # def assert_requires_login(login = nil) yield HttpLoginProxy.new(self, login) end def assert_http_authentication_required(login = nil) yield XmlLoginProxy.new(self, login) end def reset!(*instance_vars) instance_vars = [:controller, :request, :response] unless instance_vars.any? instance_vars.collect! { |v| "@#{v}".to_sym } instance_vars.each do |var| instance_variable_set(var, instance_variable_get(var).class.new) end end end class BaseLoginProxy attr_reader :controller attr_reader :options def initialize(controller, login) @controller = controller @login = login end private def authenticated raise NotImplementedError end def check raise NotImplementedError end def method_missing(method, *args) @controller.reset! authenticate @controller.send(method, *args) check end end class HttpLoginProxy < BaseLoginProxy protected def authenticate @controller.login_as @login if @login end def check @controller.assert_redirected_to :controller => 'account', :action => 'login' end end class XmlLoginProxy < BaseLoginProxy protected def authenticate @controller.accept 'application/xml' @controller.authorize_as @login if @login end def check @controller.assert_response 401 end end |