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){
    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
  }

  given(:new_user_class){
    Yaoc::Helper::StructHE(:id, :names)
  }

  given(:old_user_class){
    Yaoc::Helper::StructHE(:id, :names)
  }

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

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

  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