require File.expand_path(File.dirname(__FILE__) + "/test_helper")

%w(hole mole muskrat kitty).each do |a|
  require File.expand_path(File.dirname(__FILE__) + "/" + a)
end

class PermanentRecordsTest < ActiveSupport::TestCase
  
  def setup
    super
    Muskrat.delete_all
    @active = Muskrat.create!(:name => 'Wakko')
    @deleted = Muskrat.create!(:name => 'Yakko', :deleted_at => 4.days.ago)
    @the_girl   = Muskrat.create!(:name => 'Dot')
    Kitty.delete_all
    @kitty = Kitty.create!(:name => 'Meow Meow')
    @hole = Hole.create(:number => 14)
    @mole = @hole.muskrats.create(:name => "Steady Rat")
    @mole = @hole.moles.create(:name => "Grabowski")
  end
  
  def teardown
    setup
  end
  
  def test_destroy_should_return_the_record
    muskrat = @active
    assert_equal muskrat, muskrat.destroy
  end
  
  def test_revive_should_return_the_record
    muskrat = @deleted
    assert_equal muskrat, muskrat.destroy
  end

  def test_destroy_should_set_deleted_at_attribute
    assert @active.destroy.deleted_at
  end
  
  def test_destroy_should_save_deleted_at_attribute
    assert Muskrat.find(@active.destroy.id).deleted_at
  end
  
  def test_destroy_should_not_really_remove_the_record
    assert Muskrat.find(@active.destroy.id)
  end
  
  def test_destroy_should_recognize_a_force_parameter
    assert_raises(ActiveRecord::RecordNotFound) { @active.destroy(:force).reload }
  end
  
  def test_destroy_should_ignore_other_parameters
    assert Muskrat.find(@active.destroy(:hula_dancer).id)
  end
  
  def test_revive_should_unfreeze_record
    assert !@deleted.revive.frozen?
  end
  
  def test_revive_should_unset_deleted_at
    assert !@deleted.revive.deleted_at
  end
  
  def test_revive_should_make_deleted_return_false
    assert !@deleted.revive.deleted?
  end
  
  def test_deleted_returns_true_for_deleted_records
    assert @deleted.deleted?
  end
  
  def test_destroy_returns_record_with_modified_attributes
    assert @active.destroy.deleted?
  end
  
  def test_revive_and_destroy_should_be_chainable
    assert @active.destroy.revive.destroy.destroy.revive.revive.destroy.deleted?
    assert !@deleted.destroy.revive.revive.destroy.destroy.revive.deleted?
  end
  
  def test_with_counting_on_deleted_limits_scope_to_count_deleted_records
    assert_equal Muskrat.deleted.length,
                 Muskrat.deleted.count
  end

  def test_with_counting_on_not_deleted_limits_scope_to_count_not_deleted_records
    assert_equal Muskrat.not_deleted.length,
                 Muskrat.not_deleted.count
  end

  def test_with_deleted_limits_scope_to_deleted_records
    assert Muskrat.deleted.all?(&:deleted?)
  end
  
  def test_with_not_deleted_limits_scope_to_not_deleted_records
    assert !Muskrat.not_deleted.any?(&:deleted?)
  end
  
  def test_models_without_a_deleted_at_column_should_destroy_as_normal
    assert_raises(ActiveRecord::RecordNotFound) {@kitty.destroy.reload}
  end
  
  def test_dependent_non_permanent_records_should_be_destroyed
    assert @hole.is_permanent?
    assert !@hole.moles.first.is_permanent?
    assert_difference "Mole.count", -1 do
      @hole.destroy
    end
  end
  
  def test_dependent_permanent_records_should_be_marked_as_deleted
    assert @hole.is_permanent?
    assert @hole.muskrats.first.is_permanent?
    assert_no_difference "Muskrat.count" do
      @hole.destroy
    end
    assert @hole.muskrats.first.deleted?
  end
end