require 'helper'

class TestTransformation < Coupler::Test::IntegrationTest
  def self.startup
    super
    Connection.delete
    each_adapter do |adapter, config|
      data = Array.new(50) { [Forgery(:name).first_name, Forgery(:name).last_name] }
      conn = new_connection(adapter, :name => "#{adapter} connection").save!
      conn.database do |db|
        db.create_table!(:test_data) do
          primary_key :id
          String :first_name
          String :last_name
        end
        db[:test_data].import([:first_name, :last_name], data)
      end
    end
  end

  def adapter_setup(adapter)
    @connection = new_connection(adapter, :name => "#{adapter} connection").save!
    @project = Project.create(:name => 'foo')
    @resource = Resource.create(:name => 'test', :connection => @connection, :table_name => 'test_data', :project => @project)
  end

  each_adapter do |adapter, _|
    adapter_test(adapter, "uses local db type to determine field type") do
      adapter_setup(adapter)
      string_to_int = Transformer.create(:name => 'string_to_int', :allowed_types => %w{string}, :code => "value.length", :result_type => "integer")
      int_to_string = Transformer.create(:name => 'int_to_string', :allowed_types => %w{integer}, :code => "value.to_s", :result_type => "string")
      field = @resource.fields_dataset[:name => 'first_name']
      xformation_1 = Transformation.create(:transformer => string_to_int, :source_field => field, :resource => @resource)
      xformation_2 = Transformation.new(:transformer => int_to_string, :source_field => field, :resource => @resource)
      assert xformation_2.valid?, xformation_2.errors.full_messages.join("; ")
    end

    adapter_test(adapter, "accepts nested attributes for result field") do
      adapter_setup(adapter)
      transformer = Transformer.create({
        :name => "noop",
        :code => %{value},
        :allowed_types => %w{string integer datetime},
        :result_type => 'same'
      })
      field = @resource.fields_dataset[:name => 'first_name']
      transformation = Transformation.create({
        :transformer => transformer,
        :resource => @resource,
        :source_field => field,
        :result_field_attributes => { :name => 'new_first_name' }
      })

      result_field = transformation.result_field.refresh
      assert_equal field[:type], result_field[:type]
      assert_equal field[:db_type], result_field[:db_type]
      assert result_field[:is_generated]
    end

  end
end