# frozen_string_literal: true

RSpec.describe ThemeSetting do
  fab!(:theme)

  context "for validations" do
    it "should be invalid when setting data_type to objects and `experimental_objects_type_for_theme_settings` is disabled" do
      SiteSetting.experimental_objects_type_for_theme_settings = false

      theme_setting =
        ThemeSetting.new(name: "test", data_type: ThemeSetting.types[:objects], theme:)

      expect(theme_setting.valid?).to eq(false)
      expect(theme_setting.errors[:data_type]).to contain_exactly("is not included in the list")
    end

    it "should be valid when setting data_type to objects and `experimental_objects_type_for_theme_settings` is enabled" do
      SiteSetting.experimental_objects_type_for_theme_settings = true

      theme_setting =
        ThemeSetting.new(name: "test", data_type: ThemeSetting.types[:objects], theme:)

      expect(theme_setting.valid?).to eq(true)
    end

    it "should be invalid when json_value size is greater than the maximum allowed size" do
      SiteSetting.experimental_objects_type_for_theme_settings = true

      json_value = { "key" => "value" }
      bytesize = json_value.to_json.bytesize

      expect(bytesize).to eq(15)

      stub_const(ThemeSetting, "MAXIMUM_JSON_VALUE_SIZE_BYTES", bytesize - 1) do
        theme_setting =
          ThemeSetting.new(
            name: "test",
            data_type: ThemeSetting.types[:objects],
            theme:,
            json_value:,
          )

        expect(theme_setting.valid?).to eq(false)

        expect(theme_setting.errors[:json_value]).to contain_exactly(
          I18n.t(
            "theme_settings.errors.json_value.too_large",
            max_size_megabytes: (bytesize - 1) / 1024 / 1024,
          ),
        )
      end
    end
  end
end