Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/spec
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2023-08-18 03:08:53 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2023-08-18 03:08:53 +0300
commit9214cac69b0f0306a86056720cfc62b738449c19 (patch)
tree79c6fdbc2c8b379dd908294faa54c3fa2ab97551 /spec
parent13d851c795a48b670b859a7ec5bd6e2886d2789e (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec')
-rw-r--r--spec/controllers/groups/labels_controller_spec.rb31
-rw-r--r--spec/controllers/projects/labels_controller_spec.rb31
-rw-r--r--spec/features/dashboard/shortcuts_spec.rb1
-rw-r--r--spec/features/groups/labels/create_spec.rb6
-rw-r--r--spec/features/groups/labels/edit_spec.rb14
-rw-r--r--spec/features/projects/ci/editor_spec.rb2
-rw-r--r--spec/features/projects/labels/user_creates_labels_spec.rb2
-rw-r--r--spec/features/projects/labels/user_edits_labels_spec.rb25
-rw-r--r--spec/finders/packages/nuget/package_finder_spec.rb10
-rw-r--r--spec/frontend/groups/components/empty_states/groups_dashboard_empty_state_spec.js29
-rw-r--r--spec/frontend/groups/components/empty_states/groups_explore_empty_state_spec.js27
-rw-r--r--spec/frontend/projects/commit/components/form_modal_spec.js9
-rw-r--r--spec/frontend/vue_shared/components/markdown/comment_templates_dropdown_spec.js35
-rw-r--r--spec/helpers/issuables_helper_spec.rb145
-rw-r--r--spec/helpers/issues_helper_spec.rb75
-rw-r--r--spec/models/packages/nuget/metadatum_spec.rb23
-rw-r--r--spec/services/labels/update_service_spec.rb8
-rw-r--r--spec/spec_helper.rb1
-rw-r--r--spec/support/shared_examples/controllers/labels_controller_shared_examples.rb38
-rw-r--r--spec/support/shared_examples/requests/api/nuget_packages_shared_examples.rb8
20 files changed, 244 insertions, 276 deletions
diff --git a/spec/controllers/groups/labels_controller_spec.rb b/spec/controllers/groups/labels_controller_spec.rb
index ebe379d948c..e7844df1e26 100644
--- a/spec/controllers/groups/labels_controller_spec.rb
+++ b/spec/controllers/groups/labels_controller_spec.rb
@@ -121,4 +121,35 @@ RSpec.describe Groups::LabelsController, feature_category: :team_planning do
end
end
end
+
+ describe 'PUT #update' do
+ context 'when updating lock_on_merge' do
+ let_it_be(:params) { { lock_on_merge: true } }
+ let_it_be_with_reload(:label) { create(:group_label, group: group) }
+
+ subject(:update_request) { put :update, params: { group_id: group.to_param, id: label.to_param, label: params } }
+
+ context 'when feature flag is disabled' do
+ before do
+ stub_feature_flags(enforce_locked_labels_on_merge: false)
+ end
+
+ it 'does not allow setting lock_on_merge' do
+ update_request
+
+ expect(response).to redirect_to(group_labels_path)
+ expect(label.reload.lock_on_merge).to be_falsey
+ end
+ end
+
+ context 'when feature flag is enabled' do
+ it 'allows setting lock_on_merge' do
+ update_request
+
+ expect(response).to redirect_to(group_labels_path)
+ expect(label.reload.lock_on_merge).to be_truthy
+ end
+ end
+ end
+ end
end
diff --git a/spec/controllers/projects/labels_controller_spec.rb b/spec/controllers/projects/labels_controller_spec.rb
index 74c16621fc5..a0c85a683b0 100644
--- a/spec/controllers/projects/labels_controller_spec.rb
+++ b/spec/controllers/projects/labels_controller_spec.rb
@@ -297,6 +297,37 @@ RSpec.describe Projects::LabelsController, feature_category: :team_planning do
end
end
+ describe 'PUT #update' do
+ context 'when updating lock_on_merge' do
+ let_it_be(:params) { { lock_on_merge: true } }
+ let_it_be_with_reload(:label) { create(:label, project: project) }
+
+ subject(:update_request) { put :update, params: { namespace_id: project.namespace, project_id: project, id: label.to_param, label: params } }
+
+ context 'when feature flag is disabled' do
+ before do
+ stub_feature_flags(enforce_locked_labels_on_merge: false)
+ end
+
+ it 'does not allow setting lock_on_merge' do
+ update_request
+
+ expect(response).to redirect_to(namespace_project_labels_path)
+ expect(label.reload.lock_on_merge).to be_falsey
+ end
+ end
+
+ context 'when feature flag is enabled' do
+ it 'allows setting lock_on_merge' do
+ update_request
+
+ expect(response).to redirect_to(namespace_project_labels_path)
+ expect(label.reload.lock_on_merge).to be_truthy
+ end
+ end
+ end
+ end
+
describe 'DELETE #destroy' do
context 'when current user has ability to destroy the label' do
before do
diff --git a/spec/features/dashboard/shortcuts_spec.rb b/spec/features/dashboard/shortcuts_spec.rb
index 2e01c1304de..976dcc5a027 100644
--- a/spec/features/dashboard/shortcuts_spec.rb
+++ b/spec/features/dashboard/shortcuts_spec.rb
@@ -56,7 +56,6 @@ RSpec.describe 'Dashboard shortcuts', :js, feature_category: :shared do
it 'navigate to tabs' do
find('body').send_keys([:shift, 'G'])
- find('.nothing-here-block')
expect(page).to have_content('No public groups')
find('body').send_keys([:shift, 'S'])
diff --git a/spec/features/groups/labels/create_spec.rb b/spec/features/groups/labels/create_spec.rb
index 5b57e670c1d..8242f422e6e 100644
--- a/spec/features/groups/labels/create_spec.rb
+++ b/spec/features/groups/labels/create_spec.rb
@@ -9,15 +9,17 @@ RSpec.describe 'Create a group label', feature_category: :team_planning do
before do
group.add_owner(user)
sign_in(user)
- visit group_labels_path(group)
+
+ visit new_group_label_path(group)
end
it 'creates a new label' do
- click_link 'New label'
fill_in 'Title', with: 'test-label'
click_button 'Create label'
expect(page).to have_content 'test-label'
expect(page).to have_current_path(group_labels_path(group), ignore_query: true)
end
+
+ it_behaves_like 'lock_on_merge when creating labels'
end
diff --git a/spec/features/groups/labels/edit_spec.rb b/spec/features/groups/labels/edit_spec.rb
index 6e056d35435..70568d4baa2 100644
--- a/spec/features/groups/labels/edit_spec.rb
+++ b/spec/features/groups/labels/edit_spec.rb
@@ -12,6 +12,7 @@ RSpec.describe 'Edit group label', feature_category: :team_planning do
before do
group.add_owner(user)
sign_in(user)
+
visit edit_group_label_path(group, label)
end
@@ -34,4 +35,17 @@ RSpec.describe 'Edit group label', feature_category: :team_planning do
expect(page).to have_content("#{label.title} was removed").and have_no_content("#{label.title}</span>")
end
+
+ describe 'lock_on_merge' do
+ let(:label_unlocked) { create(:group_label, group: group, lock_on_merge: false) }
+ let(:label_locked) { create(:group_label, group: group, lock_on_merge: true) }
+ let(:edit_label_path_unlocked) { edit_group_label_path(group, label_unlocked) }
+ let(:edit_label_path_locked) { edit_group_label_path(group, label_locked) }
+
+ before do
+ visit edit_label_path_unlocked
+ end
+
+ it_behaves_like 'lock_on_merge when editing labels'
+ end
end
diff --git a/spec/features/projects/ci/editor_spec.rb b/spec/features/projects/ci/editor_spec.rb
index b09aa91f4ab..adaa5e48967 100644
--- a/spec/features/projects/ci/editor_spec.rb
+++ b/spec/features/projects/ci/editor_spec.rb
@@ -71,7 +71,7 @@ RSpec.describe 'Pipeline Editor', :js, feature_category: :pipeline_composition d
it 'renders the empty page', :aggregate_failures do
expect(page).to have_content 'Optimize your workflow with CI/CD Pipelines'
- expect(page).to have_selector '[data-testid="create_new_ci_button"]'
+ expect(page).to have_selector '[data-testid="create-new-ci-button"]'
end
context 'when clicking on the create new CI button' do
diff --git a/spec/features/projects/labels/user_creates_labels_spec.rb b/spec/features/projects/labels/user_creates_labels_spec.rb
index 46729048fe7..6e52963bee2 100644
--- a/spec/features/projects/labels/user_creates_labels_spec.rb
+++ b/spec/features/projects/labels/user_creates_labels_spec.rb
@@ -63,6 +63,8 @@ RSpec.describe "User creates labels", feature_category: :team_planning do
end
end
end
+
+ it_behaves_like "lock_on_merge when creating labels"
end
context "in another project" do
diff --git a/spec/features/projects/labels/user_edits_labels_spec.rb b/spec/features/projects/labels/user_edits_labels_spec.rb
index bf1182cfddd..059edea2109 100644
--- a/spec/features/projects/labels/user_edits_labels_spec.rb
+++ b/spec/features/projects/labels/user_edits_labels_spec.rb
@@ -13,16 +13,16 @@ RSpec.describe "User edits labels", feature_category: :team_planning do
project.add_maintainer(user)
sign_in(user)
- visit(edit_project_label_path(project, label))
+ visit edit_project_label_path(project, label)
end
- it "updates label's title" do
- new_title = "fix"
+ it 'update label with new title' do
+ new_title = 'fix'
- fill_in("Title", with: new_title)
- click_button("Save changes")
+ fill_in('Title', with: new_title)
+ click_button('Save changes')
- page.within(".other-labels .manage-labels-list") do
+ page.within('.other-labels .manage-labels-list') do
expect(page).to have_content(new_title).and have_no_content(label.title)
end
end
@@ -38,4 +38,17 @@ RSpec.describe "User edits labels", feature_category: :team_planning do
expect(page).to have_content("#{label.title} was removed").and have_no_content("#{label.title}</span>")
end
+
+ describe 'lock_on_merge' do
+ let_it_be_with_reload(:label_unlocked) { create(:label, project: project, lock_on_merge: false) }
+ let_it_be(:label_locked) { create(:label, project: project, lock_on_merge: true) }
+ let_it_be(:edit_label_path_unlocked) { edit_project_label_path(project, label_unlocked) }
+ let_it_be(:edit_label_path_locked) { edit_project_label_path(project, label_locked) }
+
+ before do
+ visit edit_label_path_unlocked
+ end
+
+ it_behaves_like 'lock_on_merge when editing labels'
+ end
end
diff --git a/spec/finders/packages/nuget/package_finder_spec.rb b/spec/finders/packages/nuget/package_finder_spec.rb
index 792e543e424..8230d132d75 100644
--- a/spec/finders/packages/nuget/package_finder_spec.rb
+++ b/spec/finders/packages/nuget/package_finder_spec.rb
@@ -114,16 +114,6 @@ RSpec.describe Packages::Nuget::PackageFinder, feature_category: :package_regist
it_behaves_like 'calling with_nuget_version_or_normalized_version scope', with_normalized: true
end
-
- context 'when nuget_normalized_version feature flag is disabled' do
- let(:package_version) { '2.0.0+abc' }
-
- before do
- stub_feature_flags(nuget_normalized_version: false)
- end
-
- it_behaves_like 'calling with_nuget_version_or_normalized_version scope', with_normalized: false
- end
end
context 'with a project' do
diff --git a/spec/frontend/groups/components/empty_states/groups_dashboard_empty_state_spec.js b/spec/frontend/groups/components/empty_states/groups_dashboard_empty_state_spec.js
new file mode 100644
index 00000000000..d2afbad802c
--- /dev/null
+++ b/spec/frontend/groups/components/empty_states/groups_dashboard_empty_state_spec.js
@@ -0,0 +1,29 @@
+import { GlEmptyState } from '@gitlab/ui';
+
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import GroupsDashboardEmptyState from '~/groups/components/empty_states/groups_dashboard_empty_state.vue';
+
+let wrapper;
+
+const defaultProvide = {
+ groupsEmptyStateIllustration: '/assets/illustrations/empty-state/empty-groups-md.svg',
+};
+
+const createComponent = () => {
+ wrapper = shallowMountExtended(GroupsDashboardEmptyState, {
+ provide: defaultProvide,
+ });
+};
+
+describe('GroupsDashboardEmptyState', () => {
+ it('renders empty state', () => {
+ createComponent();
+
+ expect(wrapper.findComponent(GlEmptyState).props()).toMatchObject({
+ title: 'A group is a collection of several projects',
+ description:
+ "If you organize your projects under a group, it works like a folder. You can manage your group member's permissions and access to each project in the group.",
+ svgPath: defaultProvide.groupsEmptyStateIllustration,
+ });
+ });
+});
diff --git a/spec/frontend/groups/components/empty_states/groups_explore_empty_state_spec.js b/spec/frontend/groups/components/empty_states/groups_explore_empty_state_spec.js
new file mode 100644
index 00000000000..f4c425902f5
--- /dev/null
+++ b/spec/frontend/groups/components/empty_states/groups_explore_empty_state_spec.js
@@ -0,0 +1,27 @@
+import { GlEmptyState } from '@gitlab/ui';
+
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import GroupsExploreEmptyState from '~/groups/components/empty_states/groups_explore_empty_state.vue';
+
+let wrapper;
+
+const defaultProvide = {
+ groupsEmptyStateIllustration: '/assets/illustrations/empty-state/empty-groups-md.svg',
+};
+
+const createComponent = () => {
+ wrapper = shallowMountExtended(GroupsExploreEmptyState, {
+ provide: defaultProvide,
+ });
+};
+
+describe('GroupsExploreEmptyState', () => {
+ it('renders empty state', () => {
+ createComponent();
+
+ expect(wrapper.findComponent(GlEmptyState).props()).toMatchObject({
+ title: 'No public groups',
+ svgPath: defaultProvide.groupsEmptyStateIllustration,
+ });
+ });
+});
diff --git a/spec/frontend/projects/commit/components/form_modal_spec.js b/spec/frontend/projects/commit/components/form_modal_spec.js
index d40e2d7a48c..7ea3a74418d 100644
--- a/spec/frontend/projects/commit/components/form_modal_spec.js
+++ b/spec/frontend/projects/commit/components/form_modal_spec.js
@@ -72,11 +72,11 @@ describe('CommitFormModal', () => {
it('Shows modal', () => {
createComponent();
- const rootEmit = jest.spyOn(wrapper.vm.$root, '$emit');
+ const rootWrapper = createWrapper(wrapper.vm.$root);
- wrapper.vm.show();
+ eventHub.$emit(mockData.modalPropsData.openModal);
- expect(rootEmit).toHaveBeenCalledWith(BV_SHOW_MODAL, mockData.modalPropsData.modalId);
+ expect(rootWrapper.emitted(BV_SHOW_MODAL)[0]).toContain(mockData.modalPropsData.modalId);
});
it('Clears the modal state once modal is hidden', () => {
@@ -150,8 +150,9 @@ describe('CommitFormModal', () => {
it('Action primary button dispatches submit action', () => {
getByText(mockData.modalPropsData.i18n.actionPrimaryText).trigger('click');
+ const formSubmitSpy = jest.spyOn(findForm().element, 'submit');
- expect(wrapper.vm.$refs.form.$el.submit).toHaveBeenCalled();
+ expect(formSubmitSpy).toHaveBeenCalled();
});
it('Changes the start_branch input value', async () => {
diff --git a/spec/frontend/vue_shared/components/markdown/comment_templates_dropdown_spec.js b/spec/frontend/vue_shared/components/markdown/comment_templates_dropdown_spec.js
index cd9f27dccbd..11c57fc5768 100644
--- a/spec/frontend/vue_shared/components/markdown/comment_templates_dropdown_spec.js
+++ b/spec/frontend/vue_shared/components/markdown/comment_templates_dropdown_spec.js
@@ -12,6 +12,7 @@ import savedRepliesQuery from '~/vue_shared/components/markdown/saved_replies.qu
import {
TRACKING_SAVED_REPLIES_USE,
TRACKING_SAVED_REPLIES_USE_IN_MR,
+ TRACKING_SAVED_REPLIES_USE_IN_OTHER,
} from '~/vue_shared/components/markdown/constants';
let wrapper;
@@ -87,6 +88,12 @@ describe('Comment templates dropdown', () => {
});
describe('tracking', () => {
+ it('always sends two tracking events', async () => {
+ await selectSavedReply();
+
+ expect(trackingSpy).toHaveBeenCalledTimes(2);
+ });
+
it('tracks overall usage', async () => {
await selectSavedReply();
@@ -108,7 +115,6 @@ describe('Comment templates dropdown', () => {
TRACKING_SAVED_REPLIES_USE_IN_MR,
expect.any(Object),
);
- expect(trackingSpy).toHaveBeenCalledTimes(2);
});
it('is not sent when not in an MR', async () => {
@@ -121,7 +127,32 @@ describe('Comment templates dropdown', () => {
TRACKING_SAVED_REPLIES_USE_IN_MR,
expect.any(Object),
);
- expect(trackingSpy).toHaveBeenCalledTimes(1);
+ });
+ });
+
+ describe('non-MR usage event', () => {
+ it('is sent when not in an MR', async () => {
+ window.location.toString.mockReturnValue('this/looks/like/a/-/issues/1');
+
+ await selectSavedReply();
+
+ expect(trackingSpy).toHaveBeenCalledWith(
+ expect.any(String),
+ TRACKING_SAVED_REPLIES_USE_IN_OTHER,
+ expect.any(Object),
+ );
+ });
+
+ it('is not sent when in an MR', async () => {
+ window.location.toString.mockReturnValue('this/looks/like/a/-/merge_requests/1');
+
+ await selectSavedReply();
+
+ expect(trackingSpy).not.toHaveBeenCalledWith(
+ expect.any(String),
+ TRACKING_SAVED_REPLIES_USE_IN_OTHER,
+ expect.any(Object),
+ );
});
});
});
diff --git a/spec/helpers/issuables_helper_spec.rb b/spec/helpers/issuables_helper_spec.rb
index 7b5537c54cc..092cc787573 100644
--- a/spec/helpers/issuables_helper_spec.rb
+++ b/spec/helpers/issuables_helper_spec.rb
@@ -134,109 +134,6 @@ RSpec.describe IssuablesHelper, feature_category: :team_planning do
end
end
- describe '#issuable_meta', time_travel_to: '2022-08-05 00:00:00 +0000' do
- let(:user) { create(:user) }
-
- let_it_be(:project) { create(:project) }
-
- describe 'Issuable created status text' do
- subject { helper.issuable_meta(issuable, project) }
-
- context 'when issuable is a work item and flag is off' do
- using RSpec::Parameterized::TableSyntax
-
- before do
- stub_feature_flags(work_items: false)
- end
-
- where(:issuable_type, :text) do
- :issue | 'Issue created Aug 05, 2022 by'
- :incident | 'Incident created Aug 05, 2022 by'
- end
-
- let(:issuable) { build_stubbed(:work_item, issuable_type, created_at: Date.current) }
-
- with_them do
- it { is_expected.to have_content(text) }
- end
- end
-
- context 'when issuable is a work item and flag is on' do
- using RSpec::Parameterized::TableSyntax
-
- where(:issuable_type, :text) do
- :issue | 'Issue created Aug 05, 2022 by'
- :incident | 'Incident created Aug 05, 2022 by'
- end
-
- let(:issuable) { build_stubbed(:work_item, issuable_type, created_at: Date.current) }
-
- with_them do
- it { is_expected.to have_content(text) }
- end
- end
-
- context 'when issuable is not a work item' do
- let(:issuable) { build_stubbed(:merge_request, created_at: Date.current) }
-
- it { is_expected.to have_content('Created Aug 05, 2022') }
- end
- end
-
- describe 'author status' do
- let(:issuable) { build(:merge_request, source_project: project, author: user, created_at: '2020-01-30') }
-
- it 'displays an emoji if the user status is set' do
- user.status = UserStatus.new(message: 'lol')
- content = helper.issuable_meta(issuable, project)
- expect(content).to match('<span class="user-status-emoji has-tooltip" title="lol" data-html="true" data-placement="top">')
- expect(content).to match('<gl-emoji title="speech balloon" data-name="speech_balloon" data-unicode-version="6.0">')
- end
-
- it 'does not displays an emoji if the user status is not set' do
- user.status = UserStatus.new
- content = helper.issuable_meta(issuable, project)
- expect(content).not_to match('class="user-status-emoji has-tooltip"')
- expect(content).not_to match('gl-emoji')
- end
- end
-
- describe 'service desk reply to email address' do
- let(:email) { 'user@example.com' }
- let(:obfuscated_email) { 'us*****@e*****.c**' }
- let(:service_desk_issue) { build_stubbed(:issue, project: project, author: User.support_bot, service_desk_reply_to: email) }
-
- subject { helper.issuable_meta(service_desk_issue, project) }
-
- context 'with anonymous user' do
- before do
- allow(helper).to receive(:current_user).and_return(nil)
- end
-
- it { is_expected.to have_content(obfuscated_email) }
- end
-
- context 'with signed in user' do
- context 'when user has no role in project' do
- before do
- allow(helper).to receive(:current_user).and_return(user)
- end
-
- it { is_expected.to have_content(obfuscated_email) }
- end
-
- context 'when user has reporter role in project' do
- before do
- project.add_reporter(user)
- allow(helper).to receive(:current_user).and_return(user)
- end
-
- it { is_expected.to have_content(email) }
- end
- end
- end
- end
-
describe '#issuables_state_counter_text' do
let_it_be(:user) { create(:user) }
@@ -613,38 +510,6 @@ RSpec.describe IssuablesHelper, feature_category: :team_planning do
end
end
- describe '#reviewer_sidebar_data' do
- let(:user) { create(:user) }
-
- subject { helper.reviewer_sidebar_data(user, merge_request: merge_request) }
-
- context 'without merge_request' do
- let(:merge_request) { nil }
-
- it 'returns hash of reviewer data' do
- is_expected.to eql({
- avatar_url: user.avatar_url,
- name: user.name,
- username: user.username
- })
- end
- end
-
- context 'with merge_request' do
- let(:merge_request) { build(:merge_request) }
-
- where(can_merge: [true, false])
-
- with_them do
- before do
- allow(merge_request).to receive(:can_be_merged_by?).and_return(can_merge)
- end
-
- it { is_expected.to include({ can_merge: can_merge }) }
- end
- end
- end
-
describe '#issuable_squash_option?' do
using RSpec::Parameterized::TableSyntax
@@ -722,16 +587,6 @@ RSpec.describe IssuablesHelper, feature_category: :team_planning do
end
end
- describe '#sidebar_milestone_tooltip_label' do
- it 'escapes HTML in the milestone title' do
- milestone = build(:milestone, title: '&lt;img onerror=alert(1)&gt;', due_date: Date.new(2022, 6, 26))
-
- expect(helper.sidebar_milestone_tooltip_label(milestone)).to eq(
- '&lt;img onerror=alert(1)&gt;<br/>Jun 26, 2022 (<strong>Past due</strong>)'
- )
- end
- end
-
describe '#issuable_type_selector_data' do
using RSpec::Parameterized::TableSyntax
diff --git a/spec/helpers/issues_helper_spec.rb b/spec/helpers/issues_helper_spec.rb
index 0cde9aeac8d..caa9fb504dd 100644
--- a/spec/helpers/issues_helper_spec.rb
+++ b/spec/helpers/issues_helper_spec.rb
@@ -136,81 +136,6 @@ RSpec.describe IssuesHelper do
end
end
- describe '#issue_closed_link' do
- let(:new_issue) { create(:issue, project: project) }
- let(:guest) { create(:user) }
-
- before do
- allow(helper).to receive(:can?) do |*args|
- Ability.allowed?(*args)
- end
- end
-
- shared_examples 'successfully displays link to issue and with css class' do |action|
- it 'returns link' do
- link = "<a class=\"#{css_class}\" href=\"/#{new_issue.project.full_path}/-/issues/#{new_issue.iid}\">(#{action})</a>"
-
- expect(helper.issue_closed_link(issue, user, css_class: css_class)).to match(link)
- end
- end
-
- shared_examples 'does not display link' do
- it 'returns nil' do
- expect(helper.issue_closed_link(issue, user)).to be_nil
- end
- end
-
- context 'with linked issue' do
- context 'with moved issue' do
- before do
- issue.update!(moved_to: new_issue)
- end
-
- context 'when user has permission to see new issue' do
- let(:user) { project.owner }
- let(:css_class) { 'text-white text-underline' }
-
- it_behaves_like 'successfully displays link to issue and with css class', 'moved'
- end
-
- context 'when user has no permission to see new issue' do
- let(:user) { guest }
-
- it_behaves_like 'does not display link'
- end
- end
-
- context 'with duplicated issue' do
- before do
- issue.update!(duplicated_to: new_issue)
- end
-
- context 'when user has permission to see new issue' do
- let(:user) { project.owner }
- let(:css_class) { 'text-white text-underline' }
-
- it_behaves_like 'successfully displays link to issue and with css class', 'duplicated'
- end
-
- context 'when user has no permission to see new issue' do
- let(:user) { guest }
-
- it_behaves_like 'does not display link'
- end
- end
- end
-
- context 'without linked issue' do
- let(:user) { project.owner }
-
- before do
- issue.update!(moved_to: nil, duplicated_to: nil)
- end
-
- it_behaves_like 'does not display link'
- end
- end
-
describe '#show_moved_service_desk_issue_warning?' do
let(:project1) { create(:project, service_desk_enabled: true) }
let(:project2) { create(:project, service_desk_enabled: true) }
diff --git a/spec/models/packages/nuget/metadatum_spec.rb b/spec/models/packages/nuget/metadatum_spec.rb
index e1520c0782f..c8e052baf6f 100644
--- a/spec/models/packages/nuget/metadatum_spec.rb
+++ b/spec/models/packages/nuget/metadatum_spec.rb
@@ -16,18 +16,7 @@ RSpec.describe Packages::Nuget::Metadatum, type: :model, feature_category: :pack
it { is_expected.to validate_length_of(:authors).is_at_most(described_class::MAX_AUTHORS_LENGTH) }
it { is_expected.to validate_presence_of(:description) }
it { is_expected.to validate_length_of(:description).is_at_most(described_class::MAX_DESCRIPTION_LENGTH) }
-
- context 'for normalized_version presence' do
- it { is_expected.to validate_presence_of(:normalized_version) }
-
- context 'when nuget_normalized_version feature flag is disabled' do
- before do
- stub_feature_flags(nuget_normalized_version: false)
- end
-
- it { is_expected.not_to validate_presence_of(:normalized_version) }
- end
- end
+ it { is_expected.to validate_presence_of(:normalized_version) }
%i[license_url project_url icon_url].each do |url|
describe "##{url}" do
@@ -87,16 +76,6 @@ RSpec.describe Packages::Nuget::Metadatum, type: :model, feature_category: :pack
expect(nuget_metadatum.normalized_version).to eq(normalized_version)
end
-
- context 'when the nuget_normalized_version feature flag is disabled' do
- before do
- stub_feature_flags(nuget_normalized_version: false)
- end
-
- it 'does not save the normalized version' do
- expect(nuget_metadatum.normalized_version).not_to eq(normalized_version)
- end
- end
end
end
end
diff --git a/spec/services/labels/update_service_spec.rb b/spec/services/labels/update_service_spec.rb
index 9a8868dac10..61e229e3138 100644
--- a/spec/services/labels/update_service_spec.rb
+++ b/spec/services/labels/update_service_spec.rb
@@ -99,6 +99,14 @@ RSpec.describe Labels::UpdateService, feature_category: :team_planning do
expect(label.reload.lock_on_merge).to be_truthy
end
+ it 'does not allow lock_on_merge to be unset' do
+ label_locked = Labels::CreateService.new(title: 'Initial', lock_on_merge: true).execute(project: project)
+ label = described_class.new(title: 'test', lock_on_merge: false).execute(label_locked)
+
+ expect(label.reload.lock_on_merge).to be_truthy
+ expect(label.reload.title).to eq 'test'
+ end
+
it 'does not allow setting lock_on_merge for templates' do
template_label = Labels::CreateService.new(title: 'Initial').execute(template: true)
label = described_class.new(params).execute(template_label)
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index d7ceab1289e..32ae920235a 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -210,6 +210,7 @@ RSpec.configure do |config|
config.include RequestUrgencyMatcher, type: :request
config.include Capybara::RSpecMatchers, type: :request
config.include PendingDirectUploadHelpers, :direct_uploads
+ config.include LabelsHelper, type: :feature
config.include_context 'when rendered has no HTML escapes', type: :view
diff --git a/spec/support/shared_examples/controllers/labels_controller_shared_examples.rb b/spec/support/shared_examples/controllers/labels_controller_shared_examples.rb
new file mode 100644
index 00000000000..aea552f6ac7
--- /dev/null
+++ b/spec/support/shared_examples/controllers/labels_controller_shared_examples.rb
@@ -0,0 +1,38 @@
+# frozen_string_literal: true
+
+RSpec.shared_examples 'lock_on_merge when editing labels' do
+ context 'when feature flag is disabled' do
+ before do
+ stub_feature_flags(enforce_locked_labels_on_merge: false)
+ visit edit_label_path_unlocked
+ end
+
+ it 'does not display the checkbox/help text' do
+ expect(page).not_to have_content(_('Lock label after a merge request is merged'))
+ expect(page).not_to have_content(label_lock_on_merge_help_text)
+ end
+ end
+
+ it 'updates lock_on_merge' do
+ expect(page).to have_content(_('Lock label after a merge request is merged'))
+ expect(page).to have_content(label_lock_on_merge_help_text)
+
+ check(_('Lock label after a merge request is merged'))
+ click_button 'Save changes'
+
+ expect(label_unlocked.reload.lock_on_merge).to be_truthy
+ end
+
+ it 'checkbox is disabled if lock_on_merge already set' do
+ visit edit_label_path_locked
+
+ expect(page.find('#label_lock_on_merge')).to be_disabled
+ end
+end
+
+RSpec.shared_examples 'lock_on_merge when creating labels' do
+ it 'is not supported when creating a label' do
+ expect(page).not_to have_content(_('Lock label after a merge request is merged'))
+ expect(page).not_to have_content(label_lock_on_merge_help_text)
+ end
+end
diff --git a/spec/support/shared_examples/requests/api/nuget_packages_shared_examples.rb b/spec/support/shared_examples/requests/api/nuget_packages_shared_examples.rb
index 2e66bae26ba..2529bcbe842 100644
--- a/spec/support/shared_examples/requests/api/nuget_packages_shared_examples.rb
+++ b/spec/support/shared_examples/requests/api/nuget_packages_shared_examples.rb
@@ -373,14 +373,6 @@ RSpec.shared_examples 'process nuget download content request' do |user_type, st
end
it_behaves_like 'bumping the package last downloaded at field'
-
- context 'when nuget_normalized_version feature flag is disabled' do
- before do
- stub_feature_flags(nuget_normalized_version: false)
- end
-
- it_behaves_like 'returning response status', :not_found
- end
end
end
end