loyal_warden 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. data/Gemfile +11 -0
  2. data/History.rdoc +150 -0
  3. data/LICENSE +20 -0
  4. data/README.textile +9 -0
  5. data/Rakefile +12 -0
  6. data/lib/loyal_warden.rb +2 -0
  7. data/lib/warden.rb +45 -0
  8. data/lib/warden/config.rb +112 -0
  9. data/lib/warden/errors.rb +66 -0
  10. data/lib/warden/hooks.rb +211 -0
  11. data/lib/warden/manager.rb +136 -0
  12. data/lib/warden/mixins/common.rb +44 -0
  13. data/lib/warden/proxy.rb +371 -0
  14. data/lib/warden/session_serializer.rb +52 -0
  15. data/lib/warden/strategies.rb +47 -0
  16. data/lib/warden/strategies/base.rb +175 -0
  17. data/lib/warden/test/helpers.rb +36 -0
  18. data/lib/warden/test/warden_helpers.rb +43 -0
  19. data/lib/warden/version.rb +4 -0
  20. data/loyal_warden.gemspec +26 -0
  21. data/spec/helpers/request_helper.rb +51 -0
  22. data/spec/helpers/strategies/failz.rb +8 -0
  23. data/spec/helpers/strategies/invalid.rb +8 -0
  24. data/spec/helpers/strategies/pass.rb +8 -0
  25. data/spec/helpers/strategies/pass_with_message.rb +8 -0
  26. data/spec/helpers/strategies/password.rb +13 -0
  27. data/spec/helpers/strategies/single.rb +12 -0
  28. data/spec/spec_helper.rb +24 -0
  29. data/spec/warden/authenticated_data_store_spec.rb +114 -0
  30. data/spec/warden/config_spec.rb +48 -0
  31. data/spec/warden/errors_spec.rb +47 -0
  32. data/spec/warden/hooks_spec.rb +373 -0
  33. data/spec/warden/manager_spec.rb +316 -0
  34. data/spec/warden/proxy_spec.rb +1041 -0
  35. data/spec/warden/scoped_session_serializer.rb +123 -0
  36. data/spec/warden/session_serializer_spec.rb +53 -0
  37. data/spec/warden/strategies/base_spec.rb +313 -0
  38. data/spec/warden/strategies_spec.rb +93 -0
  39. data/spec/warden/test/helpers_spec.rb +93 -0
  40. data/spec/warden/test/test_mode_spec.rb +76 -0
  41. data/warden.gemspec +24 -0
  42. metadata +105 -0
