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>2024-01-18 15:08:09 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2024-01-18 15:08:09 +0300
commit823d2f9a2c8796e5061c59595f96a1132641b26a (patch)
tree219b13820bd398acc48f3cc719c7a7bfdf77aa26 /spec
parent627bd5db4e091d0be312c880cbb9139b7c86818b (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'spec')
-rw-r--r--spec/factories/projects.rb33
-rw-r--r--spec/finders/merge_requests_finder_spec.rb67
-rw-r--r--spec/frontend/fixtures/static/textarea.html2
-rw-r--r--spec/frontend/vue_shared/components/form/input_copy_toggle_visibility_spec.js6
-rw-r--r--spec/helpers/search_helper_spec.rb8
-rw-r--r--spec/lib/gitlab/database/partitioning/list/convert_table_spec.rb33
-rw-r--r--spec/lib/service_ping/build_payload_spec.rb3
-rw-r--r--spec/requests/api/merge_requests_spec.rb81
-rw-r--r--spec/spec_helper.rb8
-rw-r--r--spec/support/helpers/debug_with_puts.rb13
-rw-r--r--spec/support/helpers/stub_requests.rb6
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)