require 'spec_helper'

feature 'Map objects to classes with lazy loading', %q{
   In order to defer object mapping
   as a lib user
   I want to map object from an input object to an output object with lazy loading support
} do

  given(:mapper)do
    Yaoc::ObjectMapper.new(new_user_class, old_user_class).tap do |mapper|
      mapper.add_mapping do
        fetcher :public_send
        rule to: [:id, :names],
             lazy_loading: [false, true]
      end
    end
  end

  given(:new_user_class)do
    Yaoc::Helper::StructHE(:id, :names)
  end

  given(:old_user_class)do
    Yaoc::Helper::StructHE(:id, :names)
  end

  given(:existing_old_user)do
    old_user_class.new(
        id: 'existing_user_2',
        names: ['first_name', 'second_name']
    )
  end

  given(:existing_user)do
    new_user_class.new(
        id: 'existing_user_2',
        names: ['first_name', 'second_name']
    )
  end

  scenario 'creates an result object from an input_object deferred' do
    converted_user = mapper.load(existing_old_user)
    new_names = ['new_name1', 'new_name2']

    existing_old_user.names = new_names # show defer through changes after loading an object

    expect(converted_user.names).to eq new_names
  end

  scenario 'dumps an result object as source object defered' do
    converted_user = mapper.dump(existing_user)
    new_names = ['new_name1', 'new_name2']

    existing_user.names = new_names # show defer through changes after loading an object

    expect(converted_user.names).to eq new_names
  end

end