Sha256: 7b491b2de223909ab050c202830c32832ee530a1164b69cb2fdce2d28987c8bc

Contents?: true

Size: 1.79 KB

Versions: 55

Compression:

Stored size: 1.79 KB

Contents

# frozen_string_literal: true

RSpec.describe 'Mapper Hash' do
  link :build_mapper_factory, from: :ree_mapper
  link :build_mapper_strategy, from: :ree_mapper

  let(:mapper_factory) {
    build_mapper_factory(
      strategies: [
        build_mapper_strategy(method: :cast, dto: Hash)
      ]
    )
  }

  let(:mapper) {
    mapper_factory.call.use(:cast) {
      hash :point do
        integer :x
        integer :y
      end
    }
  }

  describe '#cast' do
    it {
      expect(mapper.cast({ point: { x: 1, y: 1 } })).to eq({ point: { x: 1, y: 1 } })
    }

    it {
      expect { mapper.cast({ point: 1 }) }.to raise_error(ReeMapper::TypeError, 'Missing required field `x` for `point`')
    }

    it {
      expect { mapper.cast({ point: { x: 1, y: 'not integer' } }) }.to raise_error(ReeMapper::CoercionError, '`point[y]` is invalid integer')
    }
  end

  describe 'dto: option' do
    it {
      expect(
        mapper_factory.call.use(:cast) {
          hash :point, dto: OpenStruct do
            integer :x
            integer :y
          end
        }.cast({ point: { x: 1, y: 1 } })
      ).to eq({ point: OpenStruct.new({ x: 1, y: 1 }) })
    }
  end

  describe 'parent strategy object output' do
    let(:mapper_factory) {
      build_mapper_factory(
        strategies: [
          build_mapper_strategy(method: :cast, dto: Object)
        ]
      )
    }

    let(:mapper) {
      mapper_factory.call.use(:cast, dto: dto) {
        hash :point do
          integer :x
          integer :y
        end
      }
    }

    let(:dto) {
      Class.new do
        def ==(other)
          instance_variables == other.instance_variables
        end
      end
    }

    it {
      expect(mapper.cast({ point: { x: 1, y: 1 } })).to eq(Object.new.tap { _1.instance_exec { @point = { x: 1, y: 1 } } })
    }
  end
end

Version data entries

55 entries across 55 versions & 1 rubygems

Version Path
ree_lib-1.0.85 lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/hash_spec.rb
ree_lib-1.0.84 lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/hash_spec.rb
ree_lib-1.0.83 lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/hash_spec.rb
ree_lib-1.0.82 lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/hash_spec.rb
ree_lib-1.0.81 lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/hash_spec.rb
ree_lib-1.0.80 lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/hash_spec.rb
ree_lib-1.0.79 lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/hash_spec.rb
ree_lib-1.0.78 lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/hash_spec.rb
ree_lib-1.0.77 lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/hash_spec.rb
ree_lib-1.0.76 lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/hash_spec.rb
ree_lib-1.0.75 lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/hash_spec.rb
ree_lib-1.0.74 lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/hash_spec.rb
ree_lib-1.0.73 lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/hash_spec.rb
ree_lib-1.0.72 lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/hash_spec.rb
ree_lib-1.0.71 lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/hash_spec.rb
ree_lib-1.0.70 lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/hash_spec.rb
ree_lib-1.0.69 lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/hash_spec.rb
ree_lib-1.0.68 lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/hash_spec.rb
ree_lib-1.0.67 lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/hash_spec.rb
ree_lib-1.0.66 lib/ree_lib/packages/ree_mapper/spec/ree_mapper/types/hash_spec.rb