rocketio 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rocketio.rb +6 -3
  3. data/lib/rocketio/application.rb +3 -7
  4. data/lib/rocketio/controller.rb +62 -90
  5. data/lib/rocketio/controller/authentication.rb +38 -44
  6. data/lib/rocketio/controller/authorization.rb +8 -4
  7. data/lib/rocketio/controller/error_handlers.rb +12 -8
  8. data/lib/rocketio/controller/filters.rb +14 -19
  9. data/lib/rocketio/controller/helpers.rb +1 -1
  10. data/lib/rocketio/controller/middleware.rb +1 -1
  11. data/lib/rocketio/controller/render/engine.rb +3 -3
  12. data/lib/rocketio/controller/render/layout.rb +1 -1
  13. data/lib/rocketio/controller/render/layouts.rb +6 -6
  14. data/lib/rocketio/controller/render/template_vars.rb +3 -3
  15. data/lib/rocketio/controller/render/templates.rb +6 -6
  16. data/lib/rocketio/controller/sessions.rb +1 -1
  17. data/lib/rocketio/error_templates/409.html +11 -7
  18. data/lib/rocketio/error_templates/501.html +4 -4
  19. data/lib/rocketio/router.rb +35 -21
  20. data/lib/rocketio/version.rb +1 -1
  21. data/rocketio.gemspec +2 -0
  22. data/test/aliases_test.rb +2 -2
  23. data/test/api_test.rb +24 -117
  24. data/test/authentication_test.rb +96 -60
  25. data/test/authorization_test.rb +28 -17
  26. data/test/cache_control_test.rb +12 -12
  27. data/test/content_type_test.rb +7 -7
  28. data/test/cookies_test.rb +4 -4
  29. data/test/error_handlers_test.rb +14 -12
  30. data/test/etag_test.rb +32 -32
  31. data/test/filters_test.rb +96 -79
  32. data/test/halt_test.rb +1 -1
  33. data/test/helpers_test.rb +6 -6
  34. data/test/middleware_test.rb +4 -4
  35. data/test/redirect_test.rb +6 -7
  36. data/test/render/{post.erb → b.erb} +0 -0
  37. data/test/render/{put.erb → c.erb} +0 -0
  38. data/test/render/engine_test.rb +5 -5
  39. data/test/render/{get.erb → index.erb} +0 -0
  40. data/test/render/layout_test.rb +21 -17
  41. data/test/render/layouts_test.rb +14 -14
  42. data/test/render/render_test.rb +17 -14
  43. data/test/render/template_vars_test.rb +9 -9
  44. data/test/render/templates_test.rb +16 -16
  45. data/test/response_test.rb +4 -4
  46. data/test/routes_test.rb +21 -42
  47. data/test/sendfile_test.rb +8 -8
  48. data/test/sessions_test.rb +27 -27
  49. data/test/setup.rb +2 -0
  50. metadata +34 -6
data/test/api_test.rb CHANGED
@@ -2,7 +2,7 @@ require 'setup'
2
2
 
3
3
  spec :api do
4
4
 
