# frozen_string_literal: true

require 'test_helper'

class ReservationContextTest < ActiveSupport::TestCase
  test 'fixtures are valid' do
    ReservationContext.find_each do |reservation_context|
      assert reservation_context.valid?
    end
  end

  test "applicable_on validation" do
    reservation_context = reservation_contexts(:reservation_context_1)

    reservation_context.applicable_on << "wrong"

    assert reservation_context.invalid?
    assert_equal reservation_context.errors.details, { applicable_on: [{ error: :invalid }] }
  end

  test "name validation" do
    reservation_context = reservation_contexts(:reservation_context_1)

    reservation_context.name = nil

    assert reservation_context.invalid?
    assert_equal reservation_context.errors.details, { name: [{ error: :blank }] }
  end

  test "#safe_destroy" do
    reservation_context = reservation_contexts(:reservation_context_1)
    reservation = reservations(:reservation_1).tap { |r| r.update!(reservation_context: reservation_context) }

    assert_not reservation_context.safe_destroy

    reservation.update!(reservation_context_id: nil)

    assert reservation_context.safe_destroy
    assert reservation_context.destroyed?
  end

  test "scope applicable_on" do
    assert_equal reservation_contexts(:reservation_context_1, :reservation_context_2), ReservationContext.applicable_on("space")

    reservation_context = reservation_contexts(:reservation_context_1)
    reservation_context.applicable_on.delete("space")
    reservation_context.save!

    assert_equal [reservation_contexts(:reservation_context_2)], ReservationContext.applicable_on("space")
  end

  test "foreign key on reservations" do
    reservation_context = reservation_contexts(:reservation_context_1)
    reservation = reservations(:reservation_1).tap { |r| r.update!(reservation_context: reservation_context) }

    assert_raise ActiveRecord::InvalidForeignKey do
      reservation_context.destroy!
    end
  end
end