79
80
@handler.process(@request, @response)
82
it "should call the 'do' method associated with the indirection method" do
83
request = stub 'request'
84
@handler.expects(:uri2indirection).returns request
86
request.expects(:method).returns "mymethod"
88
@handler.expects(:do_mymethod).with(request, @request, @response)
90
@handler.process(@request, @response)
93
it "should delegate authorization to the RestAuthorization layer" do
94
request = stub 'request'
95
@handler.expects(:uri2indirection).returns request
97
request.expects(:method).returns "mymethod"
99
@handler.expects(:do_mymethod).with(request, @request, @response)
101
@handler.expects(:check_authorization).with(request)
83
it "should call the 'do' method and delegate authorization to the RestAuthorization layer" do
84
@handler.expects(:uri2indirection).returns(["facts", :mymethod, "key", {:node => "name"}])
86
@handler.expects(:do_mymethod).with("facts", "key", {:node => "name"}, @request, @response)
88
@handler.expects(:check_authorization).with("facts", :mymethod, "key", {:node => "name"})
103
90
@handler.process(@request, @response)
106
93
it "should return 403 if the request is not authorized" do
107
request = stub 'request'
108
@handler.expects(:uri2indirection).returns request
94
@handler.expects(:uri2indirection).returns(["facts", :mymethod, "key", {:node => "name"}])
110
96
@handler.expects(:do_mymethod).never
112
@handler.expects(:check_authorization).with(request).raises(Puppet::Network::AuthorizationError.new("forbindden"))
98
@handler.expects(:check_authorization).with("facts", :mymethod, "key", {:node => "name"}).raises(Puppet::Network::AuthorizationError.new("forbidden"))
114
100
@handler.expects(:set_response).with { |response, body, status| status == 403 }
155
140
it "should use the indirection request to find the model class" do
156
@irequest.expects(:model).returns @model_class
158
@handler.do_find(@irequest, @request, @response)
141
@handler.do_find("my_handler", "my_result", {}, @request, @response)
161
144
it "should use the escaped request key" do
162
@model_class.expects(:find).with do |key, args|
145
@indirection.expects(:find).with do |key, args|
163
146
key == "my_result"
164
147
end.returns @result
165
@handler.do_find(@irequest, @request, @response)
148
@handler.do_find("my_handler", "my_result", {}, @request, @response)
168
151
it "should use a common method for determining the request parameters" do
169
@irequest.stubs(:to_hash).returns(:foo => :baz, :bar => :xyzzy)
170
@model_class.expects(:find).with do |key, args|
152
@indirection.expects(:find).with do |key, args|
171
153
args[:foo] == :baz and args[:bar] == :xyzzy
172
154
end.returns @result
173
@handler.do_find(@irequest, @request, @response)
155
@handler.do_find("my_handler", "my_result", {:foo => :baz, :bar => :xyzzy}, @request, @response)
176
158
it "should set the content type to the first format specified in the accept header" do
177
159
@handler.expects(:accept_header).with(@request).returns "one,two"
178
160
@handler.expects(:set_content_type).with(@response, @oneformat)
179
@handler.do_find(@irequest, @request, @response)
161
@handler.do_find("my_handler", "my_result", {}, @request, @response)
182
164
it "should fail if no accept header is provided" do
183
165
@handler.expects(:accept_header).with(@request).returns nil
184
lambda { @handler.do_find(@irequest, @request, @response) }.should raise_error(ArgumentError)
166
lambda { @handler.do_find("my_handler", "my_result", {}, @request, @response) }.should raise_error(ArgumentError)
187
169
it "should fail if the accept header does not contain a valid format" do
188
170
@handler.expects(:accept_header).with(@request).returns ""
189
lambda { @handler.do_find(@irequest, @request, @response) }.should raise_error(RuntimeError)
171
lambda { @handler.do_find("my_handler", "my_result", {}, @request, @response) }.should raise_error(RuntimeError)
192
174
it "should not use an unsuitable format" do
225
207
@model_instance.expects(:render).returns "my_rendered_object"
227
209
@handler.expects(:set_response).with { |response, body, status| body == "my_rendered_object" }
228
@model_class.stubs(:find).returns(@model_instance)
229
@handler.do_find(@irequest, @request, @response)
210
@indirection.stubs(:find).returns(@model_instance)
211
@handler.do_find("my_handler", "my_result", {}, @request, @response)
232
214
it "should return a 404 when no model instance can be found" do
233
215
@model_class.stubs(:name).returns "my name"
234
216
@handler.expects(:set_response).with { |response, body, status| status == 404 }
235
@model_class.stubs(:find).returns(nil)
236
@handler.do_find(@irequest, @request, @response)
217
@indirection.stubs(:find).returns(nil)
218
@handler.do_find("my_handler", "my_result", {}, @request, @response)
239
221
it "should write a log message when no model instance can be found" do
240
222
@model_class.stubs(:name).returns "my name"
241
@model_class.stubs(:find).returns(nil)
223
@indirection.stubs(:find).returns(nil)
243
225
Puppet.expects(:info).with("Could not find my_handler for 'my_result'")
245
@handler.do_find(@irequest, @request, @response)
227
@handler.do_find("my_handler", "my_result", {}, @request, @response)
252
234
@handler.expects(:format_to_use).returns(@oneformat)
253
235
@model_instance.expects(:render).with(@oneformat).returns "my_rendered_object"
254
@model_class.stubs(:find).returns(@model_instance)
255
@handler.do_find(@irequest, @request, @response)
236
@indirection.stubs(:find).returns(@model_instance)
237
@handler.do_find("my_handler", "my_result", {}, @request, @response)
259
241
describe "when performing head operation" do
261
@irequest = stub 'indirection_request', :method => :head, :indirection_name => "my_handler", :to_hash => {}, :key => "my_result", :model => @model_class
243
@handler.stubs(:model).with("my_handler").returns(stub 'model', :indirection => @model_class)
244
@handler.stubs(:http_method).with(@request).returns("HEAD")
245
@handler.stubs(:path).with(@request).returns("/production/my_handler/my_result")
246
@handler.stubs(:params).with(@request).returns({})
263
248
@model_class.stubs(:head).returns true
266
it "should use the indirection request to find the model class" do
267
@irequest.expects(:model).returns @model_class
269
@handler.do_head(@irequest, @request, @response)
272
251
it "should use the escaped request key" do
273
252
@model_class.expects(:head).with do |key, args|
274
253
key == "my_result"
276
@handler.do_head(@irequest, @request, @response)
255
@handler.process(@request, @response)
279
258
it "should not generate a response when a model head call succeeds" do
280
259
@handler.expects(:set_response).never
281
@handler.do_head(@irequest, @request, @response)
260
@handler.process(@request, @response)
284
263
it "should return a 404 when the model head call returns false" do
285
@model_class.stubs(:name).returns "my name"
286
264
@handler.expects(:set_response).with { |response, body, status| status == 404 }
287
265
@model_class.stubs(:head).returns(false)
288
@handler.do_head(@irequest, @request, @response)
266
@handler.process(@request, @response)
292
270
describe "when searching for model instances" do
294
@irequest = stub 'indirection_request', :method => :find, :indirection_name => "my_handler", :to_hash => {}, :key => "key", :model => @model_class
272
Puppet::Indirector::Indirection.expects(:instance).with(:my_handler).returns( stub "indirection", :model => @model_class )
296
274
@result1 = mock 'result1'
297
275
@result2 = mock 'results'
299
277
@result = [@result1, @result2]
300
278
@model_class.stubs(:render_multiple).returns "my rendered instances"
301
@model_class.stubs(:search).returns(@result)
279
@indirection.stubs(:search).returns(@result)
303
281
@format = stub 'format', :suitable? => true, :mime => "text/format", :name => "format"
304
282
Puppet::Network::FormatHandler.stubs(:format).returns @format
310
288
it "should use the indirection request to find the model" do
311
@irequest.expects(:model).returns @model_class
313
@handler.do_search(@irequest, @request, @response)
289
@handler.do_search("my_handler", "my_result", {}, @request, @response)
316
292
it "should use a common method for determining the request parameters" do
317
@irequest.stubs(:to_hash).returns(:foo => :baz, :bar => :xyzzy)
318
@model_class.expects(:search).with do |key, args|
293
@indirection.expects(:search).with do |key, args|
319
294
args[:foo] == :baz and args[:bar] == :xyzzy
320
295
end.returns @result
321
@handler.do_search(@irequest, @request, @response)
296
@handler.do_search("my_handler", "my_result", {:foo => :baz, :bar => :xyzzy}, @request, @response)
324
299
it "should use the default status when a model search call succeeds" do
325
@model_class.stubs(:search).returns(@result)
326
@handler.do_search(@irequest, @request, @response)
300
@indirection.stubs(:search).returns(@result)
301
@handler.do_search("my_handler", "my_result", {}, @request, @response)
329
304
it "should set the content type to the first format returned by the accept header" do
330
305
@handler.expects(:accept_header).with(@request).returns "one,two"
331
306
@handler.expects(:set_content_type).with(@response, @oneformat)
333
@handler.do_search(@irequest, @request, @response)
308
@handler.do_search("my_handler", "my_result", {}, @request, @response)
336
311
it "should return a list of serialized objects when a model search call succeeds" do
337
312
@handler.expects(:accept_header).with(@request).returns "one,two"
339
@model_class.stubs(:search).returns(@result)
314
@indirection.stubs(:search).returns(@result)
341
316
@model_class.expects(:render_multiple).with(@oneformat, @result).returns "my rendered instances"
343
318
@handler.expects(:set_response).with { |response, data| data == "my rendered instances" }
344
@handler.do_search(@irequest, @request, @response)
319
@handler.do_search("my_handler", "my_result", {}, @request, @response)
347
322
it "should return [] when searching returns an empty array" do
348
323
@handler.expects(:accept_header).with(@request).returns "one,two"
349
@model_class.stubs(:search).returns([])
324
@indirection.stubs(:search).returns([])
350
325
@model_class.expects(:render_multiple).with(@oneformat, []).returns "[]"
353
328
@handler.expects(:set_response).with { |response, data| data == "[]" }
354
@handler.do_search(@irequest, @request, @response)
329
@handler.do_search("my_handler", "my_result", {}, @request, @response)
357
332
it "should return a 404 when searching returns nil" do
358
333
@model_class.stubs(:name).returns "my name"
359
334
@handler.expects(:set_response).with { |response, body, status| status == 404 }
360
@model_class.stubs(:search).returns(nil)
361
@handler.do_search(@irequest, @request, @response)
335
@indirection.stubs(:search).returns(nil)
336
@handler.do_search("my_handler", "my_result", {}, @request, @response)
365
340
describe "when destroying a model instance" do
367
@irequest = stub 'indirection_request', :method => :destroy, :indirection_name => "my_handler", :to_hash => {}, :key => "key", :model => @model_class
342
Puppet::Indirector::Indirection.expects(:instance).with(:my_handler).returns( stub "indirection", :model => @model_class )
369
344
@result = stub 'result', :render => "the result"
370
@model_class.stubs(:destroy).returns @result
345
@indirection.stubs(:destroy).returns @result
373
348
it "should use the indirection request to find the model" do
374
@irequest.expects(:model).returns @model_class
376
@handler.do_destroy(@irequest, @request, @response)
349
@handler.do_destroy("my_handler", "my_result", {}, @request, @response)
379
352
it "should use the escaped request key to destroy the instance in the model" do
380
@irequest.expects(:key).returns "foo bar"
381
@model_class.expects(:destroy).with do |key, args|
353
@indirection.expects(:destroy).with do |key, args|
384
@handler.do_destroy(@irequest, @request, @response)
356
@handler.do_destroy("my_handler", "foo bar", {}, @request, @response)
387
359
it "should use a common method for determining the request parameters" do
388
@irequest.stubs(:to_hash).returns(:foo => :baz, :bar => :xyzzy)
389
@model_class.expects(:destroy).with do |key, args|
360
@indirection.expects(:destroy).with do |key, args|
390
361
args[:foo] == :baz and args[:bar] == :xyzzy
392
@handler.do_destroy(@irequest, @request, @response)
363
@handler.do_destroy("my_handler", "my_result", {:foo => :baz, :bar => :xyzzy}, @request, @response)
395
366
it "should use the default status code a model destroy call succeeds" do
396
367
@handler.expects(:set_response).with { |response, body, status| status.nil? }
397
@handler.do_destroy(@irequest, @request, @response)
368
@handler.do_destroy("my_handler", "my_result", {}, @request, @response)
400
371
it "should return a yaml-encoded result when a model destroy call succeeds" do
401
372
@result = stub 'result', :to_yaml => "the result"
402
@model_class.expects(:destroy).returns(@result)
373
@indirection.expects(:destroy).returns(@result)
404
375
@handler.expects(:set_response).with { |response, body, status| body == "the result" }
406
@handler.do_destroy(@irequest, @request, @response)
377
@handler.do_destroy("my_handler", "my_result", {}, @request, @response)
410
381
describe "when saving a model instance" do
412
@irequest = stub 'indirection_request', :method => :save, :indirection_name => "my_handler", :to_hash => {}, :key => "key", :model => @model_class
383
Puppet::Indirector::Indirection.stubs(:instance).with(:my_handler).returns( stub "indirection", :model => @model_class )
413
384
@handler.stubs(:body).returns('my stuff')
414
385
@handler.stubs(:content_type_header).returns("text/yaml")
416
387
@result = stub 'result', :render => "the result"
418
@model_instance = stub('indirected model instance', :save => true)
389
@model_instance = stub('indirected model instance')
419
390
@model_class.stubs(:convert_from).returns(@model_instance)
391
@indirection.stubs(:save)
421
393
@format = stub 'format', :suitable? => true, :name => "format", :mime => "text/format"
422
394
Puppet::Network::FormatHandler.stubs(:format).returns @format
427
399
it "should use the indirection request to find the model" do
428
@irequest.expects(:model).returns @model_class
430
@handler.do_save(@irequest, @request, @response)
400
@handler.do_save("my_handler", "my_result", {}, @request, @response)
433
403
it "should use the 'body' hook to retrieve the body of the request" do
434
404
@handler.expects(:body).returns "my body"
435
405
@model_class.expects(:convert_from).with { |format, body| body == "my body" }.returns @model_instance
437
@handler.do_save(@irequest, @request, @response)
407
@handler.do_save("my_handler", "my_result", {}, @request, @response)
440
410
it "should fail to save model if data is not specified" do
441
411
@handler.stubs(:body).returns('')
443
lambda { @handler.do_save(@irequest, @request, @response) }.should raise_error(ArgumentError)
413
lambda { @handler.do_save("my_handler", "my_result", {}, @request, @response) }.should raise_error(ArgumentError)
446
416
it "should use a common method for determining the request parameters" do
447
@model_instance.expects(:save).with('key').once
448
@handler.do_save(@irequest, @request, @response)
417
@indirection.expects(:save).with(@model_instance, 'key').once
418
@handler.do_save("my_handler", "key", {}, @request, @response)
451
421
it "should use the default status when a model save call succeeds" do
452
422
@handler.expects(:set_response).with { |response, body, status| status.nil? }
453
@handler.do_save(@irequest, @request, @response)
423
@handler.do_save("my_handler", "my_result", {}, @request, @response)
456
426
it "should return the yaml-serialized result when a model save call succeeds" do
457
@model_instance.stubs(:save).returns(@model_instance)
427
@indirection.stubs(:save).returns(@model_instance)
458
428
@model_instance.expects(:to_yaml).returns('foo')
459
@handler.do_save(@irequest, @request, @response)
429
@handler.do_save("my_handler", "my_result", {}, @request, @response)
462
432
it "should set the content to yaml" do
463
433
@handler.expects(:set_content_type).with(@response, @yamlformat)
464
@handler.do_save(@irequest, @request, @response)
434
@handler.do_save("my_handler", "my_result", {}, @request, @response)
467
437
it "should use the content-type header to know the body format" do