@@ -0,0 +1,8 @@
1
+ # encoding: utf-8
2
+ Warden::Strategies.add(:invalid) do
3
+ def valid?
4
+ false
5
+ end
6
+
7
+ def authenticate!; end
8
+ end
@@ -0,0 +1,8 @@
1
+ # encoding: utf-8
2
+ Warden::Strategies.add(:pass) do
3
+ def authenticate!
4
+ request.env['warden.spec.strategies'] ||= []
5
+ request.env['warden.spec.strategies'] << :pass
6
+ success!("Valid User") unless scope == :failz
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ # encoding: utf-8
2
+ Warden::Strategies.add(:pass_with_message) do
3
+ def authenticate!
4
+ request.env['warden.spec.strategies'] ||= []
5
+ request.env['warden.spec.strategies'] << :pass_with_message
6
+ success!("Valid User", "The Success Strategy Has Accepted You") unless scope == :failz
7
+ end
8
+ end
@@ -0,0 +1,13 @@
1
+ # encoding: utf-8
2
+ Warden::Strategies.add(:password) do
3
+ def authenticate!
4
+ request.env['warden.spec.strategies'] ||= []
5
+ request.env['warden.spec.strategies'] << :password
6
+ if params["password"] || params["username"]
7
+ params["password"] == "sekrit" && params["username"] == "fred" ?
8
+ success!("Authenticated User") : fail!("Username or password is incorrect")
9
+ else
10
+ pass
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,12 @@
1
+ # encoding: utf-8
2
+ Warden::Strategies.add(:single) do
3
+ def authenticate!
4
+ request.env['warden.spec.strategies'] ||= []
5
+ request.env['warden.spec.strategies'] << :single
6
+ success!("Valid User")
7
+ end
8
+
9
+ def store?
10
+ false
11
+ end
12
+ end
@@ -0,0 +1,24 @@
1
+ # encoding: utf-8
2
+ $TESTING=true
3
+
4
+ $:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
5
+ $:.unshift File.expand_path(File.join(File.dirname(__FILE__)))
6
+ require 'warden'
7
+
8
+ require 'rubygems'
9
+ require 'rack'
10
+
11
+ Dir[File.join(File.dirname(__FILE__), "helpers", "**/*.rb")].each do |f|
12
+ require f
13
+ end
14
+
15
+ RSpec.configure do |config|
16
+ config.include(Warden::Spec::Helpers)
17
+ config.include(Warden::Test::Helpers)
18
+
19
+ def load_strategies
20
+ Dir[File.join(File.dirname(__FILE__), "helpers", "strategies", "**/*.rb")].each do |f|
21
+ load f
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,114 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe "authenticated data store" do
5
+
6
+ before(:each) do
7
+ @env = env_with_params
8
+ @env['rack.session'] = {
9
+ "warden.user.foo.key" => "foo user",
10
+ "warden.user.default.key" => "default user",
11
+ :foo => "bar"
12
+ }
13
+ end
14
+
15
+ it "should store data for the default scope" do
16
+ app = lambda do |e|
17
+ e['warden'].authenticate(:pass)
18
+ e['warden'].authenticate(:pass, :scope => :foo)
19
+ e['warden'].should be_authenticated
20
+ e['warden'].should be_authenticated(:foo)
21
+
22
+ # Store the data for :default
23
+ e['warden'].session[:key] = "value"
24
+ valid_response
25
+ end
26
+ setup_rack(app).call(@env)
27
+ @env['rack.session']['warden.user.default.session'].should == {:key => "value"}
28
+ @env['rack.session']['warden.user.foo.session'].should be_nil
29
+ end
30
+
31
+ it "should store data for the foo user" do
32
+ app = lambda do |e|
33
+ e['warden'].session(:foo)[:key] = "value"
34
+ valid_response
35
+ end
36
+ setup_rack(app).call(@env)
37
+ @env['rack.session']['warden.user.foo.session'].should == {:key => "value"}
38
+ end
39
+
40
+ it "should store the data seperately" do
41
+ app = lambda do |e|
42
+ e['warden'].session[:key] = "value"
43
+ e['warden'].session(:foo)[:key] = "another value"
44
+ valid_response
45
+ end
46
+ setup_rack(app).call(@env)
47
+ @env['rack.session']['warden.user.default.session'].should == {:key => "value"}
48
+ @env['rack.session']['warden.user.foo.session' ].should == {:key => "another value"}
49
+ end
50
+
51
+ it "should clear the foo scoped data when foo logs out" do
52
+ app = lambda do |e|
53
+ e['warden'].session[:key] = "value"
54
+ e['warden'].session(:foo)[:key] = "another value"
55
+ e['warden'].logout(:foo)
56
+ valid_response
57
+ end
58
+ setup_rack(app).call(@env)
59
+ @env['rack.session']['warden.user.default.session'].should == {:key => "value"}
60
+ @env['rack.session']['warden.user.foo.session' ].should be_nil
61
+ end
62
+
63
+ it "should clear out the default data when :default logs out" do
64
+ app = lambda do |e|
65
+ e['warden'].session[:key] = "value"
66
+ e['warden'].session(:foo)[:key] = "another value"
67
+ e['warden'].logout(:default)
68
+ valid_response
69
+ end
70
+ setup_rack(app).call(@env)
71
+ @env['rack.session']['warden.user.default.session'].should be_nil
72
+ @env['rack.session']['warden.user.foo.session' ].should == {:key => "another value"}
73
+ end
74
+
75
+ it "should clear out all data when a general logout is performed" do
76
+ app = lambda do |e|
77
+ e['warden'].session[:key] = "value"
78
+ e['warden'].session(:foo)[:key] = "another value"
79
+ e['warden'].logout
80
+ valid_response
81
+ end
82
+ setup_rack(app).call(@env)
83
+ @env['rack.session']['warden.user.default.session'].should be_nil
84
+ @env['rack.session']['warden.user.foo.session' ].should be_nil
85
+ end
86
+
87
+ it "should logout multuiple personas at once" do
88
+ @env['rack.session']['warden.user.bar.key'] = "bar user"
89
+
90
+ app = lambda do |e|
91
+ e['warden'].session[:key] = "value"
92
+ e['warden'].session(:foo)[:key] = "another value"
93
+ e['warden'].session(:bar)[:key] = "yet another"
94
+ e['warden'].logout(:bar, :default)
95
+ valid_response
96
+ end
97
+ setup_rack(app).call(@env)
98
+ @env['rack.session']['warden.user.default.session'].should be_nil
99
+ @env['rack.session']['warden.user.foo.session' ].should == {:key => "another value"}
100
+ @env['rack.session']['warden.user.bar.session' ].should be_nil
101
+ end
102
+
103
+ it "should not store data for a user who is not logged in" do
104
+ @env['rack.session']
105
+ app = lambda do |e|
106
+ e['warden'].session(:not_here)[:key] = "value"
107
+ valid_response
108
+ end
109
+
110
+ lambda do
111
+ setup_rack(app).call(@env)
112
+ end.should raise_error(Warden::NotAuthenticated)
113
+ end
114
+ end
@@ -0,0 +1,48 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe Warden::Config do
5
+
6
+ before(:each) do
7
+ @config = Warden::Config.new
8
+ end
9
+
10
+ it "should behave like a hash" do
11
+ @config[:foo] = :bar
12
+ @config[:foo].should == :bar
13
+ end
14
+
15
+ it "should provide hash accessors" do
16
+ @config.failure_app = :foo
17
+ @config[:failure_app].should == :foo
18
+ @config[:failure_app] = :bar
19
+ @config.failure_app.should == :bar
20
+ end
21
+
22
+ it "should allow to read and set default strategies" do
23
+ @config.default_strategies :foo, :bar
24
+ @config.default_strategies.should == [:foo, :bar]
25
+ end
26
+
27
+ it "should allow to silence missing strategies" do
28
+ @config.silence_missing_strategies!
29
+ @config.silence_missing_strategies?.should be_true
30
+ end
31
+
32
+ it "should set the default_scope" do
33
+ @config.default_scope.should == :default
34
+ @config.default_scope = :foo
35
+ @config.default_scope.should == :foo
36
+ end
37
+
38
+ it "should merge given options on initialization" do
39
+ Warden::Config.new(:foo => :bar)[:foo].should == :bar
40
+ end
41
+
42
+ it "should setup defaults with the scope_defaults method" do
43
+ c = Warden::Config.new
44
+ c.scope_defaults :foo, :strategies => [:foo, :bar], :store => false
45
+ c.default_strategies(:scope => :foo).should == [:foo, :bar]
46
+ c.scope_defaults(:foo).should == {:store => false}
47
+ end
48
+ end
@@ -0,0 +1,47 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe Warden::Proxy::Errors do
5
+
6
+ before(:each) do
7
+ @errors = Warden::Proxy::Errors.new
8
+ end
9
+
10
+ it "should report that it is empty on first creation" do
11
+ @errors.empty?.should == true
12
+ end
13
+
14
+ it "should continue to report that it is empty even after being checked" do
15
+ @errors.on(:foo)
16
+ @errors.empty?.should == true
17
+ end
18
+
19
+ it "should add an error" do
20
+ @errors.add(:login, "Login or password incorrect")
21
+ @errors[:login].should == ["Login or password incorrect"]
22
+ end
23
+
24
+ it "should allow many errors to be added to the same field" do
25
+ @errors.add(:login, "bad 1")
26
+ @errors.add(:login, "bad 2")
27
+ @errors.on(:login).should == ["bad 1", "bad 2"]
28
+ end
29
+
30
+ it "should give the full messages for an error" do
31
+ @errors.add(:login, "login wrong")
32
+ @errors.add(:password, "password wrong")
33
+ ["password wrong", "login wrong"].each do |msg|
34
+ @errors.full_messages.should include(msg)
35
+ end
36
+ end
37
+
38
+ it "should return the error for a specific field / label" do
39
+ @errors.add(:login, "wrong")
40
+ @errors.on(:login).should == ["wrong"]
41
+ end
42
+
43
+ it "should return nil for a specific field if it's not been set" do
44
+ @errors.on(:not_there).should be_nil
45
+ end
46
+
47
+ end
@@ -0,0 +1,373 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe "standard authentication hooks" do
5
+
6
+ before(:all) do
7
+ load_strategies
8
+ end
9
+
10
+ describe "after_set_user" do
11
+ before(:each) do
12
+ RAM = Warden::Manager unless defined?(RAM)
13
+ RAM._after_set_user.clear
14
+ end
15
+
16
+ after(:each) do
17
+ RAM._after_set_user.clear
18
+ end
19
+
20
+ it "should allow me to add an after_set_user hook" do
21
+ RAM.after_set_user do |user, auth, opts|
22
+ "boo"
23
+ end
24
+ RAM._after_set_user.should have(1).item
25
+ end
26
+
27
+ it "should allow me to add multiple after_set_user hooks" do
28
+ RAM.after_set_user{|user, auth, opts| "foo"}
29
+ RAM.after_set_user{|u,a| "bar"}
30
+ RAM._after_set_user.should have(2).items
31
+ end
32
+
33
+ it "should run each after_set_user hook after the user is set" do
34
+ RAM.after_set_user{|u,a,o| a.env['warden.spec.hook.foo'] = "run foo"}
35
+ RAM.after_set_user{|u,a,o| a.env['warden.spec.hook.bar'] = "run bar"}
36
+ RAM.after_set_user{|u,a,o| a.logout}
37
+ app = lambda do |e|
38
+ e['warden'].set_user("foo")
39
+ valid_response
40
+ end
41
+ env = env_with_params
42
+ setup_rack(app).call(env)
43
+ env['warden'].user.should be_nil
44
+ env['warden.spec.hook.foo'].should == "run foo"
45
+ env['warden.spec.hook.bar'].should == "run bar"
46
+ end
47
+
48
+ it "should not run the event specified with except" do
49
+ RAM.after_set_user(:except => :set_user){|u,a,o| fail}
50
+ app = lambda do |e|
51
+ e['warden'].set_user("foo")
52
+ valid_response
53
+ end
54
+ env = env_with_params
55
+ setup_rack(app).call(env)
56
+ end
57
+
58
+ it "should only run the event specified with only" do
59
+ RAM.after_set_user(:only => :set_user){|u,a,o| fail}
60
+ app = lambda do |e|
61
+ e['warden'].authenticate(:pass)
62
+ valid_response
63
+ end
64
+ env = env_with_params
65
+ setup_rack(app).call(env)
66
+ end
67
+
68
+ it "should run filters in the given order" do
69
+ RAM.after_set_user{|u,a,o| a.env['warden.spec.order'] << 2}
70
+ RAM.after_set_user{|u,a,o| a.env['warden.spec.order'] << 3}
71
+ RAM.prepend_after_set_user{|u,a,o| a.env['warden.spec.order'] << 1}
72
+ app = lambda do |e|
73
+ e['warden.spec.order'] = []
74
+ e['warden'].set_user("foo")
75
+ valid_response
76
+ end
77
+ env = env_with_params
78
+ setup_rack(app).call(env)
79
+ env['warden.spec.order'].should == [1,2,3]
80
+ end
81
+
82
+ context "after_authentication" do
83
+ it "should be a wrapper to after_set_user behavior" do
84
+ RAM.after_authentication{|u,a,o| a.env['warden.spec.hook.baz'] = "run baz"}
85
+ RAM.after_authentication{|u,a,o| a.env['warden.spec.hook.paz'] = "run paz"}
86
+ RAM.after_authentication{|u,a,o| o[:event].should == :authentication }
87
+ app = lambda do |e|
88
+ e['warden'].authenticate(:pass)
89
+ valid_response
90
+ end
91
+ env = env_with_params
92
+ setup_rack(app).call(env)
93
+ env['warden.spec.hook.baz'].should == 'run baz'
94
+ env['warden.spec.hook.paz'].should == 'run paz'
95
+ end
96
+
97
+ it "should not be invoked on default after_set_user scenario" do
98
+ RAM.after_authentication{|u,a,o| fail}
99
+ app = lambda do |e|
100
+ e['warden'].set_user("foo")
101
+ valid_response
102
+ end
103
+ env = env_with_params
104
+ setup_rack(app).call(env)
105
+ end
106
+
107
+ it "should run filters in the given order" do
108
+ RAM.after_authentication{|u,a,o| a.env['warden.spec.order'] << 2}
109
+ RAM.after_authentication{|u,a,o| a.env['warden.spec.order'] << 3}
110
+ RAM.prepend_after_authentication{|u,a,o| a.env['warden.spec.order'] << 1}
111
+ app = lambda do |e|
112
+ e['warden.spec.order'] = []
113
+ e['warden'].authenticate(:pass)
114
+ valid_response
115
+ end
116
+ env = env_with_params
117
+ setup_rack(app).call(env)
118
+ env['warden.spec.order'].should == [1,2,3]
119
+ end
120
+
121
+ it "should allow me to log out a user in an after_set_user block" do
122
+ RAM.after_set_user{|u,a,o| a.logout}
123
+
124
+ app = lambda do |e|
125
+ e['warden'].authenticate(:pass)
126
+ valid_response
127
+ end
128
+ env = env_with_params
129
+ setup_rack(app).call(env)
130
+ env['warden'].authenticated?.should be_false
131
+ end
132
+ end
133
+
134
+ context "after_fetch" do
135
+ it "should be a wrapper to after_set_user behavior" do
136
+ RAM.after_fetch{|u,a,o| a.env['warden.spec.hook.baz'] = "run baz"}
137
+ RAM.after_fetch{|u,a,o| a.env['warden.spec.hook.paz'] = "run paz"}
138
+ RAM.after_fetch{|u,a,o| o[:event].should == :fetch }
139
+ env = env_with_params
140
+ setup_rack(lambda { |e| valid_response }).call(env)
141
+ env['rack.session']['warden.user.default.key'] = "Foo"
142
+ env['warden'].user.should == "Foo"
143
+ env['warden.spec.hook.baz'].should == 'run baz'
144
+ env['warden.spec.hook.paz'].should == 'run paz'
145
+ end
146
+
147
+ it "should not be invoked on default after_set_user scenario" do
148
+ RAM.after_fetch{|u,a,o| fail}
149
+ app = lambda do |e|
150
+ e['warden'].set_user("foo")
151
+ valid_response
152
+ end
153
+ env = env_with_params
154
+ setup_rack(app).call(env)
155
+ end
156
+
157
+ it "should not be invoked if fetched user is nil" do
158
+ RAM.after_fetch{|u,a,o| fail}
159
+ env = env_with_params
160
+ setup_rack(lambda { |e| valid_response }).call(env)
161
+ env['rack.session']['warden.user.default.key'] = nil
162
+ env['warden'].user.should be_nil
163
+ end
164
+
165
+ it "should run filters in the given order" do
166
+ RAM.after_fetch{|u,a,o| a.env['warden.spec.order'] << 2}
167
+ RAM.after_fetch{|u,a,o| a.env['warden.spec.order'] << 3}
168
+ RAM.prepend_after_fetch{|u,a,o| a.env['warden.spec.order'] << 1}
169
+ app = lambda do |e|
170
+ e['warden.spec.order'] = []
171
+ e['rack.session']['warden.user.default.key'] = "Foo"
172
+ e['warden'].user
173
+ valid_response
174
+ end
175
+ env = env_with_params
176
+ setup_rack(app).call(env)
177
+ env['warden.spec.order'].should == [1,2,3]
178
+ end
179
+ end
180
+ end
181
+
182
+
183
+ describe "after_failed_fetch" do
184
+ before(:each) do
185
+ RAM = Warden::Manager unless defined?(RAM)
186
+ RAM._after_failed_fetch.clear
187
+ end
188
+
189
+ after(:each) do
190
+ RAM._after_failed_fetch.clear
191
+ end
192
+
193
+ it "should not be called when user is fetched" do
194
+ RAM.after_failed_fetch{|u,a,o| fail }
195
+ env = env_with_params
196
+ setup_rack(lambda { |e| valid_response }).call(env)
197
+ env['rack.session']['warden.user.default.key'] = "Foo"
198
+ env['warden'].user.should == "Foo"
199
+ end
200
+
201
+ it "should be called if fetched user is nil" do
202
+ calls = 0
203
+ RAM.after_failed_fetch{|u,a,o| calls += 1 }
204
+ env = env_with_params
205
+ setup_rack(lambda { |e| valid_response }).call(env)
206
+ env['warden'].user.should be_nil
207
+ calls.should == 1
208
+ end
209
+ end
210
+
211
+ describe "before_failure" do
212
+ before(:each) do
213
+ RAM = Warden::Manager unless defined?(RAM)
214
+ RAM._before_failure.clear
215
+ end
216
+
217
+ after(:each) do
218
+ RAM._before_failure.clear
219
+ end
220
+
221
+ it "should allow me to add a before_failure hook" do
222
+ RAM.before_failure{|env, opts| "foo"}
223
+ RAM._before_failure.should have(1).item
224
+ end
225
+
226
+ it "should allow me to add multiple before_failure hooks" do
227
+ RAM.before_failure{|env, opts| "foo"}
228
+ RAM.before_failure{|env, opts| "bar"}
229
+ RAM._before_failure.should have(2).items
230
+ end
231
+
232
+ it "should run each before_failure hooks before failing" do
233
+ RAM.before_failure{|e,o| e['warden.spec.before_failure.foo'] = "foo"}
234
+ RAM.before_failure{|e,o| e['warden.spec.before_failure.bar'] = "bar"}
235
+ app = lambda{|e| e['warden'].authenticate!(:failz); valid_response}
236
+ env = env_with_params
237
+ setup_rack(app).call(env)
238
+ env['warden.spec.before_failure.foo'].should == "foo"
239
+ env['warden.spec.before_failure.bar'].should == "bar"
240
+ end
241
+
242
+ it "should run filters in the given order" do
243
+ RAM.before_failure{|e,o| e['warden.spec.order'] << 2}
244
+ RAM.before_failure{|e,o| e['warden.spec.order'] << 3}
245
+ RAM.prepend_before_failure{|e,o| e['warden.spec.order'] << 1}
246
+ app = lambda do |e|
247
+ e['warden.spec.order'] = []
248
+ e['warden'].authenticate!(:failz)
249
+ valid_response
250
+ end
251
+ env = env_with_params
252
+ setup_rack(app).call(env)
253
+ env['warden.spec.order'].should == [1,2,3]
254
+ end
255
+ end
256
+
257
+ describe "before_logout" do
258
+ before(:each) do
259
+ RAM = Warden::Manager unless defined?(RAM)
260
+ RAM._before_logout.clear
261
+ end
262
+
263
+ after(:each) do
264
+ RAM._before_logout.clear
265
+ end
266
+
267
+ it "should allow me to add an before_logout hook" do
268
+ RAM.before_logout{|user, auth, scopes| "foo"}
269
+ RAM._before_logout.should have(1).item
270
+ end
271
+
272
+ it "should allow me to add multiple after_authentication hooks" do
273
+ RAM.before_logout{|u,a,o| "bar"}
274
+ RAM.before_logout{|u,a,o| "baz"}
275
+ RAM._before_logout.should have(2).items
276
+ end
277
+
278
+ it "should run each before_logout hook before logout is run" do
279
+ RAM.before_logout{|u,a,o| a.env['warden.spec.hook.lorem'] = "run lorem"}
280
+ RAM.before_logout{|u,a,o| a.env['warden.spec.hook.ipsum'] = "run ipsum"}
281
+ app = lambda{|e| e['warden'].authenticate(:pass); valid_response}
282
+ env = env_with_params
283
+ setup_rack(app).call(env)
284
+ env['warden'].logout
285
+ env['warden.spec.hook.lorem'].should == 'run lorem'
286
+ env['warden.spec.hook.ipsum'].should == 'run ipsum'
287
+ end
288
+
289
+ it "should run before_logout hook for a specified scope" do
290
+ RAM.before_logout(:scope => :scope1){|u,a,o| a.env["warden.spec.hook.a"] << :scope1 }
291
+ RAM.before_logout(:scope => [:scope2]){|u,a,o| a.env["warden.spec.hook.b"] << :scope2 }
292
+
293
+ app = lambda do |e|
294
+ e['warden'].authenticate(:pass, :scope => :scope1)
295
+ e['warden'].authenticate(:pass, :scope => :scope2)
296
+ valid_response
297
+ end
298
+ env = env_with_params
299
+ env["warden.spec.hook.a"] ||= []
300
+ env["warden.spec.hook.b"] ||= []
301
+ setup_rack(app).call(env)
302
+
303
+ env['warden'].logout(:scope1)
304
+ env['warden.spec.hook.a'].should == [:scope1]
305
+ env['warden.spec.hook.b'].should == []
306
+
307
+ env['warden'].logout(:scope2)
308
+ env['warden.spec.hook.a'].should == [:scope1]
309
+ env['warden.spec.hook.b'].should == [:scope2]
310
+ end
311
+
312
+ it "should run filters in the given order" do
313
+ RAM.before_logout{|u,a,o| a.env['warden.spec.order'] << 2}
314
+ RAM.before_logout{|u,a,o| a.env['warden.spec.order'] << 3}
315
+ RAM.prepend_before_logout{|u,a,o| a.env['warden.spec.order'] << 1}
316
+ app = lambda do |e|
317
+ e['warden.spec.order'] = []
318
+ e['warden'].authenticate(:pass)
319
+ e['warden'].logout
320
+ valid_response
321
+ end
322
+ env = env_with_params
323
+ setup_rack(app).call(env)
324
+ env['warden.spec.order'].should == [1,2,3]
325
+ end
326
+ end
327
+
328
+ describe "on_request" do
329
+ before(:each) do
330
+ @old_on_request = RAM._on_request.dup
331
+ RAM = Warden::Manager unless defined?(RAM)
332
+ RAM._on_request.clear
333
+ end
334
+
335
+ after(:each) do
336
+ RAM._on_request.clear
337
+ RAM._on_request.replace(@old_on_request)
338
+ end
339
+
340
+ it "should allow me to add an on_request hook" do
341
+ RAM.on_request{|proxy| "foo"}
342
+ RAM._on_request.should have(1).item
343
+ end
344
+
345
+ it "should allow me to add multiple on_request hooks" do
346
+ RAM.on_request{|proxy| "foo"}
347
+ RAM.on_request{|proxy| "bar"}
348
+ RAM._on_request.should have(2).items
349
+ end
350
+
351
+ it "should run each on_request hooks when initializing" do
352
+ RAM.on_request{|proxy| proxy.env['warden.spec.on_request.foo'] = "foo"}
353
+ RAM.on_request{|proxy| proxy.env['warden.spec.on_request.bar'] = "bar"}
354
+ app = lambda{|e| valid_response}
355
+ env = env_with_params
356
+ setup_rack(app).call(env)
357
+ env['warden.spec.on_request.foo'].should == "foo"
358
+ env['warden.spec.on_request.bar'].should == "bar"
359
+ end
360
+
361
+ it "should run filters in the given order" do
362
+ RAM.on_request{|proxy| proxy.env['warden.spec.order'] << 2}
363
+ RAM.on_request{|proxy| proxy.env['warden.spec.order'] << 3}
364
+ RAM.prepend_on_request{|proxy| proxy.env['warden.spec.order'] << 1}
365
+ app = lambda do |e|
366
+ valid_response
367
+ end
368
+ env = Rack::MockRequest.env_for("/", "warden.spec.order" => [])
369
+ setup_rack(app).call(env)
370
+ env['warden.spec.order'].should == [1,2,3]
371
+ end
372
+ end
373
+ end