diff --git a/ee/app/models/ee/epic.rb b/ee/app/models/ee/epic.rb index 1d9964325d0bc41aa5ca185a06cdd2315b8e4d24..b1b6ea2413e2594dc68cf20722c490fd521e762b 100644 --- a/ee/app/models/ee/epic.rb +++ b/ee/app/models/ee/epic.rb @@ -112,6 +112,7 @@ module Epic end scope :with_work_item, -> { preload(:work_item) } + scope :has_work_item, -> { where.not(issue_id: nil) } scope :within_timeframe, -> (start_date, end_date) do epics = ::Epic.arel_table diff --git a/ee/lib/ee/gitlab/event_store.rb b/ee/lib/ee/gitlab/event_store.rb index 621c78a0262f171f872bc5e4d2de4e7af5ad7a6e..e2caa889043e0b7b81f40d4e0f72c4c0117fc095 100644 --- a/ee/lib/ee/gitlab/event_store.rb +++ b/ee/lib/ee/gitlab/event_store.rb @@ -78,12 +78,14 @@ def subscribe_to_epic_events(store) store.subscribe ::WorkItems::ValidateEpicWorkItemSyncWorker, to: ::Epics::EpicCreatedEvent, if: ->(event) { - ::Feature.enabled?(:validate_epic_work_item_sync, ::Group.find_by_id(event.data[:group_id])) + ::Feature.enabled?(:validate_epic_work_item_sync, ::Group.actor_from_id(event.data[:group_id])) && + ::Epic.has_work_item.id_in(event.data[:id]).exists? } store.subscribe ::WorkItems::ValidateEpicWorkItemSyncWorker, to: ::Epics::EpicUpdatedEvent, if: ->(event) { - ::Feature.enabled?(:validate_epic_work_item_sync, ::Group.find_by_id(event.data[:group_id])) + ::Feature.enabled?(:validate_epic_work_item_sync, ::Group.actor_from_id(event.data[:group_id])) && + ::Epic.has_work_item.id_in(event.data[:id]).exists? } end end diff --git a/ee/spec/models/epic_spec.rb b/ee/spec/models/epic_spec.rb index e52443e86cecbb664079b97c978daf5b3882a2dc..71ae462c99c13472b74e1f294bbdcd291b581148 100644 --- a/ee/spec/models/epic_spec.rb +++ b/ee/spec/models/epic_spec.rb @@ -137,6 +137,15 @@ expect(described_class.from_id(epic2.id)).to match_array([epic2, epic3]) end end + + describe '.has_work_item' do + let_it_be(:epic_with_work_item) { create(:epic, :with_synced_work_item) } + let_it_be(:epic_without_work_item) { create(:epic) } + + it 'returns only epics with a work item' do + expect(described_class.has_work_item).to match_array([epic_with_work_item]) + end + end end describe 'validations' do diff --git a/ee/spec/workers/work_items/validate_epic_work_item_sync_worker_spec.rb b/ee/spec/workers/work_items/validate_epic_work_item_sync_worker_spec.rb index 4eaddebf6a2aafda17de9e4c3759c8b0adb525aa..f1a03f4dda437a78c89b38df66e7f33210f5c0e8 100644 --- a/ee/spec/workers/work_items/validate_epic_work_item_sync_worker_spec.rb +++ b/ee/spec/workers/work_items/validate_epic_work_item_sync_worker_spec.rb @@ -4,7 +4,7 @@ RSpec.describe WorkItems::ValidateEpicWorkItemSyncWorker, feature_category: :team_planning do let_it_be(:group) { create(:group) } - let_it_be_with_reload(:epic) { create(:epic, group: group) } + let_it_be_with_reload(:epic) { create(:epic, :with_synced_work_item, group: group) } let(:data) { { id: epic.id, group_id: group.id } } let(:epic_created_event) { Epics::EpicCreatedEvent.new(data: data) } @@ -39,6 +39,8 @@ end context 'when epic has no associated work item' do + let_it_be_with_reload(:epic) { create(:epic, group: group) } + it 'does not log anything or tries to create a diff' do expect(Gitlab::EpicWorkItemSync::Logger).not_to receive(:warn) expect(Gitlab::EpicWorkItemSync::Diff).not_to receive(:new)