5
- it 'should contain only public non-inherited methods' do
5
+ it 'should not contain methods defined by setup DSL' do
6
6
  c = mock_controller {
7
7
  basic_auth {}
8
8
  digest_auth {}
@@ -24,12 +24,34 @@ spec :api do
24
24
  assert(c.api).empty?
25
25
  end
26
26
 
27
+ it 'should contain public methods' do
28
+ c = mock_controller {
29
+ def x; end
30
+ }
31
+ assert(c.api.keys) == [:x]
32
+ end
33
+
34
+ it 'should exclude protected methods' do
35
+ c = mock_controller {
36
+ protected
37
+ def x; end
38
+ }
39
+ assert(c.api).empty?
40
+ end
41
+
42
+ it 'should exclude private methods' do
43
+ c = mock_controller {
44
+ private
45
+ def x; end
46
+ }
47
+ assert(c.api).empty?
48
+ end
27
49
 
28
50
  it 'should inherit api methods' do
29
51
  a = mock_controller {
30
52
  def x; end
31
53
  }
32
-
54
+
33
55
  b = mock_controller(a) {
34
56
  def y; end
35
57
  }
@@ -37,119 +59,4 @@ spec :api do
37
59
  assert(b.api).include?(:x)
38
60
  assert(b.api).include?(:y)
39
61
  end
40
-
41
-
42
- context :private_api do
43
-
44
- it 'should contain auth methods' do
45
- c = mock_controller {
46
- basic_auth {}
47
- digest_auth {}
48
- token_auth {}
49
- }
50
- assert(c.private_api).include?(:basic_auth)
51
- assert(c.private_api).include?(:__basic_auth__get__)
52
-
53
- assert(c.private_api).include?(:digest_auth)
54
- assert(c.private_api).include?(:__digest_auth__get__)
55
-
56
- assert(c.private_api).include?(:token_auth)
57
- end
58
-
59
- it 'should contain error handler methods' do
60
- c = mock_controller {
61
- error(500) {}
62
- }
63
- assert(c.private_api).include?(:error_handlers)
64
- assert(c.private_api).include?(:__404_error_handler__)
65
- assert(c.private_api).include?(:__409_error_handler__)
66
- assert(c.private_api).include?(:__501_error_handler__)
67
- end
68
-
69
- it 'should contain filters methods' do
70
- c = mock_controller {
71
- before {}
72
- around {}
73
- after {}
74
- }
75
- assert(c.private_api).include?(:before)
76
- assert(c.private_api).include?(:'__before_*__')
77
-
78
- assert(c.private_api).include?(:around)
79
- assert(c.private_api).include?(:'__around_*__')
80
-
81
- assert(c.private_api).include?(:after)
82
- assert(c.private_api).include?(:'__after_*__')
83
-
84
- end
85
-
86
- it 'should contain middleware methods' do
87
- c = mock_controller {
88
- use proc {}
89
- }
90
- assert(c.private_api).include?(:middleware)
91
- end
92
-
93
- it 'should contain session methods' do
94
- c = mock_controller {
95
- sessions :cookies
96
- }
97
- assert(c.private_api).include?(:sessions)
98
- end
99
-
100
- context :render do
101
-
102
- it 'should contain engine methods' do
103
- c = mock_controller {
104
- engine :ERB
105
- }
106
-
107
- assert(c.private_api).include?(:engine)
108
- end
109
-
110
- it 'should contain engine methods when engine defined as block' do
111
- c = mock_controller {
112
- engine {:ERB}
113
- }
114
-
115
- assert(c.private_api).include?(:engine)
116
- assert(c.private_api).include?(:__rocketio_engine__)
117
- end
118
-
119
- it 'should contain layout methods' do
120
- c = mock_controller {
121
- layout :main
122
- define_layout(:main) {}
123
- define_layout(:file, file: :file)
124
- }
125
-
126
- assert(c.private_api).include?(:layout)
127
- assert(c.private_api).include?(:layouts)
128
- assert(c.private_api).include?(:__file_layout_file__)
129
- assert(c.private_api).include?(:__file_layout__)
130
- end
131
-
132
- it 'should contain template methods' do
133
- c = mock_controller {
134
- define_template(:main) {}
135
- define_template(:file, file: :file)
136
- }
137
-
138
- assert(c.private_api).include?(:templates)
139
- assert(c.private_api).include?(:__file_template_file__)
140
- assert(c.private_api).include?(:__file_template__)
141
- end
142
-
143
- it 'should contain template_var methods' do
144
- c = mock_controller {
145
- define_template_var(:var) {}
146
- }
147
-
148
- assert(c.private_api).include?(:__template_vars__)
149
- assert(c.private_api).include?(:__var_template_var__)
150
- end
151
-
152
- end
153
-
154
- end
155
62
  end
@@ -2,11 +2,14 @@ require 'setup'
2
2
 
3
3
  spec :AuthenticationTest do
4
4
  context 'inheritance' do
5
+
5
6
  it 'inherits basic auth procedures from superclass' do
6
7
  a = mock_controller {
7
8
  basic_auth {|u,p| [u,p] == %w[u p]}
8
9
  }
9
- b = mock_controller(a)
10
+ b = mock_controller(a){
11
+ def index; end
12
+ }
10
13
  app(b)
11
14
  get
12
15
  assert(last_response).is_unauthorized
@@ -21,6 +24,7 @@ spec :AuthenticationTest do
21
24
  }
