draper 3.0.0.pre1 → 3.0.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.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +16 -0
  3. data/.github/PULL_REQUEST_TEMPLATE.md +24 -0
  4. data/.rubocop.yml +11 -0
  5. data/.travis.yml +3 -2
  6. data/CHANGELOG.md +20 -0
  7. data/Guardfile +5 -5
  8. data/README.md +27 -5
  9. data/Rakefile +1 -2
  10. data/draper.gemspec +1 -0
  11. data/lib/draper.rb +7 -2
  12. data/lib/draper/automatic_delegation.rb +5 -3
  13. data/lib/draper/collection_decorator.rb +1 -11
  14. data/lib/draper/compatibility/api_only.rb +23 -0
  15. data/lib/draper/configuration.rb +15 -0
  16. data/lib/draper/decoratable.rb +2 -2
  17. data/lib/draper/decorator.rb +4 -12
  18. data/lib/draper/finders.rb +0 -0
  19. data/lib/draper/helper_proxy.rb +1 -8
  20. data/lib/draper/railtie.rb +12 -13
  21. data/lib/draper/tasks/test.rake +1 -1
  22. data/lib/draper/test/devise_helper.rb +1 -8
  23. data/lib/draper/test/minitest_integration.rb +0 -0
  24. data/lib/draper/test/rspec_integration.rb +0 -0
  25. data/lib/draper/undecorate.rb +8 -0
  26. data/lib/draper/version.rb +1 -1
  27. data/lib/draper/view_context.rb +3 -19
  28. data/lib/draper/view_context/build_strategy.rb +11 -2
  29. data/lib/generators/controller_override.rb +2 -2
  30. data/lib/generators/draper/install_generator.rb +14 -0
  31. data/lib/generators/draper/templates/application_decorator.rb +8 -0
  32. data/lib/generators/mini_test/decorator_generator.rb +1 -1
  33. data/lib/generators/rails/decorator_generator.rb +1 -8
  34. data/lib/generators/rspec/templates/decorator_spec.rb +1 -1
  35. data/spec/draper/collection_decorator_spec.rb +11 -26
  36. data/spec/draper/configuration_spec.rb +25 -0
  37. data/spec/draper/decoratable_spec.rb +28 -13
  38. data/spec/draper/decorated_association_spec.rb +9 -9
  39. data/spec/draper/decorates_assigned_spec.rb +6 -6
  40. data/spec/draper/decorator_spec.rb +104 -89
  41. data/spec/draper/draper_spec.rb +24 -0
  42. data/spec/draper/factory_spec.rb +24 -24
  43. data/spec/draper/finders_spec.rb +21 -21
  44. data/spec/draper/helper_proxy_spec.rb +2 -2
  45. data/spec/draper/lazy_helpers_spec.rb +2 -2
  46. data/spec/draper/undecorate_chain_spec.rb +20 -0
  47. data/spec/draper/view_context/build_strategy_spec.rb +26 -10
  48. data/spec/draper/view_context_spec.rb +49 -21
  49. data/spec/dummy/app/controllers/base_controller.rb +4 -0
  50. data/spec/dummy/app/controllers/posts_controller.rb +2 -2
  51. data/spec/dummy/app/decorators/post_decorator.rb +0 -0
  52. data/spec/dummy/config/boot.rb +1 -1
  53. data/spec/dummy/config/initializers/draper.rb +3 -0
  54. data/spec/dummy/db/schema.rb +4 -4
  55. data/spec/dummy/fast_spec/post_decorator_spec.rb +1 -1
  56. data/spec/dummy/lib/tasks/test.rake +1 -1
  57. data/spec/dummy/spec/decorators/devise_spec.rb +0 -9
  58. data/spec/dummy/spec/decorators/post_decorator_spec.rb +2 -2
  59. data/spec/dummy/test/decorators/minitest/devise_test.rb +0 -9
  60. data/spec/dummy/test/decorators/minitest/view_context_test.rb +3 -3
  61. data/spec/dummy/test/decorators/test_unit/devise_test.rb +0 -9
  62. data/spec/generators/controller/controller_generator_spec.rb +3 -3
  63. data/spec/generators/decorator/decorator_generator_spec.rb +11 -10
  64. data/spec/generators/install/install_generator_spec.rb +19 -0
  65. data/spec/spec_helper.rb +4 -3
  66. data/spec/support/shared_examples/view_helpers.rb +8 -8
  67. metadata +38 -7
  68. data/spec/dummy/app/controllers/application_controller.rb +0 -4
