require "rails_helper"

RSpec.describe ProfileField do
  describe "associations" do
    it { is_expected.to belong_to(:profile_field_group) }
  end

  describe "validations" do
    describe "builtin validations" do
      it { is_expected.to validate_presence_of(:attribute_name).on(:update) }
      it { is_expected.to validate_presence_of(:display_area) }
      it { is_expected.to validate_presence_of(:input_type) }
      it { is_expected.to validate_presence_of(:label) }
    end

    it "ensures the label is case-insensitively unique" do
      create(:profile_field, label: "Test")
      expect do
        described_class.create!(label: "tEsT")
      end.to raise_error(ActiveRecord::RecordInvalid, /Label has already been taken/)
    end

    describe "#maximum_header_field_count" do
      before do
        count = [0, described_class::HEADER_FIELD_LIMIT - described_class.header.count].max
        create_list(:profile_field, count, :header)
      end

      let(:expected_message) { /#{Regexp.quote(ProfileField::HEADER_LIMIT_MESSAGE)}/ }

      it "limits the number of header fields on create" do
        expect { create(:profile_field, :header) }
          .to raise_error(ActiveRecord::RecordInvalid, expected_message)
      end

      it "limits the number of header fields on update", :aggregate_errors do
        expect(described_class.header.count).to be >= 3
        profile_field = create(:profile_field, display_area: :left_sidebar)

        expect { profile_field.header! }
          .to raise_error(ActiveRecord::RecordInvalid, expected_message)
      end

      it "considers existing header fields valid even if we reached the maximum", :aggregate_errors do
        expect(described_class.header.count).to be >= 3

        expect { described_class.header.last.validate! }.not_to raise_error
      end
    end
  end

  describe "callbacks" do
    it "automatically generates an attribute name" do
      field = create(:profile_field, label: "Test? Test! 1")
      expect(field.attribute_name).to start_with("attribute_")
    end

    describe "#maximum_header_field_count" do
      it "limits the number of header fields" do
        count = [0, described_class::HEADER_FIELD_LIMIT - described_class.header.count].max
        create_list(:profile_field, count, :header)

        expected_message = /#{Regexp.quote(ProfileField::HEADER_LIMIT_MESSAGE)}/

        expect { create(:profile_field, :header) }
          .to raise_error(ActiveRecord::RecordInvalid, expected_message)
      end
    end
  end
end
