diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-01-18 22:00:14 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-01-18 22:00:14 +0300 |
commit | 05f0ebba3a2c8ddf39e436f412dc2ab5bf1353b2 (patch) | |
tree | 11d0f2a6ec31c7793c184106cedc2ded3d9a2cc5 /spec/support | |
parent | ec73467c23693d0db63a797d10194da9e72a74af (diff) |
Add latest changes from gitlab-org/gitlab@15-8-stable-eev15.8.0-rc42
Diffstat (limited to 'spec/support')
62 files changed, 808 insertions, 858 deletions
diff --git a/spec/support/caching.rb b/spec/support/caching.rb index 11e4f534971..b18223523db 100644 --- a/spec/support/caching.rb +++ b/spec/support/caching.rb @@ -37,8 +37,8 @@ RSpec.configure do |config| end config.around(:each, :use_sql_query_cache) do |example| - ActiveRecord::Base.cache do - example.run - end + base_models = Gitlab::Database.database_base_models_with_gitlab_shared.values + inner_proc = proc { example.run } + base_models.inject(inner_proc) { |proc, base_model| proc { base_model.cache { proc.call } } }.call end end diff --git a/spec/support/capybara.rb b/spec/support/capybara.rb index aea853d1c23..fe9bff827dc 100644 --- a/spec/support/capybara.rb +++ b/spec/support/capybara.rb @@ -32,6 +32,8 @@ CAPYBARA_WINDOW_SIZE = [1366, 768].freeze SCREENSHOT_FILENAME_LENGTH = ENV['CI'] || ENV['CI_SERVER'] ? 255 : 99 +@blackhole_tcp_server = nil + # Run Workhorse on the given host and port, proxying to Puma on a UNIX socket, # for a closer-to-production experience Capybara.register_server :puma_via_workhorse do |app, port, host, **options| @@ -83,6 +85,17 @@ Capybara.register_driver :chrome do |app| # Chrome 75 defaults to W3C mode which doesn't allow console log access options.add_option(:w3c, false) + # Set up a proxy server to block all external traffic. + @blackhole_tcp_server = TCPServer.new(0) + Thread.new do + loop do + Thread.start(@blackhole_tcp_server.accept, &:close) + end + end + + options.add_argument("--proxy-server=http://127.0.0.1:#{@blackhole_tcp_server.addr[1]}") + options.add_argument("--proxy-bypass-list=127.0.0.1,localhost,#{Gitlab.config.gitlab.host}") + Capybara::Selenium::Driver.new( app, browser: :chrome, diff --git a/spec/support/helpers/api_helpers.rb b/spec/support/helpers/api_helpers.rb index 62bb9576695..a9d7c6af959 100644 --- a/spec/support/helpers/api_helpers.rb +++ b/spec/support/helpers/api_helpers.rb @@ -19,7 +19,7 @@ module ApiHelpers # => "/api/v2/issues?foo=bar&private_token=..." # # Returns the relative path to the requested API resource - def api(path, user = nil, version: API::API.version, personal_access_token: nil, oauth_access_token: nil, job_token: nil, access_token: nil) + def api(path, user = nil, version: API::API.version, personal_access_token: nil, oauth_access_token: nil, job_token: nil, access_token: nil, admin_mode: false) full_path = "/api/#{version}#{path}" if oauth_access_token @@ -31,7 +31,12 @@ module ApiHelpers elsif access_token query_string = "access_token=#{access_token.token}" elsif user - personal_access_token = create(:personal_access_token, user: user) + personal_access_token = if admin_mode && user.admin? + create(:personal_access_token, :admin_mode, user: user) + else + create(:personal_access_token, user: user) + end + query_string = "private_token=#{personal_access_token.token}" end diff --git a/spec/support/helpers/cycle_analytics_helpers.rb b/spec/support/helpers/cycle_analytics_helpers.rb index 6d41d7b7414..632f3ea28ee 100644 --- a/spec/support/helpers/cycle_analytics_helpers.rb +++ b/spec/support/helpers/cycle_analytics_helpers.rb @@ -92,7 +92,7 @@ module CycleAnalyticsHelpers end def create_value_stream_group_aggregation(group) - aggregation = Analytics::CycleAnalytics::Aggregation.safe_create_for_group(group) + aggregation = Analytics::CycleAnalytics::Aggregation.safe_create_for_namespace(group) Analytics::CycleAnalytics::AggregatorService.new(aggregation: aggregation).execute end diff --git a/spec/support/helpers/database/database_helpers.rb b/spec/support/helpers/database/database_helpers.rb index f3b2a2a6147..ecc42041e93 100644 --- a/spec/support/helpers/database/database_helpers.rb +++ b/spec/support/helpers/database/database_helpers.rb @@ -4,9 +4,7 @@ module Database module DatabaseHelpers # In order to directly work with views using factories, # we can swapout the view for a table of identical structure. - def swapout_view_for_table(view, connection: nil) - connection ||= ActiveRecord::Base.connection - + def swapout_view_for_table(view, connection:) connection.execute(<<~SQL.squish) CREATE TABLE #{view}_copy (LIKE #{view}); DROP VIEW #{view}; @@ -28,21 +26,20 @@ module Database # with_statement_timeout(0.1) do # model.select('pg_sleep(0.11)') # end - def with_statement_timeout(timeout) + def with_statement_timeout(timeout, connection:) # Force a positive value and a minimum of 1ms for very small values. timeout = (timeout * 1000).abs.ceil raise ArgumentError, 'Using a timeout of `0` means to disable statement timeout.' if timeout == 0 - previous_timeout = ActiveRecord::Base.connection - .exec_query('SHOW statement_timeout')[0].fetch('statement_timeout') + previous_timeout = connection.select_value('SHOW statement_timeout') - set_statement_timeout("#{timeout}ms") + connection.execute(format(%(SET LOCAL statement_timeout = '%s'), timeout)) yield ensure begin - set_statement_timeout(previous_timeout) + connection.execute(format(%(SET LOCAL statement_timeout = '%s'), previous_timeout)) rescue ActiveRecord::StatementInvalid # After a transaction was canceled/aborted due to e.g. a statement # timeout commands are ignored and will raise in PG::InFailedSqlTransaction. @@ -50,22 +47,5 @@ module Database # for the currrent transaction which will be closed anyway. end end - - # Set statement timeout for the current transaction. - # - # Note, that it does not restore the previous statement timeout. - # Use `with_statement_timeout` instead. - # - # @param timeout - Statement timeout in seconds - # - # Example: - # - # set_statement_timeout(0.1) - # model.select('pg_sleep(0.11)') - def set_statement_timeout(timeout) - ActiveRecord::Base.connection.execute( - format(%(SET LOCAL statement_timeout = '%s'), timeout) - ) - end end end diff --git a/spec/support/helpers/database/table_schema_helpers.rb b/spec/support/helpers/database/table_schema_helpers.rb index 472eaa45b4b..815c37e00e5 100644 --- a/spec/support/helpers/database/table_schema_helpers.rb +++ b/spec/support/helpers/database/table_schema_helpers.rb @@ -3,7 +3,9 @@ module Database module TableSchemaHelpers def connection - ActiveRecord::Base.connection + # We use ActiveRecord::Base.connection here because this is mainly used for database migrations + # where we override the connection on ActiveRecord::Base.connection + ActiveRecord::Base.connection # rubocop:disable Database/MultipleDatabases end def expect_table_to_be_replaced(original_table:, replacement_table:, archived_table:) diff --git a/spec/support/helpers/features/members_helpers.rb b/spec/support/helpers/features/members_helpers.rb index bdadcb8af43..2d3f0902a3c 100644 --- a/spec/support/helpers/features/members_helpers.rb +++ b/spec/support/helpers/features/members_helpers.rb @@ -56,6 +56,22 @@ module Spec click_button 'Search' end end + + def user_action_dropdown + '[data-testid="user-action-dropdown"]' + end + + def show_actions + within user_action_dropdown do + find('button').click + end + end + + def show_actions_for_username(user) + within find_username_row(user) do + show_actions + end + end end end end diff --git a/spec/support/helpers/features/web_ide_spec_helpers.rb b/spec/support/helpers/features/web_ide_spec_helpers.rb index 551749a43de..4793c9479fe 100644 --- a/spec/support/helpers/features/web_ide_spec_helpers.rb +++ b/spec/support/helpers/features/web_ide_spec_helpers.rb @@ -13,14 +13,18 @@ module WebIdeSpecHelpers include Spec::Support::Helpers::Features::SourceEditorSpecHelpers + # Open the IDE from anywhere by first visiting the given project's page def ide_visit(project) visit project_path(project) - wait_for_requests + ide_visit_from_link + end - click_link('Web IDE') + # Open the IDE from the current page by clicking the Web IDE link + def ide_visit_from_link(link_sel = 'Web IDE') + new_tab = window_opened_by { click_link(link_sel) } - wait_for_requests + switch_to_window new_tab end def ide_tree_body diff --git a/spec/support/helpers/listbox_helpers.rb b/spec/support/helpers/listbox_helpers.rb new file mode 100644 index 00000000000..5fcd05f31fb --- /dev/null +++ b/spec/support/helpers/listbox_helpers.rb @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +module ListboxHelpers + def select_from_listbox(text, from:, exact_item_text: false) + click_button from + select_listbox_item(text, exact_text: exact_item_text) + end + + def select_listbox_item(text, exact_text: false) + find('.gl-listbox-item[role="option"]', text: text, exact_text: exact_text).click + end + + def expect_listbox_item(text) + expect(page).to have_css('.gl-listbox-item[role="option"]', text: text) + end + + def expect_no_listbox_item(text) + expect(page).not_to have_css('.gl-listbox-item[role="option"]', text: text) + end + + def expect_listbox_items(items) + expect(find_all('.gl-listbox-item[role="option"]').map(&:text)).to eq(items) + end +end diff --git a/spec/support/helpers/listbox_input_helper.rb b/spec/support/helpers/listbox_input_helper.rb deleted file mode 100644 index ca7fbac5daa..00000000000 --- a/spec/support/helpers/listbox_input_helper.rb +++ /dev/null @@ -1,18 +0,0 @@ -# frozen_string_literal: true - -module ListboxInputHelper - include WaitForRequests - - def listbox_input(value, from:) - open_listbox_input(from) do - find('[role="option"]', text: value).click - end - end - - def open_listbox_input(selector) - page.within(selector) do - page.find('button[aria-haspopup="listbox"]').click - yield - end - end -end diff --git a/spec/support/helpers/login_helpers.rb b/spec/support/helpers/login_helpers.rb index 44237b821c3..5fde80e6dc9 100644 --- a/spec/support/helpers/login_helpers.rb +++ b/spec/support/helpers/login_helpers.rb @@ -101,6 +101,8 @@ module LoginHelpers fill_in "user_password", with: (password || user.password) check 'user_remember_me' if remember + wait_for_all_requests + find('[data-testid="sign-in-button"]:enabled').click if two_factor_auth diff --git a/spec/support/helpers/migrations_helpers.rb b/spec/support/helpers/migrations_helpers.rb index e1d28a807e3..6fc5904fc83 100644 --- a/spec/support/helpers/migrations_helpers.rb +++ b/spec/support/helpers/migrations_helpers.rb @@ -104,7 +104,7 @@ module MigrationsHelpers # We stub this way because we can't stub on # `current_application_settings` due to `method_missing` is # depending on current_application_settings... - allow(ActiveRecord::Base.connection) + allow(Gitlab::Database::Migration::V1_0::MigrationRecord.connection) .to receive(:active?) .and_return(false) allow(Gitlab::Runtime) @@ -158,10 +158,10 @@ module MigrationsHelpers end def migrate! - open_transactions = ActiveRecord::Base.connection.open_transactions + open_transactions = Gitlab::Database::Migration::V1_0::MigrationRecord.connection.open_transactions allow_next_instance_of(described_class) do |migration| allow(migration).to receive(:transaction_open?) do - ActiveRecord::Base.connection.open_transactions > open_transactions + Gitlab::Database::Migration::V1_0::MigrationRecord.connection.open_transactions > open_transactions end end diff --git a/spec/support/helpers/navbar_structure_helper.rb b/spec/support/helpers/navbar_structure_helper.rb index e1ed3ffacec..48c6e590e1b 100644 --- a/spec/support/helpers/navbar_structure_helper.rb +++ b/spec/support/helpers/navbar_structure_helper.rb @@ -91,9 +91,8 @@ module NavbarStructureHelper new_nav_item: { nav_item: _('Observability'), nav_sub_items: [ - _('Dashboards'), - _('Explore'), - _('Manage Dashboards') + _('Explore telemetry data'), + _('Data sources') ] } ) diff --git a/spec/support/helpers/query_recorder.rb b/spec/support/helpers/query_recorder.rb index dd124ed9c7f..5be9ba9ae1e 100644 --- a/spec/support/helpers/query_recorder.rb +++ b/spec/support/helpers/query_recorder.rb @@ -19,9 +19,7 @@ module ActiveRecord def record(&block) # force replacement of bind parameters to give tests the ability to check for ids - ActiveRecord::Base.connection.unprepared_statement do - ActiveSupport::Notifications.subscribed(method(:callback), 'sql.active_record', &block) - end + ActiveSupport::Notifications.subscribed(method(:callback), 'sql.active_record', &block) end def show_backtrace(values, duration) diff --git a/spec/support/helpers/usage_data_helpers.rb b/spec/support/helpers/usage_data_helpers.rb index 78ceaf297a8..438f0d129b9 100644 --- a/spec/support/helpers/usage_data_helpers.rb +++ b/spec/support/helpers/usage_data_helpers.rb @@ -116,8 +116,9 @@ module UsageDataHelpers ).freeze def stub_usage_data_connections - allow(ActiveRecord::Base.connection).to receive(:transaction_open?).and_return(false) - allow(::Ci::ApplicationRecord.connection).to receive(:transaction_open?).and_return(false) if ::Ci::ApplicationRecord.connection_class? + Gitlab::Database.database_base_models_with_gitlab_shared.each_value do |base_model| + allow(base_model.connection).to receive(:transaction_open?).and_return(false) + end allow(Gitlab::Prometheus::Internal).to receive(:prometheus_enabled?).and_return(false) end diff --git a/spec/support/matchers/be_boolean.rb b/spec/support/matchers/be_boolean.rb new file mode 100644 index 00000000000..b8c2c385504 --- /dev/null +++ b/spec/support/matchers/be_boolean.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +# Assert that this value is a boolean, i.e. true or false +# +# ``` +# expect(value).to be_boolean +# ``` +RSpec::Matchers.define :be_boolean do + match { |value| value.in? [true, false] } +end diff --git a/spec/support/matchers/exceed_query_limit.rb b/spec/support/matchers/exceed_query_limit.rb index a5a017828b3..4b08c13945c 100644 --- a/spec/support/matchers/exceed_query_limit.rb +++ b/spec/support/matchers/exceed_query_limit.rb @@ -380,3 +380,32 @@ RSpec::Matchers.define :exceed_query_limit do |expected| failure_message end end + +RSpec::Matchers.define :match_query_count do |expected| + supports_block_expectations + + include ExceedQueryLimitHelpers + + def verify_count(&block) + @subject_block = block + actual_count == maximum + end + + def failure_message + threshold_message = threshold > 0 ? " (+#{threshold})" : '' + counts = "#{expected_count}#{threshold_message}" + "Expected exactly #{counts} queries, got #{actual_count}:\n\n#{log_message}" + end + + def skip_cached + false + end + + match do |block| + verify_count(&block) + end + + failure_message_when_negated do |actual| + failure_message + end +end diff --git a/spec/support/redis/redis_helpers.rb b/spec/support/redis/redis_helpers.rb index 34ac69236ee..2c5ceb2f09e 100644 --- a/spec/support/redis/redis_helpers.rb +++ b/spec/support/redis/redis_helpers.rb @@ -6,11 +6,4 @@ module RedisHelpers instance_class.with(&:flushdb) end end - - # Usage: reset cached instance config - def redis_clear_raw_config!(instance_class) - instance_class.remove_instance_variable(:@_raw_config) - rescue NameError - # raised if @_raw_config was not set; ignore - end end diff --git a/spec/support/redis/redis_new_instance_shared_examples.rb b/spec/support/redis/redis_new_instance_shared_examples.rb index 943fe0f11ba..0f2de78b2cb 100644 --- a/spec/support/redis/redis_new_instance_shared_examples.rb +++ b/spec/support/redis/redis_new_instance_shared_examples.rb @@ -3,27 +3,22 @@ require 'spec_helper' RSpec.shared_examples "redis_new_instance_shared_examples" do |name, fallback_class| + include TmpdirHelper + let(:instance_specific_config_file) { "config/redis.#{name}.yml" } let(:environment_config_file_name) { "GITLAB_REDIS_#{name.upcase}_CONFIG_FILE" } let(:fallback_config_file) { nil } + let(:rails_root) { mktmpdir } before do - redis_clear_raw_config!(fallback_class) - allow(fallback_class).to receive(:config_file_name).and_return(fallback_config_file) end - after do - redis_clear_raw_config!(fallback_class) - end - it_behaves_like "redis_shared_examples" describe '.config_file_name' do subject { described_class.config_file_name } - let(:rails_root) { Dir.mktmpdir('redis_shared_examples') } - before do # Undo top-level stub of config_file_name because we are testing that method now. allow(described_class).to receive(:config_file_name).and_call_original @@ -32,10 +27,6 @@ RSpec.shared_examples "redis_new_instance_shared_examples" do |name, fallback_cl FileUtils.mkdir_p(File.join(rails_root, 'config')) end - after do - FileUtils.rm_rf(rails_root) - end - context 'when there is only a resque.yml' do before do FileUtils.touch(File.join(rails_root, 'config/resque.yml')) @@ -58,4 +49,49 @@ RSpec.shared_examples "redis_new_instance_shared_examples" do |name, fallback_cl end end end + + describe '#fetch_config' do + context 'when redis.yml exists' do + subject { described_class.new('test').send(:fetch_config) } + + before do + allow(described_class).to receive(:config_file_name).and_call_original + allow(described_class).to receive(:redis_yml_path).and_call_original + allow(described_class).to receive(:rails_root).and_return(rails_root) + FileUtils.mkdir_p(File.join(rails_root, 'config')) + end + + context 'when the fallback has a redis.yml entry' do + before do + File.write(File.join(rails_root, 'config/redis.yml'), { + 'test' => { + described_class.config_fallback.store_name.underscore => { 'fallback redis.yml' => 123 } + } + }.to_json) + end + + it { expect(subject).to eq({ 'fallback redis.yml' => 123 }) } + + context 'and an instance config file exists' do + before do + File.write(File.join(rails_root, instance_specific_config_file), { + 'test' => { 'instance specific file' => 456 } + }.to_json) + end + + it { expect(subject).to eq({ 'instance specific file' => 456 }) } + + context 'and the instance has a redis.yml entry' do + before do + File.write(File.join(rails_root, 'config/redis.yml'), { + 'test' => { name => { 'instance redis.yml' => 789 } } + }.to_json) + end + + it { expect(subject).to eq({ 'instance redis.yml' => 789 }) } + end + end + end + end + end end diff --git a/spec/support/redis/redis_shared_examples.rb b/spec/support/redis/redis_shared_examples.rb index 0368fd63357..43c118a362d 100644 --- a/spec/support/redis/redis_shared_examples.rb +++ b/spec/support/redis/redis_shared_examples.rb @@ -2,6 +2,7 @@ RSpec.shared_examples "redis_shared_examples" do include StubENV + include TmpdirHelper let(:test_redis_url) { "redis://redishost:#{redis_port}" } let(:test_cluster_config) { { cluster: [{ host: "redis://redishost", port: redis_port }] } } @@ -18,15 +19,11 @@ RSpec.shared_examples "redis_shared_examples" do let(:sentinel_port) { 26379 } let(:config_with_environment_variable_inside) { "spec/fixtures/config/redis_config_with_env.yml" } let(:config_env_variable_url) { "TEST_GITLAB_REDIS_URL" } - let(:rails_root) { Dir.mktmpdir('redis_shared_examples') } + let(:rails_root) { mktmpdir } before do allow(described_class).to receive(:config_file_name).and_return(Rails.root.join(config_file_name).to_s) - redis_clear_raw_config!(described_class) - end - - after do - redis_clear_raw_config!(described_class) + allow(described_class).to receive(:redis_yml_path).and_return('/dev/null') end describe '.config_file_name' do @@ -40,10 +37,6 @@ RSpec.shared_examples "redis_shared_examples" do FileUtils.mkdir_p(File.join(rails_root, 'config')) end - after do - FileUtils.rm_rf(rails_root) - end - context 'when there is no config file anywhere' do it { expect(subject).to be_nil } @@ -250,26 +243,6 @@ RSpec.shared_examples "redis_shared_examples" do end end - describe '._raw_config' do - subject { described_class._raw_config } - - let(:config_file_name) { '/var/empty/doesnotexist' } - - it 'is frozen' do - expect(subject).to be_frozen - end - - it 'returns false when the file does not exist' do - expect(subject).to eq(false) - end - - it "returns false when the filename can't be determined" do - expect(described_class).to receive(:config_file_name).and_return(nil) - - expect(subject).to eq(false) - end - end - describe '.with' do let(:config_file_name) { config_old_format_socket } @@ -313,10 +286,6 @@ RSpec.shared_examples "redis_shared_examples" do allow(described_class).to receive(:rails_root).and_return(rails_root) end - after do - FileUtils.rm_rf(rails_root) - end - it 'can run an empty block' do expect { described_class.with { nil } }.not_to raise_error end @@ -408,9 +377,7 @@ RSpec.shared_examples "redis_shared_examples" do context 'when sentinels are not defined' do let(:config_file_name) { config_old_format_host } - it 'returns false' do - is_expected.to be_falsey - end + it { expect(subject).to eq(nil) } end context 'when cluster is defined' do @@ -435,22 +402,39 @@ RSpec.shared_examples "redis_shared_examples" do end describe '#fetch_config' do - it 'returns false when no config file is present' do - allow(described_class).to receive(:_raw_config) { false } + it 'raises an exception when the config file contains invalid yaml' do + Tempfile.open('bad.yml') do |file| + file.write('{"not":"yaml"') + file.flush + allow(described_class).to receive(:config_file_name) { file.path } - expect(subject.send(:fetch_config)).to eq false + expect { subject.send(:fetch_config) }.to raise_error(Psych::SyntaxError) + end end - it 'returns false when config file is present but has invalid YAML' do - allow(described_class).to receive(:_raw_config) { "# development: true" } + it 'has a value for the legacy default URL' do + allow(subject).to receive(:fetch_config) { nil } - expect(subject.send(:fetch_config)).to eq false + expect(subject.send(:raw_config_hash)).to include(url: a_string_matching(%r{\Aredis://localhost:638[012]\Z})) end - it 'has a value for the legacy default URL' do - allow(subject).to receive(:fetch_config) { false } + context 'when redis.yml exists' do + subject { described_class.new('test').send(:fetch_config) } - expect(subject.send(:raw_config_hash)).to include(url: a_string_matching(%r{\Aredis://localhost:638[012]\Z})) + before do + allow(described_class).to receive(:config_file_name).and_call_original + allow(described_class).to receive(:redis_yml_path).and_call_original + allow(described_class).to receive(:rails_root).and_return(rails_root) + FileUtils.mkdir_p(File.join(rails_root, 'config')) + end + + it 'uses config/redis.yml' do + File.write(File.join(rails_root, 'config/redis.yml'), { + 'test' => { described_class.store_name.underscore => { 'foobar' => 123 } } + }.to_json) + + expect(subject).to eq({ 'foobar' => 123 }) + end end end diff --git a/spec/support/rspec_order_todo.yml b/spec/support/rspec_order_todo.yml index 489ed89c048..2f3f0feb87e 100644 --- a/spec/support/rspec_order_todo.yml +++ b/spec/support/rspec_order_todo.yml @@ -30,11 +30,6 @@ - './ee/spec/controllers/admin/runners_controller_spec.rb' - './ee/spec/controllers/admin/users_controller_spec.rb' - './ee/spec/controllers/autocomplete_controller_spec.rb' -- './ee/spec/controllers/boards/issues_controller_spec.rb' -- './ee/spec/controllers/boards/lists_controller_spec.rb' -- './ee/spec/controllers/boards/milestones_controller_spec.rb' -- './ee/spec/controllers/boards/users_controller_spec.rb' -- './ee/spec/controllers/concerns/boards_responses_spec.rb' - './ee/spec/controllers/concerns/ee/routable_actions/sso_enforcement_redirect_spec.rb' - './ee/spec/controllers/concerns/geo_instrumentation_spec.rb' - './ee/spec/controllers/concerns/gitlab_subscriptions/seat_count_alert_spec.rb' @@ -107,7 +102,6 @@ - './ee/spec/controllers/groups/security/vulnerabilities_controller_spec.rb' - './ee/spec/controllers/groups/sso_controller_spec.rb' - './ee/spec/controllers/groups/todos_controller_spec.rb' -- './ee/spec/controllers/groups/usage_quotas_controller_spec.rb' - './ee/spec/controllers/groups/wikis_controller_spec.rb' - './ee/spec/controllers/ldap/omniauth_callbacks_controller_spec.rb' - './ee/spec/controllers/oauth/applications_controller_spec.rb' @@ -141,7 +135,6 @@ - './ee/spec/controllers/projects/issues_controller_spec.rb' - './ee/spec/controllers/projects/iteration_cadences_controller_spec.rb' - './ee/spec/controllers/projects/iterations_controller_spec.rb' -- './ee/spec/controllers/projects/legacy_pipelines_controller_spec.rb' - './ee/spec/controllers/projects/licenses_controller_spec.rb' - './ee/spec/controllers/projects/merge_requests_controller_spec.rb' - './ee/spec/controllers/projects/merge_requests/creations_controller_spec.rb' @@ -171,11 +164,8 @@ - './ee/spec/controllers/projects/subscriptions_controller_spec.rb' - './ee/spec/controllers/projects/vulnerability_feedback_controller_spec.rb' - './ee/spec/controllers/registrations/company_controller_spec.rb' -- './ee/spec/controllers/registrations/groups_controller_spec.rb' - './ee/spec/controllers/registrations/groups_projects_controller_spec.rb' -- './ee/spec/controllers/registrations/projects_controller_spec.rb' - './ee/spec/controllers/registrations/verification_controller_spec.rb' -- './ee/spec/controllers/registrations/welcome_controller_spec.rb' - './ee/spec/controllers/repositories/git_http_controller_spec.rb' - './ee/spec/controllers/security/dashboard_controller_spec.rb' - './ee/spec/controllers/security/projects_controller_spec.rb' @@ -210,7 +200,6 @@ - './ee/spec/elastic/migrate/20220512150000_pause_indexing_for_unsupported_es_versions_spec.rb' - './ee/spec/elastic/migrate/20220613120500_migrate_commits_to_separate_index_spec.rb' - './ee/spec/elastic/migrate/20220713103500_delete_commits_from_original_index_spec.rb' -- './ee/spec/factories/lfs_object_spec.rb' - './ee/spec/features/account_recovery_regular_check_spec.rb' - './ee/spec/features/admin/admin_credentials_inventory_spec.rb' - './ee/spec/features/admin/admin_dashboard_spec.rb' @@ -260,7 +249,6 @@ - './ee/spec/features/ci_shared_runner_settings_spec.rb' - './ee/spec/features/ci_shared_runner_warnings_spec.rb' - './ee/spec/features/clusters/cluster_detail_page_spec.rb' -- './ee/spec/features/contextual_sidebar_spec.rb' - './ee/spec/features/dashboards/activity_spec.rb' - './ee/spec/features/dashboards/groups_spec.rb' - './ee/spec/features/dashboards/issues_spec.rb' @@ -312,8 +300,6 @@ - './ee/spec/features/groups/hooks/user_views_hooks_spec.rb' - './ee/spec/features/groups/insights_spec.rb' - './ee/spec/features/groups/issues_spec.rb' -- './ee/spec/features/groups/iterations/iterations_list_spec.rb' -- './ee/spec/features/groups/iteration_spec.rb' - './ee/spec/features/groups/iterations/user_creates_iteration_in_cadence_spec.rb' - './ee/spec/features/groups/iterations/user_edits_iteration_cadence_spec.rb' - './ee/spec/features/groups/iterations/user_edits_iteration_spec.rb' @@ -333,7 +319,6 @@ - './ee/spec/features/groups/saml_group_links_spec.rb' - './ee/spec/features/groups/saml_providers_spec.rb' - './ee/spec/features/groups/scim_token_spec.rb' -- './ee/spec/features/groups/seat_usage/seat_usage_spec.rb' - './ee/spec/features/groups/security/compliance_dashboards_spec.rb' - './ee/spec/features/groups/settings/ci_cd_spec.rb' - './ee/spec/features/groups/settings/protected_environments_spec.rb' @@ -342,10 +327,8 @@ - './ee/spec/features/groups/settings/user_searches_in_settings_spec.rb' - './ee/spec/features/groups_spec.rb' - './ee/spec/features/groups/sso_spec.rb' -- './ee/spec/features/groups/usage_quotas_spec.rb' - './ee/spec/features/groups/wikis_spec.rb' - './ee/spec/features/groups/wiki/user_views_wiki_empty_spec.rb' -- './ee/spec/features/ide/user_commits_changes_spec.rb' - './ee/spec/features/ide/user_opens_ide_spec.rb' - './ee/spec/features/integrations/jira/jira_issues_list_spec.rb' - './ee/spec/features/invites_spec.rb' @@ -432,7 +415,6 @@ - './ee/spec/features/projects/issues/user_creates_issue_spec.rb' - './ee/spec/features/projects/issues/viewing_relocated_issues_spec.rb' - './ee/spec/features/projects/iterations/iteration_cadences_list_spec.rb' -- './ee/spec/features/projects/iterations/iterations_list_spec.rb' - './ee/spec/features/projects/iterations/user_views_iteration_spec.rb' - './ee/spec/features/projects/jobs/blocked_deployment_job_page_spec.rb' - './ee/spec/features/projects/jobs_spec.rb' @@ -450,7 +432,6 @@ - './ee/spec/features/projects/new_project_from_template_spec.rb' - './ee/spec/features/projects/new_project_spec.rb' - './ee/spec/features/projects/path_locks_spec.rb' -- './ee/spec/features/projects/pipelines/legacy_pipeline_spec.rb' - './ee/spec/features/projects/pipelines/pipeline_csp_spec.rb' - './ee/spec/features/projects/pipelines/pipeline_spec.rb' - './ee/spec/features/projects/pipelines/pipelines_spec.rb' @@ -479,7 +460,6 @@ - './ee/spec/features/projects/settings/user_manages_approval_settings_spec.rb' - './ee/spec/features/projects/settings/user_manages_issues_template_spec.rb' - './ee/spec/features/projects/settings/user_manages_members_spec.rb' -- './ee/spec/features/projects/settings/user_manages_merge_pipelines_spec.rb' - './ee/spec/features/projects/settings/user_manages_merge_requests_template_spec.rb' - './ee/spec/features/projects/settings/user_manages_merge_trains_spec.rb' - './ee/spec/features/projects/show/developer_views_empty_project_instructions_spec.rb' @@ -494,9 +474,6 @@ - './ee/spec/features/read_only_spec.rb' - './ee/spec/features/registrations/combined_registration_spec.rb' - './ee/spec/features/registrations/one_trust_spec.rb' -- './ee/spec/features/registrations/saas_user_registration_spec.rb' -- './ee/spec/features/registrations/trial_during_signup_flow_spec.rb' -- './ee/spec/features/registrations/user_sees_new_onboarding_flow_spec.rb' - './ee/spec/features/registrations/welcome_spec.rb' - './ee/spec/features/search/elastic/global_search_spec.rb' - './ee/spec/features/search/elastic/group_search_spec.rb' @@ -595,7 +572,6 @@ - './ee/spec/finders/productivity_analytics_finder_spec.rb' - './ee/spec/finders/projects/integrations/jira/by_ids_finder_spec.rb' - './ee/spec/finders/projects/integrations/jira/issues_finder_spec.rb' -- './ee/spec/finders/requirements_management/requirements_finder_spec.rb' - './ee/spec/finders/scim_finder_spec.rb' - './ee/spec/finders/security/findings_finder_spec.rb' - './ee/spec/finders/security/pipeline_vulnerabilities_finder_spec.rb' @@ -641,7 +617,6 @@ - './ee/spec/graphql/ee/mutations/concerns/mutations/resolves_issuable_spec.rb' - './ee/spec/graphql/ee/resolvers/board_list_issues_resolver_spec.rb' - './ee/spec/graphql/ee/resolvers/board_lists_resolver_spec.rb' -- './ee/spec/graphql/ee/resolvers/issues_resolver_spec.rb' - './ee/spec/graphql/ee/resolvers/namespace_projects_resolver_spec.rb' - './ee/spec/graphql/ee/types/alert_management/http_integration_type_spec.rb' - './ee/spec/graphql/ee/types/board_list_type_spec.rb' @@ -718,7 +693,6 @@ - './ee/spec/graphql/mutations/requirements_management/update_requirement_spec.rb' - './ee/spec/graphql/mutations/security/ci_configuration/configure_container_scanning_spec.rb' - './ee/spec/graphql/mutations/security/ci_configuration/configure_dependency_scanning_spec.rb' -- './ee/spec/graphql/mutations/security_finding/dismiss_spec.rb' - './ee/spec/graphql/mutations/security_policy/assign_security_policy_project_spec.rb' - './ee/spec/graphql/mutations/security_policy/commit_scan_execution_policy_spec.rb' - './ee/spec/graphql/mutations/security_policy/create_security_policy_project_spec.rb' @@ -958,7 +932,6 @@ - './ee/spec/graphql/types/vulnerable_projects_by_grade_type_spec.rb' - './ee/spec/graphql/types/work_items/type_spec.rb' - './ee/spec/graphql/types/work_items/widget_interface_spec.rb' -- './ee/spec/graphql/types/work_items/widgets/verification_status_type_spec.rb' - './ee/spec/helpers/admin/emails_helper_spec.rb' - './ee/spec/helpers/admin/ip_restriction_helper_spec.rb' - './ee/spec/helpers/admin/repo_size_limit_helper_spec.rb' @@ -1020,7 +993,6 @@ - './ee/spec/helpers/ee/trial_registration_helper_spec.rb' - './ee/spec/helpers/ee/users/callouts_helper_spec.rb' - './ee/spec/helpers/ee/version_check_helper_spec.rb' -- './ee/spec/helpers/ee/welcome_helper_spec.rb' - './ee/spec/helpers/ee/wiki_helper_spec.rb' - './ee/spec/helpers/epics_helper_spec.rb' - './ee/spec/helpers/gitlab_subscriptions/upcoming_reconciliation_helper_spec.rb' @@ -1132,13 +1104,6 @@ - './ee/spec/lib/ee/api/helpers/scim_pagination_spec.rb' - './ee/spec/lib/ee/api/helpers_spec.rb' - './ee/spec/lib/ee/api/helpers/variables_helpers_spec.rb' -- './ee/spec/lib/ee/audit/compliance_framework_changes_auditor_spec.rb' -- './ee/spec/lib/ee/audit/group_changes_auditor_spec.rb' -- './ee/spec/lib/ee/audit/project_changes_auditor_spec.rb' -- './ee/spec/lib/ee/audit/project_ci_cd_setting_changes_auditor_spec.rb' -- './ee/spec/lib/ee/audit/project_feature_changes_auditor_spec.rb' -- './ee/spec/lib/ee/audit/project_setting_changes_auditor_spec.rb' -- './ee/spec/lib/ee/audit/protected_branches_changes_auditor_spec.rb' - './ee/spec/lib/ee/backup/repositories_spec.rb' - './ee/spec/lib/ee/banzai/filter/sanitization_filter_spec.rb' - './ee/spec/lib/ee/bulk_imports/groups/stage_spec.rb' @@ -1170,7 +1135,6 @@ - './ee/spec/lib/ee/gitlab/background_migration/migrate_approver_to_approval_rules_check_progress_spec.rb' - './ee/spec/lib/ee/gitlab/background_migration/migrate_approver_to_approval_rules_in_batch_spec.rb' - './ee/spec/lib/ee/gitlab/background_migration/migrate_approver_to_approval_rules_spec.rb' -- './ee/spec/lib/ee/gitlab/background_migration/migrate_job_artifact_registry_to_ssf_spec.rb' - './ee/spec/lib/ee/gitlab/background_migration/migrate_shared_vulnerability_scanners_spec.rb' - './ee/spec/lib/ee/gitlab/background_migration/populate_latest_pipeline_ids_spec.rb' - './ee/spec/lib/ee/gitlab/background_migration/populate_namespace_statistics_spec.rb' @@ -1197,7 +1161,6 @@ - './ee/spec/lib/ee/gitlab/ci/pipeline/chain/validate/external_spec.rb' - './ee/spec/lib/ee/gitlab/ci/pipeline/chain/validate/security_orchestration_policy_spec.rb' - './ee/spec/lib/ee/gitlab/ci/pipeline/quota/activity_spec.rb' -- './ee/spec/lib/ee/gitlab/ci/pipeline/quota/job_activity_spec.rb' - './ee/spec/lib/ee/gitlab/ci/pipeline/quota/size_spec.rb' - './ee/spec/lib/ee/gitlab/ci/reports/security/reports_spec.rb' - './ee/spec/lib/ee/gitlab/ci/status/build/manual_spec.rb' @@ -1219,8 +1182,6 @@ - './ee/spec/lib/ee/gitlab/hook_data/issue_builder_spec.rb' - './ee/spec/lib/ee/gitlab/hook_data/user_builder_spec.rb' - './ee/spec/lib/ee/gitlab/import_export/after_export_strategies/custom_template_export_import_strategy_spec.rb' -- './ee/spec/lib/ee/gitlab/import_export/group/legacy_tree_restorer_spec.rb' -- './ee/spec/lib/ee/gitlab/import_export/group/legacy_tree_saver_spec.rb' - './ee/spec/lib/ee/gitlab/import_export/group/tree_restorer_spec.rb' - './ee/spec/lib/ee/gitlab/import_export/group/tree_saver_spec.rb' - './ee/spec/lib/ee/gitlab/import_export/project/tree_restorer_spec.rb' @@ -1241,11 +1202,9 @@ - './ee/spec/lib/ee/gitlab/repo_path_spec.rb' - './ee/spec/lib/ee/gitlab/repository_size_checker_spec.rb' - './ee/spec/lib/ee/gitlab/scim/attribute_transform_spec.rb' -- './ee/spec/lib/ee/gitlab/scim/deprovision_service_spec.rb' - './ee/spec/lib/ee/gitlab/scim/filter_parser_spec.rb' - './ee/spec/lib/ee/gitlab/scim/params_parser_spec.rb' - './ee/spec/lib/ee/gitlab/scim/provisioning_service_spec.rb' -- './ee/spec/lib/ee/gitlab/scim/reprovision_service_spec.rb' - './ee/spec/lib/ee/gitlab/scim/value_parser_spec.rb' - './ee/spec/lib/ee/gitlab/search_results_spec.rb' - './ee/spec/lib/ee/gitlab/security/scan_configuration_spec.rb' @@ -1385,13 +1344,11 @@ - './ee/spec/lib/gitlab/ci/parsers/security/dast_spec.rb' - './ee/spec/lib/gitlab/ci/parsers/security/dependency_list_spec.rb' - './ee/spec/lib/gitlab/ci/parsers/security/dependency_scanning_spec.rb' -- './ee/spec/lib/gitlab/ci/parsers/security/formatters/dast_spec.rb' - './ee/spec/lib/gitlab/ci/parsers/security/formatters/dependency_list_spec.rb' - './ee/spec/lib/gitlab/ci/parsers/security/validators/default_branch_image_validator_spec.rb' - './ee/spec/lib/gitlab/ci/pipeline/chain/config/content_spec.rb' - './ee/spec/lib/gitlab/ci/pipeline/chain/create_cross_database_associations_spec.rb' - './ee/spec/lib/gitlab/ci/pipeline/chain/limit/activity_spec.rb' -- './ee/spec/lib/gitlab/ci/pipeline/chain/limit/job_activity_spec.rb' - './ee/spec/lib/gitlab/ci/pipeline/chain/limit/size_spec.rb' - './ee/spec/lib/gitlab/ci/reports/coverage_fuzzing/report_spec.rb' - './ee/spec/lib/gitlab/ci/reports/dependency_list/dependency_spec.rb' @@ -1533,7 +1490,6 @@ - './ee/spec/lib/gitlab/insights/reducers/base_reducer_spec.rb' - './ee/spec/lib/gitlab/insights/reducers/count_per_label_reducer_spec.rb' - './ee/spec/lib/gitlab/insights/reducers/count_per_period_reducer_spec.rb' -- './ee/spec/lib/gitlab/insights/reducers/dora_reducer_spec.rb' - './ee/spec/lib/gitlab/insights/reducers/label_count_per_period_reducer_spec.rb' - './ee/spec/lib/gitlab/insights/serializers/chartjs/bar_serializer_spec.rb' - './ee/spec/lib/gitlab/insights/serializers/chartjs/bar_time_series_serializer_spec.rb' @@ -1552,7 +1508,6 @@ - './ee/spec/lib/gitlab/middleware/ip_restrictor_spec.rb' - './ee/spec/lib/gitlab/mirror_spec.rb' - './ee/spec/lib/gitlab/object_hierarchy_spec.rb' -- './ee/spec/lib/gitlab/pagination_delegate_spec.rb' - './ee/spec/lib/gitlab/pagination/keyset/simple_order_builder_spec.rb' - './ee/spec/lib/gitlab/patch/database_config_spec.rb' - './ee/spec/lib/gitlab/patch/draw_route_spec.rb' @@ -1590,7 +1545,6 @@ - './ee/spec/lib/gitlab/usage_data_counters/epic_activity_unique_counter_spec.rb' - './ee/spec/lib/gitlab/usage_data_counters/licenses_list_spec.rb' - './ee/spec/lib/gitlab/usage_data_metrics_spec.rb' -- './ee/spec/lib/gitlab/usage/metrics/aggregates/aggregate_spec.rb' - './ee/spec/lib/gitlab/usage/metrics/instrumentations/advanced_search/build_type_metric_spec.rb' - './ee/spec/lib/gitlab/usage/metrics/instrumentations/advanced_search/distribution_metric_spec.rb' - './ee/spec/lib/gitlab/usage/metrics/instrumentations/advanced_search/lucene_version_metric_spec.rb' @@ -1670,12 +1624,10 @@ - './ee/spec/migrations/add_non_null_constraint_for_escalation_rule_on_pending_alert_escalations_spec.rb' - './ee/spec/migrations/async_build_trace_expire_at_index_spec.rb' - './ee/spec/migrations/backfill_delayed_group_deletion_spec.rb' -- './ee/spec/migrations/backfill_namespace_statistics_with_wiki_size_spec.rb' - './ee/spec/migrations/drop_invalid_remediations_spec.rb' - './ee/spec/migrations/geo/fix_state_column_in_file_registry_spec.rb' - './ee/spec/migrations/geo/fix_state_column_in_lfs_object_registry_spec.rb' - './ee/spec/migrations/geo/migrate_ci_job_artifacts_to_separate_registry_spec.rb' -- './ee/spec/migrations/geo/migrate_job_artifact_registry_spec.rb' - './ee/spec/migrations/geo/migrate_lfs_objects_to_separate_registry_spec.rb' - './ee/spec/migrations/geo/set_resync_flag_for_retried_projects_spec.rb' - './ee/spec/migrations/remove_schedule_and_status_null_constraints_from_pending_escalations_alert_spec.rb' @@ -1683,14 +1635,11 @@ - './ee/spec/migrations/schedule_populate_test_reports_issue_id_spec.rb' - './ee/spec/migrations/schedule_requirements_migration_spec.rb' - './ee/spec/migrations/schedule_trace_expiry_removal_spec.rb' -- './ee/spec/migrations/update_gitlab_subscriptions_start_at_post_eoa_spec.rb' - './ee/spec/migrations/update_vulnerability_occurrences_location_spec.rb' - './ee/spec/models/alert_management/alert_payload_field_spec.rb' - './ee/spec/models/allowed_email_domain_spec.rb' - './ee/spec/models/analytics/cycle_analytics/aggregation_context_spec.rb' - './ee/spec/models/analytics/cycle_analytics/group_level_spec.rb' -- './ee/spec/models/analytics/cycle_analytics/group_stage_spec.rb' -- './ee/spec/models/analytics/cycle_analytics/group_value_stream_spec.rb' - './ee/spec/models/analytics/cycle_analytics/project_stage_spec.rb' - './ee/spec/models/analytics/cycle_analytics/runtime_limiter_spec.rb' - './ee/spec/models/analytics/devops_adoption/enabled_namespace_spec.rb' @@ -1698,7 +1647,6 @@ - './ee/spec/models/analytics/issues_analytics_spec.rb' - './ee/spec/models/analytics/language_trend/repository_language_spec.rb' - './ee/spec/models/application_setting_spec.rb' -- './ee/spec/models/approvable_spec.rb' - './ee/spec/models/approval_merge_request_rule_spec.rb' - './ee/spec/models/approval_project_rule_spec.rb' - './ee/spec/models/approvals/scan_finding_wrapped_rule_set_spec.rb' @@ -1730,7 +1678,6 @@ - './ee/spec/models/ci/daily_build_group_report_result_spec.rb' - './ee/spec/models/ci/minutes/additional_pack_spec.rb' - './ee/spec/models/ci/minutes/context_spec.rb' -- './ee/spec/models/ci/minutes/limit_spec.rb' - './ee/spec/models/ci/minutes/namespace_monthly_usage_spec.rb' - './ee/spec/models/ci/minutes/notification_spec.rb' - './ee/spec/models/ci/minutes/project_monthly_usage_spec.rb' @@ -1942,7 +1889,6 @@ - './ee/spec/models/namespace_limit_spec.rb' - './ee/spec/models/namespace_setting_spec.rb' - './ee/spec/models/namespaces/free_user_cap_spec.rb' -- './ee/spec/models/namespaces/free_user_cap/standard_spec.rb' - './ee/spec/models/namespaces/storage/root_excess_size_spec.rb' - './ee/spec/models/namespaces/storage/root_size_spec.rb' - './ee/spec/models/note_spec.rb' @@ -1963,9 +1909,7 @@ - './ee/spec/models/project_team_spec.rb' - './ee/spec/models/protected_branch/required_code_owners_section_spec.rb' - './ee/spec/models/protected_branch/unprotect_access_level_spec.rb' -- './ee/spec/models/protected_environment/deploy_access_level_spec.rb' - './ee/spec/models/protected_environments/approval_rule_spec.rb' -- './ee/spec/models/protected_environments/approval_summary_spec.rb' - './ee/spec/models/protected_environment_spec.rb' - './ee/spec/models/push_rule_spec.rb' - './ee/spec/models/release_highlight_spec.rb' @@ -2030,7 +1974,6 @@ - './ee/spec/models/vulnerability_user_mention_spec.rb' - './ee/spec/models/weight_note_spec.rb' - './ee/spec/models/work_item_spec.rb' -- './ee/spec/models/work_items/widgets/verification_status_spec.rb' - './ee/spec/policies/approval_merge_request_rule_policy_spec.rb' - './ee/spec/policies/approval_project_rule_policy_spec.rb' - './ee/spec/policies/approval_state_policy_spec.rb' @@ -2265,7 +2208,6 @@ - './ee/spec/requests/api/graphql/mutations/requirements_management/create_requirement_spec.rb' - './ee/spec/requests/api/graphql/mutations/requirements_management/export_requirements_spec.rb' - './ee/spec/requests/api/graphql/mutations/requirements_management/update_requirement_spec.rb' -- './ee/spec/requests/api/graphql/mutations/security_finding/create_issue_spec.rb' - './ee/spec/requests/api/graphql/mutations/security_policy/assign_security_policy_project_spec.rb' - './ee/spec/requests/api/graphql/mutations/security_policy/commit_scan_execution_policy_spec.rb' - './ee/spec/requests/api/graphql/mutations/security_policy/create_security_policy_project_spec.rb' @@ -2337,7 +2279,6 @@ - './ee/spec/requests/api/ldap_spec.rb' - './ee/spec/requests/api/license_spec.rb' - './ee/spec/requests/api/managed_licenses_spec.rb' -- './ee/spec/requests/api/markdown_golden_master_spec.rb' - './ee/spec/requests/api/members_spec.rb' - './ee/spec/requests/api/merge_request_approval_rules_spec.rb' - './ee/spec/requests/api/merge_request_approval_settings_spec.rb' @@ -2367,7 +2308,6 @@ - './ee/spec/requests/api/resource_label_events_spec.rb' - './ee/spec/requests/api/resource_weight_events_spec.rb' - './ee/spec/requests/api/saml_group_links_spec.rb' -- './ee/spec/requests/api/scim_spec.rb' - './ee/spec/requests/api/search_spec.rb' - './ee/spec/requests/api/settings_spec.rb' - './ee/spec/requests/api/status_checks_spec.rb' @@ -2449,14 +2389,12 @@ - './ee/spec/routing/user_routing_spec.rb' - './ee/spec/routing/webhook_routes_spec.rb' - './ee/spec/serializers/analytics/cycle_analytics/event_entity_spec.rb' -- './ee/spec/serializers/analytics/cycle_analytics/stage_entity_spec.rb' - './ee/spec/serializers/analytics/cycle_analytics/value_stream_errors_serializer_spec.rb' - './ee/spec/serializers/audit_event_entity_spec.rb' - './ee/spec/serializers/audit_event_serializer_spec.rb' - './ee/spec/serializers/autocomplete/group_entity_spec.rb' - './ee/spec/serializers/autocomplete/group_serializer_spec.rb' - './ee/spec/serializers/blocking_merge_request_entity_spec.rb' -- './ee/spec/serializers/board_serializer_spec.rb' - './ee/spec/serializers/clusters/deployment_entity_spec.rb' - './ee/spec/serializers/clusters/environment_entity_spec.rb' - './ee/spec/serializers/clusters/environment_serializer_spec.rb' @@ -2469,7 +2407,6 @@ - './ee/spec/serializers/dependency_list_serializer_spec.rb' - './ee/spec/serializers/ee/admin/user_entity_spec.rb' - './ee/spec/serializers/ee/blob_entity_spec.rb' -- './ee/spec/serializers/ee/board_simple_entity_spec.rb' - './ee/spec/serializers/ee/build_details_entity_spec.rb' - './ee/spec/serializers/ee/ci/job_entity_spec.rb' - './ee/spec/serializers/ee/ci/pipeline_entity_spec.rb' @@ -2596,7 +2533,6 @@ - './ee/spec/services/app_sec/fuzzing/api/ci_configuration_create_service_spec.rb' - './ee/spec/services/app_sec/fuzzing/coverage/corpuses/create_service_spec.rb' - './ee/spec/services/arkose/blocked_users_report_service_spec.rb' -- './ee/spec/services/arkose/user_verification_service_spec.rb' - './ee/spec/services/audit_events/build_service_spec.rb' - './ee/spec/services/audit_events/custom_audit_event_service_spec.rb' - './ee/spec/services/audit_event_service_spec.rb' @@ -2744,11 +2680,9 @@ - './ee/spec/services/ee/issues/after_create_service_spec.rb' - './ee/spec/services/ee/issues/build_from_vulnerability_service_spec.rb' - './ee/spec/services/ee/issues/clone_service_spec.rb' -- './ee/spec/services/ee/issues/close_service_spec.rb' - './ee/spec/services/ee/issues/create_from_vulnerability_data_service_spec.rb' - './ee/spec/services/ee/issues/create_service_spec.rb' - './ee/spec/services/ee/issues/move_service_spec.rb' -- './ee/spec/services/ee/issues/reopen_service_spec.rb' - './ee/spec/services/ee/issues/update_service_spec.rb' - './ee/spec/services/ee/keys/destroy_service_spec.rb' - './ee/spec/services/ee/labels/create_service_spec.rb' @@ -2806,7 +2740,6 @@ - './ee/spec/services/ee/users/build_service_spec.rb' - './ee/spec/services/ee/users/create_service_spec.rb' - './ee/spec/services/ee/users/destroy_service_spec.rb' -- './ee/spec/services/ee/users/migrate_to_ghost_user_service_spec.rb' - './ee/spec/services/ee/users/reject_service_spec.rb' - './ee/spec/services/ee/users/update_service_spec.rb' - './ee/spec/services/ee/vulnerability_feedback_module/update_service_spec.rb' @@ -2887,9 +2820,7 @@ - './ee/spec/services/geo/repository_verification_secondary_service_spec.rb' - './ee/spec/services/geo/reset_checksum_event_store_spec.rb' - './ee/spec/services/geo/wiki_sync_service_spec.rb' -- './ee/spec/services/gitlab_subscriptions/activate_awaiting_users_service_spec.rb' - './ee/spec/services/gitlab_subscriptions/activate_service_spec.rb' -- './ee/spec/services/gitlab_subscriptions/apply_trial_service_spec.rb' - './ee/spec/services/gitlab_subscriptions/check_future_renewal_service_spec.rb' - './ee/spec/services/gitlab_subscriptions/create_hand_raise_lead_service_spec.rb' - './ee/spec/services/gitlab_subscriptions/create_service_spec.rb' @@ -2972,10 +2903,6 @@ - './ee/spec/services/milestones/destroy_service_spec.rb' - './ee/spec/services/milestones/promote_service_spec.rb' - './ee/spec/services/milestones/update_service_spec.rb' -- './ee/spec/services/namespaces/free_user_cap/deactivate_members_over_limit_service_spec.rb' -- './ee/spec/services/namespaces/free_user_cap/remove_group_group_links_outside_hierarchy_service_spec.rb' -- './ee/spec/services/namespaces/free_user_cap/remove_project_group_links_outside_hierarchy_service_spec.rb' -- './ee/spec/services/namespaces/free_user_cap/update_prevent_sharing_outside_hierarchy_service_spec.rb' - './ee/spec/services/namespaces/in_product_marketing_emails_service_spec.rb' - './ee/spec/services/namespaces/storage/email_notification_service_spec.rb' - './ee/spec/services/path_locks/lock_service_spec.rb' @@ -3004,8 +2931,6 @@ - './ee/spec/services/projects/hashed_storage/migrate_repository_service_spec.rb' - './ee/spec/services/projects/import_export/export_service_spec.rb' - './ee/spec/services/projects/import_service_spec.rb' -- './ee/spec/services/projects/licenses/create_policy_service_spec.rb' -- './ee/spec/services/projects/licenses/update_policy_service_spec.rb' - './ee/spec/services/projects/mark_for_deletion_service_spec.rb' - './ee/spec/services/projects/open_issues_count_service_spec.rb' - './ee/spec/services/projects/operations/update_service_spec.rb' @@ -3034,7 +2959,6 @@ - './ee/spec/services/requirements_management/map_export_fields_service_spec.rb' - './ee/spec/services/requirements_management/prepare_import_csv_service_spec.rb' - './ee/spec/services/requirements_management/process_test_reports_service_spec.rb' -- './ee/spec/services/requirements_management/update_requirement_service_spec.rb' - './ee/spec/services/resource_access_tokens/create_service_spec.rb' - './ee/spec/services/resource_access_tokens/revoke_service_spec.rb' - './ee/spec/services/resource_events/change_weight_service_spec.rb' @@ -3047,7 +2971,6 @@ - './ee/spec/services/security/auto_fix_service_spec.rb' - './ee/spec/services/security/configuration/save_auto_fix_service_spec.rb' - './ee/spec/services/security/dependency_list_service_spec.rb' -- './ee/spec/services/security/findings/cleanup_service_spec.rb' - './ee/spec/services/security/ingestion/finding_map_collection_spec.rb' - './ee/spec/services/security/ingestion/finding_map_spec.rb' - './ee/spec/services/security/ingestion/ingest_report_service_spec.rb' @@ -3120,7 +3043,6 @@ - './ee/spec/services/todo_service_spec.rb' - './ee/spec/services/upcoming_reconciliations/update_service_spec.rb' - './ee/spec/services/user_permissions/export_service_spec.rb' -- './ee/spec/services/users/abuse/excessive_projects_download_ban_service_spec.rb' - './ee/spec/services/users/abuse/git_abuse/namespace_throttle_service_spec.rb' - './ee/spec/services/users/abuse/namespace_bans/create_service_spec.rb' - './ee/spec/services/users/abuse/namespace_bans/destroy_service_spec.rb' @@ -3169,7 +3091,6 @@ - './ee/spec/tasks/gitlab/license_rake_spec.rb' - './ee/spec/tasks/gitlab/seed/group_seed_rake_spec.rb' - './ee/spec/tasks/gitlab/spdx_rake_spec.rb' -- './ee/spec/tasks/gitlab/uploads/migrate_rake_spec.rb' - './ee/spec/validators/json_schema_validator_spec.rb' - './ee/spec/validators/ldap_filter_validator_spec.rb' - './ee/spec/validators/password/complexity_validator_spec.rb' @@ -3202,8 +3123,6 @@ - './ee/spec/views/groups/security/discover/show.html.haml_spec.rb' - './ee/spec/views/groups/settings/_remove.html.haml_spec.rb' - './ee/spec/views/groups/settings/reporting/show.html.haml_spec.rb' -- './ee/spec/views/groups/show.html.haml_spec.rb' -- './ee/spec/views/groups/usage_quotas/index.html.haml_spec.rb' - './ee/spec/views/layouts/application.html.haml_spec.rb' - './ee/spec/views/layouts/checkout.html.haml_spec.rb' - './ee/spec/views/layouts/header/_current_user_dropdown.html.haml_spec.rb' @@ -3220,12 +3139,9 @@ - './ee/spec/views/operations/index.html.haml_spec.rb' - './ee/spec/views/profiles/preferences/show.html.haml_spec.rb' - './ee/spec/views/projects/edit.html.haml_spec.rb' -- './ee/spec/views/projects/empty.html.haml_spec.rb' - './ee/spec/views/projects/issues/show.html.haml_spec.rb' -- './ee/spec/views/projects/merge_requests/_merge_request_approvals.html.haml_spec.rb' - './ee/spec/views/projects/_merge_request_status_checks_settings.html.haml_spec.rb' - './ee/spec/views/projects/on_demand_scans/index.html.haml_spec.rb' -- './ee/spec/views/projects/pipelines/_tabs_content.html.haml_spec.rb' - './ee/spec/views/projects/project_members/index.html.haml_spec.rb' - './ee/spec/views/projects/security/corpus_management/show.html.haml_spec.rb' - './ee/spec/views/projects/security/dast_profiles/show.html.haml_spec.rb' @@ -3237,12 +3153,8 @@ - './ee/spec/views/projects/security/policies/index.html.haml_spec.rb' - './ee/spec/views/projects/security/sast_configuration/show.html.haml_spec.rb' - './ee/spec/views/projects/settings/subscriptions/_index.html.haml_spec.rb' -- './ee/spec/views/projects/show.html.haml_spec.rb' -- './ee/spec/views/registrations/groups/new.html.haml_spec.rb' - './ee/spec/views/registrations/groups_projects/new.html.haml_spec.rb' -- './ee/spec/views/registrations/projects/new.html.haml_spec.rb' - './ee/spec/views/registrations/welcome/continuous_onboarding_getting_started.html.haml_spec.rb' -- './ee/spec/views/registrations/welcome/show.html.haml_spec.rb' - './ee/spec/views/search/_category.html.haml_spec.rb' - './ee/spec/views/shared/billings/_billing_plan_actions.html.haml_spec.rb' - './ee/spec/views/shared/billings/_billing_plan.html.haml_spec.rb' @@ -3253,7 +3165,6 @@ - './ee/spec/views/shared/credentials_inventory/_expiry_date.html.haml_spec.rb' - './ee/spec/views/shared/credentials_inventory/gpg_keys/_gpg_key.html.haml_spec.rb' - './ee/spec/views/shared/credentials_inventory/personal_access_tokens/_personal_access_token.html.haml_spec.rb' -- './ee/spec/views/shared/credentials_inventory/project_access_tokens/_project_access_token.html.haml_spec.rb' - './ee/spec/views/shared/credentials_inventory/ssh_keys/_ssh_key.html.haml_spec.rb' - './ee/spec/views/shared/issuable/_approver_suggestion.html.haml_spec.rb' - './ee/spec/views/shared/issuable/_epic_dropdown.html.haml_spec.rb' @@ -3271,8 +3182,6 @@ - './ee/spec/views/subscriptions/buy_storage.html.haml_spec.rb' - './ee/spec/views/subscriptions/groups/edit.html.haml_spec.rb' - './ee/spec/views/subscriptions/new.html.haml_spec.rb' -- './ee/spec/views/trial_registrations/new.html.haml_spec.rb' -- './ee/spec/views/trials/_skip_trial.html.haml_spec.rb' - './ee/spec/workers/active_user_count_threshold_worker_spec.rb' - './ee/spec/workers/adjourned_group_deletion_worker_spec.rb' - './ee/spec/workers/adjourned_project_deletion_worker_spec.rb' @@ -3336,7 +3245,6 @@ - './ee/spec/workers/geo/batch_event_create_worker_spec.rb' - './ee/spec/workers/geo/batch/project_registry_scheduler_worker_spec.rb' - './ee/spec/workers/geo/batch/project_registry_worker_spec.rb' -- './ee/spec/workers/geo/container_repository_sync_dispatch_worker_spec.rb' - './ee/spec/workers/geo/container_repository_sync_worker_spec.rb' - './ee/spec/workers/geo/create_repository_updated_event_worker_spec.rb' - './ee/spec/workers/geo/design_repository_shard_sync_worker_spec.rb' @@ -3391,7 +3299,6 @@ - './ee/spec/workers/merge_request_reset_approvals_worker_spec.rb' - './ee/spec/workers/merge_requests/stream_approval_audit_event_worker_spec.rb' - './ee/spec/workers/merge_requests/sync_code_owner_approval_rules_worker_spec.rb' -- './ee/spec/workers/namespaces/free_user_cap/remediation_worker_spec.rb' - './ee/spec/workers/namespaces/sync_namespace_name_worker_spec.rb' - './ee/spec/workers/new_epic_worker_spec.rb' - './ee/spec/workers/personal_access_tokens/groups/policy_worker_spec.rb' @@ -3410,8 +3317,6 @@ - './ee/spec/workers/scan_security_report_secrets_worker_spec.rb' - './ee/spec/workers/security/auto_fix_worker_spec.rb' - './ee/spec/workers/security/create_orchestration_policy_worker_spec.rb' -- './ee/spec/workers/security/findings/cleanup_worker_spec.rb' -- './ee/spec/workers/security/findings/delete_by_job_id_worker_spec.rb' - './ee/spec/workers/security/orchestration_policy_rule_schedule_namespace_worker_spec.rb' - './ee/spec/workers/security/orchestration_policy_rule_schedule_worker_spec.rb' - './ee/spec/workers/security/store_scans_worker_spec.rb' @@ -3454,7 +3359,6 @@ - './spec/config/application_spec.rb' - './spec/config/inject_enterprise_edition_module_spec.rb' - './spec/config/mail_room_spec.rb' -- './spec/config/metrics/aggregates/aggregated_metrics_spec.rb' - './spec/config/object_store_settings_spec.rb' - './spec/config/settings_spec.rb' - './spec/config/smime_signature_settings_spec.rb' @@ -3488,10 +3392,7 @@ - './spec/controllers/admin/users_controller_spec.rb' - './spec/controllers/application_controller_spec.rb' - './spec/controllers/autocomplete_controller_spec.rb' -- './spec/controllers/boards/issues_controller_spec.rb' -- './spec/controllers/boards/lists_controller_spec.rb' - './spec/controllers/chaos_controller_spec.rb' -- './spec/controllers/concerns/boards_responses_spec.rb' - './spec/controllers/concerns/check_rate_limit_spec.rb' - './spec/controllers/concerns/checks_collaboration_spec.rb' - './spec/controllers/concerns/confirm_email_warning_spec.rb' @@ -3563,7 +3464,6 @@ - './spec/controllers/groups/variables_controller_spec.rb' - './spec/controllers/health_check_controller_spec.rb' - './spec/controllers/help_controller_spec.rb' -- './spec/controllers/import/available_namespaces_controller_spec.rb' - './spec/controllers/import/bitbucket_controller_spec.rb' - './spec/controllers/import/bitbucket_server_controller_spec.rb' - './spec/controllers/import/bulk_imports_controller_spec.rb' @@ -3670,7 +3570,6 @@ - './spec/controllers/projects/pipelines_settings_controller_spec.rb' - './spec/controllers/projects/pipelines/stages_controller_spec.rb' - './spec/controllers/projects/pipelines/tests_controller_spec.rb' -- './spec/controllers/projects/product_analytics_controller_spec.rb' - './spec/controllers/projects/project_members_controller_spec.rb' - './spec/controllers/projects/prometheus/alerts_controller_spec.rb' - './spec/controllers/projects/prometheus/metrics_controller_spec.rb' @@ -3707,7 +3606,6 @@ - './spec/controllers/projects/web_ide_terminals_controller_spec.rb' - './spec/controllers/projects/wikis_controller_spec.rb' - './spec/controllers/registrations_controller_spec.rb' -- './spec/controllers/registrations/welcome_controller_spec.rb' - './spec/controllers/repositories/git_http_controller_spec.rb' - './spec/controllers/repositories/lfs_storage_controller_spec.rb' - './spec/controllers/root_controller_spec.rb' @@ -3935,7 +3833,6 @@ - './spec/features/ide/clientside_preview_csp_spec.rb' - './spec/features/ide_spec.rb' - './spec/features/ide/static_object_external_storage_csp_spec.rb' -- './spec/features/ide/user_commits_changes_spec.rb' - './spec/features/ide/user_opens_merge_request_spec.rb' - './spec/features/import/manifest_import_spec.rb' - './spec/features/invites_spec.rb' @@ -4058,7 +3955,6 @@ - './spec/features/merge_request/user_edits_reviewers_sidebar_spec.rb' - './spec/features/merge_request/user_expands_diff_spec.rb' - './spec/features/merge_request/user_interacts_with_batched_mr_diffs_spec.rb' -- './spec/features/merge_request/user_jumps_to_discussion_spec.rb' - './spec/features/merge_request/user_locks_discussion_spec.rb' - './spec/features/merge_request/user_manages_subscription_spec.rb' - './spec/features/merge_request/user_marks_merge_request_as_draft_spec.rb' @@ -4113,7 +4009,6 @@ - './spec/features/merge_request/user_views_diffs_spec.rb' - './spec/features/merge_request/user_views_merge_request_from_deleted_fork_spec.rb' - './spec/features/merge_request/user_views_open_merge_request_spec.rb' -- './spec/features/merge_request/user_views_user_status_on_merge_request_spec.rb' - './spec/features/milestone_spec.rb' - './spec/features/milestones/user_creates_milestone_spec.rb' - './spec/features/milestones/user_deletes_milestone_spec.rb' @@ -4174,7 +4069,6 @@ - './spec/features/projects/blobs/blob_show_spec.rb' - './spec/features/projects/blobs/edit_spec.rb' - './spec/features/projects/blobs/shortcuts_blob_spec.rb' -- './spec/features/projects/blobs/user_creates_new_blob_in_new_project_spec.rb' - './spec/features/projects/blobs/user_follows_pipeline_suggest_nudge_spec.rb' - './spec/features/projects/blobs/user_views_pipeline_editor_button_spec.rb' - './spec/features/projects/branches/download_buttons_spec.rb' @@ -4334,14 +4228,8 @@ - './spec/features/projects/pages/user_edits_lets_encrypt_settings_spec.rb' - './spec/features/projects/pages/user_edits_settings_spec.rb' - './spec/features/projects/pipeline_schedules_spec.rb' -- './spec/features/projects/pipelines/legacy_pipeline_spec.rb' -- './spec/features/projects/pipelines/legacy_pipelines_spec.rb' - './spec/features/projects/pipelines/pipeline_spec.rb' - './spec/features/projects/pipelines/pipelines_spec.rb' -- './spec/features/projects/product_analytics/events_spec.rb' -- './spec/features/projects/product_analytics/graphs_spec.rb' -- './spec/features/projects/product_analytics/setup_spec.rb' -- './spec/features/projects/product_analytics/test_spec.rb' - './spec/features/projects/raw/user_interacts_with_raw_endpoint_spec.rb' - './spec/features/projects/releases/user_creates_release_spec.rb' - './spec/features/projects/releases/user_views_edit_release_spec.rb' @@ -4490,7 +4378,6 @@ - './spec/features/users/anonymous_sessions_spec.rb' - './spec/features/users/bizible_csp_spec.rb' - './spec/features/users/confirmation_spec.rb' -- './spec/features/user_sees_marketing_header_spec.rb' - './spec/features/user_sees_revert_modal_spec.rb' - './spec/features/users/email_verification_on_login_spec.rb' - './spec/features/users/google_analytics_csp_spec.rb' @@ -4570,7 +4457,6 @@ - './spec/finders/feature_flags_user_lists_finder_spec.rb' - './spec/finders/fork_projects_finder_spec.rb' - './spec/finders/fork_targets_finder_spec.rb' -- './spec/finders/freeze_periods_finder_spec.rb' - './spec/finders/group_descendants_finder_spec.rb' - './spec/finders/group_members_finder_spec.rb' - './spec/finders/group_projects_finder_spec.rb' @@ -4590,7 +4476,6 @@ - './spec/finders/members_finder_spec.rb' - './spec/finders/merge_request/metrics_finder_spec.rb' - './spec/finders/merge_requests/by_approvals_finder_spec.rb' -- './spec/finders/merge_requests_finder/params_spec.rb' - './spec/finders/merge_requests_finder_spec.rb' - './spec/finders/merge_requests/oldest_per_commit_finder_spec.rb' - './spec/finders/merge_request_target_project_finder_spec.rb' @@ -4705,7 +4590,6 @@ - './spec/frontend/fixtures/u2f.rb' - './spec/frontend/fixtures/webauthn.rb' - './spec/graphql/features/authorization_spec.rb' -- './spec/graphql/features/feature_flag_spec.rb' - './spec/graphql/gitlab_schema_spec.rb' - './spec/graphql/graphql_triggers_spec.rb' - './spec/graphql/mutations/alert_management/alerts/set_assignees_spec.rb' @@ -4803,7 +4687,6 @@ - './spec/graphql/mutations/todos/restore_spec.rb' - './spec/graphql/mutations/user_callouts/create_spec.rb' - './spec/graphql/mutations/work_items/update_task_spec.rb' -- './spec/graphql/mutations/work_items/update_widgets_spec.rb' - './spec/graphql/resolvers/admin/analytics/usage_trends/measurements_resolver_spec.rb' - './spec/graphql/resolvers/alert_management/alert_resolver_spec.rb' - './spec/graphql/resolvers/alert_management/alert_status_counts_resolver_spec.rb' @@ -4867,7 +4750,6 @@ - './spec/graphql/resolvers/group_packages_resolver_spec.rb' - './spec/graphql/resolvers/group_resolver_spec.rb' - './spec/graphql/resolvers/groups_resolver_spec.rb' -- './spec/graphql/resolvers/issues_resolver_spec.rb' - './spec/graphql/resolvers/issue_status_counts_resolver_spec.rb' - './spec/graphql/resolvers/kas/agent_configurations_resolver_spec.rb' - './spec/graphql/resolvers/kas/agent_connections_resolver_spec.rb' @@ -5367,8 +5249,6 @@ - './spec/initializers/action_mailer_hooks_spec.rb' - './spec/initializers/active_record_locking_spec.rb' - './spec/initializers/asset_proxy_setting_spec.rb' -- './spec/initializers/attr_encrypted_no_db_connection_spec.rb' -- './spec/initializers/attr_encrypted_thread_safe_spec.rb' - './spec/initializers/carrierwave_patch_spec.rb' - './spec/initializers/cookies_serializer_spec.rb' - './spec/initializers/database_config_spec.rb' @@ -5436,7 +5316,6 @@ - './spec/lib/api/entities/nuget/search_result_spec.rb' - './spec/lib/api/entities/package_spec.rb' - './spec/lib/api/entities/personal_access_token_spec.rb' -- './spec/lib/api/entities/personal_access_token_with_details_spec.rb' - './spec/lib/api/entities/plan_limit_spec.rb' - './spec/lib/api/entities/project_import_failed_relation_spec.rb' - './spec/lib/api/entities/project_import_status_spec.rb' @@ -5469,7 +5348,6 @@ - './spec/lib/api/helpers_spec.rb' - './spec/lib/api/helpers/variables_helpers_spec.rb' - './spec/lib/api/helpers/version_spec.rb' -- './spec/lib/api/integrations/slack/events/url_verification_spec.rb' - './spec/lib/api/support/git_access_actor_spec.rb' - './spec/lib/api/validations/validators/absence_spec.rb' - './spec/lib/api/validations/validators/array_none_any_spec.rb' @@ -5819,7 +5697,6 @@ - './spec/lib/gitlab/auth/unique_ips_limiter_spec.rb' - './spec/lib/gitlab/auth/user_access_denied_reason_spec.rb' - './spec/lib/gitlab/avatar_cache_spec.rb' -- './spec/lib/gitlab/background_migration/add_primary_email_to_emails_if_user_confirmed_spec.rb' - './spec/lib/gitlab/background_migration/backfill_ci_queuing_tables_spec.rb' - './spec/lib/gitlab/background_migration/backfill_draft_status_on_merge_requests_spec.rb' - './spec/lib/gitlab/background_migration/backfill_draft_status_on_merge_requests_with_corrected_regex_spec.rb' @@ -5841,7 +5718,6 @@ - './spec/lib/gitlab/background_migration/backfill_project_member_namespace_id_spec.rb' - './spec/lib/gitlab/background_migration/backfill_project_repositories_spec.rb' - './spec/lib/gitlab/background_migration/backfill_project_settings_spec.rb' -- './spec/lib/gitlab/background_migration/backfill_projects_with_coverage_spec.rb' - './spec/lib/gitlab/background_migration/backfill_snippet_repositories_spec.rb' - './spec/lib/gitlab/background_migration/backfill_topics_title_spec.rb' - './spec/lib/gitlab/background_migration/backfill_upvotes_count_on_issues_spec.rb' @@ -5850,7 +5726,6 @@ - './spec/lib/gitlab/background_migration/backfill_work_item_type_id_for_issues_spec.rb' - './spec/lib/gitlab/background_migration/base_job_spec.rb' - './spec/lib/gitlab/background_migration/batched_migration_job_spec.rb' -- './spec/lib/gitlab/background_migration/batching_strategies/backfill_issue_work_item_type_batching_strategy_spec.rb' - './spec/lib/gitlab/background_migration/batching_strategies/backfill_project_namespace_per_group_batching_strategy_spec.rb' - './spec/lib/gitlab/background_migration/batching_strategies/backfill_project_statistics_with_container_registry_size_batching_strategy_spec.rb' - './spec/lib/gitlab/background_migration/batching_strategies/base_strategy_spec.rb' @@ -5919,7 +5794,6 @@ - './spec/lib/gitlab/backtrace_cleaner_spec.rb' - './spec/lib/gitlab/bare_repository_import/importer_spec.rb' - './spec/lib/gitlab/bare_repository_import/repository_spec.rb' -- './spec/lib/gitlab/batch_pop_queueing_spec.rb' - './spec/lib/gitlab/batch_worker_context_spec.rb' - './spec/lib/gitlab/bitbucket_import/importer_spec.rb' - './spec/lib/gitlab/bitbucket_import/project_creator_spec.rb' @@ -5986,7 +5860,6 @@ - './spec/lib/gitlab/ci/badge/release/template_spec.rb' - './spec/lib/gitlab/ci/build/artifacts/adapters/gzip_stream_spec.rb' - './spec/lib/gitlab/ci/build/artifacts/adapters/raw_stream_spec.rb' -- './spec/lib/gitlab/ci/build/artifacts/adapters/zip_stream_spec.rb' - './spec/lib/gitlab/ci/build/artifacts/metadata/entry_spec.rb' - './spec/lib/gitlab/ci/build/artifacts/metadata_spec.rb' - './spec/lib/gitlab/ci/build/artifacts/path_spec.rb' @@ -6160,8 +6033,6 @@ - './spec/lib/gitlab/ci/pipeline/quota/deployments_spec.rb' - './spec/lib/gitlab/ci/pipeline/seed/build/cache_spec.rb' - './spec/lib/gitlab/ci/pipeline/seed/build_spec.rb' -- './spec/lib/gitlab/ci/pipeline/seed/deployment_spec.rb' -- './spec/lib/gitlab/ci/pipeline/seed/environment_spec.rb' - './spec/lib/gitlab/ci/pipeline/seed/pipeline_spec.rb' - './spec/lib/gitlab/ci/pipeline/seed/processable/resource_group_spec.rb' - './spec/lib/gitlab/ci/pipeline/seed/stage_spec.rb' @@ -6553,7 +6424,6 @@ - './spec/lib/gitlab/discussions_diff/file_collection_spec.rb' - './spec/lib/gitlab/discussions_diff/highlight_cache_spec.rb' - './spec/lib/gitlab/doctor/secrets_spec.rb' -- './spec/lib/gitlab/doorkeeper_secret_storing/pbkdf2_sha512_spec.rb' - './spec/lib/gitlab_edition_spec.rb' - './spec/lib/gitlab/email/attachment_uploader_spec.rb' - './spec/lib/gitlab/email/failure_handler_spec.rb' @@ -6613,10 +6483,6 @@ - './spec/lib/gitlab/exclusive_lease_helpers/sleeping_lock_spec.rb' - './spec/lib/gitlab/exclusive_lease_helpers_spec.rb' - './spec/lib/gitlab/exclusive_lease_spec.rb' -- './spec/lib/gitlab/experimentation/controller_concern_spec.rb' -- './spec/lib/gitlab/experimentation/experiment_spec.rb' -- './spec/lib/gitlab/experimentation/group_types_spec.rb' -- './spec/lib/gitlab/experimentation_spec.rb' - './spec/lib/gitlab/experiment/rollout/feature_spec.rb' - './spec/lib/gitlab/external_authorization/access_spec.rb' - './spec/lib/gitlab/external_authorization/cache_spec.rb' @@ -6665,7 +6531,6 @@ - './spec/lib/gitlab/gitaly_client_spec.rb' - './spec/lib/gitlab/gitaly_client/storage_settings_spec.rb' - './spec/lib/gitlab/gitaly_client/util_spec.rb' -- './spec/lib/gitlab/gitaly_client/wiki_service_spec.rb' - './spec/lib/gitlab/git/attributes_at_ref_parser_spec.rb' - './spec/lib/gitlab/git/attributes_parser_spec.rb' - './spec/lib/gitlab/git/base_error_spec.rb' @@ -6681,7 +6546,6 @@ - './spec/lib/gitlab/git/conflict/file_spec.rb' - './spec/lib/gitlab/git/conflict/parser_spec.rb' - './spec/lib/gitlab/git/conflict/resolver_spec.rb' -- './spec/lib/gitlab/git/cross_repo_comparer_spec.rb' - './spec/lib/gitlab/git/diff_collection_spec.rb' - './spec/lib/gitlab/git/diff_spec.rb' - './spec/lib/gitlab/git/diff_stats_collection_spec.rb' @@ -6774,7 +6638,6 @@ - './spec/lib/gitlab/git/user_spec.rb' - './spec/lib/gitlab/git/util_spec.rb' - './spec/lib/gitlab/git/wiki_page_version_spec.rb' -- './spec/lib/gitlab/git/wiki_spec.rb' - './spec/lib/gitlab/git/wraps_gitaly_errors_spec.rb' - './spec/lib/gitlab/global_id/deprecations_spec.rb' - './spec/lib/gitlab/global_id_spec.rb' @@ -6817,7 +6680,6 @@ - './spec/lib/gitlab/graphql/pagination/connections_spec.rb' - './spec/lib/gitlab/graphql/pagination/externally_paginated_array_connection_spec.rb' - './spec/lib/gitlab/graphql/pagination/keyset/connection_spec.rb' -- './spec/lib/gitlab/graphql/pagination/keyset/last_items_spec.rb' - './spec/lib/gitlab/graphql/pagination/offset_active_record_relation_connection_spec.rb' - './spec/lib/gitlab/graphql/present/field_extension_spec.rb' - './spec/lib/gitlab/graphql/queries_spec.rb' @@ -6843,13 +6705,6 @@ - './spec/lib/gitlab/health_checks/middleware_spec.rb' - './spec/lib/gitlab/health_checks/probes/collection_spec.rb' - './spec/lib/gitlab/health_checks/puma_check_spec.rb' -- './spec/lib/gitlab/health_checks/redis/cache_check_spec.rb' -- './spec/lib/gitlab/health_checks/redis/queues_check_spec.rb' -- './spec/lib/gitlab/health_checks/redis/rate_limiting_check_spec.rb' -- './spec/lib/gitlab/health_checks/redis/redis_check_spec.rb' -- './spec/lib/gitlab/health_checks/redis/sessions_check_spec.rb' -- './spec/lib/gitlab/health_checks/redis/shared_state_check_spec.rb' -- './spec/lib/gitlab/health_checks/redis/trace_chunks_check_spec.rb' - './spec/lib/gitlab/health_checks/server_spec.rb' - './spec/lib/gitlab/highlight_spec.rb' - './spec/lib/gitlab/hook_data/base_builder_spec.rb' @@ -6895,8 +6750,6 @@ - './spec/lib/gitlab/import_export/fast_hash_serializer_spec.rb' - './spec/lib/gitlab/import_export/file_importer_spec.rb' - './spec/lib/gitlab/import_export/fork_spec.rb' -- './spec/lib/gitlab/import_export/group/legacy_tree_restorer_spec.rb' -- './spec/lib/gitlab/import_export/group/legacy_tree_saver_spec.rb' - './spec/lib/gitlab/import_export/group/object_builder_spec.rb' - './spec/lib/gitlab/import_export/group/relation_factory_spec.rb' - './spec/lib/gitlab/import_export/group/relation_tree_restorer_spec.rb' @@ -7074,7 +6927,6 @@ - './spec/lib/gitlab/memory/reports_daemon_spec.rb' - './spec/lib/gitlab/memory/reports/jemalloc_stats_spec.rb' - './spec/lib/gitlab/memory/watchdog_spec.rb' -- './spec/lib/gitlab/merge_requests/commit_message_generator_spec.rb' - './spec/lib/gitlab/merge_requests/mergeability/check_result_spec.rb' - './spec/lib/gitlab/merge_requests/mergeability/redis_interface_spec.rb' - './spec/lib/gitlab/merge_requests/mergeability/results_store_spec.rb' @@ -7353,7 +7205,6 @@ - './spec/lib/gitlab/sidekiq_middleware/duplicate_jobs/strategies/until_executing_spec.rb' - './spec/lib/gitlab/sidekiq_middleware/extra_done_log_metadata_spec.rb' - './spec/lib/gitlab/sidekiq_middleware/instrumentation_logger_spec.rb' -- './spec/lib/gitlab/sidekiq_middleware/memory_killer_spec.rb' - './spec/lib/gitlab/sidekiq_middleware/monitor_spec.rb' - './spec/lib/gitlab/sidekiq_middleware/query_analyzer_spec.rb' - './spec/lib/gitlab/sidekiq_middleware/server_metrics_spec.rb' @@ -7513,13 +7364,12 @@ - './spec/lib/gitlab/usage/metrics/instrumentations/uuid_metric_spec.rb' - './spec/lib/gitlab/usage/metrics/key_path_processor_spec.rb' - './spec/lib/gitlab/usage/metrics/names_suggestions/generator_spec.rb' -- './spec/lib/gitlab/usage/metrics/names_suggestions/relation_parsers/constraints_spec.rb' - './spec/lib/gitlab/usage/metrics/names_suggestions/relation_parsers/joins_spec.rb' - './spec/lib/gitlab/usage/metrics/name_suggestion_spec.rb' - './spec/lib/gitlab/usage/metric_spec.rb' - './spec/lib/gitlab/usage/metrics/query_spec.rb' - './spec/lib/gitlab/usage/service_ping/instrumented_payload_spec.rb' -- './spec/lib/gitlab/usage/service_ping/legacy_metric_timing_decorator_spec.rb' +- './spec/lib/gitlab/usage/service_ping/legacy_metric_metadata_decorator_spec.rb' - './spec/lib/gitlab/usage/service_ping/payload_keys_processor_spec.rb' - './spec/lib/gitlab/usage/service_ping_report_spec.rb' - './spec/lib/gitlab/user_access_snippet_spec.rb' @@ -7606,8 +7456,6 @@ - './spec/lib/security/ci_configuration/sast_iac_build_action_spec.rb' - './spec/lib/security/ci_configuration/secret_detection_build_action_spec.rb' - './spec/lib/security/report_schema_version_matcher_spec.rb' -- './spec/lib/serializers/json_spec.rb' -- './spec/lib/serializers/symbolized_json_spec.rb' - './spec/lib/serializers/unsafe_json_spec.rb' - './spec/lib/service_ping/build_payload_spec.rb' - './spec/lib/service_ping/devops_report_spec.rb' @@ -7686,15 +7534,6 @@ - './spec/mailers/notify_spec.rb' - './spec/mailers/repository_check_mailer_spec.rb' - './spec/metrics_server/metrics_server_spec.rb' -- './spec/migrations/20210406144743_backfill_total_tuple_count_for_batched_migrations_spec.rb' -- './spec/migrations/20210423160427_schedule_drop_invalid_vulnerabilities_spec.rb' -- './spec/migrations/20210430134202_copy_adoption_snapshot_namespace_spec.rb' -- './spec/migrations/20210430135954_copy_adoption_segments_namespace_spec.rb' -- './spec/migrations/20210503105845_add_project_value_stream_id_to_project_stages_spec.rb' -- './spec/migrations/20210511142748_schedule_drop_invalid_vulnerabilities2_spec.rb' -- './spec/migrations/20210514063252_schedule_cleanup_orphaned_lfs_objects_projects_spec.rb' -- './spec/migrations/20210601073400_fix_total_stage_in_vsa_spec.rb' -- './spec/migrations/20210601080039_group_protected_environments_add_index_and_constraint_spec.rb' - './spec/migrations/20210603222333_remove_builds_email_service_from_services_spec.rb' - './spec/migrations/20210610153556_delete_legacy_operations_feature_flags_spec.rb' - './spec/migrations/2021061716138_cascade_delete_freeze_periods_spec.rb' @@ -7706,7 +7545,6 @@ - './spec/migrations/20210805192450_update_trial_plans_ci_daily_pipeline_schedule_triggers_spec.rb' - './spec/migrations/20210811122206_update_external_project_bots_spec.rb' - './spec/migrations/20210812013042_remove_duplicate_project_authorizations_spec.rb' -- './spec/migrations/20210818185845_backfill_projects_with_coverage_spec.rb' - './spec/migrations/20210819145000_drop_temporary_columns_and_triggers_for_ci_builds_runner_session_spec.rb' - './spec/migrations/20210831203408_upsert_base_work_item_types_spec.rb' - './spec/migrations/20210902144144_drop_temporary_columns_and_triggers_for_ci_build_needs_spec.rb' @@ -7803,11 +7641,9 @@ - './spec/migrations/20220801155858_schedule_disable_legacy_open_source_licence_for_recent_public_projects_spec.rb' - './spec/migrations/20220802114351_reschedule_backfill_container_registry_size_into_project_statistics_spec.rb' - './spec/migrations/20220802204737_remove_deactivated_user_highest_role_stats_spec.rb' -- './spec/migrations/20220809002011_schedule_destroy_invalid_group_members_spec.rb' - './spec/migrations/active_record/schema_spec.rb' - './spec/migrations/add_default_project_approval_rules_vuln_allowed_spec.rb' - './spec/migrations/add_epics_relative_position_spec.rb' -- './spec/migrations/add_new_trail_plans_spec.rb' - './spec/migrations/add_open_source_plan_spec.rb' - './spec/migrations/add_premium_and_ultimate_plan_limits_spec.rb' - './spec/migrations/add_triggers_to_integrations_type_new_spec.rb' @@ -7816,9 +7652,7 @@ - './spec/migrations/associate_existing_dast_builds_with_variables_spec.rb' - './spec/migrations/backfill_all_project_namespaces_spec.rb' - './spec/migrations/backfill_cadence_id_for_boards_scoped_to_iteration_spec.rb' -- './spec/migrations/backfill_clusters_integration_prometheus_enabled_spec.rb' - './spec/migrations/backfill_cycle_analytics_aggregations_spec.rb' -- './spec/migrations/backfill_escalation_policies_for_oncall_schedules_spec.rb' - './spec/migrations/backfill_group_features_spec.rb' - './spec/migrations/backfill_integrations_enable_ssl_verification_spec.rb' - './spec/migrations/backfill_integrations_type_new_spec.rb' @@ -7826,26 +7660,19 @@ - './spec/migrations/backfill_member_namespace_id_for_group_members_spec.rb' - './spec/migrations/backfill_namespace_id_for_namespace_routes_spec.rb' - './spec/migrations/backfill_namespace_id_for_project_routes_spec.rb' -- './spec/migrations/backfill_nuget_temporary_packages_to_processing_status_spec.rb' - './spec/migrations/backfill_project_import_level_spec.rb' - './spec/migrations/backfill_project_namespaces_for_group_spec.rb' - './spec/migrations/backfill_stage_event_hash_spec.rb' - './spec/migrations/backfill_user_namespace_spec.rb' - './spec/migrations/bulk_insert_cluster_enabled_grants_spec.rb' - './spec/migrations/change_public_projects_cost_factor_spec.rb' -- './spec/migrations/change_web_hook_events_default_spec.rb' -- './spec/migrations/cleanup_after_add_primary_email_to_emails_if_user_confirmed_spec.rb' - './spec/migrations/cleanup_after_fixing_issue_when_admin_changed_primary_email_spec.rb' - './spec/migrations/cleanup_after_fixing_regression_with_new_users_emails_spec.rb' - './spec/migrations/cleanup_backfill_integrations_enable_ssl_verification_spec.rb' -- './spec/migrations/cleanup_move_container_registry_enabled_to_project_feature_spec.rb' - './spec/migrations/cleanup_mr_attention_request_todos_spec.rb' - './spec/migrations/cleanup_orphaned_routes_spec.rb' -- './spec/migrations/clean_up_pending_builds_table_spec.rb' - './spec/migrations/cleanup_remaining_orphan_invites_spec.rb' - './spec/migrations/confirm_security_bot_spec.rb' -- './spec/migrations/confirm_support_bot_user_spec.rb' -- './spec/migrations/delete_security_findings_without_uuid_spec.rb' - './spec/migrations/disable_expiration_policies_linked_to_no_container_images_spec.rb' - './spec/migrations/disable_job_token_scope_when_unused_spec.rb' - './spec/migrations/finalize_orphaned_routes_cleanup_spec.rb' @@ -7855,23 +7682,17 @@ - './spec/migrations/fix_and_backfill_project_namespaces_for_projects_with_duplicate_name_spec.rb' - './spec/migrations/fix_batched_migrations_old_format_job_arguments_spec.rb' - './spec/migrations/generate_customers_dot_jwt_signing_key_spec.rb' -- './spec/migrations/insert_ci_daily_pipeline_schedule_triggers_plan_limits_spec.rb' -- './spec/migrations/migrate_elastic_index_settings_spec.rb' - './spec/migrations/migrate_protected_attribute_to_pending_builds_spec.rb' -- './spec/migrations/move_container_registry_enabled_to_project_features3_spec.rb' - './spec/migrations/orphaned_invite_tokens_cleanup_spec.rb' - './spec/migrations/populate_audit_event_streaming_verification_token_spec.rb' -- './spec/migrations/populate_dismissal_information_for_vulnerabilities_spec.rb' - './spec/migrations/populate_operation_visibility_permissions_spec.rb' - './spec/migrations/queue_backfill_project_feature_package_registry_access_level_spec.rb' - './spec/migrations/recreate_index_security_ci_builds_on_name_and_id_parser_features_spec.rb' - './spec/migrations/recreate_index_security_ci_builds_on_name_and_id_parser_with_new_features_spec.rb' - './spec/migrations/remove_duplicate_dast_site_tokens_spec.rb' - './spec/migrations/remove_duplicate_dast_site_tokens_with_same_token_spec.rb' -- './spec/migrations/remove_hipchat_service_records_spec.rb' - './spec/migrations/remove_invalid_integrations_spec.rb' - './spec/migrations/remove_not_null_contraint_on_title_from_sprints_spec.rb' -- './spec/migrations/remove_records_without_group_from_webhooks_table_spec.rb' - './spec/migrations/remove_schedule_and_status_from_pending_alert_escalations_spec.rb' - './spec/migrations/remove_wiki_notes_spec.rb' - './spec/migrations/rename_services_to_integrations_spec.rb' @@ -7883,22 +7704,17 @@ - './spec/migrations/reset_job_token_scope_enabled_spec.rb' - './spec/migrations/reset_severity_levels_to_new_default_spec.rb' - './spec/migrations/retry_backfill_traversal_ids_spec.rb' -- './spec/migrations/schedule_add_primary_email_to_emails_if_user_confirmed_spec.rb' - './spec/migrations/schedule_backfill_draft_status_on_merge_requests_corrected_regex_spec.rb' - './spec/migrations/schedule_backfilling_the_namespace_id_for_vulnerability_reads_spec.rb' - './spec/migrations/schedule_copy_ci_builds_columns_to_security_scans2_spec.rb' -- './spec/migrations/schedule_disable_expiration_policies_linked_to_no_container_images_spec.rb' - './spec/migrations/schedule_fix_incorrect_max_seats_used2_spec.rb' - './spec/migrations/schedule_fix_incorrect_max_seats_used_spec.rb' -- './spec/migrations/schedule_migrate_shared_vulnerability_scanners_spec.rb' - './spec/migrations/schedule_populate_requirements_issue_id_spec.rb' - './spec/migrations/schedule_purging_stale_security_scans_spec.rb' - './spec/migrations/schedule_recalculate_vulnerability_finding_signatures_for_findings_spec.rb' - './spec/migrations/schedule_security_setting_creation_spec.rb' - './spec/migrations/schedule_set_correct_vulnerability_state_spec.rb' - './spec/migrations/schedule_update_timelogs_null_spent_at_spec.rb' -- './spec/migrations/schedule_update_timelogs_project_id_spec.rb' -- './spec/migrations/schedule_update_users_where_two_factor_auth_required_from_group_spec.rb' - './spec/migrations/set_default_job_token_scope_true_spec.rb' - './spec/migrations/slice_merge_request_diff_commit_migrations_spec.rb' - './spec/migrations/start_backfill_ci_queuing_tables_spec.rb' @@ -7909,7 +7725,6 @@ - './spec/migrations/update_default_scan_method_of_dast_site_profile_spec.rb' - './spec/migrations/update_integrations_trigger_type_new_on_insert_spec.rb' - './spec/migrations/update_invalid_member_states_spec.rb' -- './spec/migrations/update_invalid_web_hooks_spec.rb' - './spec/models/ability_spec.rb' - './spec/models/abuse_report_spec.rb' - './spec/models/active_session_spec.rb' @@ -7994,7 +7809,6 @@ - './spec/models/ci/daily_build_group_report_result_spec.rb' - './spec/models/ci/deleted_object_spec.rb' - './spec/models/ci/freeze_period_spec.rb' -- './spec/models/ci/freeze_period_status_spec.rb' - './spec/models/ci/group_spec.rb' - './spec/models/ci/group_variable_spec.rb' - './spec/models/ci/instance_variable_spec.rb' @@ -8066,7 +7880,6 @@ - './spec/models/compare_spec.rb' - './spec/models/concerns/access_requestable_spec.rb' - './spec/models/concerns/after_commit_queue_spec.rb' -- './spec/models/concerns/approvable_base_spec.rb' - './spec/models/concerns/as_cte_spec.rb' - './spec/models/concerns/atomic_internal_id_spec.rb' - './spec/models/concerns/avatarable_spec.rb' @@ -8080,13 +7893,11 @@ - './spec/models/concerns/bulk_insert_safe_spec.rb' - './spec/models/concerns/cacheable_attributes_spec.rb' - './spec/models/concerns/cache_markdown_field_spec.rb' -- './spec/models/concerns/cascading_namespace_setting_attribute_spec.rb' - './spec/models/concerns/case_sensitivity_spec.rb' - './spec/models/concerns/checksummable_spec.rb' - './spec/models/concerns/chronic_duration_attribute_spec.rb' - './spec/models/concerns/ci/artifactable_spec.rb' - './spec/models/concerns/ci/bulk_insertable_tags_spec.rb' -- './spec/models/concerns/ci/has_deployment_name_spec.rb' - './spec/models/concerns/ci/has_ref_spec.rb' - './spec/models/concerns/ci/has_status_spec.rb' - './spec/models/concerns/ci/has_variable_spec.rb' @@ -8223,9 +8034,6 @@ - './spec/models/error_tracking/error_spec.rb' - './spec/models/error_tracking/project_error_tracking_setting_spec.rb' - './spec/models/event_spec.rb' -- './spec/models/experiment_spec.rb' -- './spec/models/experiment_subject_spec.rb' -- './spec/models/experiment_user_spec.rb' - './spec/models/exported_protected_branch_spec.rb' - './spec/models/external_issue_spec.rb' - './spec/models/external_pull_request_spec.rb' @@ -8318,7 +8126,6 @@ - './spec/models/internal_id_spec.rb' - './spec/models/issuable_severity_spec.rb' - './spec/models/issue_assignee_spec.rb' -- './spec/models/issue_collection_spec.rb' - './spec/models/issue_email_participant_spec.rb' - './spec/models/issue/email_spec.rb' - './spec/models/issue_link_spec.rb' @@ -8390,7 +8197,6 @@ - './spec/models/notification_setting_spec.rb' - './spec/models/oauth_access_grant_spec.rb' - './spec/models/oauth_access_token_spec.rb' -- './spec/models/onboarding_progress_spec.rb' - './spec/models/operations/feature_flags_client_spec.rb' - './spec/models/operations/feature_flag_spec.rb' - './spec/models/operations/feature_flags/strategy_spec.rb' @@ -8566,7 +8372,6 @@ - './spec/models/users/group_callout_spec.rb' - './spec/models/users/in_product_marketing_email_spec.rb' - './spec/models/users/merge_request_interaction_spec.rb' -- './spec/models/users/namespace_callout_spec.rb' - './spec/models/user_spec.rb' - './spec/models/users/project_callout_spec.rb' - './spec/models/users/saved_reply_spec.rb' @@ -8612,7 +8417,6 @@ - './spec/policies/commit_policy_spec.rb' - './spec/policies/concerns/crud_policy_helpers_spec.rb' - './spec/policies/concerns/policy_actor_spec.rb' -- './spec/policies/concerns/readonly_abilities_spec.rb' - './spec/policies/container_expiration_policy_policy_spec.rb' - './spec/policies/custom_emoji_policy_spec.rb' - './spec/policies/deploy_key_policy_spec.rb' @@ -8624,7 +8428,6 @@ - './spec/policies/group_deploy_key_policy_spec.rb' - './spec/policies/group_deploy_keys_group_policy_spec.rb' - './spec/policies/group_member_policy_spec.rb' -- './spec/policies/group_policy_spec.rb' - './spec/policies/identity_provider_policy_spec.rb' - './spec/policies/instance_metadata_policy_spec.rb' - './spec/policies/integration_policy_spec.rb' @@ -8962,7 +8765,6 @@ - './spec/requests/api/graphql/mutations/work_items/delete_task_spec.rb' - './spec/requests/api/graphql/mutations/work_items/update_spec.rb' - './spec/requests/api/graphql/mutations/work_items/update_task_spec.rb' -- './spec/requests/api/graphql/mutations/work_items/update_widgets_spec.rb' - './spec/requests/api/graphql/namespace/package_settings_spec.rb' - './spec/requests/api/graphql/namespace/projects_spec.rb' - './spec/requests/api/graphql/namespace_query_spec.rb' @@ -9058,7 +8860,6 @@ - './spec/requests/api/import_bitbucket_server_spec.rb' - './spec/requests/api/import_github_spec.rb' - './spec/requests/api/integrations/jira_connect/subscriptions_spec.rb' -- './spec/requests/api/integrations/slack/events_spec.rb' - './spec/requests/api/integrations_spec.rb' - './spec/requests/api/internal/base_spec.rb' - './spec/requests/api/internal/container_registry/migration_spec.rb' @@ -9078,7 +8879,6 @@ - './spec/requests/api/keys_spec.rb' - './spec/requests/api/labels_spec.rb' - './spec/requests/api/lint_spec.rb' -- './spec/requests/api/markdown_golden_master_spec.rb' - './spec/requests/api/markdown_snapshot_spec.rb' - './spec/requests/api/markdown_spec.rb' - './spec/requests/api/maven_packages_spec.rb' @@ -9157,9 +8957,7 @@ - './spec/requests/api/users_preferences_spec.rb' - './spec/requests/api/users_spec.rb' - './spec/requests/api/v3/github_spec.rb' -- './spec/requests/api/version_spec.rb' - './spec/requests/api/wikis_spec.rb' -- './spec/requests/boards/lists_controller_spec.rb' - './spec/requests/concerns/planning_hierarchy_spec.rb' - './spec/requests/content_security_policy_spec.rb' - './spec/requests/dashboard_controller_spec.rb' @@ -9201,8 +8999,6 @@ - './spec/requests/oauth/tokens_controller_spec.rb' - './spec/requests/oauth_tokens_spec.rb' - './spec/requests/openid_connect_spec.rb' -- './spec/requests/product_analytics/collector_app_attack_spec.rb' -- './spec/requests/product_analytics/collector_app_spec.rb' - './spec/requests/profiles/notifications_controller_spec.rb' - './spec/requests/projects/ci/promeheus_metrics/histograms_controller_spec.rb' - './spec/requests/projects/cluster_agents_controller_spec.rb' @@ -9258,7 +9054,6 @@ - './spec/requests/users_controller_spec.rb' - './spec/requests/user_sends_malformed_strings_spec.rb' - './spec/requests/users/group_callouts_spec.rb' -- './spec/requests/users/namespace_callouts_spec.rb' - './spec/requests/user_spoofs_ip_spec.rb' - './spec/requests/users/project_callouts_spec.rb' - './spec/requests/verifies_with_email_spec.rb' @@ -9288,8 +9083,6 @@ - './spec/serializers/analytics_summary_serializer_spec.rb' - './spec/serializers/base_discussion_entity_spec.rb' - './spec/serializers/blob_entity_spec.rb' -- './spec/serializers/board_serializer_spec.rb' -- './spec/serializers/board_simple_entity_spec.rb' - './spec/serializers/build_action_entity_spec.rb' - './spec/serializers/build_artifact_entity_spec.rb' - './spec/serializers/build_details_entity_spec.rb' @@ -9498,7 +9291,6 @@ - './spec/services/boards/issues/move_service_spec.rb' - './spec/services/boards/lists/create_service_spec.rb' - './spec/services/boards/lists/destroy_service_spec.rb' -- './spec/services/boards/lists/generate_service_spec.rb' - './spec/services/boards/lists/list_service_spec.rb' - './spec/services/boards/lists/move_service_spec.rb' - './spec/services/boards/lists/update_service_spec.rb' @@ -9528,7 +9320,6 @@ - './spec/services/chat_names/authorize_user_service_spec.rb' - './spec/services/chat_names/find_user_service_spec.rb' - './spec/services/ci/abort_pipelines_service_spec.rb' -- './spec/services/ci/after_requeue_job_service_spec.rb' - './spec/services/ci/append_build_trace_service_spec.rb' - './spec/services/ci/archive_trace_service_spec.rb' - './spec/services/ci/build_cancel_service_spec.rb' @@ -9641,37 +9432,14 @@ - './spec/services/clusters/agents/refresh_authorization_service_spec.rb' - './spec/services/clusters/agent_tokens/create_service_spec.rb' - './spec/services/clusters/agent_tokens/track_usage_service_spec.rb' -- './spec/services/clusters/applications/check_ingress_ip_address_service_spec.rb' -- './spec/services/clusters/applications/check_installation_progress_service_spec.rb' -- './spec/services/clusters/applications/check_uninstall_progress_service_spec.rb' -- './spec/services/clusters/applications/check_upgrade_progress_service_spec.rb' -- './spec/services/clusters/applications/create_service_spec.rb' -- './spec/services/clusters/applications/destroy_service_spec.rb' -- './spec/services/clusters/applications/install_service_spec.rb' -- './spec/services/clusters/applications/patch_service_spec.rb' -- './spec/services/clusters/applications/prometheus_config_service_spec.rb' -- './spec/services/clusters/applications/prometheus_update_service_spec.rb' -- './spec/services/clusters/applications/uninstall_service_spec.rb' -- './spec/services/clusters/applications/update_service_spec.rb' -- './spec/services/clusters/applications/upgrade_service_spec.rb' -- './spec/services/clusters/aws/authorize_role_service_spec.rb' -- './spec/services/clusters/aws/fetch_credentials_service_spec.rb' -- './spec/services/clusters/aws/finalize_creation_service_spec.rb' -- './spec/services/clusters/aws/provision_service_spec.rb' -- './spec/services/clusters/aws/verify_provision_status_service_spec.rb' - './spec/services/clusters/build_kubernetes_namespace_service_spec.rb' - './spec/services/clusters/build_service_spec.rb' - './spec/services/clusters/cleanup/project_namespace_service_spec.rb' - './spec/services/clusters/cleanup/service_account_service_spec.rb' - './spec/services/clusters/create_service_spec.rb' - './spec/services/clusters/destroy_service_spec.rb' -- './spec/services/clusters/gcp/fetch_operation_service_spec.rb' -- './spec/services/clusters/gcp/finalize_creation_service_spec.rb' -- './spec/services/clusters/gcp/provision_service_spec.rb' -- './spec/services/clusters/gcp/verify_provision_status_service_spec.rb' - './spec/services/clusters/integrations/create_service_spec.rb' - './spec/services/clusters/integrations/prometheus_health_check_service_spec.rb' -- './spec/services/clusters/kubernetes/configure_istio_ingress_service_spec.rb' - './spec/services/clusters/kubernetes/create_or_update_namespace_service_spec.rb' - './spec/services/clusters/kubernetes/create_or_update_service_account_service_spec.rb' - './spec/services/clusters/kubernetes/fetch_kubernetes_token_service_spec.rb' @@ -10238,14 +10006,12 @@ - './spec/services/users/destroy_service_spec.rb' - './spec/services/users/dismiss_callout_service_spec.rb' - './spec/services/users/dismiss_group_callout_service_spec.rb' -- './spec/services/users/dismiss_namespace_callout_service_spec.rb' - './spec/services/users/dismiss_project_callout_service_spec.rb' - './spec/services/users/email_verification/generate_token_service_spec.rb' - './spec/services/users/email_verification/validate_token_service_spec.rb' - './spec/services/users/in_product_marketing_email_records_spec.rb' - './spec/services/users/keys_count_service_spec.rb' - './spec/services/users/last_push_event_service_spec.rb' -- './spec/services/users/migrate_to_ghost_user_service_spec.rb' - './spec/services/users/refresh_authorized_projects_service_spec.rb' - './spec/services/users/registrations_build_service_spec.rb' - './spec/services/users/reject_service_spec.rb' @@ -10296,7 +10062,6 @@ - './spec/sidekiq_cluster/sidekiq_cluster_spec.rb' - './spec/sidekiq/cron/job_gem_dependency_spec.rb' - './spec/spam/concerns/has_spam_action_response_fields_spec.rb' -- './spec/support_specs/database/multiple_databases_spec.rb' - './spec/support_specs/database/prevent_cross_joins_spec.rb' - './spec/support_specs/graphql/arguments_spec.rb' - './spec/support_specs/graphql/field_selection_spec.rb' @@ -10416,7 +10181,6 @@ - './spec/validators/addressable_url_validator_spec.rb' - './spec/validators/any_field_validator_spec.rb' - './spec/validators/array_members_validator_spec.rb' -- './spec/validators/branch_filter_validator_spec.rb' - './spec/validators/color_validator_spec.rb' - './spec/validators/cron_freeze_period_timezone_validator_spec.rb' - './spec/validators/cron_validator_spec.rb' @@ -10510,7 +10274,6 @@ - './spec/views/profiles/notifications/show.html.haml_spec.rb' - './spec/views/profiles/preferences/show.html.haml_spec.rb' - './spec/views/profiles/show.html.haml_spec.rb' -- './spec/views/projects/artifacts/_artifact.html.haml_spec.rb' - './spec/views/projects/blob/_viewer.html.haml_spec.rb' - './spec/views/projects/branches/index.html.haml_spec.rb' - './spec/views/projects/commit/branches.html.haml_spec.rb' @@ -10555,7 +10318,6 @@ - './spec/views/registrations/welcome/show.html.haml_spec.rb' - './spec/views/search/_results.html.haml_spec.rb' - './spec/views/search/show.html.haml_spec.rb' -- './spec/views/shared/deploy_tokens/_form.html.haml_spec.rb' - './spec/views/shared/groups/_dropdown.html.haml_spec.rb' - './spec/views/shared/issuable/_sidebar.html.haml_spec.rb' - './spec/views/shared/_label_row.html.haml_spec.rb' @@ -10570,7 +10332,6 @@ - './spec/views/shared/projects/_project.html.haml_spec.rb' - './spec/views/shared/runners/_runner_details.html.haml_spec.rb' - './spec/views/shared/snippets/_snippet.html.haml_spec.rb' -- './spec/views/shared/ssh_keys/_key_details.html.haml_spec.rb' - './spec/views/shared/wikis/_sidebar.html.haml_spec.rb' - './spec/workers/admin_email_worker_spec.rb' - './spec/workers/analytics/usage_trends/counter_job_worker_spec.rb' @@ -10635,18 +10396,12 @@ - './spec/workers/ci/track_failed_build_worker_spec.rb' - './spec/workers/ci/update_locked_unknown_artifacts_worker_spec.rb' - './spec/workers/cleanup_container_repository_worker_spec.rb' -- './spec/workers/cluster_configure_istio_worker_spec.rb' -- './spec/workers/cluster_provision_worker_spec.rb' - './spec/workers/clusters/agents/delete_expired_events_worker_spec.rb' - './spec/workers/clusters/applications/activate_integration_worker_spec.rb' - './spec/workers/clusters/applications/deactivate_integration_worker_spec.rb' -- './spec/workers/clusters/applications/wait_for_uninstall_app_worker_spec.rb' - './spec/workers/clusters/cleanup/project_namespace_worker_spec.rb' - './spec/workers/clusters/cleanup/service_account_worker_spec.rb' - './spec/workers/clusters/integrations/check_prometheus_health_worker_spec.rb' -- './spec/workers/cluster_update_app_worker_spec.rb' -- './spec/workers/cluster_wait_for_app_update_worker_spec.rb' -- './spec/workers/cluster_wait_for_ingress_ip_address_worker_spec.rb' - './spec/workers/concerns/application_worker_spec.rb' - './spec/workers/concerns/cluster_agent_queue_spec.rb' - './spec/workers/concerns/cluster_queue_spec.rb' @@ -10799,10 +10554,6 @@ - './spec/workers/metrics/dashboard/sync_dashboards_worker_spec.rb' - './spec/workers/migrate_external_diffs_worker_spec.rb' - './spec/workers/namespaces/in_product_marketing_emails_worker_spec.rb' -- './spec/workers/namespaces/onboarding_issue_created_worker_spec.rb' -- './spec/workers/namespaces/onboarding_pipeline_created_worker_spec.rb' -- './spec/workers/namespaces/onboarding_progress_worker_spec.rb' -- './spec/workers/namespaces/onboarding_user_added_worker_spec.rb' - './spec/workers/namespaces/process_sync_events_worker_spec.rb' - './spec/workers/namespaces/prune_aggregation_schedules_worker_spec.rb' - './spec/workers/namespaces/root_statistics_worker_spec.rb' @@ -10918,7 +10669,6 @@ - './spec/workers/users/create_statistics_worker_spec.rb' - './spec/workers/users/deactivate_dormant_users_worker_spec.rb' - './spec/workers/user_status_cleanup/batch_worker_spec.rb' -- './spec/workers/wait_for_cluster_creation_worker_spec.rb' - './spec/workers/web_hooks/log_destroy_worker_spec.rb' - './spec/workers/web_hook_worker_spec.rb' - './spec/workers/wikis/git_garbage_collect_worker_spec.rb' diff --git a/spec/support/services/clusters/create_service_shared.rb b/spec/support/services/clusters/create_service_shared.rb index f8a58a828ce..80fa7c58515 100644 --- a/spec/support/services/clusters/create_service_shared.rb +++ b/spec/support/services/clusters/create_service_shared.rb @@ -37,9 +37,7 @@ RSpec.shared_context 'invalid cluster create params' do end RSpec.shared_examples 'create cluster service success' do - it 'creates a cluster object and performs a worker' do - expect(ClusterProvisionWorker).to receive(:perform_async) - + it 'creates a cluster object' do expect { subject } .to change { Clusters::Cluster.count }.by(1) .and change { Clusters::Providers::Gcp.count }.by(1) @@ -60,7 +58,6 @@ end RSpec.shared_examples 'create cluster service error' do it 'returns an error' do - expect(ClusterProvisionWorker).not_to receive(:perform_async) expect { subject }.to change { Clusters::Cluster.count }.by(0) expect(subject.errors[:"provider_gcp.gcp_project_id"]).to be_present end diff --git a/spec/support/shared_contexts/bulk_imports_requests_shared_context.rb b/spec/support/shared_contexts/bulk_imports_requests_shared_context.rb index 2f74d3131ab..e8fc498cbf7 100644 --- a/spec/support/shared_contexts/bulk_imports_requests_shared_context.rb +++ b/spec/support/shared_contexts/bulk_imports_requests_shared_context.rb @@ -15,7 +15,7 @@ RSpec.shared_context 'bulk imports requests context' do |url| let(:request_headers) { { 'Content-Type' => 'application/json' } } before do - stub_request(:get, "#{url}/api/v4/version?page=1&per_page=20&private_token=demo-pat") + stub_request(:get, "#{url}/api/v4/version?private_token=demo-pat") .with(headers: request_headers) .to_return( status: 200, diff --git a/spec/support/shared_contexts/features/integrations/integrations_shared_context.rb b/spec/support/shared_contexts/features/integrations/integrations_shared_context.rb index ca2fe8a6c54..bf5158c9a92 100644 --- a/spec/support/shared_contexts/features/integrations/integrations_shared_context.rb +++ b/spec/support/shared_contexts/features/integrations/integrations_shared_context.rb @@ -40,7 +40,7 @@ Integration.available_integration_names.each do |integration| let(:integration_attrs) do integration_attrs_list.inject({}) do |hash, k| - if k =~ /^(token*|.*_token|.*_key)/ + if k =~ /^(token*|.*_token|.*_key)/ && k =~ /^[^app_store]/ hash.merge!(k => 'secrettoken') elsif integration == 'confluence' && k == :confluence_url hash.merge!(k => 'https://example.atlassian.net/wiki') @@ -68,6 +68,12 @@ Integration.available_integration_names.each do |integration| hash.merge!(k => "match_any") elsif integration == 'campfire' && k == :room hash.merge!(k => '1234') + elsif integration == 'apple_app_store' && k == :app_store_issuer_id + hash.merge!(k => 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee') + elsif integration == 'apple_app_store' && k == :app_store_private_key + hash.merge!(k => File.read('spec/fixtures/ssl_key.pem')) + elsif integration == 'apple_app_store' && k == :app_store_key_id + hash.merge!(k => 'ABC1') else hash.merge!(k => "someword") end diff --git a/spec/support/shared_contexts/markdown_golden_master_shared_examples.rb b/spec/support/shared_contexts/markdown_golden_master_shared_examples.rb deleted file mode 100644 index 72e23e6d5fa..00000000000 --- a/spec/support/shared_contexts/markdown_golden_master_shared_examples.rb +++ /dev/null @@ -1,132 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -# See spec/fixtures/markdown/markdown_golden_master_examples.yml for documentation on how this spec works. -RSpec.shared_context 'API::Markdown Golden Master shared context' do |markdown_yml_file_path| - include ApiHelpers - include WikiHelpers - - let_it_be(:user) { create(:user, username: 'gfm_user') } - - let_it_be(:group) { create(:group, :public) } - let_it_be(:project) { create(:project, :public, :repository, group: group) } - - let_it_be(:label) { create(:label, project: project, title: 'bug') } - let_it_be(:label2) { create(:label, project: project, title: 'UX bug') } - - let_it_be(:milestone) { create(:milestone, project: project, title: '1.1') } - let_it_be(:issue) { create(:issue, project: project) } - let_it_be(:merge_request) { create(:merge_request, source_project: project) } - - let_it_be(:project_wiki) { create(:project_wiki, project: project, user: user) } - - let_it_be(:project_wiki_page) { create(:wiki_page, wiki: project_wiki) } - - before(:all) do - group.add_owner(user) - project.add_maintainer(user) - end - - before do - sign_in(user) - end - - markdown_examples = begin - yaml = File.read(markdown_yml_file_path) - YAML.safe_load(yaml, symbolize_names: true, aliases: true) - end - - it "examples must be unique and alphabetized by name", :unlimited_max_formatted_output_length do - names = markdown_examples.map { |example| example[:name] } - expect(names).to eq(names.sort.uniq) - end - - if focused_markdown_examples_string = ENV['FOCUSED_MARKDOWN_EXAMPLES'] - focused_markdown_examples = focused_markdown_examples_string.split(',').map(&:strip) || [] - markdown_examples.reject! { |markdown_example| !focused_markdown_examples.include?(markdown_example.fetch(:name)) } - end - - markdown_examples.each do |markdown_example| - name = markdown_example.fetch(:name) - api_context = markdown_example[:api_context] - - if api_context && !name.end_with?("_for_#{api_context}") - raise "Name must have suffix of '_for_#{api_context}' to the api_context" - end - - context "for #{name}#{api_context ? " (api_context: #{api_context})" : ''}" do - let(:pending_reason) do - pending_value = markdown_example.fetch(:pending, nil) - get_pending_reason(pending_value) - end - - let(:example_markdown) { markdown_example.fetch(:markdown) } - let(:example_html) { markdown_example.fetch(:html) } - let(:substitutions) { markdown_example.fetch(:substitutions, {}) } - - it "verifies conversion of GFM to HTML", :unlimited_max_formatted_output_length do - stub_application_setting(plantuml_enabled: true, plantuml_url: 'http://localhost:8080') - stub_application_setting(kroki_enabled: true, kroki_url: 'http://localhost:8000') - - pending pending_reason if pending_reason - - normalized_example_html = normalize_html(example_html, substitutions) - - api_url = get_url_for_api_context(api_context) - - post api_url, params: { text: example_markdown, gfm: true } - expect(response).to be_successful - response_body = Gitlab::Json.parse(response.body) - # Some requests have the HTML in the `html` key, others in the `body` key. - response_html = response_body['body'] ? response_body.fetch('body') : response_body.fetch('html') - normalized_response_html = normalize_html(response_html, substitutions) - - expect(normalized_response_html).to eq(normalized_example_html) - end - - def get_pending_reason(pending_value) - return false unless pending_value - - return pending_value if pending_value.is_a?(String) - - pending_value[:backend] || false - end - - def normalize_html(html, substitutions) - normalized_html = html.dup - # Note: having the top level `substitutions` data structure be a hash of arrays - # allows us to compose multiple substitutions via YAML anchors (YAML anchors - # pointing to arrays can't be combined) - substitutions.each_value do |substitution_entry| - substitution_entry.each do |substitution| - regex = substitution.fetch(:regex) - replacement = substitution.fetch(:replacement) - normalized_html.gsub!(%r{#{regex}}, replacement) - end - end - - normalized_html - end - end - end - - def supported_api_contexts - %w(project group project_wiki) - end - - def get_url_for_api_context(api_context) - case api_context - when 'project' - "/#{project.full_path}/preview_markdown" - when 'group' - "/groups/#{group.full_path}/preview_markdown" - when 'project_wiki' - "/#{project.full_path}/-/wikis/#{project_wiki_page.slug}/preview_markdown" - when nil - api "/markdown" - else - raise "Error: 'context' extension was '#{api_context}'. It must be one of: #{supported_api_contexts.join(',')}" - end - end -end diff --git a/spec/support/shared_contexts/navbar_structure_context.rb b/spec/support/shared_contexts/navbar_structure_context.rb index af35a5ff068..9c7cf831241 100644 --- a/spec/support/shared_contexts/navbar_structure_context.rb +++ b/spec/support/shared_contexts/navbar_structure_context.rb @@ -221,3 +221,46 @@ RSpec.shared_context 'group navbar structure' do ] end end + +RSpec.shared_context 'dashboard navbar structure' do + let(:structure) do + [ + { + nav_item: "Your work", + nav_sub_items: [] + }, + { + nav_item: _("Projects"), + nav_sub_items: [] + }, + { + nav_item: _("Groups"), + nav_sub_items: [] + }, + { + nav_item: _("Issues"), + nav_sub_items: [] + }, + { + nav_item: _("Merge requests"), + nav_sub_items: [] + }, + { + nav_item: _("To-Do List"), + nav_sub_items: [] + }, + { + nav_item: _("Milestones"), + nav_sub_items: [] + }, + { + nav_item: _("Snippets"), + nav_sub_items: [] + }, + { + nav_item: _("Activity"), + nav_sub_items: [] + } + ] + end +end diff --git a/spec/support/shared_contexts/policies/group_policy_shared_context.rb b/spec/support/shared_contexts/policies/group_policy_shared_context.rb index f6ac98c7669..fddcecbe125 100644 --- a/spec/support/shared_contexts/policies/group_policy_shared_context.rb +++ b/spec/support/shared_contexts/policies/group_policy_shared_context.rb @@ -12,7 +12,7 @@ RSpec.shared_context 'GroupPolicy context' do let(:public_permissions) do %i[ - read_group read_counts + read_group read_counts read_achievement read_label read_issue_board_list read_milestone read_issue_board ] end @@ -57,6 +57,7 @@ RSpec.shared_context 'GroupPolicy context' do create_projects create_cluster update_cluster admin_cluster add_cluster destroy_upload + admin_achievement ] end diff --git a/spec/support/shared_examples/analytics/cycle_analytics/parentable_examples.rb b/spec/support/shared_examples/analytics/cycle_analytics/parentable_examples.rb new file mode 100644 index 00000000000..5fd0e685c67 --- /dev/null +++ b/spec/support/shared_examples/analytics/cycle_analytics/parentable_examples.rb @@ -0,0 +1,28 @@ +# frozen_string_literal: true + +RSpec.shared_examples 'value stream analytics namespace models' do + let(:factory_name) { nil } + + context 'when ProjectNamespace is given' do + it 'is valid' do + project_namespace = create(:project_namespace) + model = build(factory_name, namespace: project_namespace) + + expect(model).to be_valid + expect(model.save).to be(true) + expect(model.namespace).to eq(project_namespace) + end + end + + context 'when Namespace is given' do + it 'fails' do + namespace = create(:namespace) + model = build(factory_name, namespace: namespace) + + expect(model).to be_invalid + + error_message = s_('CycleAnalytics|the assigned object is not supported') + expect(model.errors.messages_for(:namespace)).to eq([error_message]) + end + end +end diff --git a/spec/support/shared_examples/controllers/githubish_import_controller_shared_examples.rb b/spec/support/shared_examples/controllers/githubish_import_controller_shared_examples.rb index 5506b05ca55..de38d1ff9f8 100644 --- a/spec/support/shared_examples/controllers/githubish_import_controller_shared_examples.rb +++ b/spec/support/shared_examples/controllers/githubish_import_controller_shared_examples.rb @@ -258,7 +258,7 @@ RSpec.shared_examples 'a GitHub-ish import controller: POST create' do .to receive(:new).with(provider_repo, provider_repo[:name], user.namespace, user, type: provider, **access_params) .and_return(double(execute: project)) - post :create, format: :json + post :create, params: { target_namespace: user.namespace }, format: :json expect(response).to have_gitlab_http_status(:ok) end @@ -272,7 +272,7 @@ RSpec.shared_examples 'a GitHub-ish import controller: POST create' do .to receive(:new).with(provider_repo, provider_repo[:name], user.namespace, user, type: provider, **access_params) .and_return(double(execute: project)) - post :create, format: :json + post :create, params: { target_namespace: user.namespace_path }, format: :json expect(response).to have_gitlab_http_status(:unprocessable_entity) expect(json_response['errors']).to eq('Name is invalid, Path is old') @@ -286,7 +286,7 @@ RSpec.shared_examples 'a GitHub-ish import controller: POST create' do expect(store).to receive(:touch) { "realtime_changes_import_#{provider}_path" } end - post :create, format: :json + post :create, params: { target_namespace: user.namespace_path }, format: :json end context "when the repository owner is the provider user" do @@ -296,7 +296,7 @@ RSpec.shared_examples 'a GitHub-ish import controller: POST create' do .to receive(:new).with(provider_repo, provider_repo[:name], user.namespace, user, type: provider, **access_params) .and_return(double(execute: project)) - post :create, format: :json + post :create, params: { target_namespace: user.namespace_path }, format: :json end end @@ -308,7 +308,7 @@ RSpec.shared_examples 'a GitHub-ish import controller: POST create' do .to receive(:new).with(provider_repo, provider_repo[:name], user.namespace, user, type: provider, **access_params) .and_return(double(execute: project)) - post :create, format: :json + post :create, params: { target_namespace: user.namespace_path }, format: :json end end end @@ -333,7 +333,7 @@ RSpec.shared_examples 'a GitHub-ish import controller: POST create' do .to receive(:new).with(provider_repo, provider_repo[:name], existing_namespace, user, type: provider, **access_params) .and_return(double(execute: project)) - post :create, format: :json + post :create, params: { target_namespace: user.namespace_path }, format: :json end end @@ -345,47 +345,17 @@ RSpec.shared_examples 'a GitHub-ish import controller: POST create' do .to receive(:new).with(provider_repo, provider_repo[:name], user.namespace, user, type: provider, **access_params) .and_return(double(execute: project)) - post :create, format: :json + post :create, params: { target_namespace: user.namespace_path }, format: :json end end end context "when a namespace with the provider user's username doesn't exist" do context "when current user can create namespaces" do - it "creates the namespace" do - expect(Gitlab::LegacyGithubImport::ProjectCreator) - .to receive(:new).and_return(double(execute: project)) - - expect { post :create, params: { target_namespace: provider_repo[:name] }, format: :json }.to change { Namespace.count }.by(1) - end - - it "takes the new namespace" do - expect(Gitlab::LegacyGithubImport::ProjectCreator) - .to receive(:new).with(provider_repo, provider_repo[:name], an_instance_of(Group), user, type: provider, **access_params) - .and_return(double(execute: project)) - - post :create, params: { target_namespace: provider_repo[:name] }, format: :json - end - end - - context "when current user can't create namespaces" do - before do - user.update_attribute(:can_create_group, false) - end - - it "doesn't create the namespace" do - expect(Gitlab::LegacyGithubImport::ProjectCreator) - .to receive(:new).and_return(double(execute: project)) - - expect { post :create, format: :json }.not_to change { Namespace.count } - end + it "does not create the namespace" do + expect(Gitlab::LegacyGithubImport::ProjectCreator).not_to receive(:new) - it "takes the current user's namespace" do - expect(Gitlab::LegacyGithubImport::ProjectCreator) - .to receive(:new).with(provider_repo, provider_repo[:name], user.namespace, user, type: provider, **access_params) - .and_return(double(execute: project)) - - post :create, format: :json + expect { post :create, params: { target_namespace: provider_repo[:name] }, format: :json }.not_to change { Namespace.count } end end end @@ -405,14 +375,6 @@ RSpec.shared_examples 'a GitHub-ish import controller: POST create' do post :create, params: { target_namespace: test_namespace.name, new_name: test_name }, format: :json end - - it 'takes the selected name and default namespace' do - expect(Gitlab::LegacyGithubImport::ProjectCreator) - .to receive(:new).with(provider_repo, test_name, user.namespace, user, type: provider, **access_params) - .and_return(double(execute: project)) - - post :create, params: { new_name: test_name }, format: :json - end end context 'user has chosen an existing nested namespace and name for the project' do @@ -437,31 +399,16 @@ RSpec.shared_examples 'a GitHub-ish import controller: POST create' do context 'user has chosen a non-existent nested namespaces and name for the project' do let(:test_name) { 'test_name' } - it 'takes the selected namespace and name' do + it 'does not take the selected namespace and name' do expect(Gitlab::LegacyGithubImport::ProjectCreator) - .to receive(:new).with(provider_repo, test_name, kind_of(Namespace), user, type: provider, **access_params) - .and_return(double(execute: project)) + .not_to receive(:new) post :create, params: { target_namespace: 'foo/bar', new_name: test_name }, format: :json end - it 'creates the namespaces' do - allow(Gitlab::LegacyGithubImport::ProjectCreator) - .to receive(:new).with(provider_repo, test_name, kind_of(Namespace), user, type: provider, **access_params) - .and_return(double(execute: project)) - + it 'does not create namespaces' do expect { post :create, params: { target_namespace: 'foo/bar', new_name: test_name }, format: :json } - .to change { Namespace.count }.by(2) - end - - it 'new namespace has the right parent' do - allow(Gitlab::LegacyGithubImport::ProjectCreator) - .to receive(:new).with(provider_repo, test_name, kind_of(Namespace), user, type: provider, **access_params) - .and_return(double(execute: project)) - - post :create, params: { target_namespace: 'foo/bar', new_name: test_name }, format: :json - - expect(Namespace.find_by_path_or_name('bar').parent.path).to eq('foo') + .not_to change { Namespace.count } end end @@ -473,55 +420,25 @@ RSpec.shared_examples 'a GitHub-ish import controller: POST create' do parent_namespace.add_owner(user) end - it 'takes the selected namespace and name' do - expect(Gitlab::LegacyGithubImport::ProjectCreator) - .to receive(:new).with(provider_repo, test_name, kind_of(Namespace), user, type: provider, **access_params) - .and_return(double(execute: project)) + it 'does not take the selected namespace and name' do + expect(Gitlab::LegacyGithubImport::ProjectCreator).not_to receive(:new) post :create, params: { target_namespace: 'foo/foobar/bar', new_name: test_name }, format: :json end - it 'creates the namespaces' do - allow(Gitlab::LegacyGithubImport::ProjectCreator) - .to receive(:new).with(provider_repo, test_name, kind_of(Namespace), user, type: provider, **access_params) - .and_return(double(execute: project)) - + it 'does not create the namespaces' do expect { post :create, params: { target_namespace: 'foo/foobar/bar', new_name: test_name }, format: :json } - .to change { Namespace.count }.by(2) + .not_to change { Namespace.count } end it 'does not create a new namespace under the user namespace' do - expect(Gitlab::LegacyGithubImport::ProjectCreator) - .to receive(:new).with(provider_repo, test_name, user.namespace, user, type: provider, **access_params) - .and_return(double(execute: project)) + expect(Gitlab::LegacyGithubImport::ProjectCreator).not_to receive(:new) expect { post :create, params: { target_namespace: "#{user.namespace_path}/test_group", new_name: test_name }, format: :js } .not_to change { Namespace.count } end end - context 'user cannot create a subgroup inside a group is not a member of' do - let(:test_name) { 'test_name' } - let!(:parent_namespace) { create(:group, name: 'foo') } - - it 'does not take the selected namespace and name' do - expect(Gitlab::LegacyGithubImport::ProjectCreator) - .to receive(:new).with(provider_repo, test_name, user.namespace, user, type: provider, **access_params) - .and_return(double(execute: project)) - - post :create, params: { target_namespace: 'foo/foobar/bar', new_name: test_name }, format: :js - end - - it 'does not create the namespaces' do - allow(Gitlab::LegacyGithubImport::ProjectCreator) - .to receive(:new).with(provider_repo, test_name, kind_of(Namespace), user, type: provider, **access_params) - .and_return(double(execute: project)) - - expect { post :create, params: { target_namespace: 'foo/foobar/bar', new_name: test_name }, format: :js } - .not_to change { Namespace.count } - end - end - context 'user can use a group without having permissions to create a group' do let(:test_name) { 'test_name' } let!(:group) { create(:group, name: 'foo') } diff --git a/spec/support/shared_examples/controllers/issuables_list_metadata_shared_examples.rb b/spec/support/shared_examples/controllers/issuables_list_metadata_shared_examples.rb index 02915206cc5..446bc4cd92f 100644 --- a/spec/support/shared_examples/controllers/issuables_list_metadata_shared_examples.rb +++ b/spec/support/shared_examples/controllers/issuables_list_metadata_shared_examples.rb @@ -42,6 +42,10 @@ RSpec.shared_examples 'issuables list meta-data' do |issuable_type, action = nil let(:result_issuable) { issuables.first } let(:search) { result_issuable.title } + before do + stub_application_setting(search_rate_limit: 0, search_rate_limit_unauthenticated: 0) + end + # .simple_sorts is the same across all Sortable classes sorts = ::Issue.simple_sorts.keys + %w[popularity priority label_priority] sorts.each do |sort| diff --git a/spec/support/shared_examples/controllers/rate_limited_endpoint_shared_examples.rb b/spec/support/shared_examples/controllers/rate_limited_endpoint_shared_examples.rb index 20edca1ee9f..b34038ca0e4 100644 --- a/spec/support/shared_examples/controllers/rate_limited_endpoint_shared_examples.rb +++ b/spec/support/shared_examples/controllers/rate_limited_endpoint_shared_examples.rb @@ -5,7 +5,9 @@ # - current_user # - error_message # optional -RSpec.shared_examples 'rate limited endpoint' do |rate_limit_key:| +RSpec.shared_examples 'rate limited endpoint' do |rate_limit_key:, graphql: false| + let(:error_message) { _('This endpoint has been requested too many times. Try again later.') } + context 'when rate limiter enabled', :freeze_time, :clean_gitlab_redis_rate_limiting do let(:expected_logger_attributes) do { @@ -25,8 +27,6 @@ RSpec.shared_examples 'rate limited endpoint' do |rate_limit_key:| end end - let(:error_message) { _('This endpoint has been requested too many times. Try again later.') } - before do allow(Gitlab::ApplicationRateLimiter).to receive(:threshold).with(rate_limit_key).and_return(1) end @@ -37,12 +37,16 @@ RSpec.shared_examples 'rate limited endpoint' do |rate_limit_key:| request request - expect(response).to have_gitlab_http_status(:too_many_requests) + if graphql + expect_graphql_errors_to_include(error_message) + else + expect(response).to have_gitlab_http_status(:too_many_requests) - if example.metadata[:type] == :controller - expect(response.body).to eq(error_message) - else # it is API spec - expect(response.body).to eq({ message: { error: error_message } }.to_json) + if response.content_type == 'application/json' # it is API spec + expect(response.body).to eq({ message: { error: error_message } }.to_json) + else + expect(response.body).to eq(error_message) + end end end end @@ -57,7 +61,11 @@ RSpec.shared_examples 'rate limited endpoint' do |rate_limit_key:| request - expect(response).not_to have_gitlab_http_status(:too_many_requests) + if graphql + expect_graphql_errors_to_be_empty + else + expect(response).not_to have_gitlab_http_status(:too_many_requests) + end end end end diff --git a/spec/support/shared_examples/features/code_highlight_shared_examples.rb b/spec/support/shared_examples/features/code_highlight_shared_examples.rb new file mode 100644 index 00000000000..3917ac9b489 --- /dev/null +++ b/spec/support/shared_examples/features/code_highlight_shared_examples.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +RSpec.shared_examples 'code highlight' do + include PreferencesHelper + + let_it_be(:current_user) { user } + let_it_be(:scheme_class) { user_color_scheme } + + it 'has highlighted code', :js do + wait_for_requests + expect(subject).to have_selector(".js-syntax-highlight.#{scheme_class}") + end +end diff --git a/spec/support/shared_examples/features/content_editor_shared_examples.rb b/spec/support/shared_examples/features/content_editor_shared_examples.rb index efdf7513b2d..6cd9c4ce1c4 100644 --- a/spec/support/shared_examples/features/content_editor_shared_examples.rb +++ b/spec/support/shared_examples/features/content_editor_shared_examples.rb @@ -4,7 +4,8 @@ RSpec.shared_examples 'edits content using the content editor' do let(:content_editor_testid) { '[data-testid="content-editor"] [contenteditable].ProseMirror' } def switch_to_content_editor - find('[data-testid="toggle-editing-mode-button"] label', text: 'Rich text').click + click_button _('View rich text') + click_button _('Rich text') end def type_in_content_editor(keys) diff --git a/spec/support/shared_examples/features/dashboard/sidebar_shared_examples.rb b/spec/support/shared_examples/features/dashboard/sidebar_shared_examples.rb new file mode 100644 index 00000000000..efbd735c451 --- /dev/null +++ b/spec/support/shared_examples/features/dashboard/sidebar_shared_examples.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +RSpec.shared_examples "a dashboard page with sidebar" do |page_path, menu_label| + before do + sign_in(user) + visit send(page_path) + end + + let(:sidebar_css) { "aside.nav-sidebar[aria-label=\"Your work\"]" } + let(:active_menu_item_css) { "li.active[data-track-label=\"#{menu_label}_menu\"]" } + + it "shows the \"Your work\" sidebar" do + expect(page).to have_css(sidebar_css) + end + + it "shows the correct sidebar menu item as active" do + within(sidebar_css) do + expect(page).to have_css(active_menu_item_css) + end + end +end diff --git a/spec/support/shared_examples/features/reportable_note_shared_examples.rb b/spec/support/shared_examples/features/reportable_note_shared_examples.rb index c35f711111b..9d859403465 100644 --- a/spec/support/shared_examples/features/reportable_note_shared_examples.rb +++ b/spec/support/shared_examples/features/reportable_note_shared_examples.rb @@ -36,7 +36,7 @@ RSpec.shared_examples 'reportable note' do |type| dropdown.click_link('Report abuse to administrator') expect(find('#user_name')['value']).to match(note.author.username) - expect(find('#abuse_report_message')['value']).to match(noteable_note_url(note)) + expect(find('#abuse_report_reported_from_url')['value']).to match(noteable_note_url(note)) end def open_dropdown(dropdown) diff --git a/spec/support/shared_examples/finders/issues_finder_shared_examples.rb b/spec/support/shared_examples/finders/issues_finder_shared_examples.rb index 9d1f05d5543..6f4072ba762 100644 --- a/spec/support/shared_examples/finders/issues_finder_shared_examples.rb +++ b/spec/support/shared_examples/finders/issues_finder_shared_examples.rb @@ -550,6 +550,24 @@ RSpec.shared_examples 'issues or work items finder' do |factory, execute_context expect(items).to contain_exactly(item1, item4, item5) end end + + context 'using OR' do + let(:params) { { or: { label_name: [label.title, label2.title].join(',') } } } + + it 'returns items that have at least one of the given labels' do + expect(items).to contain_exactly(item2, item3) + end + + context 'when feature flag is disabled' do + before do + stub_feature_flags(or_issuable_queries: false) + end + + it 'does not add any filter' do + expect(items).to contain_exactly(item1, item2, item3, item4, item5) + end + end + end end context 'filtering by a label that includes any or none in the title' do diff --git a/spec/support/shared_examples/graphql/types/merge_request_interactions_type_shared_examples.rb b/spec/support/shared_examples/graphql/types/merge_request_interactions_type_shared_examples.rb index 0d0dbb112de..19ceb465383 100644 --- a/spec/support/shared_examples/graphql/types/merge_request_interactions_type_shared_examples.rb +++ b/spec/support/shared_examples/graphql/types/merge_request_interactions_type_shared_examples.rb @@ -14,7 +14,10 @@ RSpec.shared_examples "a user type with merge request interaction type" do name username email + emails publicEmail + commitEmail + namespaceCommitEmails avatarUrl webUrl webPath diff --git a/spec/support/shared_examples/lib/sidebars/your_work/menus/menu_item_examples.rb b/spec/support/shared_examples/lib/sidebars/your_work/menus/menu_item_examples.rb new file mode 100644 index 00000000000..19c94a3ba5b --- /dev/null +++ b/spec/support/shared_examples/lib/sidebars/your_work/menus/menu_item_examples.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.shared_examples 'menu item shows pill based on count' do |count| + describe '#has_pill?' do + context 'when count is zero' do + it 'returns false' do + allow(user).to receive(count).and_return(0) + expect(subject.has_pill?).to eq false + end + end + + context 'when count is larger than zero' do + it 'returns true' do + allow(user).to receive(count).and_return(3) + expect(subject.has_pill?).to eq true + end + end + end + + describe '#pill_count' do + it "returns the #{count} of the user" do + allow(user).to receive(count).and_return(123) + expect(subject.pill_count).to eq 123 + end + + it 'memoizes the query' do + subject.pill_count + + control = ActiveRecord::QueryRecorder.new do + subject.pill_count + end + + expect(control.count).to eq 0 + end + end +end diff --git a/spec/support/shared_examples/models/concerns/counter_attribute_shared_examples.rb b/spec/support/shared_examples/models/concerns/counter_attribute_shared_examples.rb index a20bb794095..f98be12523d 100644 --- a/spec/support/shared_examples/models/concerns/counter_attribute_shared_examples.rb +++ b/spec/support/shared_examples/models/concerns/counter_attribute_shared_examples.rb @@ -14,13 +14,14 @@ RSpec.shared_examples_for CounterAttribute do |counter_attributes| counter_attributes.each do |attribute| describe attribute do describe '#increment_counter', :redis do - let(:increment) { 10 } + let(:amount) { 10 } + let(:increment) { Gitlab::Counters::Increment.new(amount: amount) } let(:counter_key) { model.counter(attribute).key } subject { model.increment_counter(attribute, increment) } context 'when attribute is a counter attribute' do - where(:increment) { [10, -3] } + where(:amount) { [10, -3] } with_them do it 'increments the counter in Redis and logs it' do @@ -29,8 +30,8 @@ RSpec.shared_examples_for CounterAttribute do |counter_attributes| message: 'Increment counter attribute', attribute: attribute, project_id: model.project_id, - increment: increment, - new_counter_value: 0 + increment, + increment: amount, + new_counter_value: 0 + amount, current_db_value: model.read_attribute(attribute), 'correlation_id' => an_instance_of(String), 'meta.feature_category' => 'test', @@ -42,7 +43,7 @@ RSpec.shared_examples_for CounterAttribute do |counter_attributes| Gitlab::Redis::SharedState.with do |redis| counter = redis.get(counter_key) - expect(counter).to eq(increment.to_s) + expect(counter).to eq(amount.to_s) end end @@ -59,8 +60,8 @@ RSpec.shared_examples_for CounterAttribute do |counter_attributes| end end - context 'when increment is 0' do - let(:increment) { 0 } + context 'when increment amount is 0' do + let(:amount) { 0 } it 'does nothing' do expect(FlushCounterIncrementsWorker).not_to receive(:perform_in) @@ -71,37 +72,49 @@ RSpec.shared_examples_for CounterAttribute do |counter_attributes| end end end - end - end - describe '#reset_counter!' do - let(:attribute) { counter_attributes.first } - let(:counter_key) { model.counter(attribute).key } + describe '#bulk_increment_counter', :redis do + let(:increments) { [Gitlab::Counters::Increment.new(amount: 10), Gitlab::Counters::Increment.new(amount: 5)] } + let(:total_amount) { increments.sum(&:amount) } + let(:counter_key) { model.counter(attribute).key } - before do - model.update!(attribute => 123) - model.increment_counter(attribute, 10) - end + subject { model.bulk_increment_counter(attribute, increments) } - subject { model.reset_counter!(attribute) } + context 'when attribute is a counter attribute' do + it 'increments the counter in Redis and logs it' do + expect(Gitlab::AppLogger).to receive(:info).with( + hash_including( + message: 'Increment counter attribute', + attribute: attribute, + project_id: model.project_id, + increment: total_amount, + new_counter_value: 0 + total_amount, + current_db_value: model.read_attribute(attribute), + 'correlation_id' => an_instance_of(String), + 'meta.feature_category' => 'test', + 'meta.caller_id' => 'caller' + ) + ) - it 'resets the attribute value to 0 and clears existing counter', :aggregate_failures do - expect { subject }.to change { model.reload.send(attribute) }.from(123).to(0) + subject - Gitlab::Redis::SharedState.with do |redis| - key_exists = redis.exists?(counter_key) - expect(key_exists).to be_falsey - end - end + Gitlab::Redis::SharedState.with do |redis| + counter = redis.get(counter_key) + expect(counter).to eq(total_amount.to_s) + end + end - it_behaves_like 'obtaining lease to update database' do - context 'when the execution raises error' do - before do - allow(model).to receive(:update!).and_raise(StandardError, 'Something went wrong') - end + it 'does not increment the counter for the record' do + expect { subject }.not_to change { model.reset.read_attribute(attribute) } + end - it 'reraises error' do - expect { subject }.to raise_error(StandardError, 'Something went wrong') + it 'schedules a worker to flush counter increments asynchronously' do + expect(FlushCounterIncrementsWorker).to receive(:perform_in) + .with(Gitlab::Counters::BufferedCounter::WORKER_DELAY, model.class.name, model.id, attribute) + .and_call_original + + subject + end end end end diff --git a/spec/support/shared_examples/models/concerns/integrations/reset_secret_fields_shared_examples.rb b/spec/support/shared_examples/models/concerns/integrations/reset_secret_fields_shared_examples.rb index 873f858e432..c51a6c4f6fd 100644 --- a/spec/support/shared_examples/models/concerns/integrations/reset_secret_fields_shared_examples.rb +++ b/spec/support/shared_examples/models/concerns/integrations/reset_secret_fields_shared_examples.rb @@ -42,7 +42,7 @@ RSpec.shared_examples Integrations::ResetSecretFields do # Treat values as persisted integration.reset_updated_properties - integration.instance_variable_set('@old_data_fields', nil) if integration.supports_data_fields? + integration.instance_variable_set(:@old_data_fields, nil) if integration.supports_data_fields? end context 'when an exposing field has changed' do diff --git a/spec/support/shared_examples/models/cycle_analytics_stage_shared_examples.rb b/spec/support/shared_examples/models/cycle_analytics_stage_shared_examples.rb index 457ee49938f..5eeefacdeb9 100644 --- a/spec/support/shared_examples/models/cycle_analytics_stage_shared_examples.rb +++ b/spec/support/shared_examples/models/cycle_analytics_stage_shared_examples.rb @@ -25,7 +25,7 @@ RSpec.shared_examples 'value stream analytics stage' do stage = described_class.new(valid_params.except(:parent)) expect(stage).to be_invalid - expect(stage.errors[parent_name]).to include("can't be blank") + expect(stage.errors[parent_name]).to include('must exist') end it 'validates presence of start_event_identifier' do diff --git a/spec/support/shared_examples/models/member_shared_examples.rb b/spec/support/shared_examples/models/member_shared_examples.rb index f8cff5c5558..7159c55e303 100644 --- a/spec/support/shared_examples/models/member_shared_examples.rb +++ b/spec/support/shared_examples/models/member_shared_examples.rb @@ -207,16 +207,14 @@ RSpec.shared_examples_for "member creation" do source.request_access(user) end - it 'does not add the requester as a regular member', :aggregate_failures do + it 'adds the requester as a member', :aggregate_failures do expect(source.users).not_to include(user) - expect(source.requesters.exists?(user_id: user)).to be_truthy + expect(source.requesters.exists?(user_id: user)).to eq(true) - expect do - described_class.add_member(source, user, :maintainer) - end.to raise_error(Gitlab::Access::AccessDeniedError) + described_class.add_member(source, user, :maintainer) - expect(source.users.reload).not_to include(user) - expect(source.requesters.reload.exists?(user_id: user)).to be_truthy + expect(source.users.reload).to include(user) + expect(source.requesters.reload.exists?(user_id: user)).to eq(false) end end diff --git a/spec/support/shared_examples/models/members_notifications_shared_example.rb b/spec/support/shared_examples/models/members_notifications_shared_example.rb index e74aab95e46..e28220334ac 100644 --- a/spec/support/shared_examples/models/members_notifications_shared_example.rb +++ b/spec/support/shared_examples/models/members_notifications_shared_example.rb @@ -51,7 +51,7 @@ RSpec.shared_examples 'members notifications' do |entity_type| it "calls NotificationService.new_#{entity_type}_member" do expect(notification_service).to receive(:"new_#{entity_type}_member").with(member) - member.accept_request + member.accept_request(create(:user)) end end diff --git a/spec/support/shared_examples/models/relative_positioning_shared_examples.rb b/spec/support/shared_examples/models/relative_positioning_shared_examples.rb index b8d12a6da59..2b46c8c8fb9 100644 --- a/spec/support/shared_examples/models/relative_positioning_shared_examples.rb +++ b/spec/support/shared_examples/models/relative_positioning_shared_examples.rb @@ -20,6 +20,7 @@ RSpec.shared_examples 'a class that supports relative positioning' do let(:new_item) { create_item(relative_position: nil) } let(:set_size) { RelativePositioning.mover.context(item1).scoped_items.count } + let(:items_with_nil_position_sample_quantity) { 101 } def create_item(params = {}) create(factory, params.merge(default_params)) @@ -163,7 +164,7 @@ RSpec.shared_examples 'a class that supports relative positioning' do end it 'can move many nulls' do - nils = create_items_with_positions([nil] * 101) + nils = create_items_with_positions([nil] * items_with_nil_position_sample_quantity) described_class.move_nulls_to_end(nils) diff --git a/spec/support/shared_examples/models/resource_event_shared_examples.rb b/spec/support/shared_examples/models/resource_event_shared_examples.rb index 80806ee768a..8cab2de076d 100644 --- a/spec/support/shared_examples/models/resource_event_shared_examples.rb +++ b/spec/support/shared_examples/models/resource_event_shared_examples.rb @@ -161,3 +161,15 @@ RSpec.shared_examples 'a resource event for merge requests' do end end end + +RSpec.shared_examples 'a note for work item resource event' do + let_it_be(:user) { create(:user) } + let_it_be(:project) { create(:project) } + let_it_be(:work_item) { create(:work_item, :task, project: project, author: user) } + + it 'builds synthetic note with correct synthetic_note_class' do + event = build(described_class.name.underscore.to_sym, issue: work_item) + + expect(event.work_item_synthetic_system_note.class.name).to eq(event.synthetic_note_class.name) + end +end diff --git a/spec/support/shared_examples/models/update_project_statistics_shared_examples.rb b/spec/support/shared_examples/models/update_project_statistics_shared_examples.rb index eb742921d35..5aaa93aecef 100644 --- a/spec/support/shared_examples/models/update_project_statistics_shared_examples.rb +++ b/spec/support/shared_examples/models/update_project_statistics_shared_examples.rb @@ -60,8 +60,11 @@ RSpec.shared_examples 'UpdateProjectStatistics' do |with_counter_attribute| end it 'stores pending increments for async update' do + expected_increment = have_attributes(amount: delta, ref: subject.id) + expect(ProjectStatistics) .to receive(:increment_statistic) + .with(project, project_statistics_name, expected_increment) .and_call_original subject.write_attribute(statistic_attribute, read_attribute + delta) @@ -108,11 +111,8 @@ RSpec.shared_examples 'UpdateProjectStatistics' do |with_counter_attribute| end context 'when it is destroyed from the project level' do - it 'does not update the project statistics' do - expect(ProjectStatistics) - .not_to receive(:increment_statistic) - - expect(Projects::DestroyService.new(project, project.first_owner).execute).to eq(true) + it 'does not store pending increments for async update' do + expect { Projects::DestroyService.new(project, project.first_owner).execute }.not_to change { read_pending_increment } end it 'does not schedule a namespace statistics worker' do diff --git a/spec/support/shared_examples/namespaces/members.rb b/spec/support/shared_examples/namespaces/members.rb new file mode 100644 index 00000000000..ed1ea23226c --- /dev/null +++ b/spec/support/shared_examples/namespaces/members.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +RSpec.shared_examples 'query without source filters' do + it do + expect(subject.where_values_hash.keys).not_to include('source_id', 'source_type') + end +end + +RSpec.shared_examples 'query with source filters' do + it do + expect(subject.where_values_hash.keys).to include('source_id', 'source_type') + end +end diff --git a/spec/support/shared_examples/observability/csp_shared_examples.rb b/spec/support/shared_examples/observability/csp_shared_examples.rb index 868d7023d14..0cd211f69eb 100644 --- a/spec/support/shared_examples/observability/csp_shared_examples.rb +++ b/spec/support/shared_examples/observability/csp_shared_examples.rb @@ -2,9 +2,17 @@ # Verifies that the proper CSP rules for Observabilty UI are applied to a given controller/path # -# The path under test needs to be declared with `let(:tested_path) { .. }` in the context including this example +# It requires the following variables declared in the context including this example: +# +# - `tested_path`: the path under test +# - `user`: the test user +# - `group`: the test group +# +# e.g. # # ``` +# let_it_be(:group) { create(:group) } +# let_it_be(:user) { create(:user) } # it_behaves_like "observability csp policy" do # let(:tested_path) { ....the path under test } # end @@ -33,6 +41,9 @@ RSpec.shared_examples 'observability csp policy' do |controller_class = describe before do setup_csp_for_controller(controller_class, csp, any_time: true) + group.add_developer(user) + login_as(user) + allow(Gitlab::Observability).to receive(:observability_enabled?).and_return(true) end subject do @@ -48,6 +59,40 @@ RSpec.shared_examples 'observability csp policy' do |controller_class = describe end end + context 'when observability is disabled' do + let(:csp) do + ActionDispatch::ContentSecurityPolicy.new do |p| + p.frame_src 'https://something.test' + end + end + + before do + allow(Gitlab::Observability).to receive(:observability_enabled?).and_return(false) + end + + it 'does not add observability urls to the csp header' do + expect(subject).to include("frame-src https://something.test") + expect(subject).not_to include("#{observability_url} #{signin_url} #{oauth_url}") + end + end + + context 'when checking if observability is enabled' do + let(:csp) do + ActionDispatch::ContentSecurityPolicy.new do |p| + p.frame_src 'https://something.test' + end + end + + it 'check access for a given user and group' do + allow(Gitlab::Observability).to receive(:observability_enabled?) + + get tested_path + + expect(Gitlab::Observability).to have_received(:observability_enabled?) + .with(user, group).at_least(:once) + end + end + context 'when frame-src exists in the CSP config' do let(:csp) do ActionDispatch::ContentSecurityPolicy.new do |p| diff --git a/spec/support/shared_examples/quick_actions/issuable/close_quick_action_shared_examples.rb b/spec/support/shared_examples/quick_actions/issuable/close_quick_action_shared_examples.rb index ca6536444fd..d8690356f81 100644 --- a/spec/support/shared_examples/quick_actions/issuable/close_quick_action_shared_examples.rb +++ b/spec/support/shared_examples/quick_actions/issuable/close_quick_action_shared_examples.rb @@ -12,10 +12,10 @@ RSpec.shared_examples 'close quick action' do |issuable_type| before do case issuable_type when :merge_request - visit public_send('namespace_project_new_merge_request_path', project.namespace, project, new_url_opts) + visit public_send(:namespace_project_new_merge_request_path, project.namespace, project, new_url_opts) wait_for_all_requests when :issue - visit public_send('new_namespace_project_issue_path', project.namespace, project, new_url_opts) + visit public_send(:new_namespace_project_issue_path, project.namespace, project, new_url_opts) wait_for_all_requests end end diff --git a/spec/support/shared_examples/quick_actions/issue/promote_to_incident_quick_action_shared_examples.rb b/spec/support/shared_examples/quick_actions/issue/promote_to_incident_quick_action_shared_examples.rb index 5167d27f8b9..3f1a98ca08e 100644 --- a/spec/support/shared_examples/quick_actions/issue/promote_to_incident_quick_action_shared_examples.rb +++ b/spec/support/shared_examples/quick_actions/issue/promote_to_incident_quick_action_shared_examples.rb @@ -36,5 +36,33 @@ RSpec.shared_examples 'promote_to_incident quick action' do expect(page).to have_content('Could not apply promote_to_incident command') end end + + context 'on issue creation' do + it 'promotes issue to incident' do + visit new_project_issue_path(project) + fill_in('Title', with: 'Title') + fill_in('Description', with: '/promote_to_incident') + click_button('Create issue') + + wait_for_all_requests + + expect(page).to have_content("Incident created just now by #{user.name}") + end + + context 'when incident is selected for issue type' do + it 'promotes issue to incident' do + visit new_project_issue_path(project) + fill_in('Title', with: 'Title') + find('.js-issuable-type-filter-dropdown-wrap').click + click_link('Incident') + fill_in('Description', with: '/promote_to_incident') + click_button('Create issue') + + wait_for_all_requests + + expect(page).to have_content("Incident created just now by #{user.name}") + end + end + end end end diff --git a/spec/support/shared_examples/requests/api/graphql/issue_list_shared_examples.rb b/spec/support/shared_examples/requests/api/graphql/issue_list_shared_examples.rb index d4479e462af..d4af9e570d1 100644 --- a/spec/support/shared_examples/requests/api/graphql/issue_list_shared_examples.rb +++ b/spec/support/shared_examples/requests/api/graphql/issue_list_shared_examples.rb @@ -17,6 +17,11 @@ RSpec.shared_examples 'graphql issue list request spec' do end describe 'filters' do + before_all do + issue_a.assignee_ids = current_user.id + issue_b.assignee_ids = another_user.id + end + context 'when filtering by assignees' do context 'when both assignee_username filters are provided' do let(:issue_filter_params) do @@ -44,12 +49,30 @@ RSpec.shared_examples 'graphql issue list request spec' do end context 'when filtering by unioned arguments' do - let(:issue_filter_params) { { or: { assignee_usernames: [current_user.username, another_user.username] } } } + context 'when filtering by assignees' do + let(:issue_filter_params) { { or: { assignee_usernames: [current_user.username, another_user.username] } } } - it 'returns correctly filtered issues' do - post_query + it 'returns correctly filtered issues' do + post_query - expect(issue_ids).to match_array(expected_unioned_assignee_issues.map { |i| i.to_gid.to_s }) + expect(issue_ids).to match_array([issue_a, issue_b].map { |i| i.to_gid.to_s }) + end + end + + context 'when filtering by labels' do + let_it_be(:label_a) { create(:label, project: issue_a.project) } + let_it_be(:label_b) { create(:label, project: issue_b.project) } + + let(:issue_filter_params) { { or: { label_names: [label_a.title, label_b.title] } } } + + it 'returns correctly filtered issues' do + issue_a.label_ids = label_a.id + issue_b.label_ids = label_b.id + + post_graphql(query, current_user: current_user) + + expect(issue_ids).to match_array([issue_a, issue_b].map { |i| i.to_gid.to_s }) + end end context 'when argument is blank' do @@ -63,6 +86,8 @@ RSpec.shared_examples 'graphql issue list request spec' do end context 'when feature flag is disabled' do + let(:issue_filter_params) { { or: { assignee_usernames: [current_user.username] } } } + it 'returns an error' do stub_feature_flags(or_issuable_queries: false) diff --git a/spec/support/shared_examples/requests/api/issuable_search_shared_examples.rb b/spec/support/shared_examples/requests/api/issuable_search_shared_examples.rb index 9f67bd69560..fcde3b65b4f 100644 --- a/spec/support/shared_examples/requests/api/issuable_search_shared_examples.rb +++ b/spec/support/shared_examples/requests/api/issuable_search_shared_examples.rb @@ -34,3 +34,35 @@ RSpec.shared_examples 'issuable anonymous search' do end end end + +RSpec.shared_examples 'issuable API rate-limited search' do + it_behaves_like 'rate limited endpoint', rate_limit_key: :search_rate_limit do + let(:current_user) { user } + + def request + get api(url, current_user), params: { scope: 'all', search: issuable.title } + end + end + + it_behaves_like 'rate limited endpoint', rate_limit_key: :search_rate_limit_unauthenticated do + def request + get api(url), params: { scope: 'all', search: issuable.title } + end + end + + context 'when rate_limit_issuable_searches is disabled', :freeze_time, :clean_gitlab_redis_rate_limiting do + before do + stub_feature_flags(rate_limit_issuable_searches: false) + + allow(Gitlab::ApplicationRateLimiter).to receive(:threshold) + .with(:search_rate_limit_unauthenticated).and_return(1) + end + + it 'does not enforce the rate limit' do + get api(url), params: { scope: 'all', search: issuable.title } + get api(url), params: { scope: 'all', search: issuable.title } + + expect(response).to have_gitlab_http_status(:ok) + end + end +end diff --git a/spec/support/shared_examples/requests/api/nuget_endpoints_shared_examples.rb b/spec/support/shared_examples/requests/api/nuget_endpoints_shared_examples.rb index 290bf58fb6b..17d8b9c7fab 100644 --- a/spec/support/shared_examples/requests/api/nuget_endpoints_shared_examples.rb +++ b/spec/support/shared_examples/requests/api/nuget_endpoints_shared_examples.rb @@ -1,6 +1,11 @@ # frozen_string_literal: true -RSpec.shared_examples 'handling nuget service requests' do |anonymous_requests_example_name: 'process nuget service index request', anonymous_requests_status: :success| +RSpec.shared_examples 'handling nuget service requests' do |example_names_with_status: {}| + anonymous_requests_example_name = example_names_with_status.fetch(:anonymous_requests_example_name, 'process nuget service index request') + anonymous_requests_status = example_names_with_status.fetch(:anonymous_requests_status, :success) + guest_requests_example_name = example_names_with_status.fetch(:guest_requests_example_name, 'rejects nuget packages access') + guest_requests_status = example_names_with_status.fetch(:guest_requests_status, :forbidden) + subject { get api(url) } context 'with valid target' do @@ -18,7 +23,7 @@ RSpec.shared_examples 'handling nuget service requests' do |anonymous_requests_e 'PUBLIC' | :guest | false | false | 'rejects nuget packages access' | :unauthorized 'PUBLIC' | :anonymous | false | true | anonymous_requests_example_name | anonymous_requests_status 'PRIVATE' | :developer | true | true | 'process nuget service index request' | :success - 'PRIVATE' | :guest | true | true | 'rejects nuget packages access' | :forbidden + 'PRIVATE' | :guest | true | true | guest_requests_example_name | guest_requests_status 'PRIVATE' | :developer | true | false | 'rejects nuget packages access' | :unauthorized 'PRIVATE' | :guest | true | false | 'rejects nuget packages access' | :unauthorized 'PRIVATE' | :developer | false | true | 'rejects nuget packages access' | :not_found @@ -54,7 +59,7 @@ RSpec.shared_examples 'handling nuget service requests' do |anonymous_requests_e 'PUBLIC' | :guest | false | false | 'rejects nuget packages access' | :unauthorized 'PUBLIC' | :anonymous | false | true | anonymous_requests_example_name | anonymous_requests_status 'PRIVATE' | :developer | true | true | 'process nuget service index request' | :success - 'PRIVATE' | :guest | true | true | 'rejects nuget packages access' | :forbidden + 'PRIVATE' | :guest | true | true | guest_requests_example_name | guest_requests_status 'PRIVATE' | :developer | true | false | 'rejects nuget packages access' | :unauthorized 'PRIVATE' | :guest | true | false | 'rejects nuget packages access' | :unauthorized 'PRIVATE' | :developer | false | true | 'rejects nuget packages access' | :not_found @@ -90,9 +95,14 @@ RSpec.shared_examples 'handling nuget service requests' do |anonymous_requests_e it_behaves_like 'rejects nuget access with invalid target id' end -RSpec.shared_examples 'handling nuget metadata requests with package name' do |anonymous_requests_example_name: 'process nuget metadata request at package name level', anonymous_requests_status: :success| +RSpec.shared_examples 'handling nuget metadata requests with package name' do |example_names_with_status: {}| include_context 'with expected presenters dependency groups' + anonymous_requests_example_name = example_names_with_status.fetch(:anonymous_requests_example_name, 'process nuget metadata request at package name level') + anonymous_requests_status = example_names_with_status.fetch(:anonymous_requests_status, :success) + guest_requests_example_name = example_names_with_status.fetch(:guest_requests_example_name, 'rejects nuget packages access') + guest_requests_status = example_names_with_status.fetch(:guest_requests_status, :forbidden) + let_it_be(:package_name) { 'Dummy.Package' } let_it_be(:packages) { create_list(:nuget_package, 5, :with_metadatum, name: package_name, project: project) } let_it_be(:tags) { packages.each { |pkg| create(:packages_tag, package: pkg, name: 'test') } } @@ -117,7 +127,7 @@ RSpec.shared_examples 'handling nuget metadata requests with package name' do |a 'PUBLIC' | :guest | false | false | 'rejects nuget packages access' | :unauthorized 'PUBLIC' | :anonymous | false | true | anonymous_requests_example_name | anonymous_requests_status 'PRIVATE' | :developer | true | true | 'process nuget metadata request at package name level' | :success - 'PRIVATE' | :guest | true | true | 'rejects nuget packages access' | :forbidden + 'PRIVATE' | :guest | true | true | guest_requests_example_name | guest_requests_status 'PRIVATE' | :developer | true | false | 'rejects nuget packages access' | :unauthorized 'PRIVATE' | :guest | true | false | 'rejects nuget packages access' | :unauthorized 'PRIVATE' | :developer | false | true | 'rejects nuget packages access' | :not_found @@ -152,9 +162,14 @@ RSpec.shared_examples 'handling nuget metadata requests with package name' do |a end end -RSpec.shared_examples 'handling nuget metadata requests with package name and package version' do |anonymous_requests_example_name: 'process nuget metadata request at package name and package version level', anonymous_requests_status: :success| +RSpec.shared_examples 'handling nuget metadata requests with package name and package version' do |example_names_with_status: {}| include_context 'with expected presenters dependency groups' + anonymous_requests_example_name = example_names_with_status.fetch(:anonymous_requests_example_name, 'process nuget metadata request at package name and package version level') + anonymous_requests_status = example_names_with_status.fetch(:anonymous_requests_status, :success) + guest_requests_example_name = example_names_with_status.fetch(:guest_requests_example_name, 'rejects nuget packages access') + guest_requests_status = example_names_with_status.fetch(:guest_requests_status, :forbidden) + let_it_be(:package_name) { 'Dummy.Package' } let_it_be(:package) { create(:nuget_package, :with_metadatum, name: package_name, project: project) } let_it_be(:tag) { create(:packages_tag, package: package, name: 'test') } @@ -179,7 +194,7 @@ RSpec.shared_examples 'handling nuget metadata requests with package name and pa 'PUBLIC' | :guest | false | false | 'rejects nuget packages access' | :unauthorized 'PUBLIC' | :anonymous | false | true | anonymous_requests_example_name | anonymous_requests_status 'PRIVATE' | :developer | true | true | 'process nuget metadata request at package name and package version level' | :success - 'PRIVATE' | :guest | true | true | 'rejects nuget packages access' | :forbidden + 'PRIVATE' | :guest | true | true | guest_requests_example_name | guest_requests_status 'PRIVATE' | :developer | true | false | 'rejects nuget packages access' | :unauthorized 'PRIVATE' | :guest | true | false | 'rejects nuget packages access' | :unauthorized 'PRIVATE' | :developer | false | true | 'rejects nuget packages access' | :not_found @@ -214,7 +229,12 @@ RSpec.shared_examples 'handling nuget metadata requests with package name and pa it_behaves_like 'rejects nuget access with invalid target id' end -RSpec.shared_examples 'handling nuget search requests' do |anonymous_requests_example_name: 'process nuget search request', anonymous_requests_status: :success| +RSpec.shared_examples 'handling nuget search requests' do |example_names_with_status: {}| + anonymous_requests_example_name = example_names_with_status.fetch(:anonymous_requests_example_name, 'process nuget search request') + anonymous_requests_status = example_names_with_status.fetch(:anonymous_requests_status, :success) + guest_requests_example_name = example_names_with_status.fetch(:guest_requests_example_name, 'rejects nuget packages access') + guest_requests_status = example_names_with_status.fetch(:guest_requests_status, :forbidden) + let_it_be(:package_a) { create(:nuget_package, :with_metadatum, name: 'Dummy.PackageA', project: project) } let_it_be(:tag) { create(:packages_tag, package: package_a, name: 'test') } let_it_be(:packages_b) { create_list(:nuget_package, 5, name: 'Dummy.PackageB', project: project) } @@ -244,7 +264,7 @@ RSpec.shared_examples 'handling nuget search requests' do |anonymous_requests_ex 'PUBLIC' | :guest | false | false | 'rejects nuget packages access' | :unauthorized 'PUBLIC' | :anonymous | false | true | anonymous_requests_example_name | anonymous_requests_status 'PRIVATE' | :developer | true | true | 'process nuget search request' | :success - 'PRIVATE' | :guest | true | true | 'rejects nuget packages access' | :forbidden + 'PRIVATE' | :guest | true | true | guest_requests_example_name | guest_requests_status 'PRIVATE' | :developer | true | false | 'rejects nuget packages access' | :unauthorized 'PRIVATE' | :guest | true | false | 'rejects nuget packages access' | :unauthorized 'PRIVATE' | :developer | false | true | 'rejects nuget packages access' | :not_found 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 bace570e47a..3abe545db59 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 @@ -379,6 +379,26 @@ RSpec.shared_examples 'process nuget search request' do |user_type, status, add_ end end +RSpec.shared_examples 'process empty nuget search request' do |user_type, status, add_member = true| + before do + target.send("add_#{user_type}", user) if add_member && user_type != :anonymous + end + + it_behaves_like 'returning response status', status + + it 'returns a valid json response' do + subject + + expect(response.media_type).to eq('application/json') + expect(json_response).to be_a(Hash) + expect(json_response).to match_schema('public_api/v4/packages/nuget/search') + expect(json_response['totalHits']).to eq(0) + expect(json_response['data'].map { |e| e['versions'].size }).to be_empty + end + + it_behaves_like 'a package tracking event', 'API::NugetPackages', 'search_package' +end + RSpec.shared_examples 'rejects nuget access with invalid target id' do context 'with a target id with invalid integers' do using RSpec::Parameterized::TableSyntax diff --git a/spec/support/shared_examples/services/issuable_links/create_links_shared_examples.rb b/spec/support/shared_examples/services/issuable_links/create_links_shared_examples.rb index 12f2b5d78a5..e47ff2fcd59 100644 --- a/spec/support/shared_examples/services/issuable_links/create_links_shared_examples.rb +++ b/spec/support/shared_examples/services/issuable_links/create_links_shared_examples.rb @@ -30,7 +30,7 @@ RSpec.shared_examples 'issuable link creation' do context 'when user has no permission to target issuable' do let(:params) do - { issuable_references: [guest_issuable.to_reference(issuable_parent)] } + { issuable_references: [restricted_issuable.to_reference(issuable_parent)] } end it 'returns error' do diff --git a/spec/support/shared_examples/services/issuable_links/destroyable_issuable_links_shared_examples.rb b/spec/support/shared_examples/services/issuable_links/destroyable_issuable_links_shared_examples.rb index cc170c6544d..1532e870dcc 100644 --- a/spec/support/shared_examples/services/issuable_links/destroyable_issuable_links_shared_examples.rb +++ b/spec/support/shared_examples/services/issuable_links/destroyable_issuable_links_shared_examples.rb @@ -1,10 +1,11 @@ # frozen_string_literal: true -RSpec.shared_examples 'a destroyable issuable link' do +RSpec.shared_examples 'a destroyable issuable link' do |required_role: :reporter| context 'when successfully removes an issuable link' do before do - issuable_link.source.resource_parent.add_reporter(user) - issuable_link.target.resource_parent.add_reporter(user) + [issuable_link.target, issuable_link.source].each do |issuable| + issuable.resource_parent.try(:"add_#{required_role}", user) + end end it 'removes related issue' do diff --git a/spec/support/shared_examples/services/repositories/housekeeping_shared_examples.rb b/spec/support/shared_examples/services/repositories/housekeeping_shared_examples.rb index 8a937303711..8cc71230ba4 100644 --- a/spec/support/shared_examples/services/repositories/housekeeping_shared_examples.rb +++ b/spec/support/shared_examples/services/repositories/housekeeping_shared_examples.rb @@ -65,12 +65,9 @@ RSpec.shared_examples 'housekeeps repository' do # At push 200 expect(resource.git_garbage_collect_worker_klass).to receive(:perform_async).with(resource.id, :gc, :the_lease_key, :the_uuid) .once - # At push 50, 100, 150 - expect(resource.git_garbage_collect_worker_klass).to receive(:perform_async).with(resource.id, :full_repack, :the_lease_key, :the_uuid) - .exactly(3).times - # At push 10, 20, ... (except those above) + # At push 10, 20, ... (except the gc call) expect(resource.git_garbage_collect_worker_klass).to receive(:perform_async).with(resource.id, :incremental_repack, :the_lease_key, :the_uuid) - .exactly(16).times + .exactly(19).times 201.times do subject.increment! @@ -79,37 +76,6 @@ RSpec.shared_examples 'housekeeps repository' do expect(resource.pushes_since_gc).to eq(1) end - - context 'when optimized_repository feature flag is disabled' do - before do - stub_feature_flags(optimized_housekeeping: false) - end - - it 'calls also the garbage collect worker with pack_refs every 6 commits' do - allow(subject).to receive(:try_obtain_lease).and_return(:the_uuid) - allow(subject).to receive(:lease_key).and_return(:the_lease_key) - - # At push 200 - expect(resource.git_garbage_collect_worker_klass).to receive(:perform_async).with(resource.id, :gc, :the_lease_key, :the_uuid) - .once - # At push 50, 100, 150 - expect(resource.git_garbage_collect_worker_klass).to receive(:perform_async).with(resource.id, :full_repack, :the_lease_key, :the_uuid) - .exactly(3).times - # At push 10, 20, ... (except those above) - expect(resource.git_garbage_collect_worker_klass).to receive(:perform_async).with(resource.id, :incremental_repack, :the_lease_key, :the_uuid) - .exactly(16).times - # At push 6, 12, 18, ... (except those above) - expect(resource.git_garbage_collect_worker_klass).to receive(:perform_async).with(resource.id, :pack_refs, :the_lease_key, :the_uuid) - .exactly(27).times - - 201.times do - subject.increment! - subject.execute if subject.needed? - end - - expect(resource.pushes_since_gc).to eq(1) - end - end end it 'runs the task specifically requested' do @@ -136,15 +102,11 @@ RSpec.shared_examples 'housekeeps repository' do expect(subject.needed?).to eq(true) end - context 'when optimized_housekeeping is disabled' do - before do - stub_feature_flags(optimized_housekeeping: false) - end + it 'when incremental repack period is not multiple of gc period' do + allow(Gitlab::CurrentSettings).to receive(:housekeeping_incremental_repack_period).and_return(12) + allow(resource).to receive(:pushes_since_gc).and_return(200) - it 'returns true pack refs is needed' do - allow(resource).to receive(:pushes_since_gc).and_return(described_class::PACK_REFS_PERIOD) - expect(subject.needed?).to eq(true) - end + expect(subject.needed?).to eq(true) end end diff --git a/spec/support/shared_examples/services/security/ci_configuration/create_service_shared_examples.rb b/spec/support/shared_examples/services/security/ci_configuration/create_service_shared_examples.rb index 105c4247ff7..716be8c6210 100644 --- a/spec/support/shared_examples/services/security/ci_configuration/create_service_shared_examples.rb +++ b/spec/support/shared_examples/services/security/ci_configuration/create_service_shared_examples.rb @@ -88,6 +88,68 @@ RSpec.shared_examples_for 'services security ci configuration create service' do end end + context 'when existing ci config contains anchors/aliases' do + let(:params) { {} } + let(:unsupported_yaml) do + <<-YAML + image: python:latest + + cache: &global_cache + key: 'common-cache' + paths: + - .cache/pip + - venv/ + + test: + cache: + <<: *global_cache + key: 'custom-cache' + script: + - python setup.py test + - pip install tox flake8 # you can also use tox + - tox -e py36,flake8 + YAML + end + + it 'fails with error' do + expect(project).to receive(:ci_config_for).and_return(unsupported_yaml) + + expect { result }.to raise_error(Gitlab::Graphql::Errors::MutationError, '.gitlab-ci.yml with aliases/anchors is not supported. Please change the CI configuration manually.') + end + end + + context 'when parsing existing ci config gives a Psych error' do + let(:params) { {} } + let(:invalid_yaml) do + <<-YAML + image: python:latest + + test: + script: + - python setup.py test + - pip install tox flake8 # you can also use tox + - tox -e py36,flake8 + YAML + end + + it 'fails with error' do + expect(project).to receive(:ci_config_for).and_return(invalid_yaml) + expect(YAML).to receive(:safe_load).and_raise(Psych::Exception) + + expect { result }.to raise_error(Gitlab::Graphql::Errors::MutationError, /merge request creation mutation failed/) + end + end + + context 'when parsing existing ci config gives any other error' do + let(:params) { {} } + let_it_be(:repository) { project.repository } + + it 'is successful' do + expect(repository).to receive(:root_ref_sha).and_raise(StandardError) + expect(result.status).to eq(:success) + end + end + unless skip_w_params context 'with parameters' do let(:params) { non_empty_params } diff --git a/spec/support/shared_examples/workers/batched_background_migration_worker_shared_examples.rb b/spec/support/shared_examples/workers/batched_background_migration_worker_shared_examples.rb index 09ebc495e61..8ec955940c0 100644 --- a/spec/support/shared_examples/workers/batched_background_migration_worker_shared_examples.rb +++ b/spec/support/shared_examples/workers/batched_background_migration_worker_shared_examples.rb @@ -256,6 +256,7 @@ RSpec.shared_examples 'it runs batched background migration jobs' do |tracking_d Class.new(Gitlab::BackgroundMigration::BatchedMigrationJob) do job_arguments :matching_status operation_name :update_all + feature_category :code_review_workflow def perform each_sub_batch( @@ -325,16 +326,16 @@ RSpec.shared_examples 'it runs batched background migration jobs' do |tracking_d stub_const('Gitlab::BackgroundMigration::ExampleDataMigration', migration_class) end - shared_examples 'batched background migration execution' do - subject(:full_migration_run) do - # process all batches, then do an extra execution to mark the job as finished - (number_of_batches + 1).times do - described_class.new.perform + subject(:full_migration_run) do + # process all batches, then do an extra execution to mark the job as finished + (number_of_batches + 1).times do + described_class.new.perform - travel_to((migration.interval + described_class::INTERVAL_VARIANCE).seconds.from_now) - end + travel_to((migration.interval + described_class::INTERVAL_VARIANCE).seconds.from_now) end + end + shared_examples 'batched background migration execution' do it 'marks the migration record as finished' do expect { full_migration_run }.to change { migration.reload.status }.from(1).to(3) # active -> finished end @@ -404,6 +405,15 @@ RSpec.shared_examples 'it runs batched background migration jobs' do |tracking_d end it_behaves_like 'batched background migration execution' + + it 'assigns proper feature category to the context and the worker' do + expected_feature_category = migration_class.feature_category.to_s + + expect { full_migration_run }.to change { + Gitlab::ApplicationContext.current["meta.feature_category"] + }.to(expected_feature_category) + .and change { described_class.get_feature_category }.from(:database).to(expected_feature_category) + end end context 'when parallel execution is enabled', :sidekiq_inline do diff --git a/spec/support/shared_examples/workers/concerns/git_garbage_collect_methods_shared_examples.rb b/spec/support/shared_examples/workers/concerns/git_garbage_collect_methods_shared_examples.rb index 503e331ea2e..ba1bdfa7aa8 100644 --- a/spec/support/shared_examples/workers/concerns/git_garbage_collect_methods_shared_examples.rb +++ b/spec/support/shared_examples/workers/concerns/git_garbage_collect_methods_shared_examples.rb @@ -24,19 +24,6 @@ RSpec.shared_examples 'can collect git garbage' do |update_statistics: true| subject.perform(*params) end - - context 'when optimized_housekeeping feature is disabled' do - before do - stub_feature_flags(optimized_housekeeping: false) - end - - specify do - expect(subject).to receive(:get_gitaly_client).with(task, repository.raw_repository).and_return(repository_service) - expect(repository_service).to receive(gitaly_task) - - subject.perform(*params) - end - end end shared_examples 'it updates the resource statistics' do @@ -91,20 +78,6 @@ RSpec.shared_examples 'can collect git garbage' do |update_statistics: true| expect { subject.perform(*params) }.to raise_exception(Gitlab::Git::Repository::NoRepository) end - - context 'when optimized_housekeeping feature flag is disabled' do - before do - stub_feature_flags(optimized_housekeeping: false) - end - - it 'handles gRPC errors' do - allow_next_instance_of(Gitlab::GitalyClient::RepositoryService, repository.raw_repository) do |instance| - allow(instance).to receive(:garbage_collect).and_raise(GRPC::NotFound) - end - - expect { subject.perform(*params) }.to raise_exception(Gitlab::Git::Repository::NoRepository) - end - end end context 'with different lease than the active one' do @@ -161,51 +134,6 @@ RSpec.shared_examples 'can collect git garbage' do |update_statistics: true| end end - context 'repack_full' do - let(:task) { :full_repack } - let(:gitaly_task) { :repack_full } - - before do - expect(subject).to receive(:get_lease_uuid).and_return(lease_uuid) - end - - it_behaves_like 'it calls Gitaly' - it_behaves_like 'it updates the resource statistics' if update_statistics - end - - context 'pack_refs' do - let(:task) { :pack_refs } - let(:gitaly_task) { :pack_refs } - - before do - expect(subject).to receive(:get_lease_uuid).and_return(lease_uuid) - end - - it_behaves_like 'it calls Gitaly' do - let(:repository_service) { instance_double(Gitlab::GitalyClient::RefService) } - end - - it 'does not update the resource statistics' do - expect(statistics_service_klass).not_to receive(:new) - - subject.perform(*params) - end - end - - context 'repack_incremental' do - let(:task) { :incremental_repack } - let(:gitaly_task) { :repack_incremental } - - before do - expect(subject).to receive(:get_lease_uuid).and_return(lease_uuid) - - statistics_keys.delete(:repository_size) - end - - it_behaves_like 'it calls Gitaly' - it_behaves_like 'it updates the resource statistics' if update_statistics - end - context 'prune' do before do expect(subject).to receive(:get_lease_uuid).and_return(lease_uuid) @@ -219,41 +147,5 @@ RSpec.shared_examples 'can collect git garbage' do |update_statistics: true| subject.perform(resource.id, 'prune', lease_key, lease_uuid) end end - - shared_examples 'gc tasks' do - before do - allow(subject).to receive(:get_lease_uuid).and_return(lease_uuid) - allow(subject).to receive(:bitmaps_enabled?).and_return(bitmaps_enabled) - - stub_feature_flags(optimized_housekeeping: false) - end - - it 'cleans up repository after finishing' do - expect(resource).to receive(:cleanup).and_call_original - - subject.perform(resource.id, 'gc', lease_key, lease_uuid) - end - - it 'prune calls garbage_collect with the option prune: true' do - repository_service = instance_double(Gitlab::GitalyClient::RepositoryService) - - expect(subject).to receive(:get_gitaly_client).with(:prune, repository.raw_repository).and_return(repository_service) - expect(repository_service).to receive(:garbage_collect).with(bitmaps_enabled, prune: true) - - subject.perform(resource.id, 'prune', lease_key, lease_uuid) - end - end - - context 'with bitmaps enabled' do - let(:bitmaps_enabled) { true } - - include_examples 'gc tasks' - end - - context 'with bitmaps disabled' do - let(:bitmaps_enabled) { false } - - include_examples 'gc tasks' - end end end diff --git a/spec/support/shared_examples/workers/update_repository_move_shared_examples.rb b/spec/support/shared_examples/workers/update_repository_move_shared_examples.rb index c50dc6d5372..9b7183a9eac 100644 --- a/spec/support/shared_examples/workers/update_repository_move_shared_examples.rb +++ b/spec/support/shared_examples/workers/update_repository_move_shared_examples.rb @@ -1,6 +1,10 @@ # frozen_string_literal: true RSpec.shared_examples 'an update storage move worker' do + it 'has the `until_executed` deduplicate strategy' do + expect(described_class.get_deduplicate_strategy).to eq(:until_executed) + end + describe '#perform' do let(:service) { double(:update_repository_storage_service) } diff --git a/spec/support/tmpdir.rb b/spec/support/tmpdir.rb new file mode 100644 index 00000000000..ea8e26d2878 --- /dev/null +++ b/spec/support/tmpdir.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +module TmpdirHelper + def mktmpdir + @tmpdir_helper_dirs ||= [] + @tmpdir_helper_dirs << Dir.mktmpdir + @tmpdir_helper_dirs.last + end + + def self.included(base) + base.after do + if @tmpdir_helper_dirs + FileUtils.rm_rf(@tmpdir_helper_dirs) + @tmpdir_helper_dirs = nil + end + end + end +end |