@@ -28,14 +28,14 @@ module Draper
28
28
  end
29
29
 
30
30
  it "creates a factory" do
31
- Factory.should_receive(:new).once
31
+ allow(Factory).to receive(:new).once
32
32
  controller_class.decorates_assigned :article, :author
33
33
  end
34
34
 
35
35
  it "passes options to the factory" do
36
36
  options = {foo: "bar"}
37
37
 
38
- Factory.should_receive(:new).with(options)
38
+ allow(Factory).to receive(:new).with(options)
39
39
  controller_class.decorates_assigned :article, :author, options
40
40
  end
41
41
 
@@ -43,24 +43,24 @@ module Draper
43
43
  it "decorates the instance variable" do
44
44
  object = double
45
45
  factory = double
46
- Factory.stub new: factory
46
+ allow(Factory).to receive_messages(new: factory)
47
47
 
48
48
  controller_class.decorates_assigned :article
49
49
  controller = controller_class.new
50
50
  controller.instance_variable_set "@article", object
51
51
 
52
- factory.should_receive(:decorate).with(object, context_args: controller).and_return(:decorated)
52
+ expect(factory).to receive(:decorate).with(object, context_args: controller).and_return(:decorated)
53
53
  expect(controller.article).to be :decorated
54
54
  end
55
55
 
56
56
  it "memoizes" do
57
57
  factory = double
58
- Factory.stub new: factory
58
+ allow(Factory).to receive_messages(new: factory)
59
59
 
60
60
  controller_class.decorates_assigned :article
61
61
  controller = controller_class.new
62
62
 
63
- factory.should_receive(:decorate).once
63
+ expect(factory).to receive(:decorate).once
64
64
  controller.article
65
65
  controller.article
66
66
  end
@@ -73,7 +73,7 @@ module Draper
73
73
  decorated = OtherDecorator.new(Decorator.new(Model.new))
74
74
 
75
75
  warning_message = nil
76
- Object.any_instance.stub(:warn) { |instance, message| warning_message = message }
76
+ allow_any_instance_of(Object).to receive(:warn) { |instance, message| warning_message = message }
77
77
 
78
78
  expect{Decorator.new(decorated)}.to change{warning_message}
79
79
  expect(warning_message).to start_with "Reapplying Draper::Decorator"
@@ -82,7 +82,7 @@ module Draper
82
82
 
83
83
  it "decorates anyway" do
84
84
  decorated = OtherDecorator.new(Decorator.new(Model.new))
85
- Object.any_instance.stub(:warn)
85
+ allow_any_instance_of(Object).to receive(:warn)
86
86
  redecorated = Decorator.decorate(decorated)
87
87
 
88
88
  expect(redecorated.object).to be decorated
@@ -102,7 +102,7 @@ module Draper
102
102
 
103
103
  describe ".decorate_collection" do
104
104
  describe "options validation" do
105
- before { CollectionDecorator.stub(:new) }
105
+ before { allow(CollectionDecorator).to receive(:new) }
106
106
 
107
107
  it "does not raise error on valid options" do
108
108
  valid_options = {with: OtherDecorator, context: {}}
@@ -118,14 +118,14 @@ module Draper
118
118
  it "creates a CollectionDecorator using itself for each item" do
119
119
  object = [Model.new]
120
120
 
121
- CollectionDecorator.should_receive(:new).with(object, with: Decorator)
121
+ expect(CollectionDecorator).to receive(:new).with(object, with: Decorator)
122
122
  Decorator.decorate_collection(object)
123
123
  end
124
124
 
125
125
  it "passes options to the collection decorator" do
126
126
  options = {with: OtherDecorator, context: {some: "context"}}
127
127
 
128
- CollectionDecorator.should_receive(:new).with([], options)
128
+ expect(CollectionDecorator).to receive(:new).with([], options)
129
129
  Decorator.decorate_collection([], options)
130
130
  end
131
131
  end
@@ -134,24 +134,17 @@ module Draper
134
134
  it "creates a custom collection decorator using itself for each item" do
135
135
  object = [Model.new]
136
136
 
137
- ProductsDecorator.should_receive(:new).with(object, with: ProductDecorator)
137
+ expect(ProductsDecorator).to receive(:new).with(object, with: ProductDecorator)
138
138
  ProductDecorator.decorate_collection(object)
139
139
  end
140
140
 
141
141
  it "passes options to the collection decorator" do
142
142
  options = {with: OtherDecorator, context: {some: "context"}}
143
143
 
