Sha256: 5f6bc192fccc86ce5bb90a258216c9a579d4072c20112a22c92af767923c8465

Contents?: true

Size: 1.78 KB

Versions: 6

Compression:

Stored size: 1.78 KB

Contents

require 'spec_helper'

describe Virtus::Attribute::Collection, '#coerce' do
  subject { object.coerce(input) }

  context 'when input is an array' do
    context 'when member type is a primitive' do
      fake(:coercer)     { Virtus::Attribute::Coercer }
      fake(:member_type) { Virtus::Attribute }

      let(:member_primitive) { Integer }
      let(:input)            { ['1', '2'] }

      let(:object) {
        described_class.build(Array[member_primitive], :coercer => coercer, :member_type => member_type)
      }

      it 'uses coercer to coerce members' do
        stub(coercer).call(input) { input }
        stub(member_type).finalize { member_type }
        stub(member_type).coerce('1') { 1 }
        stub(member_type).coerce('2') { 2 }

        expect(subject).to eq([1, 2])

        expect(member_type).to have_received.coerce('1')
        expect(member_type).to have_received.coerce('2')
      end
    end

    context 'when member type is an EV' do
      let(:member_primitive) { Struct.new(:id) }
      let(:input)            { [1, 2] }
      let(:object)           { described_class.build(Array[member_primitive]) }

      it 'coerces members' do
        expect(subject).to eq([member_primitive.new(1), member_primitive.new(2)])
      end
    end

    context 'when member type is a hash with key/value coercion' do
      let(:member_primitive) { Hash[String => Integer] }
      let(:member_attribute) { Virtus::Attribute.build(member_primitive) }
      let(:input)            { [{:one => '1'}, {:two => '2'}] }
      let(:output)           { [member_attribute.coerce(input.first), member_attribute.coerce(input.last)] }
      let(:object)           { described_class.build(Array[member_primitive]) }

      it 'coerces members' do
        expect(subject).to eq(output)
      end
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
virtus-1.0.2 spec/unit/virtus/attribute/collection/coerce_spec.rb
virtus-1.0.1 spec/unit/virtus/attribute/collection/coerce_spec.rb
virtus-1.0.0 spec/unit/virtus/attribute/collection/coerce_spec.rb
virtus-1.0.0.rc2 spec/unit/virtus/attribute/collection/coerce_spec.rb
virtus-1.0.0.rc1 spec/unit/virtus/attribute/collection/coerce_spec.rb
virtus-1.0.0.beta8 spec/unit/virtus/attribute/collection/coerce_spec.rb