moonrope 1.4.1 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +9 -0
- data/Gemfile.lock +47 -0
- data/MIT-LICENCE +20 -0
- data/README.md +24 -0
- data/bin/moonrope +28 -0
- data/docs/authentication.md +114 -0
- data/docs/controllers.md +106 -0
- data/docs/exceptions.md +27 -0
- data/docs/introduction.md +29 -0
- data/docs/structures.md +214 -0
- data/example/authentication.rb +50 -0
- data/example/controllers/meta_controller.rb +14 -0
- data/example/controllers/users_controller.rb +92 -0
- data/example/structures/pet_structure.rb +12 -0
- data/example/structures/user_structure.rb +35 -0
- data/html/assets/lock.svg +3 -0
- data/html/assets/reset.css +101 -0
- data/html/assets/style.css +348 -0
- data/html/assets/tool.svg +4 -0
- data/html/assets/try.js +151 -0
- data/html/authenticators/default.html +191 -0
- data/html/controllers/meta/version.html +144 -0
- data/html/controllers/meta.html +73 -0
- data/html/controllers/users/create.html +341 -0
- data/html/controllers/users/list.html +348 -0
- data/html/controllers/users/show.html +261 -0
- data/html/controllers/users/update.html +387 -0
- data/html/controllers/users.html +93 -0
- data/html/index.html +166 -0
- data/html/moonrope.txt +0 -0
- data/html/structures/pet.html +176 -0
- data/html/structures/user.html +338 -0
- data/lib/moonrope/action.rb +165 -37
- data/lib/moonrope/authenticator.rb +39 -0
- data/lib/moonrope/base.rb +24 -6
- data/lib/moonrope/controller.rb +4 -2
- data/lib/moonrope/doc_context.rb +94 -0
- data/lib/moonrope/doc_server.rb +123 -0
- data/lib/moonrope/dsl/action_dsl.rb +159 -9
- data/lib/moonrope/dsl/authenticator_dsl.rb +31 -0
- data/lib/moonrope/dsl/base_dsl.rb +21 -18
- data/lib/moonrope/dsl/controller_dsl.rb +60 -9
- data/lib/moonrope/dsl/filterable_dsl.rb +27 -0
- data/lib/moonrope/dsl/structure_dsl.rb +27 -2
- data/lib/moonrope/errors.rb +3 -0
- data/lib/moonrope/eval_environment.rb +82 -3
- data/lib/moonrope/eval_helpers/filter_helper.rb +82 -0
- data/lib/moonrope/eval_helpers.rb +28 -5
- data/lib/moonrope/guard.rb +35 -0
- data/lib/moonrope/html_generator.rb +65 -0
- data/lib/moonrope/param_set.rb +11 -1
- data/lib/moonrope/rack_middleware.rb +1 -1
- data/lib/moonrope/railtie.rb +31 -14
- data/lib/moonrope/request.rb +25 -14
- data/lib/moonrope/structure.rb +74 -11
- data/lib/moonrope/structure_attribute.rb +15 -0
- data/lib/moonrope/version.rb +1 -1
- data/lib/moonrope.rb +5 -4
- data/moonrope.gemspec +21 -0
- data/spec/spec_helper.rb +32 -0
- data/spec/specs/action_spec.rb +455 -0
- data/spec/specs/base_spec.rb +29 -0
- data/spec/specs/controller_spec.rb +31 -0
- data/spec/specs/param_set_spec.rb +31 -0
- data/templates/basic/_action_form.erb +77 -0
- data/templates/basic/_errors_table.erb +32 -0
- data/templates/basic/_structure_attributes_list.erb +55 -0
- data/templates/basic/action.erb +168 -0
- data/templates/basic/assets/lock.svg +3 -0
- data/templates/basic/assets/reset.css +101 -0
- data/templates/basic/assets/style.css +348 -0
- data/templates/basic/assets/tool.svg +4 -0
- data/templates/basic/assets/try.js +151 -0
- data/templates/basic/authenticator.erb +51 -0
- data/templates/basic/controller.erb +20 -0
- data/templates/basic/index.erb +114 -0
- data/templates/basic/layout.erb +46 -0
- data/templates/basic/structure.erb +23 -0
- data/test/test_helper.rb +81 -0
- data/test/tests/action_access_test.rb +63 -0
- data/test/tests/actions_test.rb +524 -0
- data/test/tests/authenticators_test.rb +87 -0
- data/test/tests/base_test.rb +35 -0
- data/test/tests/controllers_test.rb +49 -0
- data/test/tests/eval_environment_test.rb +136 -0
- data/test/tests/evel_helpers_test.rb +60 -0
- data/test/tests/examples_test.rb +11 -0
- data/test/tests/helpers_test.rb +97 -0
- data/test/tests/param_set_test.rb +44 -0
- data/test/tests/rack_middleware_test.rb +109 -0
- data/test/tests/request_test.rb +232 -0
- data/test/tests/structures_param_extensions_test.rb +159 -0
- data/test/tests/structures_test.rb +335 -0
- metadata +82 -48
@@ -0,0 +1,524 @@
|
|
1
|
+
class ActionsTest < Test::Unit::TestCase
|
2
|
+
|
3
|
+
def setup
|
4
|
+
@base = Moonrope::Base.new
|
5
|
+
@controller = Moonrope::Controller.new(@base, :users)
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_basic_definition
|
9
|
+
action = Moonrope::Action.new(@controller, :list) do
|
10
|
+
description "An example action with a description"
|
11
|
+
end
|
12
|
+
assert action.is_a?(Moonrope::Action)
|
13
|
+
assert_equal :list, action.name
|
14
|
+
assert action.description.is_a?(String)
|
15
|
+
assert action.description.length > 0
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_defining_params
|
19
|
+
action = Moonrope::Action.new(@controller, :list) do
|
20
|
+
param :page
|
21
|
+
param :limit
|
22
|
+
end
|
23
|
+
assert action.params.is_a?(Hash)
|
24
|
+
assert_equal [:page, :limit], action.params.keys
|
25
|
+
assert action.params.values.all? { |p| p.is_a?(Hash) }
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_using_shares
|
29
|
+
controller = Moonrope::Controller.new(@base, :users) do
|
30
|
+
shared_action :user_properties do
|
31
|
+
error 'InvalidUsername', "Some description"
|
32
|
+
param :username, "Blah"
|
33
|
+
param :first_name
|
34
|
+
end
|
35
|
+
|
36
|
+
action :create do
|
37
|
+
use :user_properties
|
38
|
+
param :last_name
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
action = controller / :create
|
43
|
+
assert_equal(Hash, action.params.class)
|
44
|
+
assert_equal(Hash, action.params[:username].class)
|
45
|
+
assert_equal("Blah", action.params[:username][:description])
|
46
|
+
assert_equal(Hash, action.errors['InvalidUsername'].class)
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_action
|
50
|
+
action = Moonrope::Action.new(@controller, :list) do
|
51
|
+
action { true }
|
52
|
+
end
|
53
|
+
assert action.actions.is_a?(Array)
|
54
|
+
assert action.actions.first.is_a?(Proc)
|
55
|
+
assert_equal true, action.actions.first.call
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_calling_actions
|
59
|
+
action = Moonrope::Action.new(@controller, :list) do
|
60
|
+
action { [1,2,3,4] }
|
61
|
+
end
|
62
|
+
assert result = action.execute
|
63
|
+
assert result.is_a?(Moonrope::ActionResult)
|
64
|
+
assert_equal 'success', result.status
|
65
|
+
assert_equal [1,2,3,4], result.data
|
66
|
+
assert_equal Float, result.time.class
|
67
|
+
assert_equal({}, result.flags)
|
68
|
+
assert_equal({}, result.headers)
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_structure_method_can_be_called
|
72
|
+
# Create a new structure to test with
|
73
|
+
user_structure = Moonrope::Structure.new(@base, :user) do
|
74
|
+
basic { {:id => o.id, :username => o.username}}
|
75
|
+
end
|
76
|
+
|
77
|
+
# Create an action which uses this structure
|
78
|
+
action = Moonrope::Action.new(@controller, :list) do
|
79
|
+
action do
|
80
|
+
user = User.new(:id => 1, :username => 'adamcooke')
|
81
|
+
structure user_structure, user
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
# Test the structure was returned
|
86
|
+
assert result = action.execute
|
87
|
+
assert result.is_a?(Moonrope::ActionResult), "result is not a ActionResult"
|
88
|
+
assert_equal 1, result.data[:id]
|
89
|
+
assert_equal 'adamcooke', result.data[:username]
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_structure_methods_can_be_called_with_opts_from_dsl
|
93
|
+
# Create a new structure to test with
|
94
|
+
user_structure = Moonrope::Structure.new(@base, :user) do
|
95
|
+
basic :id
|
96
|
+
full :username
|
97
|
+
end
|
98
|
+
|
99
|
+
# Create an action which uses this structure
|
100
|
+
action = Moonrope::Action.new(@controller, :list) do
|
101
|
+
returns :hash, :structure => :user, :structure_opts => {:full => true}
|
102
|
+
action do
|
103
|
+
user = User.new(:id => 1, :username => 'adamcooke')
|
104
|
+
structure user_structure, user, :return => true
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
# Test the structure was returned
|
109
|
+
assert result = action.execute
|
110
|
+
assert_equal 1, result.data[:id]
|
111
|
+
assert_equal 'adamcooke', result.data[:username]
|
112
|
+
end
|
113
|
+
|
114
|
+
def test_default_params
|
115
|
+
action = Moonrope::Action.new(@controller, :default_params_test) do
|
116
|
+
param :page, :default => 1234
|
117
|
+
param :limit
|
118
|
+
action { {:page => params.page, :limit => params.limit} }
|
119
|
+
end
|
120
|
+
result = action.execute
|
121
|
+
assert_equal({'page' => 1234}, action.default_params)
|
122
|
+
assert_equal 1234, result.data[:page]
|
123
|
+
assert_equal nil, result.data[:limit]
|
124
|
+
end
|
125
|
+
|
126
|
+
def test_before_filters_are_executed
|
127
|
+
controller = Moonrope::Controller.new(@base, :users) do
|
128
|
+
before { set_flag :before_all, true }
|
129
|
+
before(:other) { set_flag :before_other, true }
|
130
|
+
before(:list) { set_flag :before_list, true }
|
131
|
+
before(:list, :potato) { set_flag :before_list_and_potato, true }
|
132
|
+
end
|
133
|
+
|
134
|
+
action = Moonrope::Action.new(controller, :list) do
|
135
|
+
action { true }
|
136
|
+
end
|
137
|
+
|
138
|
+
assert result = action.execute
|
139
|
+
assert_equal true, result.flags[:before_all]
|
140
|
+
assert_equal true, result.flags[:before_list]
|
141
|
+
assert_equal true, result.flags[:before_list_and_potato]
|
142
|
+
assert_equal nil, result.flags[:before_other]
|
143
|
+
end
|
144
|
+
|
145
|
+
def test_result_can_be_expressed_as_a_hash
|
146
|
+
action = Moonrope::Action.new(@controller, :list) do
|
147
|
+
action { [1,2,3] }
|
148
|
+
end
|
149
|
+
assert result = action.execute
|
150
|
+
assert hash = result.to_hash
|
151
|
+
assert hash.is_a?(Hash), "result.to_hash does not return a hash"
|
152
|
+
assert_equal 'success', hash[:status]
|
153
|
+
assert hash[:time].is_a?(Float)
|
154
|
+
assert hash[:flags].is_a?(Hash)
|
155
|
+
end
|
156
|
+
|
157
|
+
def test_result_can_be_expressed_as_json
|
158
|
+
action = Moonrope::Action.new(@controller, :list) do
|
159
|
+
action { [1,2,3] }
|
160
|
+
end
|
161
|
+
assert result = action.execute
|
162
|
+
assert json = result.to_json
|
163
|
+
assert json.is_a?(String)
|
164
|
+
end
|
165
|
+
|
166
|
+
def test_that_param_validation_happens_on_executin
|
167
|
+
action = Moonrope::Action.new(@controller, :list) do
|
168
|
+
param :page, "Page number", :required => true
|
169
|
+
action { [1,2,3] }
|
170
|
+
end
|
171
|
+
assert result = action.execute
|
172
|
+
assert_equal 'parameter-error', result.status
|
173
|
+
end
|
174
|
+
|
175
|
+
def test_actions_params_can_be_validated_for_presence
|
176
|
+
action = Moonrope::Action.new(@controller, :list) do
|
177
|
+
param :page, "Page number", :required => true
|
178
|
+
end
|
179
|
+
|
180
|
+
# request without the param
|
181
|
+
assert_raises Moonrope::Errors::ParameterError do
|
182
|
+
action.validate_parameters(Moonrope::ParamSet.new)
|
183
|
+
end
|
184
|
+
|
185
|
+
# request with the param
|
186
|
+
assert_equal true, action.validate_parameters(Moonrope::ParamSet.new('page' => 1))
|
187
|
+
end
|
188
|
+
|
189
|
+
def test_actions_params_can_be_validated_for_type
|
190
|
+
action = Moonrope::Action.new(@controller, :list) do
|
191
|
+
param :page, "Page number", :type => Integer
|
192
|
+
end
|
193
|
+
|
194
|
+
# request with a string valuee
|
195
|
+
assert_raises Moonrope::Errors::ParameterError do
|
196
|
+
action.validate_parameters(Moonrope::ParamSet.new('page' => 'stringy'))
|
197
|
+
end
|
198
|
+
|
199
|
+
# request with an integer value
|
200
|
+
assert_equal true, action.validate_parameters(Moonrope::ParamSet.new('page' => 1))
|
201
|
+
|
202
|
+
# request with an nil value
|
203
|
+
assert_equal true, action.validate_parameters(Moonrope::ParamSet.new('page' => nil))
|
204
|
+
end
|
205
|
+
|
206
|
+
def test_actions_params_can_be_validated_for_boolean_types
|
207
|
+
action = Moonrope::Action.new(@controller, :list) do
|
208
|
+
param :hungry, "Are you hungry", :type => :boolean
|
209
|
+
end
|
210
|
+
|
211
|
+
# request with a string valuee
|
212
|
+
assert_raises Moonrope::Errors::ParameterError do
|
213
|
+
action.validate_parameters(Moonrope::ParamSet.new('hungry' => 'randomstring'))
|
214
|
+
end
|
215
|
+
|
216
|
+
assert_raises Moonrope::Errors::ParameterError do
|
217
|
+
action.validate_parameters(Moonrope::ParamSet.new('hungry' => 2))
|
218
|
+
end
|
219
|
+
|
220
|
+
assert_raises Moonrope::Errors::ParameterError do
|
221
|
+
action.validate_parameters(Moonrope::ParamSet.new('hungry' => 123))
|
222
|
+
end
|
223
|
+
|
224
|
+
# request with an boolean value
|
225
|
+
assert_equal true, action.validate_parameters(Moonrope::ParamSet.new('hungry' => true))
|
226
|
+
assert_equal true, action.validate_parameters(Moonrope::ParamSet.new('hungry' => false))
|
227
|
+
|
228
|
+
# request with string values
|
229
|
+
set = Moonrope::ParamSet.new('hungry' => 'true')
|
230
|
+
assert_equal true, action.validate_parameters(set)
|
231
|
+
assert_equal true, set.hungry
|
232
|
+
|
233
|
+
set = Moonrope::ParamSet.new('hungry' => 'false')
|
234
|
+
assert_equal true, action.validate_parameters(set)
|
235
|
+
assert_equal false, set.hungry
|
236
|
+
|
237
|
+
# request with an numeric values
|
238
|
+
assert_equal true, action.validate_parameters(Moonrope::ParamSet.new('hungry' => 1))
|
239
|
+
assert_equal true, action.validate_parameters(Moonrope::ParamSet.new('hungry' => 0))
|
240
|
+
|
241
|
+
# request with nil vlaues
|
242
|
+
assert_equal true, action.validate_parameters(Moonrope::ParamSet.new('hungry' => nil))
|
243
|
+
end
|
244
|
+
|
245
|
+
def test_actions_params_can_have_symbols_as_types_which_do_nothing
|
246
|
+
action = Moonrope::Action.new(@controller, :list) do
|
247
|
+
param :created_at, "Timestamp", :type => :timestamp
|
248
|
+
end
|
249
|
+
assert_equal true, action.validate_parameters(Moonrope::ParamSet.new('created_at' => 'something'))
|
250
|
+
assert_equal true, action.validate_parameters(Moonrope::ParamSet.new('created_at' => nil))
|
251
|
+
end
|
252
|
+
|
253
|
+
def test_actions_params_can_be_validated_for_regex_matches
|
254
|
+
action = Moonrope::Action.new(@controller, :list) do
|
255
|
+
param :username, "Username", :regex => /\A[a-z]+\z/
|
256
|
+
end
|
257
|
+
# request with a nil value
|
258
|
+
assert_equal true, action.validate_parameters(Moonrope::ParamSet.new)
|
259
|
+
|
260
|
+
# request with a matching value
|
261
|
+
assert_equal true, action.validate_parameters(Moonrope::ParamSet.new('username' => 'adam'))
|
262
|
+
|
263
|
+
# request with a string valuee
|
264
|
+
assert_raises Moonrope::Errors::ParameterError do
|
265
|
+
action.validate_parameters(Moonrope::ParamSet.new('username' => 'invalid-username1234'))
|
266
|
+
end
|
267
|
+
end
|
268
|
+
|
269
|
+
def test_actions_params_can_be_validated_for_option_matches
|
270
|
+
action = Moonrope::Action.new(@controller, :list) do
|
271
|
+
param :sort_by, :options => ["name", "age"]
|
272
|
+
end
|
273
|
+
# request with a nil value
|
274
|
+
assert_equal true, action.validate_parameters(Moonrope::ParamSet.new)
|
275
|
+
|
276
|
+
# request with a matching value
|
277
|
+
assert_equal true, action.validate_parameters(Moonrope::ParamSet.new('sort_by' => 'name'))
|
278
|
+
|
279
|
+
# request with a string valuee
|
280
|
+
assert_raises Moonrope::Errors::ParameterError do
|
281
|
+
action.validate_parameters(Moonrope::ParamSet.new('sort_by' => 'somethingelse'))
|
282
|
+
end
|
283
|
+
end
|
284
|
+
|
285
|
+
|
286
|
+
def test_actions_can_raise_errors
|
287
|
+
action = Moonrope::Action.new(@controller, :list) do
|
288
|
+
action do
|
289
|
+
error :not_found, "Something wasn't found"
|
290
|
+
end
|
291
|
+
end
|
292
|
+
assert result = action.execute
|
293
|
+
assert_equal "not-found", result.status
|
294
|
+
assert_equal({:message => "Something wasn't found"}, result.data)
|
295
|
+
end
|
296
|
+
|
297
|
+
def test_actions_can_raise_structured_errors
|
298
|
+
action = Moonrope::Action.new(@controller, :list) do
|
299
|
+
action do
|
300
|
+
structured_error 'feature-disabled', "The feature you have requested is not currently available for this resource.", :number => 1000
|
301
|
+
end
|
302
|
+
end
|
303
|
+
assert result = action.execute
|
304
|
+
assert_equal "error", result.status
|
305
|
+
assert_equal("feature-disabled", result.data[:code])
|
306
|
+
assert_equal("The feature you have requested is not currently available for this resource.", result.data[:message])
|
307
|
+
assert_equal(1000, result.data[:number])
|
308
|
+
end
|
309
|
+
|
310
|
+
def test_actions_can_raise_structured_errors_through_the_error_method
|
311
|
+
action = Moonrope::Action.new(@controller, :list) do
|
312
|
+
action do
|
313
|
+
error :structured_error, 'feature-disabled', "The feature you have requested is not currently available for this resource."
|
314
|
+
end
|
315
|
+
end
|
316
|
+
assert result = action.execute
|
317
|
+
assert_equal "error", result.status
|
318
|
+
assert_equal("feature-disabled", result.data[:code])
|
319
|
+
assert_equal("The feature you have requested is not currently available for this resource.", result.data[:message])
|
320
|
+
end
|
321
|
+
|
322
|
+
def test_actions_can_raise_structured_errors_through_the_error_method_using_a_string
|
323
|
+
action = Moonrope::Action.new(@controller, :list) do
|
324
|
+
action do
|
325
|
+
error 'feature-disabled', "The feature you have requested is not currently available for this resource."
|
326
|
+
end
|
327
|
+
end
|
328
|
+
assert result = action.execute
|
329
|
+
assert_equal "error", result.status
|
330
|
+
assert_equal("feature-disabled", result.data[:code])
|
331
|
+
assert_equal("The feature you have requested is not currently available for this resource.", result.data[:message])
|
332
|
+
end
|
333
|
+
|
334
|
+
def test_actions_can_raise_structured_errors_referencing_action_errors
|
335
|
+
action = Moonrope::Action.new(@controller, :list) do
|
336
|
+
error "NoWidgetsFound", "No widgets were found with level {widget_level}"
|
337
|
+
action do
|
338
|
+
error 'NoWidgetsFound', :widget_level => 42
|
339
|
+
end
|
340
|
+
end
|
341
|
+
assert result = action.execute
|
342
|
+
assert_equal "error", result.status
|
343
|
+
assert_equal "NoWidgetsFound", result.data[:code]
|
344
|
+
assert_equal "No widgets were found with level 42", result.data[:message]
|
345
|
+
assert_equal 42, result.data[:widget_level]
|
346
|
+
end
|
347
|
+
|
348
|
+
class DummyError < StandardError; end
|
349
|
+
|
350
|
+
def test_catching_external_errors
|
351
|
+
@controller.base.register_external_error DummyError do |exp, res|
|
352
|
+
res.status = 'dummy-error'
|
353
|
+
res.data = {:message => exp.message}
|
354
|
+
end
|
355
|
+
|
356
|
+
action = Moonrope::Action.new(@controller, :list) do
|
357
|
+
action do
|
358
|
+
raise DummyError, "Something happened"
|
359
|
+
end
|
360
|
+
end
|
361
|
+
|
362
|
+
assert result = action.execute
|
363
|
+
assert_equal 'dummy-error', result.status
|
364
|
+
assert_equal({:message => 'Something happened'}, result.data)
|
365
|
+
end
|
366
|
+
|
367
|
+
class DummyError2 < StandardError; end
|
368
|
+
|
369
|
+
def test_non_defined_errors_are_raised
|
370
|
+
action = Moonrope::Action.new(@controller, :list) do
|
371
|
+
action do
|
372
|
+
raise DummyError2, "Something happened"
|
373
|
+
end
|
374
|
+
end
|
375
|
+
assert_raises(DummyError2) { action.execute }
|
376
|
+
end
|
377
|
+
|
378
|
+
def test_can_change_full_attribute
|
379
|
+
# can't change when no ops
|
380
|
+
action = Moonrope::Action.new(@controller, :list) do
|
381
|
+
returns :hash, :structure => :animal
|
382
|
+
end
|
383
|
+
assert_equal(false, action.can_change_full?)
|
384
|
+
|
385
|
+
# can change when paramable is true
|
386
|
+
action = Moonrope::Action.new(@controller, :list) do
|
387
|
+
returns :hash, :structure => :animal, :structure_opts => {:paramable => true}
|
388
|
+
end
|
389
|
+
assert_equal(true, action.can_change_full?)
|
390
|
+
|
391
|
+
# can change when specified
|
392
|
+
action = Moonrope::Action.new(@controller, :list) do
|
393
|
+
returns :hash, :structure => :animal, :structure_opts => {:paramable => {:full => true}}
|
394
|
+
end
|
395
|
+
assert_equal(true, action.can_change_full?)
|
396
|
+
|
397
|
+
# can't change when not specified
|
398
|
+
action = Moonrope::Action.new(@controller, :list) do
|
399
|
+
returns :hash, :structure => :animal, :structure_opts => {:paramable => {}}
|
400
|
+
end
|
401
|
+
assert_equal(false, action.can_change_full?)
|
402
|
+
end
|
403
|
+
|
404
|
+
def test_includes_full_attributes
|
405
|
+
#not included by default
|
406
|
+
action = Moonrope::Action.new(@controller, :list) do
|
407
|
+
returns :hash, :structure => :animal
|
408
|
+
end
|
409
|
+
assert_equal(false, action.includes_full_attributes?)
|
410
|
+
|
411
|
+
# not included when paramable is just true
|
412
|
+
action = Moonrope::Action.new(@controller, :list) do
|
413
|
+
returns :hash, :structure => :animal, :structure_opts => {:paramable => true}
|
414
|
+
end
|
415
|
+
assert_equal(false, action.includes_full_attributes?)
|
416
|
+
|
417
|
+
# included when paramable sets the default to true
|
418
|
+
action = Moonrope::Action.new(@controller, :list) do
|
419
|
+
returns :hash, :structure => :animal, :structure_opts => {:paramable => {:full => true}}
|
420
|
+
end
|
421
|
+
assert_equal(true, action.includes_full_attributes?)
|
422
|
+
|
423
|
+
# included when it's full anyway
|
424
|
+
action = Moonrope::Action.new(@controller, :list) do
|
425
|
+
returns :hash, :structure => :animal, :structure_opts => {:full => true}
|
426
|
+
end
|
427
|
+
assert_equal(true, action.includes_full_attributes?)
|
428
|
+
end
|
429
|
+
|
430
|
+
|
431
|
+
def test_can_change_expansions_attribute
|
432
|
+
# can't change when no ops
|
433
|
+
action = Moonrope::Action.new(@controller, :list) do
|
434
|
+
returns :hash, :structure => :animal
|
435
|
+
end
|
436
|
+
assert_equal(false, action.can_change_expansions?)
|
437
|
+
|
438
|
+
# can change when paramable is true
|
439
|
+
action = Moonrope::Action.new(@controller, :list) do
|
440
|
+
returns :hash, :structure => :animal, :structure_opts => {:paramable => true}
|
441
|
+
end
|
442
|
+
assert_equal(true, action.can_change_expansions?)
|
443
|
+
|
444
|
+
# can change when specified
|
445
|
+
action = Moonrope::Action.new(@controller, :list) do
|
446
|
+
returns :hash, :structure => :animal, :structure_opts => {:paramable => {:expansions => true}}
|
447
|
+
end
|
448
|
+
assert_equal(true, action.can_change_expansions?)
|
449
|
+
|
450
|
+
# can't change when not specified
|
451
|
+
action = Moonrope::Action.new(@controller, :list) do
|
452
|
+
returns :hash, :structure => :animal, :structure_opts => {:paramable => {}}
|
453
|
+
end
|
454
|
+
assert_equal(false, action.can_change_expansions?)
|
455
|
+
end
|
456
|
+
|
457
|
+
def test_includes_expansion
|
458
|
+
#not included by default
|
459
|
+
action = Moonrope::Action.new(@controller, :list) do
|
460
|
+
returns :hash, :structure => :animal
|
461
|
+
end
|
462
|
+
assert_equal(false, action.includes_expansion?(:blah))
|
463
|
+
|
464
|
+
# not included when paramable is just true
|
465
|
+
action = Moonrope::Action.new(@controller, :list) do
|
466
|
+
returns :hash, :structure => :animal, :structure_opts => {:paramable => true}
|
467
|
+
end
|
468
|
+
assert_equal(false, action.includes_expansion?(:blah))
|
469
|
+
|
470
|
+
# included when paramable sets the default to true
|
471
|
+
action = Moonrope::Action.new(@controller, :list) do
|
472
|
+
returns :hash, :structure => :animal, :structure_opts => {:paramable => {:expansions => true}}
|
473
|
+
end
|
474
|
+
assert_equal(true, action.includes_expansion?(:blah))
|
475
|
+
|
476
|
+
# included when it's expansions anyway
|
477
|
+
action = Moonrope::Action.new(@controller, :list) do
|
478
|
+
returns :hash, :structure => :animal, :structure_opts => {:expansions => true}
|
479
|
+
end
|
480
|
+
assert_equal(true, action.includes_expansion?(:blah))
|
481
|
+
|
482
|
+
# included when expansions is an array
|
483
|
+
action = Moonrope::Action.new(@controller, :list) do
|
484
|
+
returns :hash, :structure => :animal, :structure_opts => {:expansions => [:blah]}
|
485
|
+
end
|
486
|
+
assert_equal(true, action.includes_expansion?(:blah))
|
487
|
+
assert_equal(false, action.includes_expansion?(:another))
|
488
|
+
|
489
|
+
# included when paramable expansions is an array
|
490
|
+
action = Moonrope::Action.new(@controller, :list) do
|
491
|
+
returns :hash, :structure => :animal, :structure_opts => {:paramable => {:expansions => [:blah]}}
|
492
|
+
end
|
493
|
+
assert_equal(true, action.includes_expansion?(:blah))
|
494
|
+
assert_equal(false, action.includes_expansion?(:another))
|
495
|
+
end
|
496
|
+
|
497
|
+
def test_available_expansions_array_on_actions
|
498
|
+
# if an array is provided, it should return the items in the array
|
499
|
+
action = Moonrope::Action.new(@controller, :list) do
|
500
|
+
returns :hash, :structure => :animal, :structure_opts => {:paramable => {:expansions => [:user]}}
|
501
|
+
end
|
502
|
+
assert_equal([:user], action.available_expansions)
|
503
|
+
end
|
504
|
+
|
505
|
+
def test_that_param_can_copy_data_from_structures
|
506
|
+
base = Moonrope::Base.new do
|
507
|
+
structure :user do
|
508
|
+
basic :username, "The username for the user", :type => String, :eg => 123
|
509
|
+
end
|
510
|
+
|
511
|
+
controller :users do
|
512
|
+
action :save do
|
513
|
+
param :username, :from_structure => :user
|
514
|
+
end
|
515
|
+
end
|
516
|
+
end
|
517
|
+
|
518
|
+
action = base/:users/:save
|
519
|
+
assert_equal "The username for the user", action.params[:username][:description]
|
520
|
+
assert_equal String, action.params[:username][:type]
|
521
|
+
end
|
522
|
+
|
523
|
+
|
524
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
class AuthenticatorsTest < Test::Unit::TestCase
|
2
|
+
|
3
|
+
def test_that_by_default_actions_dont_have_an_authenticator
|
4
|
+
base = Moonrope::Base.new do
|
5
|
+
controller :users do
|
6
|
+
action :list
|
7
|
+
end
|
8
|
+
end
|
9
|
+
assert_equal :none, (base/:users/:list).authenticator_to_use
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_actions_will_use_default_authenticator
|
13
|
+
base = Moonrope::Base.new do
|
14
|
+
authenticator :default do
|
15
|
+
lookup { true }
|
16
|
+
end
|
17
|
+
controller :users do
|
18
|
+
action :list
|
19
|
+
end
|
20
|
+
end
|
21
|
+
assert_equal :default, (base/:users/:list).authenticator_to_use.name
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_actions_will_use_controller_authenticator
|
25
|
+
base = Moonrope::Base.new do
|
26
|
+
authenticator :default
|
27
|
+
authenticator :controller_specific
|
28
|
+
authenticator :action_specific
|
29
|
+
controller :animals do
|
30
|
+
action :list
|
31
|
+
end
|
32
|
+
controller :users do
|
33
|
+
authenticator :controller_specific
|
34
|
+
action :list
|
35
|
+
action :show do
|
36
|
+
authenticator :action_specific
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
assert_equal :default, (base/:animals/:list).authenticator_to_use.name
|
41
|
+
assert_equal :controller_specific, (base/:users/:list).authenticator_to_use.name
|
42
|
+
assert_equal :action_specific, (base/:users/:show).authenticator_to_use.name
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_that_missing_authenticators_return_not_found
|
46
|
+
base = Moonrope::Base.new do
|
47
|
+
authenticator :default
|
48
|
+
controller :animals do
|
49
|
+
authenticator :missing
|
50
|
+
action :list
|
51
|
+
end
|
52
|
+
end
|
53
|
+
assert_equal :not_found, (base/:animals/:list).authenticator_to_use
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_authentication_can_be_defined_via_access_rule
|
57
|
+
base = Moonrope::Base.new do
|
58
|
+
authenticator :some_authenticator
|
59
|
+
controller :users do
|
60
|
+
action :list do
|
61
|
+
access_rule :some_authenticator => :some_rule
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
assert_equal :some_authenticator, (base/:users/:list).authenticator
|
66
|
+
assert_equal :some_rule, (base/:users/:list).access_rule
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_that_access_rules_can_inherit
|
70
|
+
base = Moonrope::Base.new do
|
71
|
+
controller :animals do
|
72
|
+
action :list
|
73
|
+
end
|
74
|
+
controller :users do
|
75
|
+
access_rule :controller_specific
|
76
|
+
action :list
|
77
|
+
action :show do
|
78
|
+
access_rule :action_specific
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
assert_equal :default, (base/:animals/:list).access_rule_to_use
|
83
|
+
assert_equal :controller_specific, (base/:users/:list).access_rule_to_use
|
84
|
+
assert_equal :action_specific, (base/:users/:show).access_rule_to_use
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
class ControllersTest < Test::Unit::TestCase
|
2
|
+
|
3
|
+
def test_basic_definitions
|
4
|
+
base = Moonrope::Base.new do
|
5
|
+
authenticator :default do
|
6
|
+
lookup { :person }
|
7
|
+
end
|
8
|
+
controller :users do
|
9
|
+
action :list
|
10
|
+
end
|
11
|
+
controller :animals
|
12
|
+
structure :user
|
13
|
+
structure :animal
|
14
|
+
end
|
15
|
+
|
16
|
+
# Check they are added to the base
|
17
|
+
assert_equal 2, base.controllers.size
|
18
|
+
assert_equal true, base.controllers.all? { |s| s.is_a?(Moonrope::Controller)}
|
19
|
+
assert_equal 2, base.structures.size
|
20
|
+
assert_equal true, base.structures.all? { |s| s.is_a?(Moonrope::Structure)}
|
21
|
+
assert_equal 1, base.authenticators.size
|
22
|
+
assert_equal true, base.authenticators.all? { |_,v| v.is_a?(Moonrope::Authenticator) }
|
23
|
+
|
24
|
+
# Check they can be accessed
|
25
|
+
assert_equal :users, base.controller(:users).name
|
26
|
+
assert_equal :animals, base.controller(:animals).name
|
27
|
+
assert_equal :user, base.structure(:user).name
|
28
|
+
assert_equal :animal, base.structure(:animal).name
|
29
|
+
|
30
|
+
# Check controllers & actions can be found nicely
|
31
|
+
assert_equal :list, (base / :users / :list).name
|
32
|
+
assert_equal :user, (base[:user]).name
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
class ControllersTest < Test::Unit::TestCase
|
2
|
+
|
3
|
+
def setup
|
4
|
+
@base = Moonrope::Base.new
|
5
|
+
end
|
6
|
+
|
7
|
+
def test_controllers_actions_can_be_found_easily
|
8
|
+
controller = Moonrope::Controller.new(@base, :users) do
|
9
|
+
action :list do
|
10
|
+
action { true }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
action = controller / :list
|
14
|
+
assert_equal :list, action.name
|
15
|
+
assert action.is_a?(Moonrope::Action)
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_controllers_can_have_before_filters
|
19
|
+
controller = Moonrope::Controller.new(@base, :users) do
|
20
|
+
before { 1 }
|
21
|
+
before(:list) { 3 }
|
22
|
+
action :list do
|
23
|
+
action { true }
|
24
|
+
end
|
25
|
+
|
26
|
+
action :show do
|
27
|
+
action { true }
|
28
|
+
end
|
29
|
+
end
|
30
|
+
assert_equal 2, controller.befores.size
|
31
|
+
assert_equal 2, controller.before_actions_for(:list).size
|
32
|
+
assert_equal 1, controller.before_actions_for(:show).size
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_definining_shared_params
|
36
|
+
controller = Moonrope::Controller.new(@base, :users) do
|
37
|
+
shared_action :crud do
|
38
|
+
param :username
|
39
|
+
param :first_name
|
40
|
+
error 'SomeError'
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
assert_equal(Hash, controller.shared_actions.class)
|
45
|
+
assert_equal(Proc, controller.shared_actions[:crud].class)
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|