144
- ProductsDecorator.should_receive(:new).with([], options)
144
+ expect(ProductsDecorator).to receive(:new).with([], options)
145
145
  ProductDecorator.decorate_collection([], options)
146
146
  end
147
147
  end
148
-
149
- context "when a NameError is thrown" do
150
- it "re-raises that error" do
151
- String.any_instance.stub(:constantize) { Draper::DecoratedEnumerableProxy }
152
- expect{ProductDecorator.decorate_collection([])}.to raise_error NameError, /Draper::DecoratedEnumerableProxy/
153
- end
154
- end
155
148
  end
156
149
 
157
150
  describe ".decorates" do
@@ -181,61 +174,67 @@ module Draper
181
174
  protect_class Namespaced::ProductDecorator
182
175
 
183
176
  context "when not set by .decorates" do
184
- it "raises an UninferrableSourceError for a so-named 'Decorator'" do
185
- expect{Decorator.object_class}.to raise_error UninferrableSourceError
177
+ it "raises an UninferrableObjectError for a so-named 'Decorator'" do
178
+ expect{Decorator.object_class}.to raise_error UninferrableObjectError
186
179
  end
187
180
 
188
- it "raises an UninferrableSourceError for anonymous decorators" do
189
- expect{Class.new(Decorator).object_class}.to raise_error UninferrableSourceError
181
+ it "raises an UninferrableObjectError for anonymous decorators" do
182
+ expect{Class.new(Decorator).object_class}.to raise_error UninferrableObjectError
190
183
  end
191
184
 
192
- it "raises an UninferrableSourceError for a decorator without a model" do
193
- skip
194
- expect{OtherDecorator.object_class}.to raise_error UninferrableSourceError
185
+ it "raises an UninferrableObjectError for a decorator without a model" do
186
+ SomeDecorator = Class.new(Draper::Decorator)
187
+ expect{SomeDecorator.object_class}.to raise_error UninferrableObjectError
195
188
  end
196
189
 
197
- it "raises an UninferrableSourceError for other naming conventions" do
198
- expect{ProductPresenter.object_class}.to raise_error UninferrableSourceError
190
+ it "raises an UninferrableObjectError for other naming conventions" do
191
+ ProductPresenter = Class.new(Draper::Decorator)
192
+ expect{ProductPresenter.object_class}.to raise_error UninferrableObjectError
199
193
  end
200
194
 
201
- it "infers the source for '<Model>Decorator'" do
195
+ it "infers the object class for '<Model>Decorator'" do
202
196
  expect(ProductDecorator.object_class).to be Product
203
197
  end
204
198
 
205
- it "infers namespaced sources" do
199
+ it "infers the object class for namespaced decorators" do
206
200
  expect(Namespaced::ProductDecorator.object_class).to be Namespaced::Product
207
201
  end
208
202
 
209
203
  context "when an unrelated NameError is thrown" do
210
204
  it "re-raises that error" do
211
- String.any_instance.stub(:constantize) { SomethingThatDoesntExist }
205
+ allow_any_instance_of(String).to receive(:constantize) { SomethingThatDoesntExist }
212
206
  expect{ProductDecorator.object_class}.to raise_error NameError, /SomethingThatDoesntExist/
213
207
  end
214
208
  end
215
209
  end
216
-
217
- it "is aliased to .source_class" do
218
- expect(ProductDecorator.source_class).to be Product
219
- end
220
210
  end
221
211
 
222
212
  describe ".object_class?" do
223
213
  it "returns truthy when .object_class is set" do
224
- Decorator.stub(:object_class).and_return(Model)
214
+ allow(Decorator).to receive(:object_class).and_return(Model)
225
215
 
226
216
  expect(Decorator.object_class?).to be_truthy
227
217
  end
228
218
 
229
219
  it "returns false when .object_class is not inferrable" do
230
- Decorator.stub(:object_class).and_raise(UninferrableSourceError.new(Decorator))
220
+ allow(Decorator).to receive(:object_class).and_raise(UninferrableObjectError.new(Decorator))
231
221
 
232
222
  expect(Decorator.object_class?).to be_falsey
233
223
  end
224
+ end
225
+
226
+ describe '.collection_decorator_class' do
227
+ it 'defaults to CollectionDecorator' do
228
+ allow_any_instance_of(String).to receive(:constantize) { SomethingThatDoesntExist }
229
+ expect(ProductDecorator.collection_decorator_class).to be Draper::CollectionDecorator
230
+ end
234
231
 