22
25
  b = mock_controller(a) {
23
26
  basic_auth {|u,p| [u,p] == %w[x y]}
27
+ def index; end
24
28
  }
25
29
  app(b)
26
30
  get
@@ -30,7 +34,7 @@ spec :AuthenticationTest do
30
34
  assert(last_response).is_authorized
31
35
  end
32
36
 
33
- it 'uses `inherit` to override basic auth inherited from superclass' do
37
+ it 'uses `import` to override basic auth inherited from superclass' do
34
38
  a = mock_controller {
35
39
  basic_auth {|u,p| [u,p] == %w[u p]}
36
40
  }
@@ -39,6 +43,7 @@ spec :AuthenticationTest do
39
43
  }
40
44
  c = mock_controller(a) {
41
45
  import :basic_auth, from: b
46
+ def index; end
42
47
  }
43
48
  app(c)
44
49
  get
@@ -48,12 +53,13 @@ spec :AuthenticationTest do
48
53
  assert(last_response).is_authorized
49
54
  end
50
55
 
51
- it 'inherits basic auth procedures' do
56
+ it 'imports basic auth procedures' do
52
57
  a = mock_controller {
53
58
  basic_auth {|u,p| [u,p] == %w[u p]}
54
59
  }
55
60
  b = mock_controller {
56
61
  import :basic_auth, from: a
62
+ def index; end
57
63
  }
58
64
  app(b)
59
65
  get
@@ -67,7 +73,9 @@ spec :AuthenticationTest do
67
73
  a = mock_controller {
68
74
  digest_auth {|u| {'u' => 'p'}[u]}
69
75
  }
70
- b = mock_controller(a)
76
+ b = mock_controller(a) {
77
+ def index; end
78
+ }
71
79
  app(b)
72
80
  get
73
81
  assert(last_response).is_unauthorized
@@ -82,6 +90,7 @@ spec :AuthenticationTest do
82
90
  }
83
91
  b = mock_controller(a) {
84
92
  digest_auth {|u| {'x' => 'y'}[u]}
93
+ def index; end
85
94
  }
86
95
  app(b)
87
96
  get
@@ -91,7 +100,7 @@ spec :AuthenticationTest do
91
100
  assert(last_response).is_authorized
92
101
  end
93
102
 
94
- it 'uses `inherit` to override digest auth inherited from superclass' do
103
+ it 'uses `import` to override digest auth inherited from superclass' do
95
104
  a = mock_controller {
96
105
  digest_auth {|u| {'u' => 'p'}[u]}
97
106
  }
@@ -100,8 +109,9 @@ spec :AuthenticationTest do
100
109
  }
101
110
  c = mock_controller(a) {
102
111
  import :digest_auth, from: b
112
+ def index; end
103
113
  }
104
- app(b)
114
+ app(c)
105
115
  get
106
116
  assert(last_response).is_unauthorized
107
117
  digest_authorize 'x', 'y'
@@ -109,12 +119,13 @@ spec :AuthenticationTest do
109
119
  assert(last_response).is_authorized
110
120
  end
111
121
 
112
- it 'inherits digest auth procedures' do
122
+ it 'imports digest auth procedures' do
113
123
  a = mock_controller {
114
124
  digest_auth {|u| {'u' => 'p'}[u]}
115
125
  }
116
126
  b = mock_controller {
117
127
  import :digest_auth, from: a
128
+ def index; end
118
129
  }
119
130
  app(b)
120
131
  get
@@ -126,17 +137,22 @@ spec :AuthenticationTest do
126
137
  end
127
138
 
128
139
  context 'basic auth' do
129
- context 'protect all request methods' do
140
+ context 'protect all methods on any request method' do
141
+
130
142
  before do
