Sha256: 477276b749e0e8095b1bfe484bda0ddd995f102bbbf12bf4c39c6931a91343ad

Contents?: true

Size: 1.89 KB

Versions: 2

Compression:

Stored size: 1.89 KB

Contents

# encoding: utf-8

require 'spec_helper'

describe Mapping, '.build' do
  let(:header)   { [[:id, Integer], [:user_name, String], [:age, Integer], [:email, String]] }
  let(:relation) { Axiom::Relation::Base.new(:users, header) }
  let(:model)    { mock_model(:id, :name, :email) }
  let(:env)      { Environment.setup(test: 'memory://test') }
  let(:schema)   { Hash[users: relation] }

  context 'when attribute mapping is used' do
    subject { env }

    let(:mapper) { subject[:users].mapper }

    before do
      user_model = model

      Mapping.build(env, schema) do
        users do
          model user_model

          map :id, :email
          map :user_name, to: :name
        end
      end
    end

    it 'registers rom relation' do
      expect(subject[:users]).to be_instance_of(Relation)
    end

    it 'builds rom mapper' do
      expect(mapper.header.map(&:name)).to eql([:id, :email, :name])

      # TODO: introduce new interface in rom-mapper to make this simpler
      expect(mapper.header.map { |a| a.field.type }).to eql([
        Axiom::Types::Integer, Axiom::Types::String, Axiom::Types::String
      ])
    end

    it 'sets up the model' do
      object = mapper.new_object(id: 1, name: 'Jane', email: 'jane@rom.org')
      expect(object).to be_instance_of(model)
    end
  end

  context 'when custom mapper is injected' do
    subject { env }

    let(:test_mapper) { TestMapper.new(header, model) }

    before do
      custom_mapper = test_mapper
      Mapping.build(env, schema) { users { mapper(custom_mapper) } }
    end

    it 'sets the custom mapper' do
      expect(subject[:users].mapper).to be(test_mapper)
    end
  end

  context 'when unknown relation name is used' do
    subject { described_class.build(env, schema) { not_here(1, 'a') {} } }

    it 'raises error' do
      expect { subject }.to raise_error(
        NoMethodError, /undefined method `not_here'/
      )
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
rom-relation-0.1.2 spec/unit/rom/mapping/class_methods/build_spec.rb
rom-relation-0.1.1 spec/unit/rom/mapping/class_methods/build_spec.rb