diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index 10f9f1800..cfdbf9db5 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -83,6 +83,7 @@ Rails/UniqueValidationWithoutIndex: - 'app/models/comment.rb' - 'app/models/follow.rb' - 'app/models/notification.rb' + - 'app/models/broadcast.rb' # Offense count: 33 # Cop supports --auto-correct. diff --git a/app/models/broadcast.rb b/app/models/broadcast.rb index f880a43c5..12177737f 100644 --- a/app/models/broadcast.rb +++ b/app/models/broadcast.rb @@ -3,7 +3,8 @@ class Broadcast < ApplicationRecord has_many :notifications, as: :notifiable, inverse_of: :notifiable - validates :title, :type_of, :processed_html, presence: true + validates :title, uniqueness: { scope: :type_of }, presence: true + validates :type_of, :processed_html, presence: true validates :type_of, inclusion: { in: %w[Announcement Welcome] } validate :single_active_announcement_broadcast diff --git a/db/schema.rb b/db/schema.rb index 6ab2ee05e..c182c56b6 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2020_06_01_121243) do +ActiveRecord::Schema.define(version: 2020_06_02_174329) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -273,6 +273,7 @@ ActiveRecord::Schema.define(version: 2020_06_01_121243) do t.string "title" t.string "type_of" t.datetime "updated_at" + t.index ["title", "type_of"], name: "index_broadcasts_on_title_and_type_of", unique: true end create_table "buffer_updates", force: :cascade do |t| diff --git a/spec/models/broadcast_spec.rb b/spec/models/broadcast_spec.rb index 15e16927e..2672d8ae8 100644 --- a/spec/models/broadcast_spec.rb +++ b/spec/models/broadcast_spec.rb @@ -5,6 +5,7 @@ RSpec.describe Broadcast, type: :model do it { is_expected.to validate_presence_of(:type_of) } it { is_expected.to validate_presence_of(:processed_html) } it { is_expected.to validate_inclusion_of(:type_of).in_array(%w[Announcement Welcome]) } + it { is_expected.to validate_uniqueness_of(:title).scoped_to(:type_of) } it { is_expected.to have_many(:notifications) } diff --git a/spec/requests/internal/broadcasts_spec.rb b/spec/requests/internal/broadcasts_spec.rb index 62da641ed..76cfbba68 100644 --- a/spec/requests/internal/broadcasts_spec.rb +++ b/spec/requests/internal/broadcasts_spec.rb @@ -112,4 +112,19 @@ RSpec.describe "/internal/broadcasts", type: :request do end end end + + context "with the same title and the same type_of" do + let(:super_admin) { create(:user, :super_admin) } + let(:params) { { title: "Hello!", processed_html: "
Hello!
", type_of: "Announcement" } } + + before { sign_in super_admin } + + it "does not allow for a second broadcast to be created" do + expect do + 2.times do + post_resource + end + end.to change { Broadcast.all.count }.by(1) + end + end end