131
143
  app mock_controller {
132
144
  basic_auth {|u,p| [u,p] == %w[u p]}
133
- RocketIO::REQUEST_METHODS.each_value {|m| define_method(m) {}}
145
+ def x; end
146
+ def y; end
147
+ def z; end
134
148
  }
135
149
  end
136
150
 
137
151
  it 'returns "401 Unauthorized" if no authorization given' do
138
152
  RocketIO::REQUEST_METHODS.each_value do |rqm|
139
- send(rqm)
153
+ send(rqm, :x)
154
+ send(rqm, :y)
155
+ send(rqm, :z)
140
156
  assert(last_response).is_unauthorized
141
157
  end
142
158
  end
@@ -144,7 +160,9 @@ spec :AuthenticationTest do
144
160
  it 'returns "401 Unauthorized" if wrong authorization given' do
145
161
  authorize('x', 'y')
146
162
  RocketIO::REQUEST_METHODS.values.each do |rqm|
147
- send(rqm)
163
+ send(rqm, :x)
164
+ send(rqm, :y)
165
+ send(rqm, :z)
148
166
  assert(last_response).is_unauthorized
149
167
  end
150
168
  end
@@ -152,65 +170,75 @@ spec :AuthenticationTest do
152
170
  it 'returns "200 Ok" response if authorization passed' do
153
171
  authorize('u', 'p')
154
172
  RocketIO::REQUEST_METHODS.values.each do |rqm|
155
- send(rqm)
173
+ send(rqm, :x)
174
+ send(rqm, :y)
175
+ send(rqm, :z)
156
176
  assert(last_response).ok?
157
177
  end
158
178
  end
159
179
  end
160
180
 
161
- context 'protect specific request methods' do
181
+ context 'protect specific methods on any request method' do
162
182
  before do
163
- @protected = %w[get post]
183
+ @protected = %w[x y]
164
184
  app mock_controller {
165
- basic_auth(:get) {|u,p| [u,p] == ['u', 'get'] }
166
- basic_auth(:post) {|u,p| [u,p] == ['u', 'post']}
167
- define_method(:get) {}
168
- define_method(:post) {}
169
- define_method(:put) {}
170
- define_method(:delete) {}
185
+ basic_auth(:x) {|u,p| [u,p] == ['u', 'x']}
186
+ basic_auth(:y) {|u,p| [u,p] == ['u', 'y']}
187
+ def x; end
188
+ def y; end
189
+ def z; end
171
190
  }
172
191
  end
173
192
 
174
193
  it 'returns "200 Ok" for un-protected methods' do
175
- %w[put delete].each do |rqm|
176
- send(rqm)
194
+ RocketIO::REQUEST_METHODS.values.each do |rqm|
195
+ send(rqm, :z)
177
196
  assert(last_response).ok?
178
197
  end
179
198
  end
180
199
 
181
200
  it 'returns "401 Unauthorized" if no authorization given' do
182
- @protected.each do |rqm|
183
- send(rqm)
184
- assert(last_response).is_unauthorized
201
+ @protected.each do |m|
202
+ RocketIO::REQUEST_METHODS.values.each do |rqm|
203
+ send(rqm, m)
204
+ assert(last_response).is_unauthorized
205
+ end
185
206
  end
186
207
  end
187
208
 
188
209
  it 'returns "401 Unauthorized" if wrong authorization given' do
189
- authorize('x', 'y')
190
- @protected.each do |rqm|
191
- send(rqm)
192
- assert(last_response).is_unauthorized
210
+ authorize('', '')
211
+ @protected.each do |m|
212
+ RocketIO::REQUEST_METHODS.values.each do |rqm|
213
+ send(rqm, m)
214
+ assert(last_response).is_unauthorized
215
+ end
193
216
  end
194
217
  end
195
218
 
196
219
  it 'returns "200 Ok" response if authorization passed' do
197
- authorize('u', 'get')
198
- get
199
- assert(last_response).ok?
220
+ authorize('u', 'x')
221
+ RocketIO::REQUEST_METHODS.values.each do |rqm|
222
+ send(rqm, :x)
223
+ assert(last_response).ok?
224
+ end
200
225
 