235
- it "is aliased to .source_class?" do
236
- Decorator.stub(:object_class).and_return(Model)
232
+ it 'infers collection decorator based on name' do
233
+ expect(ProductDecorator.collection_decorator_class).to be ProductsDecorator
234
+ end
237
235
 
238
- expect(Decorator.source_class?).to be_truthy
236
+ it 'infers collection decorator base on name for namespeced model' do
237
+ expect(Namespaced::ProductDecorator.collection_decorator_class).to be Namespaced::ProductsDecorator
239
238
  end
240
239
  end
241
240
 
@@ -243,7 +242,7 @@ module Draper
243
242
  protect_class Decorator
244
243
 
245
244
  describe "options validation" do
246
- before { DecoratedAssociation.stub(:new).and_return(->{}) }
245
+ before { allow(DecoratedAssociation).to receive(:new).and_return(->{}) }
247
246
 
248
247
  it "does not raise error on valid options" do
249
248
  valid_options = {with: Class, scope: :sorted, context: {}}
@@ -261,7 +260,7 @@ module Draper
261
260
  Decorator.decorates_association :children, options
262
261
  decorator = Decorator.new(Model.new)
263
262
 
264
- DecoratedAssociation.should_receive(:new).with(decorator, :children, options).and_return(->{})
263
+ expect(DecoratedAssociation).to receive(:new).with(decorator, :children, options).and_return(->{})
265
264
  decorator.children
266
265
  end
267
266
 
@@ -269,7 +268,7 @@ module Draper
269
268
  Decorator.decorates_association :children
270
269
  decorator = Decorator.new(Model.new)
271
270
 
272
- DecoratedAssociation.should_receive(:new).once.and_return(->{})
271
+ expect(DecoratedAssociation).to receive(:new).once.and_return(->{})
273
272
  decorator.children
274
273
  decorator.children
275
274
  end
@@ -278,9 +277,9 @@ module Draper
278
277
  Decorator.decorates_association :children
279
278
  decorator = Decorator.new(Model.new)
280
279
  decorated_association = ->{}
281
- DecoratedAssociation.stub(:new).and_return(decorated_association)
280
+ allow(DecoratedAssociation).to receive(:new).and_return(decorated_association)
282
281
 
283
- decorated_association.should_receive(:call).and_return(:decorated)
282
+ expect(decorated_association).to receive(:call).and_return(:decorated)
284
283
  expect(decorator.children).to be :decorated
285
284
  end
286
285
  end
@@ -290,16 +289,16 @@ module Draper
290
289
  protect_class Decorator
291
290
 
292
291
  it "decorates each of the associations" do
293
- Decorator.should_receive(:decorates_association).with(:friends, {})
294
- Decorator.should_receive(:decorates_association).with(:enemies, {})
292
+ expect(Decorator).to receive(:decorates_association).with(:friends, {})
293
+ expect(Decorator).to receive(:decorates_association).with(:enemies, {})
295
294
  Decorator.decorates_associations :friends, :enemies
296
295
  end
297
296
 
298
297
  it "dispatches options" do
299
298
  options = {with: Class.new, scope: :foo, context: {}}
300
299
 
301
- Decorator.should_receive(:decorates_association).with(:friends, options)
302
- Decorator.should_receive(:decorates_association).with(:enemies, options)
300
+ expect(Decorator).to receive(:decorates_association).with(:friends, options)
301
+ expect(Decorator).to receive(:decorates_association).with(:enemies, options)
303
302
  Decorator.decorates_associations :friends, :enemies, options
304
303
  end
305
304
  end
@@ -337,7 +336,6 @@ module Draper
337
336
 
338
337
  expect(decorator.object).to be object
339
338
  expect(decorator.model).to be object
340
- expect(decorator.to_source).to be object
341
339
  end
342
340
 
343
341
  it "is aliased to #model" do
@@ -346,20 +344,6 @@ module Draper
346
344
 
347
345
  expect(decorator.model).to be object
348
346
  end
349
-
350
- it "is aliased to #source" do
351
- object = Model.new
352
- decorator = Decorator.new(object)
353
-
354
- expect(decorator.source).to be object
355
- end
356
-
357
- it "is aliased to #to_source" do
358
- object = Model.new
359
- decorator = Decorator.new(object)
360
-
361
- expect(decorator.to_source).to be object
362
- end
363
347
  end
364
348
 
365
349
  describe "aliasing object to object class name" do
@@ -480,15 +464,15 @@ module Draper
480
464
  describe "#attributes" do
