root/lib/authenticated_test_helper.rb

Revision 1, 2.6 kB (checked in by falcon, 16 years ago)

Version one -> initial work from the laptop.

Line 
1module AuthenticatedTestHelper
2  # Sets the current user in the session from the user fixtures.
3  def login_as(user)
4    @request.session[:user] = user ? users(user).id : nil
5  end
6
7  def content_type(type)
8    @request.env['Content-Type'] = type
9  end
10
11  def accept(accept)
12    @request.env["HTTP_ACCEPT"] = accept
13  end
14
15  def authorize_as(user)
16    if user
17      @request.env["HTTP_AUTHORIZATION"] = "Basic #{Base64.encode64("#{users(user).login}:test")}"
18      accept       'application/xml'
19      content_type 'application/xml'
20    else
21      @request.env["HTTP_AUTHORIZATION"] = nil
22      accept       nil
23      content_type nil
24    end
25  end
26
27  # http://project.ioni.st/post/217#post-217
28  #
29  #  def test_new_publication
30  #    assert_difference(Publication, :count) do
31  #      post :create, :publication => {...}
32  #      # ...
33  #    end
34  #  end
35  #
36  def assert_difference(object, method = nil, difference = 1)
37    initial_value = object.send(method)
38    yield
39    assert_equal initial_value + difference, object.send(method), "#{object}##{method}"
40  end
41
42  def assert_no_difference(object, method, &block)
43    assert_difference object, method, 0, &block
44  end
45
46  # Assert the block redirects to the login
47  #
48  #   assert_requires_login(:bob) { |c| c.get :edit, :id => 1 }
49  #
50  def assert_requires_login(login = nil)
51    yield HttpLoginProxy.new(self, login)
52  end
53
54  def assert_http_authentication_required(login = nil)
55    yield XmlLoginProxy.new(self, login)
56  end
57
58  def reset!(*instance_vars)
59    instance_vars = [:controller, :request, :response] unless instance_vars.any?
60    instance_vars.collect! { |v| "@#{v}".to_sym }
61    instance_vars.each do |var|
62      instance_variable_set(var, instance_variable_get(var).class.new)
63    end
64  end
65end
66
67class BaseLoginProxy
68  attr_reader :controller
69  attr_reader :options
70  def initialize(controller, login)
71    @controller = controller
72    @login      = login
73  end
74
75  private
76    def authenticated
77      raise NotImplementedError
78    end
79   
80    def check
81      raise NotImplementedError
82    end
83   
84    def method_missing(method, *args)
85      @controller.reset!
86      authenticate
87      @controller.send(method, *args)
88      check
89    end
90end
91
92class HttpLoginProxy < BaseLoginProxy
93  protected
94    def authenticate
95      @controller.login_as @login if @login
96    end
97   
98    def check
99      @controller.assert_redirected_to :controller => 'account', :action => 'login'
100    end
101end
102
103class XmlLoginProxy < BaseLoginProxy
104  protected
105    def authenticate
106      @controller.accept 'application/xml'
107      @controller.authorize_as @login if @login
108    end
109   
110    def check
111      @controller.assert_response 401
112    end
113end
Note: See TracBrowser for help on using the browser.