require File.expand_path('../abstract_unit', __FILE__)

class TestAttributes < ActiveSupport::TestCase
  fixtures :reference_types, :reference_codes, :products, :tariffs, :product_tariffs

  CLASSES = {
    :single => {
      :class => ReferenceType,
      :primary_keys => :reference_type_id,
    },
    :dual   => {
      :class => ReferenceCode,
      :primary_keys => [:reference_type_id, :reference_code],
    },
  }

  def setup
    self.class.classes = CLASSES
  end

  def test_brackets
    tested_at_least_on_attribute = false
    testing_with do
      @first.attributes.each_pair do |attr_name, value|
        next if value.nil?
        assert_equal value, @first[attr_name]
        tested_at_least_on_attribute = true
      end
    end
    assert tested_at_least_on_attribute
  end

  def test_brackets_primary_key
    testing_with do
      assert_equal(@first.id, @first[@primary_keys])
      assert_equal(@first.id, @first[@first.class.primary_key])
    end
  end

  def test_brackets_assignment
    testing_with do
      @first.attributes.each_pair do |attr_name, value|
        next if attr_name == @first.class.primary_key
        @first[attr_name]= !value.nil? ? value * 2 : '1'
        assert_equal !value.nil? ? value * 2 : '1', @first[attr_name]
      end
    end
  end

  def test_brackets_foreign_key_assignment
    tarrif = tariffs(:flat)
    product_tariff = product_tariffs(:first_flat)
    compare_indexes(tarrif, tarrif.class.primary_key, product_tariff, [:tariff_id, :tariff_start_date])
  end

  def test_has_attribute
    tariff = tariffs(:flat)
    assert(tariff.has_attribute?([:tariff_id, :start_date]))
    assert(tariff.has_attribute?(['tariff_id', 'start_date']))
  end

  def test_has__attribute
    tariff = tariffs(:flat)
    assert(tariff._has_attribute?(['tariff_id', 'start_date']))
  end

  private

  def compare_indexes(obj1, indexes1, obj2, indexes2)
    indexes1.length.times do |key_index|
      key1 = indexes1[key_index]
      key2 = indexes2[key_index]
      assert_equal(obj1[key1], obj2[key2])
    end
  end
end