481
465
  it "returns only the object's attributes that are implemented by the decorator" do
482
466
  decorator = Decorator.new(double(attributes: {foo: "bar", baz: "qux"}))
483
- decorator.stub(:foo)
467
+ allow(decorator).to receive(:foo)
484
468
 
485
469
  expect(decorator.attributes).to eq({foo: "bar"})
486
470
  end
487
471
  end
488
472
 
489
473
  describe ".model_name" do
490
- it "delegates to the source class" do
491
- Decorator.stub object_class: double(model_name: :delegated)
474
+ it "delegates to the object class" do
475
+ allow(Decorator).to receive(:object_class).and_return(double(model_name: :delegated))
492
476
 
493
477
  expect(Decorator.model_name).to be :delegated
494
478
  end
@@ -514,7 +498,7 @@ module Draper
514
498
  decorator = Decorator.new(object)
515
499
  other = double(object: Model.new)
516
500
 
517
- object.should_receive(:==).with(other).and_return(true)
501
+ expect(object).to receive(:==).with(other).and_return(true)
518
502
  expect(decorator == other).to be_truthy
519
503
  end
520
504
 
@@ -523,7 +507,7 @@ module Draper
523
507
  decorator = Decorator.new(object)
524
508
  other = double(object: Model.new)
525
509
 
526
- object.should_receive(:==).with(other).and_return(false)
510
+ expect(object).to receive(:==).with(other).and_return(false)
527
511
  expect(decorator == other).to be_falsey
528
512
  end
529
513
  end
@@ -538,7 +522,7 @@ module Draper
538
522
 
539
523
  it "is false when #== is false" do
540
524
  decorator = Decorator.new(Model.new)
541
- decorator.stub(:==).with(:anything).and_return(false)
525
+ allow(decorator).to receive(:==).with(:anything).and_return(false)
542
526
 
543
527
  expect(decorator === :anything).to be_falsey
544
528
  end
@@ -574,12 +558,12 @@ module Draper
574
558
  protect_class Decorator
575
559
 
576
560
  it "defaults the :to option to :object" do
577
- Object.should_receive(:delegate).with(:foo, :bar, to: :object)
561
+ expect(Object).to receive(:delegate).with(:foo, :bar, to: :object)
578
562
  Decorator.delegate :foo, :bar
579
563
  end
580
564
 
581
565
  it "does not overwrite the :to option if supplied" do
582
- Object.should_receive(:delegate).with(:foo, :bar, to: :baz)
566
+ expect(Object).to receive(:delegate).with(:foo, :bar, to: :baz)
583
567
  Decorator.delegate :foo, :bar, to: :baz
584
568
  end
585
569
  end
@@ -596,12 +580,43 @@ module Draper
596
580
  expect(decorator.hello_world).to be :delegated
597
581
  end
598
582
 
599
- it "adds delegated methods to the decorator when they are used" do
600
- decorator = Decorator.new(double(hello_world: :delegated))
583
+ it 'delegates `super` to parent class first' do
584
+ parent_decorator_class = Class.new(Decorator) do
585
+ def hello_world
586
+ "parent#hello_world"
587
+ end
588
+ end
601
589
 
602
- expect(decorator.methods).not_to include :hello_world
603
- decorator.hello_world
604
- expect(decorator.methods).to include :hello_world
590
+ child_decorator_class = Class.new(parent_decorator_class) do
591
+ def hello_world
592
+ super
593
+ end
594
+ end
595
+
596
+ decorator = child_decorator_class.new(double(hello_world: 'object#hello_world'))
597
+ expect(decorator.hello_world).to eq 'parent#hello_world'
598
+ end
599
+
600
+ it 'delegates `super` to object if method does not exist on parent class' do
601
+ decorator_class = Class.new(Decorator) do
602
+ def hello_world
603
+ super
604
+ end
605
+ end
606
+
607
+ decorator = decorator_class.new(double(hello_world: 'object#hello_world'))
608
+ expect(decorator.hello_world).to eq 'object#hello_world'
609
+ end
610
+
611
+ it 'raises `NoMethodError` when `super` is called on for method that does not exist' do
612
+ decorator_class = Class.new(Decorator) do
613
+ def hello_world
614
+ super
615
+ end
616
+ end
617
+
618
+ decorator = decorator_class.new(double)
619
+ expect{decorator.hello_world}.to raise_error NoMethodError
605
620
  end
606
621
 
607
622
  it "allows decorator to decorate different classes of objects" do
