From f64a639bcfa1fc2bc89ca7db268f594306edfd7c Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Tue, 16 Mar 2021 18:18:33 +0000 Subject: Add latest changes from gitlab-org/gitlab@13-10-stable-ee --- .../alert_notification_service_shared_examples.rb | 15 + .../banzai/filters/emoji_shared_examples.rb | 46 ++ .../multiple_issue_boards_shared_examples.rb | 2 + .../create_notes_rate_limit_shared_examples.rb | 44 ++ .../controllers/snippet_blob_shared_examples.rb | 32 ++ .../comment_and_close_button_shared_examples.rb | 29 - .../features/discussion_comments_shared_example.rb | 216 ++++++-- .../issuable_invite_members_shared_examples.rb | 10 +- .../project_upload_files_shared_examples.rb | 34 +- .../features/variable_list_shared_examples.rb | 26 +- .../graphql/mutation_shared_examples.rb | 2 +- .../mutations/boards_create_shared_examples.rb | 6 +- .../mutations/can_mutate_spammable_examples.rb | 8 +- .../graphql/notes_on_noteables_shared_examples.rb | 2 +- .../gitlab_style_deprecations_shared_examples.rb | 2 +- ...suable_description_templates_shared_examples.rb | 4 +- .../cycle_analytics/event_shared_examples.rb | 1 + .../issuable_activity_shared_examples.rb | 37 ++ .../issue_activity_shared_examples.rb | 27 - .../lib/sentry/client_shared_examples.rb | 4 +- .../active_record_subscriber_shared_examples.rb | 137 +++++ .../models/application_setting_shared_examples.rb | 15 +- .../boards/user_preferences_shared_examples.rb | 68 +++ .../models/chat_service_shared_examples.rb | 11 +- .../models/concerns/timebox_shared_examples.rb | 4 +- .../models/email_format_shared_examples.rb | 4 +- ...ack_mattermost_notifications_shared_examples.rb | 241 ++++----- .../shared_examples/models/wiki_shared_examples.rb | 46 +- .../time_tracking_quick_action_shared_examples.rb | 2 +- .../requests/api/conan_packages_shared_examples.rb | 106 ++-- ...oup_and_project_boards_query_shared_examples.rb | 2 +- ...up_and_project_packages_list_shared_examples.rb | 51 ++ .../logging_application_context_shared_examples.rb | 16 + .../requests/api/npm_packages_shared_examples.rb | 593 ++++++++++++++------- .../api/rubygems_packages_shared_examples.rb | 194 +++++++ .../service_desk_issue_templates_examples.rb | 12 + .../boards/update_boards_shared_examples.rb | 83 +++ .../packages/maven/metadata_shared_examples.rb | 57 ++ 38 files changed, 1640 insertions(+), 549 deletions(-) create mode 100644 spec/support/shared_examples/banzai/filters/emoji_shared_examples.rb create mode 100644 spec/support/shared_examples/controllers/create_notes_rate_limit_shared_examples.rb delete mode 100644 spec/support/shared_examples/features/comment_and_close_button_shared_examples.rb create mode 100644 spec/support/shared_examples/lib/gitlab/usage_data_counters/issuable_activity_shared_examples.rb delete mode 100644 spec/support/shared_examples/lib/gitlab/usage_data_counters/issue_activity_shared_examples.rb create mode 100644 spec/support/shared_examples/metrics/active_record_subscriber_shared_examples.rb create mode 100644 spec/support/shared_examples/models/boards/user_preferences_shared_examples.rb create mode 100644 spec/support/shared_examples/requests/api/graphql/packages/group_and_project_packages_list_shared_examples.rb create mode 100644 spec/support/shared_examples/requests/api/rubygems_packages_shared_examples.rb create mode 100644 spec/support/shared_examples/service_desk_issue_templates_examples.rb create mode 100644 spec/support/shared_examples/services/boards/update_boards_shared_examples.rb create mode 100644 spec/support/shared_examples/services/packages/maven/metadata_shared_examples.rb (limited to 'spec/support/shared_examples') diff --git a/spec/support/shared_examples/alert_notification_service_shared_examples.rb b/spec/support/shared_examples/alert_notification_service_shared_examples.rb index 7bd6df8c608..fc935effe0e 100644 --- a/spec/support/shared_examples/alert_notification_service_shared_examples.rb +++ b/spec/support/shared_examples/alert_notification_service_shared_examples.rb @@ -27,3 +27,18 @@ RSpec.shared_examples 'Alert Notification Service sends no notifications' do |ht end end end + +RSpec.shared_examples 'creates status-change system note for an auto-resolved alert' do + it 'has 2 new system notes' do + expect { subject }.to change(Note, :count).by(2) + expect(Note.last.note).to include('Resolved') + end +end + +# Requires `source` to be defined +RSpec.shared_examples 'creates single system note based on the source of the alert' do + it 'has one new system note' do + expect { subject }.to change(Note, :count).by(1) + expect(Note.last.note).to include(source) + end +end diff --git a/spec/support/shared_examples/banzai/filters/emoji_shared_examples.rb b/spec/support/shared_examples/banzai/filters/emoji_shared_examples.rb new file mode 100644 index 00000000000..da305f5ccaa --- /dev/null +++ b/spec/support/shared_examples/banzai/filters/emoji_shared_examples.rb @@ -0,0 +1,46 @@ +# frozen_string_literal: true + +RSpec.shared_examples 'emoji filter' do + it 'keeps whitespace intact' do + doc = filter("This deserves a #{emoji_name}, big time.") + + expect(doc.to_html).to match(/^This deserves a , big time\.\z/) + end + + it 'does not match emoji in a string' do + doc = filter("'2a00:a4c0#{emoji_name}:1'") + + expect(doc.css('gl-emoji')).to be_empty + end + + it 'ignores non existent/unsupported emoji' do + exp = '