201
- authorize('u', 'post')
202
- post
203
- assert(last_response).ok?
226
+ authorize('u', 'y')
227
+ RocketIO::REQUEST_METHODS.values.each do |rqm|
228
+ send(rqm, :y)
229
+ assert(last_response).ok?
230
+ end
204
231
  end
205
232
  end
206
233
  end
207
234
 
208
235
  context 'digest auth' do
209
236
  context 'hashed password' do
237
+
210
238
  before do
211
239
  app mock_controller {
212
240
  digest_auth(passwords_hashed: true) {|u| {'u' => '5daad7ee02f846df2874dba8f7522112'}[u]}
213
- define_method(:get) {}
241
+ def index; end
214
242
  }
215
243
  end
216
244
 
@@ -236,7 +264,7 @@ spec :AuthenticationTest do
236
264
  before do
237
265
  app mock_controller {
238
266
  digest_auth {|u| {'u' => 'p'}[u]}
239
- define_method(:get) {}
267
+ def index; end
240
268
  }
241
269
  end
242
270
 
@@ -258,49 +286,57 @@ spec :AuthenticationTest do
258
286
  end
259
287
  end
260
288
 
261
- context 'protect specific request methods' do
289
+ context 'protect specific methods on any request method' do
290
+
262
291
  before do
263
- @protected = %w[get post]
292
+ @protected = %w[x y]
264
293
  app mock_controller {
265
- digest_auth(:get) {|u| {'u' => 'get'}[u] }
266
- digest_auth(:post) {|u| {'u' => 'post'}[u]}
267
- define_method(:get) {}
268
- define_method(:post) {}
269
- define_method(:put) {}
270
- define_method(:delete) {}
294
+ digest_auth(:x) {|u| {'u' => 'x'}[u] }
295
+ digest_auth(:y) {|u| {'u' => 'y'}[u]}
296
+ def x; end
297
+ def y; end
298
+ def z; end
271
299
  }
272
300
  end
273
301
 
274
302
  it 'returns "200 Ok" for un-protected methods' do
275
- %w[put delete].each do |rqm|
276
- send(rqm)
303
+ RocketIO::REQUEST_METHODS.values.each do |rqm|
304
+ send(rqm, :z)
277
305
  assert(last_response).ok?
278
306
  end
279
307
  end
280
308
 
281
309
  it 'returns "401 Unauthorized" if no authorization given' do
282
- @protected.each do |rqm|
283
- send(rqm)
284
- assert(last_response).is_unauthorized
310
+ @protected.each do |m|
311
+ RocketIO::REQUEST_METHODS.values.each do |rqm|
312
+ send(rqm, m)
313
+ assert(last_response).is_unauthorized
314
+ end
285
315
  end
286
316
  end
287
317
 
288
318
  it 'returns "401 Unauthorized" if wrong authorization given' do
289
- digest_authorize('x', 'y')
290
- @protected.each do |rqm|
291
- send(rqm)
292
- assert(last_response).is_unauthorized
319
+ digest_authorize('', '')
320
+ @protected.each do |m|
321
+ RocketIO::REQUEST_METHODS.values.each do |rqm|
322
+ send(rqm, m)
323
+ assert(last_response).is_unauthorized
324
+ end
293
325
  end
294
326
  end
295
327
 
296
328
  it 'returns "200 Ok" response if authorization passed' do
297
- digest_authorize('u', 'get')
298
- get
299
- assert(last_response).ok?
329
+ digest_authorize('u', 'x')
330
+ RocketIO::REQUEST_METHODS.values.each do |rqm|
331
+ send(rqm, :x)
332
+ assert(last_response).ok?
333
+ end
300
334
 
301
- digest_authorize('u', 'post')
302
- post
303
- assert(last_response).ok?
335
+ digest_authorize('u', 'y')
336
+ RocketIO::REQUEST_METHODS.values.each do |rqm|
337
+ send(rqm, :y)
338
+ assert(last_response).ok?
339
+ end
304
340
  end
305
341
  end
306
342
  end