require 'rake_test_support'
require 'db/hsqldb'

class HSQLDBRakeTest < Test::Unit::TestCase
  include RakeTestSupport

  def db_name; 'mem:rake-test.hsqldb'; end

  def do_teardown
    drop_rake_test_database
  end

  test 'rake db:create (and db:drop)' do
    @db_name = 'rake-create-test.hsqldb'
    Rake::Task["db:create"].invoke
    assert_true File.exists?("#{@db_name}.lck")

    Rake::Task["db:drop"].invoke
    assert_false File.exists?("#{@db_name}.lck")
  end

  test 'rake db:create (and db:drop) in memory db' do
    Rake::Task["db:create"].invoke
    # assert_true File.exists?("#{db_name}.lck")

    Rake::Task["db:drop"].invoke
    # assert_false File.exists?("#{db_name}.lck")
  end

  test 'rake db:test:purge' do
    # Rake::Task["db:create"].invoke
    create_rake_test_database do |connection|
      connection.create_table('loosers') { |t| t.string :name }
    end

    Rake::Task["db:test:purge"].invoke

    ActiveRecord::Base.establish_connection db_config.merge :database => db_name
    assert_false ActiveRecord::Base.connection.table_exists?('loosers')
    ActiveRecord::Base.connection.disconnect!
  end

  test 'rake db:structure:dump (and db:structure:load)' do
    db_name = @db_name = 'test-dump-rake.hsqldb'
    create_rake_test_database(db_name) do |connection|
      create_schema_migrations_table(connection)
      connection.create_table('loosers') { |t| t.string :name; t.timestamps }
    end

    structure_sql = File.join('db', structure_sql_filename)
    begin
      Dir.mkdir 'db' # db/structure.sql
      Rake::Task["db:structure:dump"].invoke

      assert File.exists?(structure_sql)
      # CREATE MEMORY TABLE PUBLIC.LOOSERS
      assert_match(/CREATE .*? TABLE PUBLIC.LOOSERS/i, File.read(structure_sql))

      # db:structure:load
      drop_rake_test_database(:silence)
      Rake::Task["db:structure:load"].invoke

      ActiveRecord::Base.establish_connection db_config.merge :database => db_name
      assert ActiveRecord::Base.connection.table_exists?('loosers')
      ActiveRecord::Base.connection.disconnect!
    ensure
      File.delete(structure_sql) if File.exists?(structure_sql)
      Dir.rmdir 'db'
    end
  end

#  test 'rake db:charset' do
#    expect_rake_output('UTF-8')
#    Rake::Task["db:charset"].invoke
#  end

  def create_rake_test_database(db_name = self.db_name)
    ActiveRecord::Base.establish_connection db_config.merge :database => db_name
    if block_given?
      yield ActiveRecord::Base.connection
    end
    ActiveRecord::Base.connection.shutdown
    ActiveRecord::Base.connection.disconnect!
  end

  def drop_rake_test_database(silence = nil)
    ActiveRecord::Base.establish_connection db_config.merge :database => @db_name
    ActiveRecord::Base.connection.shutdown
    ActiveRecord::Base.connection.disconnect!

    Dir.glob("#{@db_name}*").each do |f|
      if silence
        FileUtils.rm_rf(f) if File.exists?(f)
      else
        FileUtils.rm_rf(f)
      end
      FileUtils.rmdir(f) if File.directory?(f)
    end
  end

end
