diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2024-01-18 15:08:09 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2024-01-18 15:08:09 +0300 |
commit | 823d2f9a2c8796e5061c59595f96a1132641b26a (patch) | |
tree | 219b13820bd398acc48f3cc719c7a7bfdf77aa26 /spec | |
parent | 627bd5db4e091d0be312c880cbb9139b7c86818b (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec')
-rw-r--r-- | spec/factories/projects.rb | 33 | ||||
-rw-r--r-- | spec/finders/merge_requests_finder_spec.rb | 67 | ||||
-rw-r--r-- | spec/frontend/fixtures/static/textarea.html | 2 | ||||
-rw-r--r-- | spec/frontend/vue_shared/components/form/input_copy_toggle_visibility_spec.js | 6 | ||||
-rw-r--r-- | spec/helpers/search_helper_spec.rb | 8 | ||||
-rw-r--r-- | spec/lib/gitlab/database/partitioning/list/convert_table_spec.rb | 33 | ||||
-rw-r--r-- | spec/lib/service_ping/build_payload_spec.rb | 3 | ||||
-rw-r--r-- | spec/requests/api/merge_requests_spec.rb | 81 | ||||
-rw-r--r-- | spec/spec_helper.rb | 8 | ||||
-rw-r--r-- | spec/support/helpers/debug_with_puts.rb | 13 | ||||
-rw-r--r-- | spec/support/helpers/stub_requests.rb | 6 |
11 files changed, 187 insertions, 73 deletions
diff --git a/spec/factories/projects.rb b/spec/factories/projects.rb index 83107e6cc4a..a2848bd0256 100644 --- a/spec/factories/projects.rb +++ b/spec/factories/projects.rb @@ -2,10 +2,6 @@ require_relative '../support/helpers/test_env' -# TODO: Remove the debug_with_puts statements below! Used for debugging purposes. -# TODO: https://gitlab.com/gitlab-org/quality/engineering-productivity/team/-/issues/323#note_1688925316 -require_relative '../support/helpers/debug_with_puts' - FactoryBot.define do # Project without repository # @@ -70,8 +66,6 @@ FactoryBot.define do end after(:build) do |project, evaluator| - DebugWithPuts.debug_with_puts "Beginning of after :build of projects factory in spec/factories/projects.rb" - # Builds and MRs can't have higher visibility level than repository access level. builds_access_level = [evaluator.builds_access_level, evaluator.repository_access_level].min merge_requests_access_level = [evaluator.merge_requests_access_level, evaluator.repository_access_level].min @@ -93,8 +87,6 @@ FactoryBot.define do security_and_compliance_access_level: evaluator.security_and_compliance_access_level } - DebugWithPuts.debug_with_puts "During after :build of projects factory in spec/factories/projects.rb:#{__LINE__}" - project_namespace_hash = { name: evaluator.name, path: evaluator.path, @@ -105,16 +97,10 @@ FactoryBot.define do project_namespace_hash[:id] = evaluator.project_namespace_id.presence - DebugWithPuts.debug_with_puts "During after :build of projects factory in spec/factories/projects.rb:#{__LINE__}" - project.build_project_namespace(project_namespace_hash) project.build_project_feature(project_feature_hash) - DebugWithPuts.debug_with_puts "During after :build of projects factory in spec/factories/projects.rb:#{__LINE__}" - project.set_runners_token(evaluator.runners_token) if evaluator.runners_token.present? - - DebugWithPuts.debug_with_puts "End of after :build of projects factory in spec/factories/projects.rb" end to_create do |project| @@ -122,7 +108,6 @@ FactoryBot.define do end after(:create) do |project, evaluator| - DebugWithPuts.debug_with_puts "Beginning of after :create of projects factory in spec/factories/projects.rb" # Normally the class Projects::CreateService is used for creating # projects, and this class takes care of making sure the owner and current # user have access to the project. Our specs don't use said service class, @@ -131,16 +116,12 @@ FactoryBot.define do project.add_owner(project.first_owner) end - DebugWithPuts.debug_with_puts "During after :create of projects factory in spec/factories/projects.rb:#{__LINE__}" - if project.group project.run_after_commit_or_now do AuthorizedProjectUpdate::ProjectRecalculateService.new(project).execute end end - DebugWithPuts.debug_with_puts "During after :create of projects factory in spec/factories/projects.rb:#{__LINE__}" - # assign the delegated `#ci_cd_settings` attributes after create project.group_runners_enabled = evaluator.group_runners_enabled unless evaluator.group_runners_enabled.nil? project.merge_pipelines_enabled = evaluator.merge_pipelines_enabled unless evaluator.merge_pipelines_enabled.nil? @@ -152,8 +133,6 @@ FactoryBot.define do project.runner_token_expiration_interval = evaluator.runner_token_expiration_interval unless evaluator.runner_token_expiration_interval.nil? project.runner_token_expiration_interval_human_readable = evaluator.runner_token_expiration_interval_human_readable unless evaluator.runner_token_expiration_interval_human_readable.nil? - DebugWithPuts.debug_with_puts "During after :create of projects factory in spec/factories/projects.rb:#{__LINE__}" - if evaluator.import_status import_state = project.import_state || project.build_import_state import_state.status = evaluator.import_status @@ -163,12 +142,8 @@ FactoryBot.define do import_state.save! end - DebugWithPuts.debug_with_puts "During after :create of projects factory in spec/factories/projects.rb:#{__LINE__}" - # simulating ::Projects::ProcessSyncEventsWorker because most tests don't run Sidekiq inline project.create_ci_project_mirror!(namespace_id: project.namespace_id) unless project.ci_project_mirror - - DebugWithPuts.debug_with_puts "End of after :create of projects factory in spec/factories/projects.rb" end trait :public do @@ -351,7 +326,6 @@ FactoryBot.define do end after :create do |project, evaluator| - DebugWithPuts.debug_with_puts "Beginning of after :create of trait :repository do in spec/factories/projects.rb" # Specify `lfs: true` to create the LfsObject for the LFS file in the test repo: # https://gitlab.com/gitlab-org/gitlab-test/-/blob/master/files/lfs/lfs_object.iso if evaluator.lfs @@ -377,8 +351,6 @@ FactoryBot.define do end end - DebugWithPuts.debug_with_puts "During after :create of trait :repository do in spec/factories/projects.rb:#{__LINE__}" - if evaluator.create_templates templates_path = "#{evaluator.create_templates}_templates" @@ -408,8 +380,6 @@ FactoryBot.define do branch_name: 'master') end - DebugWithPuts.debug_with_puts "During after :create of trait :repository do in spec/factories/projects.rb:#{__LINE__}" - if evaluator.create_branch project.repository.create_file( project.creator, @@ -419,8 +389,6 @@ FactoryBot.define do branch_name: evaluator.create_branch) end - DebugWithPuts.debug_with_puts "During after :create of trait :repository do in spec/factories/projects.rb:#{__LINE__}" - if evaluator.create_tag project.repository.add_tag( project.creator, @@ -429,7 +397,6 @@ FactoryBot.define do end project.track_project_repository - DebugWithPuts.debug_with_puts "End of after :create of trait :repository do in spec/factories/projects.rb" end end diff --git a/spec/finders/merge_requests_finder_spec.rb b/spec/finders/merge_requests_finder_spec.rb index 3f9c1baec82..d85ae92f954 100644 --- a/spec/finders/merge_requests_finder_spec.rb +++ b/spec/finders/merge_requests_finder_spec.rb @@ -170,6 +170,73 @@ RSpec.describe MergeRequestsFinder, feature_category: :code_review_workflow do end end + context 'merge_user filtering' do + before do + merge_request1.update!(state_id: MergeRequest.available_states[:merged]) + merge_request1.metrics.update!(merged_by_id: user.id) + merge_request2.update!(state_id: MergeRequest.available_states[:merged]) + merge_request2.metrics.update!(merged_by_id: user.id) + merge_request3.update!(state_id: MergeRequest.available_states[:merged]) + merge_request3.metrics.update!(merged_by_id: user2.id) + merge_request4.update!(state_id: MergeRequest.available_states[:merged]) + merge_request4.metrics.update!(merged_by_id: user2.id) + end + + subject { described_class.new(user, params).execute } + + context 'when flag `mr_merge_user_filter` is disabled' do + before do + stub_feature_flags(mr_merge_user_filter: false) + end + + describe 'by merge_user_id' do + let(:params) { { merge_user_id: user.id } } + let(:expected_mr) { [merge_request1, merge_request2, merge_request3, merge_request4, merge_request5] } + + it { is_expected.to contain_exactly(*expected_mr) } + end + + describe 'by merge_user_username' do + let(:params) { { merge_user_username: user.username } } + let(:expected_mr) { [merge_request1, merge_request2, merge_request3, merge_request4, merge_request5] } + + it { is_expected.to contain_exactly(*expected_mr) } + end + end + + context 'when flag `mr_merge_user_filter` is enabled' do + before do + stub_feature_flags(mr_merge_user_filter: true) + end + + describe 'by merge_user_id' do + let(:params) { { merge_user_id: user.id } } + let(:expected_mr) { [merge_request1, merge_request2] } + + it { is_expected.to contain_exactly(*expected_mr) } + end + + describe 'by merge_user_username' do + let(:params) { { merge_user_username: user.username } } + let(:expected_mr) { [merge_request1, merge_request2] } + + it { is_expected.to contain_exactly(*expected_mr) } + end + + describe 'by merge_user_id with unknown user id' do + let(:params) { { merge_user_id: 99999 } } + + it { is_expected.to be_empty } + end + + describe 'by merge_user_username with unknown user name' do + let(:params) { { merge_user_username: 'does-not-exist' } } + + it { is_expected.to be_empty } + end + end + end + context 'filtering by group' do it 'includes all merge requests when user has access excluding merge requests from projects the user does not have access to' do private_project = allow_gitaly_n_plus_1 { create(:project, :private, group: group) } diff --git a/spec/frontend/fixtures/static/textarea.html b/spec/frontend/fixtures/static/textarea.html index 68d5a0f2d4d..6bebd5df11b 100644 --- a/spec/frontend/fixtures/static/textarea.html +++ b/spec/frontend/fixtures/static/textarea.html @@ -10,7 +10,7 @@ <textarea class="note-textarea js-gfm-input js-autosize markdown-area" placeholder="Write milestone description..." dir="auto" data-supports-quick-actions="false" data-supports-autocomplete="true" - data-qa-selector="milestone_description_field" data-autofocus="false" + data-testid="milestone-description-field" data-autofocus="false" name="milestone[description]" id="milestone_description"></textarea> <a class="zen-control zen-control-leave js-zen-leave gl-text-gray-500" diff --git a/spec/frontend/vue_shared/components/form/input_copy_toggle_visibility_spec.js b/spec/frontend/vue_shared/components/form/input_copy_toggle_visibility_spec.js index b57643a1359..27227ac69dd 100644 --- a/spec/frontend/vue_shared/components/form/input_copy_toggle_visibility_spec.js +++ b/spec/frontend/vue_shared/components/form/input_copy_toggle_visibility_spec.js @@ -378,7 +378,7 @@ describe('InputCopyToggleVisibility', () => { props: { formInputGroupProps: { name: 'Foo bar', - 'data-qa-selector': 'Foo bar', + 'data-testid': 'Foo bar', class: 'Foo bar', id: 'Foo bar', }, @@ -387,14 +387,14 @@ describe('InputCopyToggleVisibility', () => { expect(findFormInput().attributes()).toMatchObject({ name: 'Foo bar', - 'data-qa-selector': 'Foo bar', + 'data-testid': 'Foo bar', class: expect.stringContaining('Foo bar'), id: 'Foo bar', }); const attributesInputGroup = findFormInputGroup().attributes(); expect(attributesInputGroup.name).toBeUndefined(); - expect(attributesInputGroup['data-qa-selector']).toBeUndefined(); + expect(attributesInputGroup['data-testid']).toBeUndefined(); expect(attributesInputGroup.class).not.toContain('Foo bar'); expect(attributesInputGroup.id).toBeUndefined(); }); diff --git a/spec/helpers/search_helper_spec.rb b/spec/helpers/search_helper_spec.rb index bad30b5033d..e8c412cc892 100644 --- a/spec/helpers/search_helper_spec.rb +++ b/spec/helpers/search_helper_spec.rb @@ -1108,10 +1108,10 @@ RSpec.describe SearchHelper, feature_category: :global_search do context 'data' do where(:scope, :label, :data, :search, :active_scope) do - "projects" | "Projects" | { qa_selector: 'projects_tab' } | nil | "projects" - "snippet_titles" | "Snippets" | nil | { snippets: "test" } | "code" - "projects" | "Projects" | { qa_selector: 'projects_tab' } | nil | "issue" - "snippet_titles" | "Snippets" | nil | { snippets: "test" } | "snippet_titles" + "projects" | "Projects" | { testid: 'projects-tab' } | nil | "projects" + "snippet_titles" | "Snippets" | nil | { snippets: "test" } | "code" + "projects" | "Projects" | { testid: 'projects-tab' } | nil | "issue" + "snippet_titles" | "Snippets" | nil | { snippets: "test" } | "snippet_titles" end with_them do diff --git a/spec/lib/gitlab/database/partitioning/list/convert_table_spec.rb b/spec/lib/gitlab/database/partitioning/list/convert_table_spec.rb index e0b090f7ff9..45bedbda22b 100644 --- a/spec/lib/gitlab/database/partitioning/list/convert_table_spec.rb +++ b/spec/lib/gitlab/database/partitioning/list/convert_table_spec.rb @@ -142,18 +142,29 @@ RSpec.describe Gitlab::Database::Partitioning::List::ConvertTable, feature_categ end describe '#revert_preparation_for_partitioning' do - before do - converter.prepare_for_partitioning - end - shared_examples 'runs #revert_preparation_for_partitioning' do - it 'removes a check constraint' do - expect { revert_prepare }.to change { - Gitlab::Database::PostgresConstraint - .check_constraints - .by_table_identifier("#{connection.current_schema}.#{table_name}") - .count - }.from(1).to(0) + context 'when check constraint exists' do + before do + converter.prepare_for_partitioning + end + + it 'removes a check constraint' do + expect { revert_prepare }.to change { + Gitlab::Database::PostgresConstraint + .check_constraints + .by_table_identifier("#{connection.current_schema}.#{table_name}") + .count + }.from(1).to(0) + end + end + + context 'when check constraint does not exist' do + it 'returns a message' do + expect(Gitlab::AppLogger) + .to receive(:warn) + .with(starting_with('The partitioning constraint')) + revert_prepare + end end end diff --git a/spec/lib/service_ping/build_payload_spec.rb b/spec/lib/service_ping/build_payload_spec.rb index 6699310681a..8d2b5311be3 100644 --- a/spec/lib/service_ping/build_payload_spec.rb +++ b/spec/lib/service_ping/build_payload_spec.rb @@ -3,7 +3,8 @@ require 'spec_helper' RSpec.describe ServicePing::BuildPayload, feature_category: :service_ping do - describe '#execute', :without_license do + describe '#execute', :without_license, + quarantine: 'https://gitlab.com/gitlab-org/gitlab/-/issues/438582' do subject(:service_ping_payload) { described_class.new.execute } include_context 'stubbed service ping metrics definitions' diff --git a/spec/requests/api/merge_requests_spec.rb b/spec/requests/api/merge_requests_spec.rb index 6ba51080bf0..ef249f82072 100644 --- a/spec/requests/api/merge_requests_spec.rb +++ b/spec/requests/api/merge_requests_spec.rb @@ -27,7 +27,7 @@ RSpec.describe API::MergeRequests, :aggregate_failures, feature_category: :sourc shared_context 'with merge requests' do let_it_be(:milestone1) { create(:milestone, title: '0.9', project: project) } - let_it_be(:merge_request_merged) { create(:merge_request, state: "merged", author: user, assignees: [user], source_project: project, target_project: project, title: "Merged test", created_at: base_time + 2.seconds, updated_at: base_time + 1.hour, merge_commit_sha: '9999999999999999999999999999999999999999') } + let_it_be(:merge_request_merged) { create(:merge_request, :with_merged_metrics, state: "merged", author: user, assignees: [user], source_project: project, target_project: project, title: "Merged test", created_at: base_time + 2.seconds, updated_at: base_time + 1.hour, merge_commit_sha: '9999999999999999999999999999999999999999', merged_by: user) } let_it_be(:merge_request) { create(:merge_request, :simple, milestone: milestone1, author: user, assignees: [user], source_project: project, target_project: project, source_branch: 'markdown', title: "Test", created_at: base_time, updated_at: base_time + 3.hours) } let_it_be(:merge_request_closed) { create(:merge_request, state: "closed", milestone: milestone1, author: user, assignees: [user], source_project: project, target_project: project, title: "Closed test", created_at: base_time + 1.second, updated_at: base_time) } let_it_be(:merge_request_locked) { create(:merge_request, state: "locked", milestone: milestone1, author: user, assignees: [user], source_project: project, target_project: project, title: "Locked test", created_at: base_time + 1.second, updated_at: base_time + 2.hours) } @@ -931,6 +931,85 @@ RSpec.describe API::MergeRequests, :aggregate_failures, feature_category: :sourc end end + context 'filter by merge_user' do + let(:params) { { scope: :all } } + + context 'when flag `mr_merge_user_filter` is disabled' do + before do + stub_feature_flags(mr_merge_user_filter: false) + end + + context 'with merge_user_id' do + let(:params) { super().merge(merge_user_id: user.id) } + + it 'returns merged merge requests for the given user' do + get api('/merge_requests', user), params: params + + expect_response_contain_exactly( + merge_request.id, + merge_request_closed.id, + merge_request_merged.id, + merge_request_locked.id, + merge_request2.id + ) + end + end + + context 'with merge_user_username' do + let(:params) { super().merge(merge_user_username: user.username) } + + it 'returns merged merge requests for the given user' do + get api('/merge_requests', user), params: params + + expect_response_contain_exactly( + merge_request.id, + merge_request_closed.id, + merge_request_merged.id, + merge_request_locked.id, + merge_request2.id + ) + end + end + end + + context 'when flag `mr_merge_user_filter` is enabled' do + before do + stub_feature_flags(mr_merge_user_filter: true) + end + + context 'with merge_user_id' do + let(:params) { super().merge(merge_user_id: user.id) } + + it 'returns merged merge requests for the given user' do + get api('/merge_requests', user), params: params + + expect_response_contain_exactly(merge_request_merged.id) + end + end + + context 'with merge_user_username' do + let(:params) { super().merge(merge_user_username: user.username) } + + it 'returns merged merge requests for the given user' do + get api('/merge_requests', user), params: params + + expect_response_contain_exactly(merge_request_merged.id) + end + end + + context 'with both merge_user_id and merge_user_username' do + let(:params) { super().merge(merge_user_id: user.id, merge_user_username: user.username) } + + it 'returns a 400' do + get api('/merge_requests', user), params: params + + expect(response).to have_gitlab_http_status(:bad_request) + expect(json_response['error']).to eq('merge_user_id, merge_user_username are mutually exclusive') + end + end + end + end + it 'returns an array of merge requests assigned to the given user' do merge_request3 = create(:merge_request, :simple, author: user, assignees: [user2], source_project: project2, target_project: project2, source_branch: 'other-branch') diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 3dfc27b8511..d08f6ef9d0d 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -223,6 +223,14 @@ RSpec.configure do |config| example.metadata[:retry] = 1 end + # Gradually stop using rspec-retry + # See https://gitlab.com/gitlab-org/gitlab/-/issues/438388 + %i[lib migrations models requests services].each do |type| + config.prepend_before(:each, type: type) do |example| + example.metadata[:retry] = 1 + end + end + config.exceptions_to_hard_fail = [DeprecationToolkitEnv::DeprecationBehaviors::SelectiveRaise::RaiseDisallowedDeprecation] end diff --git a/spec/support/helpers/debug_with_puts.rb b/spec/support/helpers/debug_with_puts.rb deleted file mode 100644 index b8599cc7d40..00000000000 --- a/spec/support/helpers/debug_with_puts.rb +++ /dev/null @@ -1,13 +0,0 @@ -# frozen_string_literal: true - -# TODO: Remove the debug_with_puts statements below! Used for debugging purposes. -# TODO: https://gitlab.com/gitlab-org/quality/engineering-productivity/team/-/issues/323#note_1688925316 -module DebugWithPuts - def debug_with_puts(message) - return unless ENV['CI'] # rubocop:disable RSpec/AvoidConditionalStatements -- Debug information only in the CI - - warn "[#{Time.current}] #{message}" - end - - module_function :debug_with_puts -end diff --git a/spec/support/helpers/stub_requests.rb b/spec/support/helpers/stub_requests.rb index b77b366e037..a3810323fee 100644 --- a/spec/support/helpers/stub_requests.rb +++ b/spec/support/helpers/stub_requests.rb @@ -18,15 +18,9 @@ module StubRequests end def stub_dns(url, ip_address:, port: 80) - DebugWithPuts.debug_with_puts "beginning of stub_dns" url = parse_url(url) - DebugWithPuts.debug_with_puts "before socket = Socket.sockaddr_in" socket = Socket.sockaddr_in(port, ip_address) - DebugWithPuts.debug_with_puts "after socket = Socket.sockaddr_in" - - DebugWithPuts.debug_with_puts "before addr = Addrinfo.new(socket)" addr = Addrinfo.new(socket) - DebugWithPuts.debug_with_puts "after addr = Addrinfo.new(socket)" # See Gitlab::UrlBlocker allow(Addrinfo).to receive(:getaddrinfo) |