diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-08-18 03:08:53 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-08-18 03:08:53 +0300 |
commit | 9214cac69b0f0306a86056720cfc62b738449c19 (patch) | |
tree | 79c6fdbc2c8b379dd908294faa54c3fa2ab97551 /spec | |
parent | 13d851c795a48b670b859a7ec5bd6e2886d2789e (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec')
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: '<img onerror=alert(1)>', due_date: Date.new(2022, 6, 26)) - - expect(helper.sidebar_milestone_tooltip_label(milestone)).to eq( - '<img onerror=alert(1)><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 |