From 206e71ea3a3bb997dce4aa3e240c055323e9cbe1 Mon Sep 17 00:00:00 2001 From: Benjamin Fleischer Date: Wed, 31 Aug 2016 21:33:06 -0500 Subject: [PATCH 1/3] Add failing test for AMS::Model accessor vs. attributes mutation --- test/active_model_serializers/model_test.rb | 50 ++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/test/active_model_serializers/model_test.rb b/test/active_model_serializers/model_test.rb index 7bfb2edf4..de215e38f 100644 --- a/test/active_model_serializers/model_test.rb +++ b/test/active_model_serializers/model_test.rb @@ -4,7 +4,7 @@ module ActiveModelSerializers class ModelTest < ActiveSupport::TestCase include ActiveModel::Serializer::Lint::Tests - def setup + setup do @resource = ActiveModelSerializers::Model.new end @@ -18,5 +18,53 @@ def test_initialization_with_string_keys assert_equal model_instance.read_attribute_for_serialization(:key), value end + + def test_attributes_can_be_read_for_serialization + klass = Class.new(ActiveModelSerializers::Model) do + attr_accessor :one, :two, :three + end + original_attributes = { one: 1, two: 2, three: 3 } + instance = klass.new(original_attributes) + + # Initial value + expected_attributes = { one: 1, two: 2, three: 3 } + assert_equal expected_attributes, instance.attributes + assert_equal 1, instance.one + assert_equal 1, instance.read_attribute_for_serialization(:one) + + # Change via accessor + instance.one = :not_one + + expected_attributes = { one: :not_one, two: 2, three: 3 } + assert_equal expected_attributes, instance.attributes + assert_equal :not_one, instance.one + assert_equal :not_one, instance.read_attribute_for_serialization(:one) + end + + def test_id_attribute_can_be_read_for_serialization + klass = Class.new(ActiveModelSerializers::Model) do + attr_accessor :id, :one, :two, :three + end + self.class.const_set(:SomeTestModel, klass) + original_attributes = { id: :ego, one: 1, two: 2, three: 3 } + instance = klass.new(original_attributes) + + # Initial value + expected_attributes = { id: :ego, one: 1, two: 2, three: 3 } + assert_equal expected_attributes, instance.attributes + assert_equal 1, instance.one + assert_equal 1, instance.read_attribute_for_serialization(:one) + + # Change via accessor + instance.id = :superego + + expected_attributes = { id: :superego, one: 1, two: 2, three: 3 } + assert_equal expected_attributes, instance.attributes + assert_equal :superego, instance.id + assert_equal :superego, instance.read_attribute_for_serialization(:id) + ensure + self.class.send(:remove_const, :SomeTestModel) + end + end end From c91f3ff5147318e2f7f56626261495e3148cbec3 Mon Sep 17 00:00:00 2001 From: NullVoxPopuli Date: Fri, 23 Sep 2016 22:12:41 -0400 Subject: [PATCH 2/3] use send if the model responds_to the method, otherwise fallback to attributes hash --- Gemfile | 2 ++ lib/active_model_serializers/model.rb | 2 ++ test/active_model_serializers/model_test.rb | 7 ------- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/Gemfile b/Gemfile index 35557ef05..e29cdce03 100644 --- a/Gemfile +++ b/Gemfile @@ -50,4 +50,6 @@ end group :development, :test do gem 'rubocop', '~> 0.40.0', require: false gem 'yard', require: false + gem 'm' + gem 'pry-byebug' end diff --git a/lib/active_model_serializers/model.rb b/lib/active_model_serializers/model.rb index b9937cb5c..56e993341 100644 --- a/lib/active_model_serializers/model.rb +++ b/lib/active_model_serializers/model.rb @@ -30,6 +30,8 @@ def updated_at end def read_attribute_for_serialization(key) + return send(key) if respond_to?(key) + if key == :id || key == 'id' attributes.fetch(key) { id } else diff --git a/test/active_model_serializers/model_test.rb b/test/active_model_serializers/model_test.rb index de215e38f..b748af973 100644 --- a/test/active_model_serializers/model_test.rb +++ b/test/active_model_serializers/model_test.rb @@ -35,8 +35,6 @@ def test_attributes_can_be_read_for_serialization # Change via accessor instance.one = :not_one - expected_attributes = { one: :not_one, two: 2, three: 3 } - assert_equal expected_attributes, instance.attributes assert_equal :not_one, instance.one assert_equal :not_one, instance.read_attribute_for_serialization(:one) end @@ -50,21 +48,16 @@ def test_id_attribute_can_be_read_for_serialization instance = klass.new(original_attributes) # Initial value - expected_attributes = { id: :ego, one: 1, two: 2, three: 3 } - assert_equal expected_attributes, instance.attributes assert_equal 1, instance.one assert_equal 1, instance.read_attribute_for_serialization(:one) # Change via accessor instance.id = :superego - expected_attributes = { id: :superego, one: 1, two: 2, three: 3 } - assert_equal expected_attributes, instance.attributes assert_equal :superego, instance.id assert_equal :superego, instance.read_attribute_for_serialization(:id) ensure self.class.send(:remove_const, :SomeTestModel) end - end end From 9ddf0040b17f080ac8cb547c0759ca00934e279c Mon Sep 17 00:00:00 2001 From: "L. Preston Sego III" Date: Fri, 23 Sep 2016 22:41:00 -0400 Subject: [PATCH 3/3] remove testing gems --- Gemfile | 2 -- 1 file changed, 2 deletions(-) diff --git a/Gemfile b/Gemfile index e29cdce03..35557ef05 100644 --- a/Gemfile +++ b/Gemfile @@ -50,6 +50,4 @@ end group :development, :test do gem 'rubocop', '~> 0.40.0', require: false gem 'yard', require: false - gem 'm' - gem 'pry-byebug' end