From de9224b67cc5ebc9a458d5d4f28d882510f3c219 Mon Sep 17 00:00:00 2001 From: Doug Hammond Date: Sun, 27 Sep 2015 18:52:08 +0200 Subject: [PATCH] + Virtus::Attribute::Collection.value_coerced? Added override of `Virtus::Attribute.value_coerced?` to `Virtus::Attribute::Collection`, which checks collection members against the expected member type. Prevents e.g. `Virtus::Attribute.build(Array[Integer]).value_coerced? %w{1 2 3}` from returning `true`. --- lib/virtus/attribute/collection.rb | 5 +++ .../value_coerced_predicate_spec.rb | 31 +++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 spec/unit/virtus/attribute/collection/value_coerced_predicate_spec.rb diff --git a/lib/virtus/attribute/collection.rb b/lib/virtus/attribute/collection.rb index 1b3a20b6..7e960ed9 100644 --- a/lib/virtus/attribute/collection.rb +++ b/lib/virtus/attribute/collection.rb @@ -80,6 +80,11 @@ def coerce(value) end end + # @api public + def value_coerced?(value) + super && value.all? { |item| member_type.value_coerced? item } + end + # @api private def finalize return self if finalized? diff --git a/spec/unit/virtus/attribute/collection/value_coerced_predicate_spec.rb b/spec/unit/virtus/attribute/collection/value_coerced_predicate_spec.rb new file mode 100644 index 00000000..9bf771b9 --- /dev/null +++ b/spec/unit/virtus/attribute/collection/value_coerced_predicate_spec.rb @@ -0,0 +1,31 @@ +require 'spec_helper' +require 'set' + +describe Virtus::Attribute::Collection, '#value_coerced?' do + subject { object.value_coerced?(input) } + + let(:object) { described_class.build(Array[Integer]) } + + context 'when input has correctly typed members' do + let(:input) { [1, 2, 3] } + + it { is_expected.to be(true) } + end + + context 'when input has incorrectly typed members' do + let(:input) { [1, 2, '3'] } + + it { is_expected.to be(false) } + end + + context 'when the collection type is incorrect' do + let(:input) { Set[1, 2, 3] } + + it { is_expected.to be(false) } + end + + context 'when the input is empty' do + let(:input) { [] } + it { is_expected.to be(true) } + end +end