From b69fe8049830fed672f154241dddf85d71685aa1 Mon Sep 17 00:00:00 2001 From: Andrew Haines Date: Sun, 3 Mar 2013 10:34:56 +0000 Subject: [PATCH 1/6] Add reason for pending spec --- spec/dummy/spec/decorators/post_decorator_spec.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/dummy/spec/decorators/post_decorator_spec.rb b/spec/dummy/spec/decorators/post_decorator_spec.rb index e90011c..453d2d5 100755 --- a/spec/dummy/spec/decorators/post_decorator_spec.rb +++ b/spec/dummy/spec/decorators/post_decorator_spec.rb @@ -46,8 +46,8 @@ describe PostDecorator do end it "serializes to XML" do - # Rails < 3.2 does not use `serializable_hash` in `to_xml` - pending if Rails.version.to_f < 3.2 + pending("Rails < 3.2 does not use `serializable_hash` in `to_xml`") if Rails.version.to_f < 3.2 + xml = Capybara.string(decorator.to_xml) expect(xml).to have_css "post > updated-at", text: "overridden" end From 2de0592214a1e451e2afe1fa3a7213595daa0655 Mon Sep 17 00:00:00 2001 From: Andrew Haines Date: Sun, 3 Mar 2013 11:13:32 +0000 Subject: [PATCH 2/6] Add integration specs for Decoratable.decorate --- .../app/decorators/mongoid_post_decorator.rb | 2 ++ spec/dummy/spec/models/mongoid_post_spec.rb | 6 ++--- spec/dummy/spec/models/post_spec.rb | 12 ++-------- .../dummy/spec/shared_examples/decoratable.rb | 22 +++++++++++++++++++ 4 files changed, 28 insertions(+), 14 deletions(-) create mode 100644 spec/dummy/app/decorators/mongoid_post_decorator.rb create mode 100644 spec/dummy/spec/shared_examples/decoratable.rb diff --git a/spec/dummy/app/decorators/mongoid_post_decorator.rb b/spec/dummy/app/decorators/mongoid_post_decorator.rb new file mode 100644 index 0000000..61596e4 --- /dev/null +++ b/spec/dummy/app/decorators/mongoid_post_decorator.rb @@ -0,0 +1,2 @@ +class MongoidPostDecorator < Draper::Decorator +end diff --git a/spec/dummy/spec/models/mongoid_post_spec.rb b/spec/dummy/spec/models/mongoid_post_spec.rb index a5a35d0..1707bd1 100644 --- a/spec/dummy/spec/models/mongoid_post_spec.rb +++ b/spec/dummy/spec/models/mongoid_post_spec.rb @@ -1,10 +1,8 @@ require 'spec_helper' +require 'shared_examples/decoratable' if defined?(Mongoid) describe MongoidPost do - it "is decoratable" do - expect(MongoidPost).to respond_to :decorator_class - expect(MongoidPost.new).to respond_to :decorate - end + it_behaves_like "a decoratable model" end end diff --git a/spec/dummy/spec/models/post_spec.rb b/spec/dummy/spec/models/post_spec.rb index 4e7ef44..8bdd192 100644 --- a/spec/dummy/spec/models/post_spec.rb +++ b/spec/dummy/spec/models/post_spec.rb @@ -1,14 +1,6 @@ require 'spec_helper' +require 'shared_examples/decoratable' describe Post do - describe "#==" do - it "is true for other instances' decorators" do - Post.create - one = Post.first - other = Post.first - - expect(one).not_to be other - expect(one == other.decorate).to be_true - end - end + it_behaves_like "a decoratable model" end diff --git a/spec/dummy/spec/shared_examples/decoratable.rb b/spec/dummy/spec/shared_examples/decoratable.rb new file mode 100644 index 0000000..2c644bb --- /dev/null +++ b/spec/dummy/spec/shared_examples/decoratable.rb @@ -0,0 +1,22 @@ +shared_examples_for "a decoratable model" do + describe ".decorate" do + it "applies a collection decorator to a scope" do + described_class.create + decorated = described_class.limit(1).decorate + + expect(decorated).to have(1).items + expect(decorated).to be_decorated + end + end + + describe "#==" do + it "is true for other instances' decorators" do + described_class.create + one = described_class.first + other = described_class.first + + expect(one).not_to be other + expect(one == other.decorate).to be_true + end + end +end From 47ee29c3b739eee3fc28a561432ad2363c14813c Mon Sep 17 00:00:00 2001 From: Andrew Haines Date: Sun, 3 Mar 2013 11:14:18 +0000 Subject: [PATCH 3/6] Prevent deprecation warning in Rails 4.0 Use `all` instead of `scoped` if possible. Closes #484 --- lib/draper/decoratable.rb | 3 ++- spec/draper/decoratable_spec.rb | 6 ++++-- spec/spec_helper.rb | 1 + 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/draper/decoratable.rb b/lib/draper/decoratable.rb index da590c5..de74e39 100644 --- a/lib/draper/decoratable.rb +++ b/lib/draper/decoratable.rb @@ -53,7 +53,8 @@ module Draper # @param [Hash] options # see {Decorator.decorate_collection}. def decorate(options = {}) - decorator_class(options[:namespace]).decorate_collection(scoped, options.reverse_merge(with: nil)) + collection = Rails::VERSION::MAJOR >= 4 ? all : scoped + decorator_class(options[:namespace]).decorate_collection(collection, options.reverse_merge(with: nil)) end # Infers the decorator class to be used by {Decoratable#decorate} (e.g. diff --git a/spec/draper/decoratable_spec.rb b/spec/draper/decoratable_spec.rb index 2c8d463..67d0730 100644 --- a/spec/draper/decoratable_spec.rb +++ b/spec/draper/decoratable_spec.rb @@ -108,9 +108,11 @@ module Draper end describe ".decorate" do + let(:scoping_method) { Rails::VERSION::MAJOR >= 4 ? :all : :scoped } + it "calls #decorate_collection on .decorator_class" do scoped = [Product.new] - Product.stub scoped: scoped + Product.stub scoping_method => scoped Product.decorator_class.should_receive(:decorate_collection).with(scoped, with: nil).and_return(:decorated_collection) expect(Product.decorate).to be :decorated_collection @@ -118,7 +120,7 @@ module Draper it "accepts options" do options = {with: ProductDecorator, context: {some: "context"}} - Product.stub scoped: [] + Product.stub scoping_method => [] Product.decorator_class.should_receive(:decorate_collection).with([], options) Product.decorate(options) diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 4fa0fd1..db6510f 100755 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,5 +1,6 @@ require 'bundler/setup' require 'draper' +require 'rails/version' require 'action_controller' require 'action_controller/test_case' From b03c7e749ed11c6c2b5d64b50d5f0e1b0cc35f6e Mon Sep 17 00:00:00 2001 From: Andrew Haines Date: Sun, 3 Mar 2013 11:34:06 +0000 Subject: [PATCH 4/6] Add MongoDB to Travis --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index 196eba8..64a8dfd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,6 +3,9 @@ language: ruby before_install: - gem install bundler --pre +services: + - mongodb + rvm: - 1.9.3 - 2.0.0 From e3131da6cc2f99d9e922aec536371ef415e3810d Mon Sep 17 00:00:00 2001 From: Andrew Haines Date: Sun, 3 Mar 2013 11:51:46 +0000 Subject: [PATCH 5/6] Install bundler stable --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 64a8dfd..21aba45 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,7 @@ language: ruby before_install: - - gem install bundler --pre + - gem install bundler services: - mongodb From 9873c3358582ff85ae1d095cd5f46e8e5f486d56 Mon Sep 17 00:00:00 2001 From: Andrew Haines Date: Sun, 3 Mar 2013 12:06:38 +0000 Subject: [PATCH 6/6] Disable failing Decoratable#== spec on Mongoid 3.0 --- spec/dummy/spec/shared_examples/decoratable.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/spec/dummy/spec/shared_examples/decoratable.rb b/spec/dummy/spec/shared_examples/decoratable.rb index 2c644bb..a20b058 100644 --- a/spec/dummy/spec/shared_examples/decoratable.rb +++ b/spec/dummy/spec/shared_examples/decoratable.rb @@ -11,6 +11,8 @@ shared_examples_for "a decoratable model" do describe "#==" do it "is true for other instances' decorators" do + pending "Mongoid < 3.1 overrides `#==`" if defined?(Mongoid) && Mongoid::VERSION.to_f < 3.1 && described_class < Mongoid::Document + described_class.create one = described_class.first other = described_class.first