diff --git a/app/models/sponsorship.rb b/app/models/sponsorship.rb index c8c5e92a5..337f47e9e 100644 --- a/app/models/sponsorship.rb +++ b/app/models/sponsorship.rb @@ -2,6 +2,7 @@ class Sponsorship < ApplicationRecord LEVELS = %w[gold silver bronze tag media devrel].freeze METAL_LEVELS = %w[gold silver bronze].freeze STATUSES = %w[none pending live].freeze + SPONSORABLE_TYPES = %w[Tag ActsAsTaggableOn::Tag].freeze # media has no fixed amount of credits CREDITS = { gold: 6_000, @@ -19,6 +20,11 @@ class Sponsorship < ApplicationRecord validates :status, presence: true, inclusion: { in: STATUSES } validates :url, url: { allow_blank: true, no_local: true, schemes: %w[http https] } validates :user, :organization, :featured_number, presence: true + validates :sponsorable_type, inclusion: { + in: SPONSORABLE_TYPES, + allow_blank: true, + message: "is not a sponsorable type" + } validate :validate_tag_uniqueness, if: proc { level.to_s == "tag" } validate :validate_level_uniqueness, if: proc { METAL_LEVELS.include?(level) } diff --git a/spec/models/sponsorship_spec.rb b/spec/models/sponsorship_spec.rb index d72c20f7f..71eae0a39 100644 --- a/spec/models/sponsorship_spec.rb +++ b/spec/models/sponsorship_spec.rb @@ -111,6 +111,12 @@ RSpec.describe Sponsorship, type: :model do expect(tag_sponsorship).not_to be_valid expect(tag_sponsorship.errors[:level]).to be_present end + + it "ensures sponsorable_type is loadable when present" do + sponsorship = build(:sponsorship, user: user, organization: org, sponsorable_type: "Unsponsorable") + expect(sponsorship).not_to be_valid + expect(sponsorship.errors[:sponsorable_type]).to include("is not a sponsorable type") + end end end end