diff --git a/app/controllers/admin/domain_blocks_controller.rb b/app/controllers/admin/domain_blocks_controller.rb index 96c31a38fdf..325b33df80b 100644 --- a/app/controllers/admin/domain_blocks_controller.rb +++ b/app/controllers/admin/domain_blocks_controller.rb @@ -33,7 +33,7 @@ module Admin # Disallow accidentally downgrading a domain block if existing_domain_block.present? && !@domain_block.stricter_than?(existing_domain_block) - @domain_block.save + @domain_block.validate flash.now[:alert] = I18n.t('admin.domain_blocks.existing_domain_block_html', name: existing_domain_block.domain, unblock_url: admin_domain_block_path(existing_domain_block)).html_safe @domain_block.errors.delete(:domain) return render :new diff --git a/spec/features/admin/domain_blocks_spec.rb b/spec/features/admin/domain_blocks_spec.rb index 0d7b90c21cd..4379ac91dba 100644 --- a/spec/features/admin/domain_blocks_spec.rb +++ b/spec/features/admin/domain_blocks_spec.rb @@ -4,6 +4,7 @@ require 'rails_helper' describe 'blocking domains through the moderation interface' do before do + allow(DomainBlockWorker).to receive(:perform_async).and_return(true) sign_in Fabricate(:user, role: UserRole.find_by(name: 'Admin')), scope: :user end @@ -16,6 +17,7 @@ describe 'blocking domains through the moderation interface' do click_button I18n.t('admin.domain_blocks.new.create') expect(DomainBlock.exists?(domain: 'example.com', severity: 'silence')).to be true + expect(DomainBlockWorker).to have_received(:perform_async) end end @@ -27,13 +29,15 @@ describe 'blocking domains through the moderation interface' do select I18n.t('admin.domain_blocks.new.severity.suspend'), from: 'domain_block_severity' click_button I18n.t('admin.domain_blocks.new.create') - # It presents a confirmation screen + # It doesn't immediately block but presents a confirmation screen expect(page).to have_title(I18n.t('admin.domain_blocks.confirm_suspension.title', domain: 'example.com')) + expect(DomainBlockWorker).to_not have_received(:perform_async) # Confirming creates a block click_button I18n.t('admin.domain_blocks.confirm_suspension.confirm') expect(DomainBlock.exists?(domain: 'example.com', severity: 'suspend')).to be true + expect(DomainBlockWorker).to have_received(:perform_async) end end @@ -47,13 +51,15 @@ describe 'blocking domains through the moderation interface' do select I18n.t('admin.domain_blocks.new.severity.suspend'), from: 'domain_block_severity' click_button I18n.t('admin.domain_blocks.new.create') - # It presents a confirmation screen + # It doesn't immediately block but presents a confirmation screen expect(page).to have_title(I18n.t('admin.domain_blocks.confirm_suspension.title', domain: 'example.com')) + expect(DomainBlockWorker).to_not have_received(:perform_async) # Confirming updates the block click_button I18n.t('admin.domain_blocks.confirm_suspension.confirm') expect(domain_block.reload.severity).to eq 'suspend' + expect(DomainBlockWorker).to have_received(:perform_async) end end @@ -67,13 +73,15 @@ describe 'blocking domains through the moderation interface' do select I18n.t('admin.domain_blocks.new.severity.suspend'), from: 'domain_block_severity' click_button I18n.t('admin.domain_blocks.new.create') - # It presents a confirmation screen + # It doesn't immediately block but presents a confirmation screen expect(page).to have_title(I18n.t('admin.domain_blocks.confirm_suspension.title', domain: 'subdomain.example.com')) + expect(DomainBlockWorker).to_not have_received(:perform_async) # Confirming creates the block click_button I18n.t('admin.domain_blocks.confirm_suspension.confirm') expect(DomainBlock.where(domain: 'subdomain.example.com', severity: 'suspend')).to exist + expect(DomainBlockWorker).to have_received(:perform_async) # And leaves the previous block alone expect(domain_block.reload.severity).to eq 'silence' @@ -90,11 +98,13 @@ describe 'blocking domains through the moderation interface' do select I18n.t('admin.domain_blocks.new.severity.suspend'), from: 'domain_block_severity' click_button I18n.t('generic.save_changes') - # It presents a confirmation screen + # It doesn't immediately block but presents a confirmation screen expect(page).to have_title(I18n.t('admin.domain_blocks.confirm_suspension.title', domain: 'example.com')) + expect(DomainBlockWorker).to_not have_received(:perform_async) # Confirming updates the block click_button I18n.t('admin.domain_blocks.confirm_suspension.confirm') + expect(DomainBlockWorker).to have_received(:perform_async) expect(domain_block.reload.severity).to eq 'suspend' end