diff --git a/ee/app/models/ee/epic.rb b/ee/app/models/ee/epic.rb index 5a257496bb27ea66ff2d6049cef52c25c52e5f5f..72ec0f28b0ca338f8b74aa42cb2129d9ed66aae1 100644 --- a/ee/app/models/ee/epic.rb +++ b/ee/app/models/ee/epic.rb @@ -738,7 +738,7 @@ def exportable_restricted_associations # To account for this mismatch we call this method on the updated epic to set the same updated_at value on the # work item while bypassing validations and callbacks def sync_work_item_updated_at - return unless work_item && group.epic_sync_to_work_item_enabled? + return unless work_item work_item.update_column(:updated_at, updated_at) end diff --git a/ee/app/models/ee/group.rb b/ee/app/models/ee/group.rb index f9a5e9060a439015a8f1e2404e5fa45108aa5370..4d1c081f5769c35cc581fa6ef1f62024246c87b3 100644 --- a/ee/app/models/ee/group.rb +++ b/ee/app/models/ee/group.rb @@ -251,18 +251,9 @@ def service_accounts provisioned_users.service_account end - def epic_sync_to_work_item_enabled? - ::Feature.enabled?(:sync_epic_to_work_item, self, type: :wip) - end - def work_item_sync_to_epic_enabled? ::Feature.enabled?(:sync_work_item_to_epic, self, type: :wip) end - - def sync_epic_work_item_order_enabled? - epic_sync_to_work_item_enabled? && - ::Feature.enabled?(:sync_epic_work_item_order, self, type: :gitlab_com_derisk) - end end override :supports_saved_replies? diff --git a/ee/app/services/concerns/epics/sync_as_work_item.rb b/ee/app/services/concerns/epics/sync_as_work_item.rb index f3e8087088d2623f1bb62a3e06235c47107e3eec..453afc27a6dd7b47a997893c7c9f1f0c3b295494 100644 --- a/ee/app/services/concerns/epics/sync_as_work_item.rb +++ b/ee/app/services/concerns/epics/sync_as_work_item.rb @@ -16,8 +16,6 @@ module SyncAsWorkItem def create_work_item_for!(epic) work_item = WorkItem.create!(create_params(epic)) - return work_item unless group.epic_sync_to_work_item_enabled? - sync_color(epic, work_item) sync_dates(epic, work_item) @@ -29,7 +27,6 @@ def create_work_item_for!(epic) end def update_work_item_for!(epic) - return true unless group.epic_sync_to_work_item_enabled? return true unless epic.work_item sync_color(epic, epic.work_item) diff --git a/ee/app/services/epic_issues/create_service.rb b/ee/app/services/epic_issues/create_service.rb index 104c349fd2dd7f01d9d7ea926cb1d5ca8e631660..d36f9563c044b3eb43aa935030a4256e81cc0265 100644 --- a/ee/app/services/epic_issues/create_service.rb +++ b/ee/app/services/epic_issues/create_service.rb @@ -91,7 +91,7 @@ def schedule_new_link_worker(link, referenced_issue, params) def sync_work_item_link!(epic_issue_link) return if synced_epic - if issuable.group.epic_sync_to_work_item_enabled? && issuable.work_item + if issuable.work_item create_synced_work_item_link!(epic_issue_link) else delete_synced_work_item_link!(epic_issue_link) diff --git a/ee/app/services/epics/close_service.rb b/ee/app/services/epics/close_service.rb index ce9f943f0a542e24f2ee6ee5744b70d848e063f6..2a879157f2a89bde7712189988ea615b9164c4ba 100644 --- a/ee/app/services/epics/close_service.rb +++ b/ee/app/services/epics/close_service.rb @@ -11,7 +11,7 @@ def execute(epic) private def close_epic(epic) - work_item = epic.work_item if epic.group.epic_sync_to_work_item_enabled? && epic.work_item + work_item = epic.work_item if epic.work_item ApplicationRecord.transaction do epic.close! diff --git a/ee/app/services/epics/epic_links/create_service.rb b/ee/app/services/epics/epic_links/create_service.rb index 8d3961d4489bfef05edfe17791857ac04168b806..c69763476e56f7d928bc3dba1f463291ced1e764 100644 --- a/ee/app/services/epics/epic_links/create_service.rb +++ b/ee/app/services/epics/epic_links/create_service.rb @@ -126,7 +126,7 @@ def can_link_epic?(epic) end def create_synced_work_item_link!(child_epic) - return true unless !params[:synced_epic] && issuable.group.epic_sync_to_work_item_enabled? + return true if params[:synced_epic] return true unless issuable.work_item && child_epic.work_item response = ::WorkItems::ParentLinks::CreateService diff --git a/ee/app/services/epics/epic_links/update_service.rb b/ee/app/services/epics/epic_links/update_service.rb index 89e63c47db4c0ff1caac212d2a2158b53079c4fc..8636eb2ccef4111586c4c7081cfd308f37d09a1e 100644 --- a/ee/app/services/epics/epic_links/update_service.rb +++ b/ee/app/services/epics/epic_links/update_service.rb @@ -61,7 +61,7 @@ def sync_work_items_relative_position!(before_epic, after_epic, epic) end def sync_work_item_parent_links?(epic, before_epic, after_epic) - return false unless epic.parent.group.sync_epic_work_item_order_enabled? && epic.work_item&.parent_link.present? + return false unless epic.work_item&.parent_link.present? return false if after_epic && after_epic.work_item&.parent_link.blank? return false if before_epic && before_epic.work_item&.parent_link.blank? diff --git a/ee/app/services/epics/issue_promote_service.rb b/ee/app/services/epics/issue_promote_service.rb index 6bcf89827797bb567379ecd3684e90ac7eead617..0bb026d1b5fe76afd1faebc6388cc04ed9711b1b 100644 --- a/ee/app/services/epics/issue_promote_service.rb +++ b/ee/app/services/epics/issue_promote_service.rb @@ -54,7 +54,6 @@ def update_old_entity def update_new_entity_description super - return unless parent_group.epic_sync_to_work_item_enabled? return unless new_entity.work_item new_entity.work_item.update!(description: new_entity.description, description_html: new_entity.description_html) diff --git a/ee/app/services/epics/related_epic_links/create_service.rb b/ee/app/services/epics/related_epic_links/create_service.rb index 93324c0dad5de59e1b98bcbc8fbc0860c4d57c0f..413e721c85bd53674b9ba553a150cd3880b887cb 100644 --- a/ee/app/services/epics/related_epic_links/create_service.rb +++ b/ee/app/services/epics/related_epic_links/create_service.rb @@ -80,9 +80,7 @@ def create_synced_work_item_links! end def sync_to_work_item? - !params[:synced_epic] && - issuable.group.epic_sync_to_work_item_enabled? && - issuable.work_item && referenced_issuables.any?(&:issue_id) + !params[:synced_epic] && issuable.work_item && referenced_issuables.any?(&:issue_id) end def referenced_synced_work_items diff --git a/ee/app/services/epics/reopen_service.rb b/ee/app/services/epics/reopen_service.rb index 1819edf986ed4ad0a9c26298601fcb0f5f67faef..9a393c7bbf9cc19d34eb76af18721ba39a32e2c7 100644 --- a/ee/app/services/epics/reopen_service.rb +++ b/ee/app/services/epics/reopen_service.rb @@ -11,7 +11,7 @@ def execute(epic) private def reopen_epic(epic) - work_item = epic.work_item if epic.group.epic_sync_to_work_item_enabled? && epic.work_item + work_item = epic.work_item if epic.work_item ApplicationRecord.transaction do epic.reopen! diff --git a/ee/app/services/epics/strategies/base_dates_strategy.rb b/ee/app/services/epics/strategies/base_dates_strategy.rb index 4cd79fce313e3dcd1a7ad1a16abcb66939823630..48994b935d2585a51d5b6b13b4bbc89fc3896e4b 100644 --- a/ee/app/services/epics/strategies/base_dates_strategy.rb +++ b/ee/app/services/epics/strategies/base_dates_strategy.rb @@ -16,8 +16,6 @@ def source_milestones_query # rubocop: enable CodeReuse/ActiveRecord def update_epic_work_items(epics) - return unless Feature.enabled?(:sync_epic_to_work_item_dates) - work_items_dates = build_work_items_date_sources(epics) return if work_items_dates.blank? diff --git a/ee/app/services/epics/tree_reorder_service.rb b/ee/app/services/epics/tree_reorder_service.rb index fb8be47b8e1e999e27c3c500e4b8a94da3dbe13f..191fd93f690913b64746d02753c5fc0b44eafa94 100644 --- a/ee/app/services/epics/tree_reorder_service.rb +++ b/ee/app/services/epics/tree_reorder_service.rb @@ -194,7 +194,6 @@ def find_object(id) end def sync_move_to_work_item! - return unless Feature.enabled?(:sync_epic_work_item_order, base_epic.group) return if new_parent_has_no_adjacent_item? || not_all_items_have_a_work_item? result = WorkItems::ParentLinks::ReorderService.new(work_item_parent, current_user, diff --git a/ee/config/feature_flags/gitlab_com_derisk/sync_epic_to_work_item_dates.yml b/ee/config/feature_flags/gitlab_com_derisk/sync_epic_to_work_item_dates.yml deleted file mode 100644 index 2cb5af3a5d20b707ada2e5dfd226067211f8a4be..0000000000000000000000000000000000000000 --- a/ee/config/feature_flags/gitlab_com_derisk/sync_epic_to_work_item_dates.yml +++ /dev/null @@ -1,9 +0,0 @@ ---- -name: sync_epic_to_work_item_dates -feature_issue_url: -introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/149590 -rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/456979 -milestone: '17.0' -group: group::product planning -type: gitlab_com_derisk -default_enabled: false diff --git a/ee/config/feature_flags/gitlab_com_derisk/sync_epic_work_item_order.yml b/ee/config/feature_flags/gitlab_com_derisk/sync_epic_work_item_order.yml deleted file mode 100644 index e8b228b5e078f40c49216967f507725cc1a0b5fe..0000000000000000000000000000000000000000 --- a/ee/config/feature_flags/gitlab_com_derisk/sync_epic_work_item_order.yml +++ /dev/null @@ -1,9 +0,0 @@ ---- -name: sync_epic_work_item_order -feature_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/441273 -introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/147059 -rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/449044 -milestone: '16.11' -group: group::product planning -type: gitlab_com_derisk -default_enabled: false diff --git a/ee/config/feature_flags/wip/sync_epic_to_work_item.yml b/ee/config/feature_flags/wip/sync_epic_to_work_item.yml deleted file mode 100644 index cf3f6455b7e00f651e48f62c7284cb78100959e8..0000000000000000000000000000000000000000 --- a/ee/config/feature_flags/wip/sync_epic_to_work_item.yml +++ /dev/null @@ -1,9 +0,0 @@ ---- -name: sync_epic_to_work_item -feature_issue_url: -introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/140232 -rollout_issue_url: -milestone: '16.9' -group: group::product planning -type: wip -default_enabled: false diff --git a/ee/spec/models/ee/group_spec.rb b/ee/spec/models/ee/group_spec.rb index 7abca7ba9c1d171ebb87567fa5cee06c1c8089f8..fa1d4a25d76aa875fb562eea692b3c0b53f939db 100644 --- a/ee/spec/models/ee/group_spec.rb +++ b/ee/spec/models/ee/group_spec.rb @@ -3566,20 +3566,6 @@ def webhook_headers end end - describe '#epic_sync_to_work_item_enabled?' do - subject { group.epic_sync_to_work_item_enabled? } - - it { is_expected.to be true } - - context 'when feature flag is disabled' do - before do - stub_feature_flags(sync_epic_to_work_item: false) - end - - it { is_expected.to be false } - end - end - describe '#work_item_sync_to_epic_enabled?' do subject { group.work_item_sync_to_epic_enabled? } diff --git a/ee/spec/models/epic_spec.rb b/ee/spec/models/epic_spec.rb index 81c068fb1376836316d97f93a89cfaee1157473c..a1dccee5f4fffb8a079888e1c68de4136eb798ae 100644 --- a/ee/spec/models/epic_spec.rb +++ b/ee/spec/models/epic_spec.rb @@ -1582,17 +1582,5 @@ def as_item(item) epic.sync_work_item_updated_at end - - context 'when sync_epic_to_work_item feature flag is disabled' do - before do - stub_feature_flags(sync_epic_to_work_item: false) - end - - it 'does not update the updated_at column on the work item' do - expect(epic.work_item).not_to receive(:update_column) - - epic.sync_work_item_updated_at - end - end end end diff --git a/ee/spec/services/ee/work_items/related_work_item_links/create_service_spec.rb b/ee/spec/services/ee/work_items/related_work_item_links/create_service_spec.rb index fcd721598f0f98ecb3ca7e71ebf6a10420f3a37b..50b430023105458d5e169cb7931289b885d0b9fa 100644 --- a/ee/spec/services/ee/work_items/related_work_item_links/create_service_spec.rb +++ b/ee/spec/services/ee/work_items/related_work_item_links/create_service_spec.rb @@ -158,7 +158,7 @@ ) end - context 'when sync_epic_to_work_item feature flag is disabled' do + context 'when sync_work_item_to_epic feature flag is disabled' do before do stub_feature_flags(sync_work_item_to_epic: false) end diff --git a/ee/spec/services/epic_issues/create_service_spec.rb b/ee/spec/services/epic_issues/create_service_spec.rb index 87cf40194ed06f39de693f0d451af09b790255fb..ff41fe5d9fe91f69ee1fc443fa29c55f9769fca6 100644 --- a/ee/spec/services/epic_issues/create_service_spec.rb +++ b/ee/spec/services/epic_issues/create_service_spec.rb @@ -256,15 +256,6 @@ def assign_issue(references) expect(issue.reload.epic).to eq(another_epic) expect(WorkItem.find(issue.id).work_item_parent).to eq(another_epic.work_item) end - - context 'when :sync_epic_to_work_item FF is disabled' do - it 'deletes old parent link' do - stub_feature_flags(sync_epic_to_work_item: false) - - expect { subject }.to change { WorkItems::ParentLink.count }.by(-1) - expect(WorkItems::ParentLink.where(work_item_id: issue.id)).to be_empty - end - end end context 'and new parent does not have associated work item' do @@ -335,20 +326,6 @@ def assign_issue(references) end end - context 'when sync_epic_to_work_item feature flag is disabled' do - before do - stub_feature_flags(sync_epic_to_work_item: false) - end - - it 'create relationship only for the epic' do - expect { subject }.to change { EpicIssue.count }.by(1) - .and(not_change { WorkItems::ParentLink.count }) - - expect(created_link).to have_attributes(epic: epic) - expect(epic.work_item.child_links).to be_empty - end - end - context 'when synced_epic parameter is true' do let(:params) { { issuable_references: [valid_reference], synced_epic: true } } diff --git a/ee/spec/services/epic_issues/destroy_service_spec.rb b/ee/spec/services/epic_issues/destroy_service_spec.rb index 7b0fcec907f79c95f5d7a801da91fb7e18772505..0c057157530fd8cfc853c7cc0535c6b7fe0de585 100644 --- a/ee/spec/services/epic_issues/destroy_service_spec.rb +++ b/ee/spec/services/epic_issues/destroy_service_spec.rb @@ -151,17 +151,6 @@ expect(epic.reload.updated_at).to eq(epic.work_item.updated_at) end - context 'when feature flag is disabled' do - before do - stub_feature_flags(sync_epic_to_work_item: false) - end - - it 'removes the epic and work item link' do - expect { subject }.to change { EpicIssue.count }.by(-1) - .and(change { WorkItems::ParentLink.count }.by(-1)) - end - end - it_behaves_like 'removes relationship with the issue' do let(:issue) { child_issue } end diff --git a/ee/spec/services/epics/close_service_spec.rb b/ee/spec/services/epics/close_service_spec.rb index 9e2921af080b1b2910e1145c6f00c041381f141b..f76ff6f2fefa02fff4386e19a5a072240e75aa37 100644 --- a/ee/spec/services/epics/close_service_spec.rb +++ b/ee/spec/services/epics/close_service_spec.rb @@ -85,19 +85,6 @@ expect(epic.reload.state).to eq('opened') end end - - context 'when feature flag is disabled' do - before do - stub_feature_flags(sync_epic_to_work_item: false) - end - - it 'does not change the work item' do - subject - - expect(epic.reload.state).to eq('closed') - expect(work_item.reload.state).to eq('opened') - end - end end it 'creates a resource state event' do diff --git a/ee/spec/services/epics/epic_links/create_service_spec.rb b/ee/spec/services/epics/epic_links/create_service_spec.rb index eee6a30872d525dd9c5d01eed49c2c72310b6361..46d57c6d78b9e01e92fa65d2e7f82dca234c316a 100644 --- a/ee/spec/services/epics/epic_links/create_service_spec.rb +++ b/ee/spec/services/epics/epic_links/create_service_spec.rb @@ -687,20 +687,6 @@ def add_epic(references) it_behaves_like 'rollback changes when creation fails' end - context 'when sync_epic_to_work_item feature flag is disabled' do - before do - stub_feature_flags(sync_epic_to_work_item: false) - end - - it 'create relationship only for the epic' do - expect { create_link }.to change { parent_epic.children.count }.by(1) - .and(not_change { WorkItems::ParentLink.count }) - - expect(parent_epic.reload.children).to include(child_epic) - expect(parent_work_item.reload.work_item_children).to be_empty - end - end - context 'when synced_epic parameter is true' do let(:synced_epic_param) { true } diff --git a/ee/spec/services/epics/epic_links/destroy_service_spec.rb b/ee/spec/services/epics/epic_links/destroy_service_spec.rb index e4a7a8449699fd7760b075410610be39ab6453d3..46dfa6cf89af872b4bf43cd4d43c92c294a855b0 100644 --- a/ee/spec/services/epics/epic_links/destroy_service_spec.rb +++ b/ee/spec/services/epics/epic_links/destroy_service_spec.rb @@ -224,20 +224,6 @@ def remove_epic_relation(child_epic) end end - context 'when sync_epic_to_work_item feature flag is disabled' do - before do - stub_feature_flags(sync_epic_to_work_item: false) - end - - it 'removes epic relationship and destroy work item parent link' do - expect { remove_epic_relation(child_epic) }.to change { parent_epic.children.count }.by(-1) - .and(change { WorkItems::ParentLink.count }.by(-1)) - - expect(parent_epic.reload.children).not_to include(child_epic) - expect(parent.reload.work_item_children).not_to include(child) - end - end - context 'when synced_epic argument is true' do subject(:destroy_link) { described_class.new(child_epic, user, synced_epic: true).execute } diff --git a/ee/spec/services/epics/epic_links/update_service_spec.rb b/ee/spec/services/epics/epic_links/update_service_spec.rb index cdb131e41a8a1f3c24b00e85dad5be70395bf2d4..24d5f10fa8792cd593523a63ee9c47b3a0823ef7 100644 --- a/ee/spec/services/epics/epic_links/update_service_spec.rb +++ b/ee/spec/services/epics/epic_links/update_service_spec.rb @@ -197,22 +197,6 @@ def create_child_epic(relative_position) end end - context 'when sync_epic_to_work_item feature flag is disabled' do - before do - stub_feature_flags(sync_epic_to_work_item: false) - end - - it_behaves_like 'reordering without syncing relative positions' - end - - context 'when sync_epic_work_item_order feature flag is disabled' do - before do - stub_feature_flags(sync_epic_work_item_order: false) - end - - it_behaves_like 'reordering without syncing relative positions' - end - context 'when moving child does not have a synced work item parent link' do before do WorkItems::ParentLink.where(work_item_id: epic_to_move.issue_id).delete_all diff --git a/ee/spec/services/epics/related_epic_links/create_service_spec.rb b/ee/spec/services/epics/related_epic_links/create_service_spec.rb index 2d26db7990e9bac9e429755e750eb7ef05f11ef0..a055f135be8b4c13694f6b1456c45e72a5fa03ca 100644 --- a/ee/spec/services/epics/related_epic_links/create_service_spec.rb +++ b/ee/spec/services/epics/related_epic_links/create_service_spec.rb @@ -129,149 +129,135 @@ let_it_be(:epic_a) { create(:epic, :with_synced_work_item, group: group) } let_it_be(:epic_b) { create(:epic, :with_synced_work_item, group: group) } - context 'when feature flag is disabled' do - before do - stub_feature_flags(sync_epic_to_work_item: false) - end - - it_behaves_like 'only creates an epic link' + it_behaves_like 'syncs all data from an epic to a work item' do + let(:epic) { epic_a } end - context 'when feature flag is enabled' do - before do - stub_feature_flags(sync_epic_to_work_item: group) - end - - it_behaves_like 'syncs all data from an epic to a work item' do - let(:epic) { epic_a } - end + it 'creates a link for the epics and the synced work item' do + expect { execute }.to change { Epic::RelatedEpicLink.count }.by(1) + .and change { WorkItems::RelatedWorkItemLink.count }.by(1) - it 'creates a link for the epics and the synced work item' do - expect { execute }.to change { Epic::RelatedEpicLink.count }.by(1) - .and change { WorkItems::RelatedWorkItemLink.count }.by(1) + expect(WorkItems::RelatedWorkItemLink.find_by!(target: epic_b.work_item)) + .to have_attributes(source: epic_a.work_item, link_type: IssuableLink::TYPE_RELATES_TO) - expect(WorkItems::RelatedWorkItemLink.find_by!(target: epic_b.work_item)) - .to have_attributes(source: epic_a.work_item, link_type: IssuableLink::TYPE_RELATES_TO) - - expect(epic_a.reload.updated_at).to eq(epic_a.work_item.updated_at) - expect(epic_b.reload.updated_at).to eq(epic_b.work_item.updated_at) - end + expect(epic_a.reload.updated_at).to eq(epic_a.work_item.updated_at) + expect(epic_b.reload.updated_at).to eq(epic_b.work_item.updated_at) + end - context 'when synced_epic parameter is true' do - let(:params) { { issuable_references: [epic_b.to_reference(full: true)], link_type: IssuableLink::TYPE_BLOCKS, synced_epic: true } } + context 'when synced_epic parameter is true' do + let(:params) { { issuable_references: [epic_b.to_reference(full: true)], link_type: IssuableLink::TYPE_BLOCKS, synced_epic: true } } - it 'does not try to create a synced work item link' do - expect(WorkItems::RelatedWorkItemLinks::CreateService).not_to receive(:new) + it 'does not try to create a synced work item link' do + expect(WorkItems::RelatedWorkItemLinks::CreateService).not_to receive(:new) - execute - end + execute + end - it 'bypasses permission checks' do - new_user = create(:user) - service = described_class.new(epic_a, new_user, params) + it 'bypasses permission checks' do + new_user = create(:user) + service = described_class.new(epic_a, new_user, params) - expect { service.execute }.to change { Epic::RelatedEpicLink.count }.by(1) - .and not_change { WorkItems::RelatedWorkItemLink.count } - end + expect { service.execute }.to change { Epic::RelatedEpicLink.count }.by(1) + .and not_change { WorkItems::RelatedWorkItemLink.count } end + end - context 'when link type is blocking' do - let(:params) { { issuable_references: [epic_b.to_reference(full: true)], link_type: IssuableLink::TYPE_BLOCKS } } + context 'when link type is blocking' do + let(:params) { { issuable_references: [epic_b.to_reference(full: true)], link_type: IssuableLink::TYPE_BLOCKS } } - it 'creates a blocking link' do - execute + it 'creates a blocking link' do + execute - expect(WorkItems::RelatedWorkItemLink.find_by!(target: epic_b.work_item)) - .to have_attributes(source: epic_a.work_item, link_type: IssuableLink::TYPE_BLOCKS) - end + expect(WorkItems::RelatedWorkItemLink.find_by!(target: epic_b.work_item)) + .to have_attributes(source: epic_a.work_item, link_type: IssuableLink::TYPE_BLOCKS) end + end - context 'when link type is blocked by' do - let(:params) { { issuable_references: [epic_b.to_reference(full: true)], link_type: IssuableLink::TYPE_IS_BLOCKED_BY } } + context 'when link type is blocked by' do + let(:params) { { issuable_references: [epic_b.to_reference(full: true)], link_type: IssuableLink::TYPE_IS_BLOCKED_BY } } - it 'creates a blocking link' do - execute + it 'creates a blocking link' do + execute - expect(WorkItems::RelatedWorkItemLink.find_by!(target: epic_a.work_item)) - .to have_attributes(source: epic_b.work_item, link_type: IssuableLink::TYPE_BLOCKS) - end + expect(WorkItems::RelatedWorkItemLink.find_by!(target: epic_a.work_item)) + .to have_attributes(source: epic_b.work_item, link_type: IssuableLink::TYPE_BLOCKS) end + end - context 'when multiple epics are referenced' do - let_it_be(:epic_c) { create(:epic, :with_synced_work_item, group: group) } + context 'when multiple epics are referenced' do + let_it_be(:epic_c) { create(:epic, :with_synced_work_item, group: group) } - let(:params) { { issuable_references: [epic_b.to_reference(full: true), epic_c.to_reference(full: true)] } } + let(:params) { { issuable_references: [epic_b.to_reference(full: true), epic_c.to_reference(full: true)] } } - it 'creates a link for the epics and the synced work item' do - expect { execute }.to change { Epic::RelatedEpicLink.count }.by(2) - .and change { WorkItems::RelatedWorkItemLink.count }.by(2) + it 'creates a link for the epics and the synced work item' do + expect { execute }.to change { Epic::RelatedEpicLink.count }.by(2) + .and change { WorkItems::RelatedWorkItemLink.count }.by(2) - expect(WorkItems::RelatedWorkItemLink.where(source: epic_a.work_item)).to include( - an_object_having_attributes(target: epic_b.work_item, link_type: IssuableLink::TYPE_RELATES_TO), - an_object_having_attributes(target: epic_c.work_item, link_type: IssuableLink::TYPE_RELATES_TO) - ) - end + expect(WorkItems::RelatedWorkItemLink.where(source: epic_a.work_item)).to include( + an_object_having_attributes(target: epic_b.work_item, link_type: IssuableLink::TYPE_RELATES_TO), + an_object_having_attributes(target: epic_c.work_item, link_type: IssuableLink::TYPE_RELATES_TO) + ) + end - context 'when epic does not have a synced work item' do - let_it_be(:epic_c) { create(:epic, :without_synced_work_item, group: group) } + context 'when epic does not have a synced work item' do + let_it_be(:epic_c) { create(:epic, :without_synced_work_item, group: group) } - it 'does create related work item links for the rest' do - expect { execute }.to change { Epic::RelatedEpicLink.count }.by(2) - .and change { WorkItems::RelatedWorkItemLink.count }.by(1) - end + it 'does create related work item links for the rest' do + expect { execute }.to change { Epic::RelatedEpicLink.count }.by(2) + .and change { WorkItems::RelatedWorkItemLink.count }.by(1) end end + end - context 'when creating related work item links fails' do - before do - allow_next_instance_of(WorkItems::RelatedWorkItemLinks::CreateService) do |instance| - allow(instance).to receive(:execute).and_return({ status: :error, message: "Some error" }) - end + context 'when creating related work item links fails' do + before do + allow_next_instance_of(WorkItems::RelatedWorkItemLinks::CreateService) do |instance| + allow(instance).to receive(:execute).and_return({ status: :error, message: "Some error" }) end + end - it 'does not create an epic link nor a work item link' do - expect(Gitlab::EpicWorkItemSync::Logger).to receive(:error) - .with({ - message: "Not able to create work item links", - error_message: "Some error", - group_id: group.id, - epic_id: epic_a.id - }) - - expect(Gitlab::ErrorTracking).to receive(:track_exception).with( - instance_of(Epics::SyncAsWorkItem::SyncAsWorkItemError), - { epic_id: epic_a.id } - ) - - expect { execute }.to not_change { Epic::RelatedEpicLink.count } - .and not_change { WorkItems::RelatedWorkItemLink.count } - end + it 'does not create an epic link nor a work item link' do + expect(Gitlab::EpicWorkItemSync::Logger).to receive(:error) + .with({ + message: "Not able to create work item links", + error_message: "Some error", + group_id: group.id, + epic_id: epic_a.id + }) + + expect(Gitlab::ErrorTracking).to receive(:track_exception).with( + instance_of(Epics::SyncAsWorkItem::SyncAsWorkItemError), + { epic_id: epic_a.id } + ) + + expect { execute }.to not_change { Epic::RelatedEpicLink.count } + .and not_change { WorkItems::RelatedWorkItemLink.count } + end - it 'returns an error' do - expect(execute) - .to eq({ status: :error, message: "Couldn't create link due to an internal error.", http_status: 422 }) - end + it 'returns an error' do + expect(execute) + .to eq({ status: :error, message: "Couldn't create link due to an internal error.", http_status: 422 }) end + end - context 'when creating related epic link fails' do - before do - allow_next_instance_of(Epic::RelatedEpicLink) do |instance| - allow(instance).to receive(:save).and_return(false) + context 'when creating related epic link fails' do + before do + allow_next_instance_of(Epic::RelatedEpicLink) do |instance| + allow(instance).to receive(:save).and_return(false) - errors = ActiveModel::Errors.new(instance).tap { |e| e.add(:source, 'error message') } - allow(instance).to receive(:errors).and_return(errors) - end + errors = ActiveModel::Errors.new(instance).tap { |e| e.add(:source, 'error message') } + allow(instance).to receive(:errors).and_return(errors) end + end - it 'does not create relationship', :aggregate_failures do - error_message = "#{epic_b.to_reference} cannot be added: error message" - service_result = execute + it 'does not create relationship', :aggregate_failures do + error_message = "#{epic_b.to_reference} cannot be added: error message" + service_result = execute - expect { service_result }.to not_change { Epic::RelatedEpicLink.count } - .and not_change { WorkItems::RelatedWorkItemLink.count } + expect { service_result }.to not_change { Epic::RelatedEpicLink.count } + .and not_change { WorkItems::RelatedWorkItemLink.count } - expect(service_result).to eq(message: error_message, status: :error, http_status: 422) - end + expect(service_result).to eq(message: error_message, status: :error, http_status: 422) end end end diff --git a/ee/spec/services/epics/related_epic_links/destroy_service_spec.rb b/ee/spec/services/epics/related_epic_links/destroy_service_spec.rb index 63106a16bfe2e8c3ceae2e58f28e290336d015a6..9c2aee77424f65ebc2d3b2e34af02d75721a7f0a 100644 --- a/ee/spec/services/epics/related_epic_links/destroy_service_spec.rb +++ b/ee/spec/services/epics/related_epic_links/destroy_service_spec.rb @@ -32,96 +32,79 @@ let(:epic) { source } end - context 'when feature flag is disabled' do - before do - stub_feature_flags(sync_epic_to_work_item: false) - end - - it 'removes the epic and the work item relation' do + context 'when epic is the source' do + it 'removes the epic and the work item relation and does not create system notes' do expect { subject }.to change { issuable_link.class.count }.by(-1) - .and change { WorkItems::RelatedWorkItemLink.count }.by(-1) + .and change { WorkItems::RelatedWorkItemLink.count }.by(-1) + + expect(source.reload.work_item.notes).to be_empty + expect(target.reload.work_item.notes).to be_empty + expect(source.updated_at).to eq(source.work_item.updated_at) + expect(target.updated_at).to eq(target.work_item.updated_at) end end - context 'when feature flag is enabled' do - before do - stub_feature_flags(sync_epic_to_work_item: group) - end + context 'when epic is the target' do + subject(:execute) { described_class.new(issuable_link, issuable_link.target, user).execute } - context 'when epic is the source' do - it 'removes the epic and the work item relation and does not create system notes' do - expect { subject }.to change { issuable_link.class.count }.by(-1) - .and change { WorkItems::RelatedWorkItemLink.count }.by(-1) + it 'removes the epic and the work item relation and does not create system notes' do + expect { subject }.to change { issuable_link.class.count }.by(-1) + .and change { WorkItems::RelatedWorkItemLink.count }.by(-1) - expect(source.reload.work_item.notes).to be_empty - expect(target.reload.work_item.notes).to be_empty - expect(source.updated_at).to eq(source.work_item.updated_at) - expect(target.updated_at).to eq(target.work_item.updated_at) - end + expect(source.reload.work_item.notes).to be_empty + expect(target.reload.work_item.notes).to be_empty end + end - context 'when epic is the target' do - subject(:execute) { described_class.new(issuable_link, issuable_link.target, user).execute } - - it 'removes the epic and the work item relation and does not create system notes' do - expect { subject }.to change { issuable_link.class.count }.by(-1) - .and change { WorkItems::RelatedWorkItemLink.count }.by(-1) + context 'when the source has no synced work item' do + let_it_be_with_reload(:source) { create(:epic, :without_synced_work_item, group: group) } + let_it_be_with_refind(:issuable_link) { create(:related_epic_link, source: source, target: target) } - expect(source.reload.work_item.notes).to be_empty - expect(target.reload.work_item.notes).to be_empty - end + it 'removes the epic but not the work item relation' do + expect { subject }.to change { issuable_link.class.count }.by(-1) + .and not_change { WorkItems::RelatedWorkItemLink.count } end + end - context 'when the source has no synced work item' do - let_it_be_with_reload(:source) { create(:epic, :without_synced_work_item, group: group) } - let_it_be_with_refind(:issuable_link) { create(:related_epic_link, source: source, target: target) } + context 'when the target has no synced work item' do + let_it_be_with_reload(:target) { create(:epic, :without_synced_work_item, group: group) } + let_it_be_with_refind(:issuable_link) { create(:related_epic_link, source: source, target: target) } - it 'removes the epic but not the work item relation' do - expect { subject }.to change { issuable_link.class.count }.by(-1) - .and not_change { WorkItems::RelatedWorkItemLink.count } - end + it 'removes the epic but not the work item relation' do + expect { subject }.to change { issuable_link.class.count }.by(-1) + .and not_change { WorkItems::RelatedWorkItemLink.count } end + end - context 'when the target has no synced work item' do - let_it_be_with_reload(:target) { create(:epic, :without_synced_work_item, group: group) } - let_it_be_with_refind(:issuable_link) { create(:related_epic_link, source: source, target: target) } - - it 'removes the epic but not the work item relation' do - expect { subject }.to change { issuable_link.class.count }.by(-1) - .and not_change { WorkItems::RelatedWorkItemLink.count } + context 'when destroying the work item link fails' do + before do + allow_next_instance_of(WorkItems::RelatedWorkItemLinks::DestroyService) do |instance| + allow(instance).to receive(:execute).and_return({ status: :error, message: "Some error" }) end end - context 'when destroying the work item link fails' do - before do - allow_next_instance_of(WorkItems::RelatedWorkItemLinks::DestroyService) do |instance| - allow(instance).to receive(:execute).and_return({ status: :error, message: "Some error" }) - end - end + it 'does not create an epic link nor a work item link', :aggregate_failures do + expect(Gitlab::EpicWorkItemSync::Logger).to receive(:error) + .with({ + message: "Not able to destroy work item links", + error_message: "Some error", + group_id: group.id, + source_id: source.id, + target_id: target.id + }) - it 'does not create an epic link nor a work item link', :aggregate_failures do - expect(Gitlab::EpicWorkItemSync::Logger).to receive(:error) - .with({ - message: "Not able to destroy work item links", - error_message: "Some error", - group_id: group.id, - source_id: source.id, - target_id: target.id - }) - - expect(Gitlab::ErrorTracking).to receive(:track_exception).with( - instance_of(Epics::SyncAsWorkItem::SyncAsWorkItemError), - { epic_id: source.id } - ) - - expect { execute }.to not_change { Epic::RelatedEpicLink.count } - .and not_change { WorkItems::RelatedWorkItemLink.count } - end + expect(Gitlab::ErrorTracking).to receive(:track_exception).with( + instance_of(Epics::SyncAsWorkItem::SyncAsWorkItemError), + { epic_id: source.id } + ) - it 'returns an error' do - expect(execute) - .to eq({ status: :error, message: "Couldn't delete link due to an internal error.", http_status: 422 }) - end + expect { execute }.to not_change { Epic::RelatedEpicLink.count } + .and not_change { WorkItems::RelatedWorkItemLink.count } + end + + it 'returns an error' do + expect(execute) + .to eq({ status: :error, message: "Couldn't delete link due to an internal error.", http_status: 422 }) end end end diff --git a/ee/spec/services/epics/reopen_service_spec.rb b/ee/spec/services/epics/reopen_service_spec.rb index 990783c8db9b34a4bf6872b44ef493e678df646b..f638576ffa74ee63478eeb2c7aa6cc2ae72af4d7 100644 --- a/ee/spec/services/epics/reopen_service_spec.rb +++ b/ee/spec/services/epics/reopen_service_spec.rb @@ -115,19 +115,6 @@ expect(epic.reload.state).to eq('closed') end end - - context 'when feature flag is disabled' do - before do - stub_feature_flags(sync_epic_to_work_item: false) - end - - it 'does not change the work item' do - subject - - expect(epic.reload.state).to eq('opened') - expect(work_item.reload.state).to eq('closed') - end - end end context 'when project bot it logs audit events' do diff --git a/ee/spec/services/epics/tree_reorder_service_spec.rb b/ee/spec/services/epics/tree_reorder_service_spec.rb index 656c3f53042d0a8fd50a69e92078443c1ecf6412..54522421f5fe5ec6a62ea3f5d80a9134ea7bc3f5 100644 --- a/ee/spec/services/epics/tree_reorder_service_spec.rb +++ b/ee/spec/services/epics/tree_reorder_service_spec.rb @@ -277,18 +277,6 @@ expect(new_parent.updated_at).to eq(new_parent.work_item.updated_at) end - context 'when feature flag is turned off' do - before do - stub_feature_flags(sync_epic_work_item_order: false) - end - - it 'only sets the new parent for the epic_issue' do - expect { subject }.to change { moving_epic_issue.reload.epic }.from(old_parent).to(new_parent) - expect { subject }.to not_change { moving_parent_link.reload.work_item_parent } - expect(subject[:status]).to eq(:success) - end - end - context 'when the new parent has no synced work item' do let_it_be_with_reload(:new_parent) { create(:epic, group: group) } @@ -812,19 +800,6 @@ end end - context 'when the feature flag is turned off' do - before do - stub_feature_flags(sync_epic_work_item_order: false) - end - - it 'only changes the position of the epics' do - expect { subject }.to change { moving_epic.reload.relative_position } - .and not_change { moving_object_parent_link.reload.relative_position } - - expect(subject[:status]).to eq(:success) - end - end - context 'when the moving epic has no correlating work item' do let_it_be_with_reload(:moving_epic) do create(:epic, group: group, parent: parent, relative_position: 20) diff --git a/ee/spec/services/epics/update_dates_service_spec.rb b/ee/spec/services/epics/update_dates_service_spec.rb index 0ace0935eeda0ba7433505b0e94e77aa77d69659..8b5bd9490b0dbaae6821877369977635c7d5c50c 100644 --- a/ee/spec/services/epics/update_dates_service_spec.rb +++ b/ee/spec/services/epics/update_dates_service_spec.rb @@ -58,18 +58,6 @@ end it_behaves_like 'syncs all data from an epic to a work item' - - context 'when sync_epic_to_work_item_dates is disabled' do - before do - stub_feature_flags(sync_epic_to_work_item_dates: false) - end - - it 'does not upsert WorkItems::DatesSource' do - expect(WorkItems::DatesSource).not_to receive(:upsert_all) - - described_class.new([epic]).execute - end - end end context 'without due date' do diff --git a/ee/spec/services/epics/update_service_spec.rb b/ee/spec/services/epics/update_service_spec.rb index c903be9580773ed9cd75257c8e7cbe6c5ced76d0..6f7ab26cde454bb225a65a84661bf2ce4012473f 100644 --- a/ee/spec/services/epics/update_service_spec.rb +++ b/ee/spec/services/epics/update_service_spec.rb @@ -965,16 +965,6 @@ def update_issuable(update_params) expect(work_item.reload.description).to eq('- [ ] Task') end end - - context 'when feature flag is disabled' do - before do - stub_feature_flags(sync_epic_to_work_item: false) - end - - it 'does not propagate changes' do - expect { subject }.to change { epic.reload.description }.and not_change { work_item.reload.description } - end - end end context 'when unchecking a task' do @@ -1002,16 +992,6 @@ def update_issuable(update_params) end end end - - context 'when feature flag is disabled' do - before do - stub_feature_flags(sync_epic_to_work_item: false) - end - - it 'does not propagate changes' do - expect { subject }.to change { epic.reload.title }.and not_change { work_item.reload.title } - end - end end context 'when changes are invalid', :aggregate_failures do diff --git a/ee/spec/services/work_items/parent_links/create_service_spec.rb b/ee/spec/services/work_items/parent_links/create_service_spec.rb index 5fa85e7177715ba00454ebe1b0c83e10dc6f7cfe..2afb5def1bcad59771cc686592ebcb76a3d4fb5f 100644 --- a/ee/spec/services/work_items/parent_links/create_service_spec.rb +++ b/ee/spec/services/work_items/parent_links/create_service_spec.rb @@ -206,7 +206,7 @@ .to eq("added #{parent_work_item.to_reference} as parent epic") end - context 'when sync_epic_to_work_item feature flag is disabled' do + context 'when sync_work_item_to_epic feature flag is disabled' do before do stub_feature_flags(sync_work_item_to_epic: false) end @@ -320,7 +320,7 @@ expect(child_work_item.notes.last.note).to eq("added #{parent_work_item.to_reference} as parent epic") end - context 'when sync_epic_to_work_item feature flag is disabled' do + context 'when sync_work_item_to_epic feature flag is disabled' do before do stub_feature_flags(sync_work_item_to_epic: false) end