lotus-controller 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,29 +0,0 @@
1
- require 'test_helper'
2
- require 'rack'
3
-
4
- describe Lotus::Action::Params do
5
- it 'accepts params from "router.params"' do
6
- action = ParamsAction.new
7
- response = action.call({ 'router.params' => {id: '23'} })
8
-
9
- response[2].must_equal ["{:id=>\"23\"}"]
10
- end
11
-
12
- it 'accepts params as they are, for testing purposes' do
13
- action = ParamsAction.new
14
- response = action.call({id: '23'})
15
-
16
- response[2].must_equal ["{:id=>\"23\"}"]
17
- end
18
-
19
- it 'accepts params from "rack.input" as request body' do
20
- response = Rack::MockRequest.new(ParamsAction.new).request('PATCH', "?id=23", params: { x: { foo: 'bar' } })
21
- response.body.must_match "{:id=>\"23\", :x=>{:foo=>\"bar\"}}"
22
- end
23
-
24
- it 'is frozen' do
25
- params = Lotus::Action::Params.new({id: '23'})
26
-
27
- -> { params.delete(:id) }.must_raise(RuntimeError)
28
- end
29
- end
data/test/action_test.rb DELETED
@@ -1,31 +0,0 @@
1
- require 'test_helper'
2
-
3
- describe Lotus::Action do
4
- describe '#call' do
5
- it 'calls an action' do
6
- response = CallAction.new.call({})
7
-
8
- response[0].must_equal 201
9
- response[1].must_equal({'Content-Type' => 'application/octet-stream', 'X-Custom' => 'OK'})
10
- response[2].must_equal ['Hi from TestAction!']
11
- end
12
-
13
- it 'returns an HTTP 500 status code when an exception is raised' do
14
- response = ErrorCallAction.new.call({})
15
-
16
- response[0].must_equal 500
17
- response[2].must_equal ['Internal Server Error']
18
- end
19
- end
20
-
21
- describe '#expose' do
22
- it 'creates a getter for the given ivar' do
23
- action = ExposeAction.new
24
-
25
- response = action.call({})
26
- response[0].must_equal 200
27
-
28
- action.exposures.must_equal({ film: '400 ASA', time: nil })
29
- end
30
- end
31
- end
@@ -1,24 +0,0 @@
1
- require 'test_helper'
2
-
3
- describe Lotus::Controller do
4
- describe '.action' do
5
- it 'creates an action for the given name' do
6
- action = TestController::Index.new
7
- action.call({name: 'test'})
8
- action.xyz.must_equal 'test'
9
- end
10
-
11
- it "raises an error when the given name isn't a valid Ruby identifier" do
12
- -> {
13
- class Controller
14
- include Lotus::Controller
15
-
16
- action 12 do
17
- def call(params)
18
- end
19
- end
20
- end
21
- }.must_raise TypeError
22
- end
23
- end
24
- end
data/test/cookies_test.rb DELETED
@@ -1,36 +0,0 @@
1
- require 'test_helper'
2
-
3
- describe Lotus::Action do
4
- describe 'cookies' do
5
- it 'gets cookies' do
6
- action = GetCookiesAction.new
7
- response = action.call({'HTTP_COOKIE' => 'foo=bar'})
8
-
9
- action.send(:cookies).must_equal({foo: 'bar'})
10
- response[1].must_equal({'Content-Type' => 'application/octet-stream', 'Set-Cookie' => 'foo=bar'})
11
- end
12
-
13
- it 'sets cookies' do
14
- action = SetCookiesAction.new
15
- response = action.call({})
16
-
17
- response[2].must_equal(['yo'])
18
- response[1].must_equal({'Content-Type' => 'application/octet-stream', 'Set-Cookie' => 'foo=yum%21'})
19
- end
20
-
21
- it 'sets cookies with options' do
22
- tomorrow = Time.now + 60 * 60 * 24
23
- action = SetCookiesWithOptionsAction.new
24
- response = action.call({expires: tomorrow})
25
-
26
- response[1].must_equal({'Content-Type' => 'application/octet-stream', 'Set-Cookie' => "kukki=yum%21; domain=lotusrb.org; path=/controller; expires=#{ tomorrow.gmtime.rfc2822 }; secure; HttpOnly"})
27
- end
28
-
29
- it 'removes cookies' do
30
- action = RemoveCookiesAction.new
31
- response = action.call({'HTTP_COOKIE' => 'foo=bar;rm=me'})
32
-
33
- response[1].must_equal({'Content-Type' => 'application/octet-stream', 'Set-Cookie' => "foo=bar\nrm=; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 -0000"})
34
- end
35
- end
36
- end
data/test/fixtures.rb DELETED
@@ -1,501 +0,0 @@
1
- HTTP_TEST_STATUSES = {
2
- 100 => 'Continue',
3
- 101 => 'Switching Protocols',
4
- 102 => 'Processing (WebDAV) (RFC 2518)',
5
- 103 => 'Checkpoint',
6
- 122 => 'Request-URI too long',
7
- 200 => 'OK',
8
- 201 => 'Created',
9
- 202 => 'Accepted',
10
- 203 => 'Non-Authoritative Information',
11
- 204 => 'No Content',
12
- 205 => 'Reset Content',
13
- 206 => 'Partial Content',
14
- 207 => 'Multi-Status (WebDAV) (RFC 4918)',
15
- 208 => 'Already Reported (WebDAV) (RFC 5842)',
16
- 226 => 'IM Used (RFC 3229)',
17
- 300 => 'Multiple Choices',
18
- 301 => 'Moved Permanently',
19
- 302 => 'Found',
20
- 303 => 'See Other',
21
- 304 => 'Not Modified',
22
- 305 => 'Use Proxy',
23
- 306 => 'Switch Proxy',
24
- 307 => 'Temporary Redirect',
25
- 308 => 'Resume Incomplete',
26
- 400 => 'Bad Request',
27
- 401 => 'Unauthorized',
28
- 402 => 'Payment Required',
29
- 403 => 'Forbidden',
30
- 404 => 'Not Found',
31
- 405 => 'Method Not Allowed',
32
- 406 => 'Not Acceptable',
33
- 407 => 'Proxy Authentication Required',
34
- 408 => 'Request Timeout',
35
- 409 => 'Conflict',
36
- 410 => 'Gone',
37
- 411 => 'Length Required',
38
- 412 => 'Precondition Failed',
39
- 413 => 'Request Entity Too Large',
40
- 414 => 'Request-URI Too Long',
41
- 415 => 'Unsupported Media Type',
42
- 416 => 'Requested Range Not Satisfiable',
43
- 417 => 'Expectation Failed',
44
- 418 => 'I\'m a teapot (RFC 2324)',
45
- 420 => 'Enhance Your Calm',
46
- 422 => 'Unprocessable Entity (WebDAV) (RFC 4918)',
47
- 423 => 'Locked (WebDAV) (RFC 4918)',
48
- 424 => 'Failed Dependency (WebDAV) (RFC 4918)',
49
- 426 => 'Upgrade Required (RFC 2817)',
50
- 428 => 'Precondition Required',
51
- 429 => 'Too Many Requests',
52
- 431 => 'Request Header Fields Too Large',
53
- 444 => 'No Response',
54
- 449 => 'Retry With',
55
- 450 => 'Blocked by Windows Parental Controls',
56
- 451 => 'Wrong Exchange server',
57
- 499 => 'Client Closed Request',
58
- 500 => 'Internal Server Error',
59
- 501 => 'Not Implemented',
60
- 502 => 'Bad Gateway',
61
- 503 => 'Service Unavailable',
62
- 504 => 'Gateway Timeout',
63
- 505 => 'HTTP Version Not Supported',
64
- 506 => 'Variant Also Negotiates (RFC 2295)',
65
- 507 => 'Insufficient Storage (WebDAV) (RFC 4918)',
66
- 508 => 'Loop Detected (WebDAV) (RFC 5842)',
67
- 509 => 'Bandwidth Limit Exceeded (Apache bw\/limited extension)',
68
- 510 => 'Not Extended (RFC 2774)',
69
- 511 => 'Network Authentication Required',
70
- 598 => 'Network read timeout error',
71
- 599 => 'Network connect timeout error'
72
- }
73
-
74
- class TestController
75
- include Lotus::Controller
76
-
77
- action 'Index' do
78
- expose :xyz
79
-
80
- def call(params)
81
- @xyz = params[:name]
82
- end
83
- end
84
- end
85
-
86
- class CallAction
87
- include Lotus::Action
88
-
89
- def call(params)
90
- self.status = 201
91
- self.body = 'Hi from TestAction!'
92
- self.headers.merge!({ 'X-Custom' => 'OK' })
93
- end
94
- end
95
-
96
- class ErrorCallAction
97
- include Lotus::Action
98
-
99
- def call(params)
100
- raise
101
- end
102
- end
103
-
104
- class ExposeAction
105
- include Lotus::Action
106
-
107
- expose :film, :time
108
-
109
- def call(params)
110
- @film = '400 ASA'
111
- end
112
- end
113
-
114
- class BeforeMethodAction
115
- include Lotus::Action
116
-
117
- expose :article
118
- before :set_article, :reverse_article
119
-
120
- def call(params)
121
- end
122
-
123
- private
124
- def set_article
125
- @article = 'Bonjour!'
126
- end
127
-
128
- def reverse_article
129
- @article.reverse!
130
- end
131
- end
132
-
133
- class SubclassBeforeMethodAction < BeforeMethodAction
134
- before :upcase_article
135
-
136
- private
137
- def upcase_article
138
- @article.upcase!
139
- end
140
- end
141
-
142
- class ParamsBeforeMethodAction < BeforeMethodAction
143
- expose :exposed_params
144
-
145
- private
146
- def set_article(params)
147
- @exposed_params = params
148
- @article = super() + params[:bang]
149
- end
150
- end
151
-
152
- class ErrorBeforeMethodAction < BeforeMethodAction
153
- private
154
- def set_article
155
- raise
156
- end
157
- end
158
-
159
- class BeforeBlockAction
160
- include Lotus::Action
161
-
162
- expose :article
163
- before { @article = 'Good morning!' }
164
- before { @article.reverse! }
165
-
166
- def call(params)
167
- end
168
- end
169
-
170
- class YieldBeforeBlockAction < BeforeBlockAction
171
- expose :yielded_params
172
- before {|params| @yielded_params = params }
173
- end
174
-
175
- class AfterMethodAction
176
- include Lotus::Action
177
-
178
- expose :egg
179
- after :set_egg, :scramble_egg
180
-
181
- def call(params)
182
- end
183
-
184
- private
185
- def set_egg
186
- @egg = 'Egg!'
187
- end
188
-
189
- def scramble_egg
190
- @egg = 'gE!g'
191
- end
192
- end
193
-
194
- class SubclassAfterMethodAction < AfterMethodAction
195
- after :upcase_egg
196
-
197
- private
198
- def upcase_egg
199
- @egg.upcase!
200
- end
201
- end
202
-
203
- class ParamsAfterMethodAction < AfterMethodAction
204
- private
205
- def scramble_egg(params)
206
- @egg = super() + params[:question]
207
- end
208
- end
209
-
210
- class ErrorAfterMethodAction < AfterMethodAction
211
- private
212
- def set_egg
213
- raise
214
- end
215
- end
216
-
217
- class AfterBlockAction
218
- include Lotus::Action
219
-
220
- expose :egg
221
- after { @egg = 'Coque' }
222
- after { @egg.reverse! }
223
-
224
- def call(params)
225
- end
226
- end
227
-
228
- class YieldAfterBlockAction < AfterBlockAction
229
- expose :meaning_of_life_params
230
- before {|params| @meaning_of_life_params = params }
231
- end
232
-
233
- class SessionAction
234
- include Lotus::Action
235
- include Lotus::Action::Session
236
-
237
- def call(params)
238
- end
239
- end
240
-
241
- class RedirectAction
242
- include Lotus::Action
243
-
244
- def call(params)
245
- redirect_to '/destination'
246
- end
247
- end
248
-
249
- class StatusRedirectAction
250
- include Lotus::Action
251
-
252
- def call(params)
253
- redirect_to '/destination', status: 301
254
- end
255
- end
256
-
257
- class GetCookiesAction
258
- include Lotus::Action
259
- include Lotus::Action::Cookies
260
-
261
- def call(params)
262
- end
263
- end
264
-
265
- class SetCookiesAction
266
- include Lotus::Action
267
- include Lotus::Action::Cookies
268
-
269
- def call(params)
270
- self.body = 'yo'
271
- cookies[:foo] = 'yum!'
272
- end
273
- end
274
-
275
- class SetCookiesWithOptionsAction
276
- include Lotus::Action
277
- include Lotus::Action::Cookies
278
-
279
- def call(params)
280
- cookies[:kukki] = { value: 'yum!', domain: 'lotusrb.org', path: '/controller', expires: params[:expires], secure: true, httponly: true }
281
- end
282
- end
283
-
284
- class RemoveCookiesAction
285
- include Lotus::Action
286
- include Lotus::Action::Cookies
287
-
288
- def call(params)
289
- cookies[:rm] = nil
290
- end
291
- end
292
-
293
- class ThrowCodeAction
294
- include Lotus::Action
295
-
296
- def call(params)
297
- throw params[:status]
298
- end
299
- end
300
-
301
- class ThrowBeforeMethodAction
302
- include Lotus::Action
303
-
304
- before :authorize!
305
- before :set_body
306
-
307
- def call(params)
308
- self.body = 'Hello!'
309
- end
310
-
311
- private
312
- def authorize!
313
- throw 401
314
- end
315
-
316
- def set_body
317
- self.body = 'Hi!'
318
- end
319
- end
320
-
321
- class ThrowBeforeBlockAction
322
- include Lotus::Action
323
-
324
- before { throw 401 }
325
- before { self.body = 'Hi!' }
326
-
327
- def call(params)
328
- self.body = 'Hello!'
329
- end
330
- end
331
-
332
- class ThrowAfterMethodAction
333
- include Lotus::Action
334
-
335
- after :raise_timeout!
336
- after :set_body
337
-
338
- def call(params)
339
- self.body = 'Hello!'
340
- end
341
-
342
- private
343
- def raise_timeout!
344
- throw 408
345
- end
346
-
347
- def set_body
348
- self.body = 'Later!'
349
- end
350
- end
351
-
352
- class ThrowAfterBlockAction
353
- include Lotus::Action
354
-
355
- after { throw 408 }
356
- after { self.body = 'Later!' }
357
-
358
- def call(params)
359
- self.body = 'Hello!'
360
- end
361
- end
362
-
363
- class RecordNotFound < StandardError
364
- end
365
-
366
- class HandledExceptionAction
367
- include Lotus::Action
368
- handle_exception RecordNotFound, 404
369
-
370
- def call(params)
371
- raise RecordNotFound.new
372
- end
373
- end
374
-
375
- class UnhandledExceptionAction
376
- include Lotus::Action
377
-
378
- def call(params)
379
- raise RecordNotFound.new
380
- end
381
- end
382
-
383
- class ParamsAction
384
- include Lotus::Action
385
-
386
- def call(params)
387
- self.body = params.inspect
388
- end
389
- end
390
-
391
- class Root
392
- include Lotus::Action
393
-
394
- def call(params)
395
- self.body = params.inspect
396
- headers.merge!({'X-Test' => 'test'})
397
- end
398
- end
399
-
400
- class AboutController
401
- include Lotus::Controller
402
-
403
- class Team < Root
404
- end
405
-
406
- action 'Contacts' do
407
- def call(params)
408
- self.body = params.inspect
409
- end
410
- end
411
- end
412
-
413
- class IdentityController
414
- include Lotus::Controller
415
-
416
- class Action
417
- include Lotus::Action
418
-
419
- def call(params)
420
- self.body = params.inspect
421
- end
422
- end
423
-
424
- Show = Class.new(Action)
425
- New = Class.new(Action)
426
- Create = Class.new(Action)
427
- Edit = Class.new(Action)
428
- Update = Class.new(Action)
429
- Destroy = Class.new(Action)
430
- end
431
-
432
- class FlowersController
433
- include Lotus::Controller
434
-
435
- class Action
436
- include Lotus::Action
437
-
438
- def call(params)
439
- self.body = params.inspect
440
- end
441
- end
442
-
443
- Index = Class.new(Action)
444
- Show = Class.new(Action)
445
- New = Class.new(Action)
446
- Create = Class.new(Action)
447
- Edit = Class.new(Action)
448
- Update = Class.new(Action)
449
- Destroy = Class.new(Action)
450
- end
451
-
452
- class DashboardController
453
- include Lotus::Controller
454
-
455
- action 'Index' do
456
- include Lotus::Action::Session
457
- before :authenticate!
458
-
459
- def call(params)
460
- end
461
-
462
- private
463
- def authenticate!
464
- throw 401 unless loggedin?
465
- end
466
-
467
- def loggedin?
468
- session.has_key?(:user_id)
469
- end
470
- end
471
- end
472
-
473
- class SessionsController
474
- include Lotus::Controller
475
-
476
- action 'Create' do
477
- include Lotus::Action::Session
478
-
479
- def call(params)
480
- session[:user_id] = 23
481
- redirect_to '/'
482
- end
483
- end
484
-
485
- action 'Destroy' do
486
- include Lotus::Action::Session
487
-
488
- def call(params)
489
- session[:user_id] = nil
490
- end
491
- end
492
- end
493
-
494
- class StandaloneSession
495
- include Lotus::Action
496
- include Lotus::Action::Session
497
-
498
- def call(params)
499
- session[:age] = Time.now.year - 1982
500
- end
501
- end