Exclude projects pending delete from notifications

If the Sidekiq job fails for some reason, a project can be 'stuck'
pending deletion. The project can't be viewed, so it shouldn't be
available through the notification settings association as this will
throw an exception when we try to show the link.
This commit is contained in:
Sean McGivern 2016-07-07 12:41:48 +01:00
parent 3c89a788c7
commit ea25e0918b
4 changed files with 34 additions and 1 deletions

View File

@ -17,6 +17,7 @@ v 8.10.0 (unreleased)
- Fix MR-auto-close text added to description. !4836
- Fix issue, preventing users w/o push access to sort tags !5105 (redetection)
- Add Spring EmojiOne updates.
- Fix viewing notification settings when a project is pending deletion
- Fix pagination when sorting by columns with lots of ties (like priority)
- Updated project header design
- Exclude email check from the standard health check

View File

@ -5,6 +5,7 @@ class NotificationSetting < ActiveRecord::Base
belongs_to :user
belongs_to :source, polymorphic: true
belongs_to :project, foreign_key: 'source_id'
validates :user, presence: true
validates :level, presence: true
@ -13,7 +14,13 @@ class NotificationSetting < ActiveRecord::Base
allow_nil: true }
scope :for_groups, -> { where(source_type: 'Namespace') }
scope :for_projects, -> { where(source_type: 'Project') }
# Exclude projects not included by the Project model's default scope (those that are
# pending delete).
#
scope :for_projects, -> do
includes(:project).references(:projects).where(source_type: 'Project').where.not(projects: { id: nil })
end
EMAIL_EVENTS = [
:new_note,

View File

@ -0,0 +1,8 @@
FactoryGirl.define do
factory :notification_setting do
source factory: :empty_project
user
level 3
events []
end
end

View File

@ -38,4 +38,21 @@ RSpec.describe NotificationSetting, type: :model do
end
end
end
describe '#for_projects' do
let(:user) { create(:user) }
before do
1.upto(4) do |i|
setting = create(:notification_setting, user: user)
setting.project.update_attributes(pending_delete: true) if i.even?
end
end
it 'excludes projects pending delete' do
expect(user.notification_settings.for_projects).to all(have_attributes(project: an_instance_of(Project)))
expect(user.notification_settings.for_projects.map(&:project)).to all(have_attributes(pending_delete: false))
end
end
end