require 'rails_helper'
require 'table_migration_helper'

describe TableMigrationHelper do

  def table_exists?(table_name)
    sql = <<-SQL
    SELECT 1
    FROM INFORMATION_SCHEMA.TABLES
    WHERE table_schema = 'public' AND
          table_name = '#{table_name}'
    SQL

    ActiveRecord::Base.exec_sql(sql).to_a.length > 0
  end

  describe '#delayed_drop' do
    it "can drop a table after correct delay and when new table exists" do
      ActiveRecord::Base.exec_sql "CREATE TABLE table_with_old_name (topic_id INTEGER)"

      name = ActiveRecord::Base
        .exec_sql("SELECT name FROM schema_migration_details LIMIT 1")
        .getvalue(0, 0)

      Topic.exec_sql("UPDATE schema_migration_details SET created_at = :created_at WHERE name = :name",
                    name: name, created_at: 15.minutes.ago)

      dropped_proc_called = false

      described_class.delayed_drop(
        old_name: 'table_with_old_name',
        new_name: 'table_with_new_name',
        after_migration: name,
        delay: 20.minutes,
        on_drop: ->() { dropped_proc_called = true }
      )

      expect(table_exists?('table_with_old_name')).to eq(true)
      expect(dropped_proc_called).to eq(false)

      described_class.delayed_drop(
        old_name: 'table_with_old_name',
        new_name: 'table_with_new_name',
        after_migration: name,
        delay: 10.minutes,
        on_drop: ->() { dropped_proc_called = true }
      )

      expect(table_exists?('table_with_old_name')).to eq(true)
      expect(dropped_proc_called).to eq(false)

      ActiveRecord::Base.exec_sql "CREATE TABLE table_with_new_name (topic_id INTEGER)"

      described_class.delayed_drop(
        old_name: 'table_with_old_name',
        new_name: 'table_with_new_name',
        after_migration: name,
        delay: 10.minutes,
        on_drop: ->() { dropped_proc_called = true }
      )

      expect(table_exists?('table_with_old_name')).to eq(false)
      expect(dropped_proc_called).to eq(true)
    end
  end
end