:foo:

' + doc = filter(exp) + + expect(doc.to_html).to eq(exp) + end + + it 'matches with adjacent text' do + doc = filter("#{emoji_name.delete(':')} (#{emoji_name})") + + expect(doc.css('gl-emoji').size).to eq 1 + end + + it 'does not match emoji in a pre tag' do + doc = filter("

#{emoji_name}

") + + expect(doc.css('img')).to be_empty + end + + it 'does not match emoji in code tag' do + doc = filter("

#{emoji_name} wow

") + + expect(doc.css('img')).to be_empty + end + + it 'does not match emoji in tt tag' do + doc = filter("

#{emoji_name} yes!

") + + expect(doc.css('img')).to be_empty + end +end diff --git a/spec/support/shared_examples/boards/multiple_issue_boards_shared_examples.rb b/spec/support/shared_examples/boards/multiple_issue_boards_shared_examples.rb index 7f49d20c83e..9c8006ce4f1 100644 --- a/spec/support/shared_examples/boards/multiple_issue_boards_shared_examples.rb +++ b/spec/support/shared_examples/boards/multiple_issue_boards_shared_examples.rb @@ -9,6 +9,8 @@ RSpec.shared_examples 'multiple issue boards' do login_as(user) + stub_feature_flags(board_new_list: false) + visit boards_path wait_for_requests end diff --git a/spec/support/shared_examples/controllers/create_notes_rate_limit_shared_examples.rb b/spec/support/shared_examples/controllers/create_notes_rate_limit_shared_examples.rb new file mode 100644 index 00000000000..74a98c20383 --- /dev/null +++ b/spec/support/shared_examples/controllers/create_notes_rate_limit_shared_examples.rb @@ -0,0 +1,44 @@ +# frozen_string_literal: true +# +# Requires a context containing: +# - user +# - params +# - request_full_path + +RSpec.shared_examples 'request exceeding rate limit' do + before do + stub_application_setting(notes_create_limit: 2) + 2.times { post :create, params: params } + end + + it 'prevents from creating more notes', :request_store do + expect { post :create, params: params } + .to change { Note.count }.by(0) + + expect(response).to have_gitlab_http_status(:too_many_requests) + expect(response.body).to eq(_('This endpoint has been requested too many times. Try again later.')) + end + + it 'logs the event in auth.log' do + attributes = { + message: 'Application_Rate_Limiter_Request', + env: :notes_create_request_limit, + remote_ip: '0.0.0.0', + request_method: 'POST', + path: request_full_path, + user_id: user.id, + username: user.username + } + + expect(Gitlab::AuthLogger).to receive(:error).with(attributes).once + post :create, params: params + end + + it 'allows user in allow-list to create notes, even if the case is different' do + user.update_attribute(:username, user.username.titleize) + stub_application_setting(notes_create_limit_allowlist: ["#{user.username.downcase}"]) + + post :create, params: params + expect(response).to have_gitlab_http_status(:found) + end +end diff --git a/spec/support/shared_examples/controllers/snippet_blob_shared_examples.rb b/spec/support/shared_examples/controllers/snippet_blob_shared_examples.rb index c3e8f807afb..62aaec85162 100644 --- a/spec/support/shared_examples/controllers/snippet_blob_shared_examples.rb +++ b/spec/support/shared_examples/controllers/snippet_blob_shared_examples.rb @@ -17,6 +17,38 @@ RSpec.shared_examples 'raw snippet blob' do end end + context 'Content Disposition' do + context 'when the disposition is inline' do + let(:inline) { true } + + it 'returns inline in the content disposition header' do + subject + + expect(response.header['Content-Disposition']).to eq('inline') + end + end + + context 'when the disposition is attachment' do + let(:inline) { false } + + it 'returns attachment plus the filename in the content disposition header' do + subject + + expect(response.header['Content-Disposition']).to match "attachment; filename=\"#{filepath}\"" + end + + context 'when the feature flag attachment_with_filename is disabled' do + it 'returns just attachment in the disposition header' do + stub_feature_flags(attachment_with_filename: false) + + subject + + expect(response.header['Content-Disposition']).to eq 'attachment' + end + end + end + end + context 'with invalid file path' do let(:filepath) { 'doesnotexist' } diff --git a/spec/support/shared_examples/features/comment_and_close_button_shared_examples.rb b/spec/support/shared_examples/features/comment_and_close_button_shared_examples.rb deleted file mode 100644 index 4ee2840ed9f..00000000000 --- a/spec/support/shared_examples/features/comment_and_close_button_shared_examples.rb +++ /dev/null @@ -1,29 +0,0 @@ -# frozen_string_literal: true - -RSpec.shared_examples 'page with comment and close button' do |button_text| - context 'when remove_comment_close_reopen feature flag is enabled' do - before do - stub_feature_flags(remove_comment_close_reopen: true) - setup - end - - it "does not show #{button_text} button" do - within '.note-form-actions' do - expect(page).not_to have_button(button_text) - end - end - end - - context 'when remove_comment_close_reopen feature flag is disabled' do - before do - stub_feature_flags(remove_comment_close_reopen: false) - setup - end - - it "shows #{button_text} button" do - within '.note-form-actions' do - expect(page).to have_button(button_text) - end - end - end -end diff --git a/spec/support/shared_examples/features/discussion_comments_shared_example.rb b/spec/support/shared_examples/features/discussion_comments_shared_example.rb index 6bebd59ed70..86ba2821c78 100644 --- a/spec/support/shared_examples/features/discussion_comments_shared_example.rb +++ b/spec/support/shared_examples/features/discussion_comments_shared_example.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -RSpec.shared_examples 'thread comments' do |resource_name| +RSpec.shared_examples 'thread comments for commit and snippet' do |resource_name| let(:form_selector) { '.js-main-target-form' } let(:dropdown_selector) { "#{form_selector} .comment-type-dropdown" } let(:toggle_selector) { "#{dropdown_selector} .dropdown-toggle" } @@ -24,23 +24,6 @@ RSpec.shared_examples 'thread comments' do |resource_name| expect(new_comment).not_to have_selector '.discussion' end - if resource_name == 'issue' - it "clicking 'Comment & close #{resource_name}' will post a comment and close the #{resource_name}" do - find("#{form_selector} .note-textarea").send_keys(comment) - - click_button 'Comment & close issue' - - wait_for_all_requests - - expect(page).to have_content(comment) - expect(page).to have_content "@#{user.username} closed" - - new_comment = all(comments_selector).last - - expect(new_comment).not_to have_selector '.discussion' - end - end - describe 'when the toggle is clicked' do before do find("#{form_selector} .note-textarea").send_keys(comment) @@ -110,33 +93,172 @@ RSpec.shared_examples 'thread comments' do |resource_name| end it 'updates the submit button text and closes the dropdown' do - button = find(submit_selector) + expect(find(submit_selector).value).to eq 'Start thread' - # on issues page, the submit input is a