@@ -614,7 +629,7 @@ module Draper
614
629
 
615
630
  it "passes blocks to delegated methods" do
616
631
  object = Model.new
617
- object.stub(:hello_world) { |*args, &block| block.call }
632
+ allow(object).to receive(:hello_world) { |*args, &block| block.call }
618
633
  decorator = Decorator.new(object)
619
634
 
620
635
  expect(decorator.hello_world{:yielded}).to be :yielded
@@ -628,7 +643,7 @@ module Draper
628
643
 
629
644
  it "delegates already-delegated methods" do
630
645
  object = Class.new{ delegate :bar, to: :foo }.new
631
- object.stub foo: double(bar: :delegated)
646
+ allow(object).to receive_messages foo: double(bar: :delegated)
632
647
  decorator = Decorator.new(object)
633
648
 
634
649
  expect(decorator.bar).to be :delegated
@@ -651,23 +666,23 @@ module Draper
651
666
  end
652
667
 
653
668
  context ".method_missing" do
654
- context "without a source class" do
669
+ context "without an object class" do
655
670
  it "raises a NoMethodError on missing methods" do
656
671
  expect{Decorator.hello_world}.to raise_error NoMethodError
657
672
  end
658
673
  end
659
674
 
660
- context "with a source class" do
661
- it "delegates methods that exist on the source class" do
675
+ context "with an object class" do
676
+ it "delegates methods that exist on the object class" do
662
677
  object_class = Class.new
663
- object_class.stub hello_world: :delegated
664
- Decorator.stub object_class: object_class
678
+ allow(object_class).to receive_messages hello_world: :delegated
679
+ allow(Decorator).to receive_messages object_class: object_class
665
680
 
666
681
  expect(Decorator.hello_world).to be :delegated
667
682
  end
668
683
 
669
- it "does not delegate methods that do not exist on the source class" do
670
- Decorator.stub object_class: Class.new
684
+ it "does not delegate methods that do not exist on the object class" do
685
+ allow(Decorator).to receive_messages object_class: Class.new
671
686
 
672
687
  expect{Decorator.hello_world}.to raise_error NoMethodError
673
688
  end
@@ -706,7 +721,7 @@ module Draper
706
721
  end
707
722
 
708
723
  describe ".respond_to?" do
709
- context "without a source class" do
724
+ context "without a object class" do
710
725
  it "returns true for its own class methods" do
711
726
  Decorator.class_eval{def self.hello_world; end}
712
727
 
@@ -718,16 +733,16 @@ module Draper
718
733
  end
719
734
  end
720
735
 
721
- context "with a source class" do
736
+ context "with a object class" do
722
737
  it "returns true for its own class methods" do
723
738
  Decorator.class_eval{def self.hello_world; end}
724
- Decorator.stub object_class: Class.new
739
+ allow(Decorator).to receive_messages object_class: Class.new
725
740
 
726
741
  expect(Decorator).to respond_to :hello_world
727
742
  end
728
743
 
729
- it "returns true for the source's class methods" do
730
- Decorator.stub object_class: double(hello_world: :delegated)
744
+ it "returns true for the object's class methods" do
745
+ allow(Decorator).to receive_messages object_class: double(hello_world: :delegated)
731
746
 
732
747
  expect(Decorator).to respond_to :hello_world
733
748
  end
@@ -745,7 +760,7 @@ module Draper
745
760
 
746
761
  describe ".respond_to_missing?" do
747
762
  it "allows .method to be called on delegated class methods" do
748
- Decorator.stub object_class: double(hello_world: :delegated)
763
+ allow(Decorator).to receive_messages object_class: double(hello_world: :delegated)
749
764
 
750
765
  expect(Decorator.method(:hello_world)).not_to be_nil
751
766
  end
@@ -753,7 +768,7 @@ module Draper
753
768
  end
754
769
 
755
770
  describe "class spoofing" do
756
- it "pretends to be a kind of the source class" do
771
+ it "pretends to be a kind of the object class" do
757
772
  decorator = Decorator.new(Model.new)
758
773
 
759
774
  expect(decorator.kind_of?(Model)).to be_truthy
@@ -767,7 +782,7 @@ module Draper
767
782
  expect(decorator.is_a?(Decorator)).to be_truthy
768
783
  end
769
784
 
770
- it "pretends to be an instance of the source class" do
785
+ it "pretends to be an instance of the object class" do
771
786
  decorator = Decorator.new(Model.new)
772
787
 
773
788
  expect(decorator.instance_of?(Model)).to be_truthy