Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
29a4258e5b
commit
fe2f83b699
|
|
@ -1 +1 @@
|
|||
1e47c7b6599377e58e2cce50984817aed247a3f2
|
||||
d13f8f0278c9e81ffcad439d4c0d55b4c2ee67e8
|
||||
|
|
|
|||
|
|
@ -84,6 +84,8 @@ class Admin::ImpersonationTokensController < Admin::ApplicationController
|
|||
def set_index_vars
|
||||
@scopes = Gitlab::Auth.available_scopes_for(current_user)
|
||||
|
||||
@scopes = ::VirtualRegistries.filter_token_scopes(@scopes, current_user)
|
||||
|
||||
@impersonation_token ||= finder.build
|
||||
@active_impersonation_tokens = active_impersonation_tokens
|
||||
end
|
||||
|
|
|
|||
|
|
@ -98,6 +98,9 @@ module AccessTokensActions
|
|||
resource.members.load
|
||||
|
||||
@scopes = Gitlab::Auth.available_scopes_for(resource)
|
||||
|
||||
@scopes = ::VirtualRegistries.filter_token_scopes(@scopes, current_user)
|
||||
|
||||
@active_access_tokens, @active_access_tokens_size = active_access_tokens
|
||||
@inactive_access_tokens_size = inactive_access_tokens.size
|
||||
end
|
||||
|
|
|
|||
|
|
@ -106,6 +106,9 @@ module UserSettings
|
|||
|
||||
def set_index_vars
|
||||
@scopes = Gitlab::Auth.available_scopes_for(current_user)
|
||||
|
||||
@scopes = ::VirtualRegistries.filter_token_scopes(@scopes, current_user)
|
||||
|
||||
@active_access_tokens, @active_access_tokens_size = active_access_tokens
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -6,6 +6,12 @@ class WebHookLog < ApplicationRecord
|
|||
include CreatedAtFilterable
|
||||
include PartitionedTable
|
||||
|
||||
ROUTING_FEATURE_FLAG = 'web_hook_logs_daily_enabled'
|
||||
self.define_singleton_method(:routing_table_name) { 'web_hook_logs_daily' }
|
||||
self.define_singleton_method(:routing_table_name_flag) { ROUTING_FEATURE_FLAG }
|
||||
|
||||
include ::Ci::Partitionable::Switch # rubocop:disable Layout/ClassStructure -- required to be loaded after constant
|
||||
|
||||
OVERSIZE_REQUEST_DATA = { 'oversize' => true }.freeze
|
||||
MAX_RECENT_DAYS = 7
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,11 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
# Remove this file when virtual_registry_maven *and* dependency_proxy_read_write_scopes are removed
|
||||
module VirtualRegistries
|
||||
def self.filter_token_scopes(scopes, current_user)
|
||||
return scopes if Feature.enabled?(:virtual_registry_maven, current_user) ||
|
||||
Feature.enabled?(:dependency_proxy_read_write_scopes, current_user)
|
||||
|
||||
scopes - ::Gitlab::Auth.virtual_registry_scopes
|
||||
end
|
||||
end
|
||||
|
|
@ -23,7 +23,7 @@ module Import
|
|||
end
|
||||
|
||||
def send_user_reassign_email
|
||||
Notify.import_source_user_reassign(import_source_user.id).deliver_now
|
||||
Notify.import_source_user_reassign(import_source_user.id).deliver_later
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -0,0 +1,9 @@
|
|||
---
|
||||
name: web_hook_logs_daily_enabled
|
||||
feature_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/514530
|
||||
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/180522
|
||||
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/517450
|
||||
milestone: '17.9'
|
||||
group: group::database frameworks
|
||||
type: gitlab_com_derisk
|
||||
default_enabled: false
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
---
|
||||
name: dependency_proxy_read_write_scopes
|
||||
feature_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/336800
|
||||
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/180333
|
||||
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/517249
|
||||
milestone: '17.9'
|
||||
group: group::container registry
|
||||
type: wip
|
||||
default_enabled: false
|
||||
|
|
@ -9,14 +9,6 @@ description: Links two issues by relationship type, which can be related or bloc
|
|||
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/1719
|
||||
milestone: '9.4'
|
||||
gitlab_schema: gitlab_main_cell
|
||||
desired_sharding_key:
|
||||
namespace_id:
|
||||
references: namespaces
|
||||
backfill_via:
|
||||
parent:
|
||||
foreign_key: source_id
|
||||
table: issues
|
||||
sharding_key: namespace_id
|
||||
belongs_to: source
|
||||
desired_sharding_key_migration_job_name: BackfillIssueLinksNamespaceId
|
||||
table_size: small
|
||||
sharding_key:
|
||||
namespace_id: namespaces
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
table_name: web_hook_logs_daily
|
||||
classes:
|
||||
- WebHookLog
|
||||
- WebHookLog::Partitioned
|
||||
feature_categories:
|
||||
- integrations
|
||||
description: Webhooks logs data partitioned by day.
|
||||
|
|
|
|||
|
|
@ -0,0 +1,13 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class ValidateIssueLinksNamespaceIdNotNullConstraint < Gitlab::Database::Migration[2.2]
|
||||
milestone '17.10'
|
||||
|
||||
def up
|
||||
validate_not_null_constraint :issue_links, :namespace_id
|
||||
end
|
||||
|
||||
def down
|
||||
# no-op
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1 @@
|
|||
51a1cdee9b563c02c0d51fb689d71226b893c2a9f5fb08c8570f68b4e7bec08b
|
||||
|
|
@ -15273,7 +15273,8 @@ CREATE TABLE issue_links (
|
|||
created_at timestamp without time zone,
|
||||
updated_at timestamp without time zone,
|
||||
link_type smallint DEFAULT 0 NOT NULL,
|
||||
namespace_id bigint
|
||||
namespace_id bigint,
|
||||
CONSTRAINT check_c32f659c75 CHECK ((namespace_id IS NOT NULL))
|
||||
);
|
||||
|
||||
CREATE SEQUENCE issue_links_id_seq
|
||||
|
|
@ -27262,9 +27263,6 @@ ALTER TABLE approval_merge_request_rules
|
|||
ALTER TABLE approvals
|
||||
ADD CONSTRAINT check_9da7c942dc CHECK ((project_id IS NOT NULL)) NOT VALID;
|
||||
|
||||
ALTER TABLE issue_links
|
||||
ADD CONSTRAINT check_c32f659c75 CHECK ((namespace_id IS NOT NULL)) NOT VALID;
|
||||
|
||||
ALTER TABLE sprints
|
||||
ADD CONSTRAINT check_ccd8a1eae0 CHECK ((start_date IS NOT NULL)) NOT VALID;
|
||||
|
||||
|
|
|
|||
Binary file not shown.
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 26 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 116 KiB After Width: | Height: | Size: 60 KiB |
|
|
@ -48,6 +48,8 @@ are very appreciative of the work done by translators and proofreaders!
|
|||
- Proofreaders needed.
|
||||
- Estonian
|
||||
- Proofreaders needed.
|
||||
- Farsi
|
||||
- Iman manati [GitLab](https://gitlab.com/baratiiman3), [Crowdin](https://crowdin.com/profile/iman31)
|
||||
- Filipino
|
||||
- Proofreaders needed.
|
||||
- French
|
||||
|
|
|
|||
|
|
@ -43,21 +43,6 @@ Remember to **Save** each translation.
|
|||
|
||||
### Context
|
||||
|
||||
{{< details >}}
|
||||
|
||||
- Status: Beta
|
||||
|
||||
{{< /details >}}
|
||||
|
||||
{{< alert type="warning" >}}
|
||||
|
||||
This feature is in [beta](../../policy/development_stages_support.md#beta).
|
||||
You might get a string similar to the one you want to translate,
|
||||
so be sure to select the correct string and line of code.
|
||||
If you cannot find a string with code search, post a comment in Crowdin with that string.
|
||||
|
||||
{{< /alert >}}
|
||||
|
||||
In Crowdin, each string contains a link that shows all instances of the string in the entire GitLab codebase.
|
||||
When you translate a string, you can go to the relevant commit or merge request to get more context.
|
||||
|
||||
|
|
|
|||
|
|
@ -24,8 +24,14 @@ title: GitLab Duo Chat
|
|||
|
||||
{{< /history >}}
|
||||
|
||||
GitLab Duo Chat is your personal AI-powered assistant for boosting productivity.
|
||||
It can assist various tasks of your daily work with the AI-generated content.
|
||||
GitLab Duo Chat is an AI-powered assistant that accelerates development with
|
||||
contextual, conversational AI. Duo Chat:
|
||||
|
||||
- Explains code and suggests improvements directly in your development environment.
|
||||
- Analyzes code, merge requests, issues, and other GitLab artifacts.
|
||||
- Generates code, tests, and documentation based on your requirements and codebase.
|
||||
- Integrates directly in the GitLab UI, Web IDE, VS Code, JetBrains IDEs, and Visual Studio.
|
||||
- Can include information from your repositories and projects to deliver targeted improvements.
|
||||
|
||||
## Supported editor extensions
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
# ActiveRecord::GitlabPatches
|
||||
# activerecord-gitlab
|
||||
|
||||
This gem adds GitLab specific Active Record patches.
|
||||
This gem adds GitLab specific Active Record patches and a fixed items model concern and association.
|
||||
We have patches as a separate gem to isolate complexity.
|
||||
|
|
|
|||
|
|
@ -0,0 +1,4 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require_relative "fixed_items_model/model"
|
||||
require_relative "fixed_items_model/has_one"
|
||||
|
|
@ -0,0 +1,82 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module ActiveRecord
|
||||
module FixedItemsModel
|
||||
# Realizes a has one association with a fixed items model.
|
||||
#
|
||||
# See ActiveRecord::FixedItemsModel::Model for reference
|
||||
# for such a fixed items model.
|
||||
#
|
||||
# A minimal example is:
|
||||
#
|
||||
# class MyModel < ApplicationRecord
|
||||
# include ActiveRecord::FixedItemsModel::HasOne
|
||||
#
|
||||
# belongs_to_fixed_items :static_model, fixed_items_class: StaticModel
|
||||
# end
|
||||
#
|
||||
# The attribute `static_model_id` must exist for the model.
|
||||
#
|
||||
# Usage:
|
||||
#
|
||||
# m = MyModel.last
|
||||
# m.static_model # Returns fixed items model instance
|
||||
# m.static_model = StaticModel.find(1)
|
||||
# m.static_model_id = 1 # still possible
|
||||
# m.static_model? # Bool
|
||||
#
|
||||
module HasOne
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
class_methods do
|
||||
def belongs_to_fixed_items(association_name, fixed_items_class:, foreign_key: nil)
|
||||
foreign_key ||= "#{association_name}_id"
|
||||
|
||||
raise "Missing attribute #{foreign_key}" unless attribute_names.include?(foreign_key)
|
||||
|
||||
# Getter method
|
||||
define_method(association_name) do
|
||||
current_id = read_attribute(foreign_key)
|
||||
return if current_id.nil?
|
||||
|
||||
@cached_static_associations ||= {}
|
||||
|
||||
cached_association = @cached_static_associations[association_name]
|
||||
|
||||
# Invalidate cache if the foreign key has changed
|
||||
if cached_association && cached_association.id != current_id
|
||||
@cached_static_associations.delete(association_name)
|
||||
end
|
||||
|
||||
@cached_static_associations[association_name] ||= fixed_items_class.find(current_id)
|
||||
end
|
||||
|
||||
# Setter method
|
||||
define_method(:"#{association_name}=") do |static_object|
|
||||
@cached_static_associations&.delete(association_name)
|
||||
write_attribute(foreign_key, static_object&.id)
|
||||
end
|
||||
|
||||
# Query method
|
||||
define_method(:"#{association_name}?") do
|
||||
attribute_present?(foreign_key)
|
||||
end
|
||||
|
||||
# Clear cache on reset
|
||||
if method_defined?(:reset)
|
||||
after_reset = instance_method(:reset)
|
||||
define_method(:reset) do |*args|
|
||||
@cached_static_associations = nil
|
||||
after_reset.bind_call(self, *args)
|
||||
end
|
||||
else
|
||||
define_method(:reset) do
|
||||
@cached_static_associations = nil
|
||||
self
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,96 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module ActiveRecord
|
||||
module FixedItemsModel
|
||||
# Includes handy AR-like methods to models that have a fixed set
|
||||
# of items that are stored in code instead of the database.
|
||||
#
|
||||
# See ActiveRecord::FixedItemsModel::HasOne for reference
|
||||
# on how to build associations.
|
||||
#
|
||||
# A minimal example of such a model is:
|
||||
#
|
||||
# class StaticModel
|
||||
# include ActiveModel::Model
|
||||
# include ActiveModel::Attributes
|
||||
# include ActiveRecord::FixedItemsModel::Model
|
||||
#
|
||||
# ITEMS = [
|
||||
# {
|
||||
# id: 1,
|
||||
# name: 'To do'
|
||||
# }
|
||||
# ]
|
||||
#
|
||||
# attribute :id, :integer
|
||||
# attribute :name, :string
|
||||
# end
|
||||
#
|
||||
# Usage:
|
||||
#
|
||||
# StaticModel.find(1)
|
||||
# StaticModel.where(name: 'To do')
|
||||
# StaticModel.find_by(name: 'To do')
|
||||
# StaticModel.all
|
||||
#
|
||||
module Model
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
class_methods do
|
||||
# Caches created instances for fast retrieval used in associations.
|
||||
def find(id)
|
||||
find_instances[id] ||= self::ITEMS.find { |item| item[:id] == id }&.then do |item_data|
|
||||
new(item_data)
|
||||
end
|
||||
end
|
||||
|
||||
def all
|
||||
self::ITEMS.map { |data| new(data) }
|
||||
end
|
||||
|
||||
def where(**conditions)
|
||||
all.select { |item| item.matches?(conditions) }
|
||||
end
|
||||
|
||||
def find_by(**conditions)
|
||||
all.find { |item| item.matches?(conditions) }
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def find_instances
|
||||
@find_instances ||= []
|
||||
end
|
||||
end
|
||||
|
||||
included do
|
||||
def matches?(conditions)
|
||||
conditions.all? do |attribute, value|
|
||||
if value.is_a?(Array)
|
||||
value.include?(read_attribute(attribute))
|
||||
else
|
||||
read_attribute(attribute) == value
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def has_attribute?(key)
|
||||
attribute_names.include?(key.to_s)
|
||||
end
|
||||
|
||||
def read_attribute(key)
|
||||
return nil unless has_attribute?(key)
|
||||
|
||||
# Passed attributes are actual attributes of the model
|
||||
# rubocop:disable GitlabSecurity/PublicSend -- Reason above
|
||||
public_send(key)
|
||||
# rubocop:enable GitlabSecurity/PublicSend
|
||||
end
|
||||
|
||||
def inspect
|
||||
"#<#{self.class} #{attributes.map { |k, v| "#{k}: #{v.inspect}" }.join(', ')}>"
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -2,4 +2,6 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require_relative "active_record/gitlab_patches"
|
||||
require_relative "active_record/fixed_items_model"
|
||||
|
||||
# rubocop:enable Naming/FileName
|
||||
|
|
|
|||
|
|
@ -0,0 +1,157 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe ActiveRecord::FixedItemsModel::HasOne, feature_category: :shared do
|
||||
before do
|
||||
stub_const('TestStaticModel', Class.new do
|
||||
include ActiveModel::Model
|
||||
include ActiveModel::Attributes
|
||||
include ActiveRecord::FixedItemsModel::Model
|
||||
|
||||
attribute :id, :integer
|
||||
attribute :name, :string
|
||||
end)
|
||||
|
||||
stub_const('TestStaticModel::ITEMS', [
|
||||
{ id: 1, name: 'Item 1' },
|
||||
{ id: 2, name: 'Item 2' },
|
||||
{ id: 3, name: 'Item 3' }
|
||||
].freeze)
|
||||
|
||||
stub_const('TestRecord', Class.new do
|
||||
include ActiveModel::Attributes
|
||||
include ActiveRecord::FixedItemsModel::HasOne
|
||||
|
||||
attribute :static_item_id, :integer
|
||||
|
||||
# Mock AR methods
|
||||
def read_attribute(attr_name)
|
||||
send(attr_name)
|
||||
end
|
||||
|
||||
def write_attribute(attr_name, value)
|
||||
send("#{attr_name}=", value)
|
||||
end
|
||||
|
||||
def attribute_present?(attr_name)
|
||||
send(attr_name).present?
|
||||
end
|
||||
|
||||
# Mock reset method
|
||||
def reset
|
||||
@static_item = nil
|
||||
self
|
||||
end
|
||||
|
||||
belongs_to_fixed_items :static_item, fixed_items_class: TestStaticModel
|
||||
end)
|
||||
end
|
||||
|
||||
subject(:record) { TestRecord.new }
|
||||
|
||||
describe '#belongs_to_fixed_items' do
|
||||
it { is_expected.to respond_to(:static_item) }
|
||||
it { is_expected.to respond_to(:static_item=) }
|
||||
it { is_expected.to respond_to(:static_item?) }
|
||||
|
||||
context 'when foreign key attribute does not exist' do
|
||||
it 'raises runtime error' do
|
||||
expect do
|
||||
stub_const('TestRecord', Class.new do
|
||||
include ActiveModel::Attributes
|
||||
include ActiveRecord::FixedItemsModel::HasOne
|
||||
|
||||
attribute :static_item_id, :integer
|
||||
|
||||
# No need for mock methods because they're not called
|
||||
# because of the guard raise
|
||||
|
||||
belongs_to_fixed_items :doesnt_exist, fixed_items_class: TestStaticModel
|
||||
end)
|
||||
end.to raise_error(RuntimeError, "Missing attribute doesnt_exist_id")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe 'getter method' do
|
||||
it 'returns nil when foreign key is nil' do
|
||||
expect(record.static_item).to be_nil
|
||||
end
|
||||
|
||||
it 'returns the correct static item when foreign key is set' do
|
||||
record.static_item_id = 2
|
||||
expect(record.static_item.name).to eq('Item 2')
|
||||
# Ensure cache is invalidated when id is changed
|
||||
record.static_item_id = 3
|
||||
expect(record.static_item.name).to eq('Item 3')
|
||||
end
|
||||
|
||||
it 'caches the result' do
|
||||
record.static_item_id = 1
|
||||
expect(TestStaticModel).to receive(:find).once.and_call_original
|
||||
2.times { record.static_item }
|
||||
end
|
||||
end
|
||||
|
||||
describe 'setter method' do
|
||||
it 'sets the foreign key when assigning a static item' do
|
||||
static_item = TestStaticModel.find(3)
|
||||
record.static_item = static_item
|
||||
expect(record.static_item_id).to eq(3)
|
||||
end
|
||||
|
||||
it 'sets the foreign key to nil when assigning nil' do
|
||||
record.static_item_id = 1
|
||||
record.static_item = nil
|
||||
expect(record.static_item_id).to be_nil
|
||||
end
|
||||
|
||||
it 'clears the cache when setting a new value' do
|
||||
record.static_item_id = 1
|
||||
record.static_item # cache the value
|
||||
record.static_item = TestStaticModel.find(2)
|
||||
expect(TestStaticModel).to receive(:find).once.and_call_original
|
||||
record.static_item # should refetch the object
|
||||
end
|
||||
end
|
||||
|
||||
describe 'query method' do
|
||||
it 'returns true when foreign key is present' do
|
||||
record.static_item_id = 1
|
||||
expect(record.static_item?).to be true
|
||||
end
|
||||
|
||||
it 'returns false when foreign key is nil' do
|
||||
record.static_item_id = nil
|
||||
expect(record.static_item?).to be false
|
||||
end
|
||||
end
|
||||
|
||||
describe '#reset' do
|
||||
it 'clears the cache when reloading' do
|
||||
record.static_item_id = 1
|
||||
record.static_item # cache the value
|
||||
expect(TestStaticModel).to receive(:find).once.and_call_original
|
||||
record.reset
|
||||
record.static_item # should refetch the object
|
||||
end
|
||||
|
||||
context 'when original #reset is not defined' do
|
||||
before do
|
||||
stub_const('TestRecord', Class.new do
|
||||
include ActiveModel::Attributes
|
||||
include ActiveRecord::FixedItemsModel::HasOne
|
||||
|
||||
attribute :static_item_id, :integer
|
||||
|
||||
belongs_to_fixed_items :static_item, fixed_items_class: TestStaticModel
|
||||
end)
|
||||
end
|
||||
|
||||
it 'does not raise an error' do
|
||||
expect { record.reset }.not_to raise_error
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,167 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe ActiveRecord::FixedItemsModel::Model, feature_category: :shared do
|
||||
before do
|
||||
stub_const('TestStaticModel', Class.new do
|
||||
include ActiveModel::Model
|
||||
include ActiveModel::Attributes
|
||||
include ActiveRecord::FixedItemsModel::Model
|
||||
|
||||
attribute :id, :integer
|
||||
attribute :name, :string
|
||||
attribute :category
|
||||
end)
|
||||
|
||||
stub_const('TestStaticModel::ITEMS', [
|
||||
{ id: 1, name: 'Item 1', category: :a },
|
||||
{ id: 2, name: 'Item 2', category: :b },
|
||||
{ id: 3, name: 'Item 3', category: :a }
|
||||
].freeze)
|
||||
end
|
||||
|
||||
describe '.find' do
|
||||
it 'returns the correct item by id' do
|
||||
item = TestStaticModel.find(2)
|
||||
expect(item.name).to eq('Item 2')
|
||||
end
|
||||
|
||||
it 'returns nil for non-existent id' do
|
||||
expect(TestStaticModel.find(999)).to be_nil
|
||||
end
|
||||
|
||||
it 'caches the found instance' do
|
||||
item1 = TestStaticModel.find(1)
|
||||
item2 = TestStaticModel.find(1)
|
||||
expect(item1).to be(item2)
|
||||
end
|
||||
end
|
||||
|
||||
describe '.all' do
|
||||
it 'returns all items' do
|
||||
expect(TestStaticModel.all.map(&:id)).to eq([1, 2, 3])
|
||||
end
|
||||
end
|
||||
|
||||
describe '.where' do
|
||||
it 'returns items matching the conditions' do
|
||||
items = TestStaticModel.where(category: :a)
|
||||
expect(items.map(&:id)).to eq([1, 3])
|
||||
end
|
||||
|
||||
it 'returns empty array when no items match' do
|
||||
expect(TestStaticModel.where(category: :c)).to be_empty
|
||||
end
|
||||
|
||||
it 'handles multiple conditions' do
|
||||
items = TestStaticModel.where(category: :a, name: 'Item 1')
|
||||
expect(items.map(&:id)).to eq([1])
|
||||
end
|
||||
|
||||
it 'handles array conditions' do
|
||||
items = TestStaticModel.where(category: [:a, :b])
|
||||
expect(items.map(&:id)).to eq([1, 2, 3])
|
||||
end
|
||||
end
|
||||
|
||||
describe '.find_by' do
|
||||
it 'returns the first item matching the conditions' do
|
||||
item = TestStaticModel.find_by(category: :a)
|
||||
expect(item.id).to eq(1)
|
||||
end
|
||||
|
||||
it 'returns nil when no items match' do
|
||||
expect(TestStaticModel.find_by(category: :c)).to be_nil
|
||||
end
|
||||
end
|
||||
|
||||
describe 'cache isolation' do
|
||||
it 'creates new cache instances for each subclass' do
|
||||
# Create a subclass of TestModelA
|
||||
subclass = Class.new(TestStaticModel)
|
||||
|
||||
# Modifying the subclass cache shouldn't affect the parent class data
|
||||
# rubocop:disable GitlabSecurity/PublicSend -- Just used for mocking
|
||||
subclass.send(:find_instances)[2] = 'test'
|
||||
expect(subclass.send(:find_instances)[2]).to eq('test')
|
||||
expect(TestStaticModel.send(:find_instances)[2]).to be_nil
|
||||
# rubocop:enable GitlabSecurity/PublicSend
|
||||
end
|
||||
end
|
||||
|
||||
describe '#matches?' do
|
||||
let(:item) { TestStaticModel.find(1) }
|
||||
|
||||
it 'returns true when all conditions match' do
|
||||
expect(item.matches?(category: :a, name: 'Item 1')).to be true
|
||||
end
|
||||
|
||||
it 'returns false when any condition does not match' do
|
||||
expect(item.matches?(category: :b, name: 'Item 1')).to be false
|
||||
end
|
||||
|
||||
it 'handles array conditions' do
|
||||
expect(item.matches?(category: [:a, :b])).to be true
|
||||
expect(item.matches?(category: [:b, :c])).to be false
|
||||
end
|
||||
|
||||
it 'does not match with unpermitted attribute' do
|
||||
expect(item).not_to receive(:doesnt_exist)
|
||||
expect(item.matches?(doesnt_exist: 'test', name: 'Item 1')).to be false
|
||||
end
|
||||
end
|
||||
|
||||
describe '#has_attribute?' do
|
||||
let(:item) { TestStaticModel.new(id: 1) }
|
||||
|
||||
it 'returns true for valid attributes' do
|
||||
expect(item.has_attribute?(:id)).to be true
|
||||
end
|
||||
|
||||
it 'returns false for invalid attributes' do
|
||||
expect(item.has_attribute?(:non_existent)).to be false
|
||||
end
|
||||
|
||||
it 'handles both symbol and string keys' do
|
||||
expect(item.has_attribute?(:id)).to be true
|
||||
expect(item.has_attribute?('id')).to be true
|
||||
end
|
||||
|
||||
it 'returns false for nil or empty string keys' do
|
||||
expect(item.has_attribute?(nil)).to be false
|
||||
expect(item.has_attribute?('')).to be false
|
||||
end
|
||||
end
|
||||
|
||||
describe '#read_attribute' do
|
||||
let(:item) { TestStaticModel.new(id: 1, name: 'Test', category: :a) }
|
||||
|
||||
it 'returns the value of a valid attribute' do
|
||||
expect(item.read_attribute(:id)).to eq(1)
|
||||
expect(item.read_attribute(:name)).to eq('Test')
|
||||
expect(item.read_attribute(:category)).to eq(:a)
|
||||
end
|
||||
|
||||
it 'returns nil for an invalid attribute' do
|
||||
expect(item.read_attribute(:non_existent)).to be_nil
|
||||
end
|
||||
|
||||
it 'handles both symbol and string keys' do
|
||||
expect(item.read_attribute(:id)).to eq(1)
|
||||
expect(item.read_attribute('id')).to eq(1)
|
||||
end
|
||||
|
||||
it 'returns nil for nil or empty string keys' do
|
||||
expect(item.read_attribute(nil)).to be_nil
|
||||
expect(item.read_attribute('')).to be_nil
|
||||
end
|
||||
end
|
||||
|
||||
describe '#inspect' do
|
||||
it 'returns a string representation of the object' do
|
||||
item = TestStaticModel.find(1)
|
||||
expect(item.inspect).to eq('#<TestStaticModel id: 1, name: "Item 1", category: :a>')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -3,6 +3,7 @@
|
|||
ENV["RAILS_ENV"] = "test"
|
||||
|
||||
require "active_record/gitlab_patches"
|
||||
require "active_record/fixed_items_model"
|
||||
|
||||
RSpec.configure do |config|
|
||||
# Enable flags like --only-failures and --next-failure
|
||||
|
|
|
|||
|
|
@ -142,10 +142,10 @@ module Gitlab
|
|||
# one registered in `.rate_limits`
|
||||
#
|
||||
# @return [Boolean] Whether or not a request should be throttled
|
||||
def resource_usage_throttled?(key, scope:, resource_key:, threshold:, interval:)
|
||||
def resource_usage_throttled?(key, scope:, resource_key:, threshold:, interval:, peek: false)
|
||||
strategy = IncrementResourceUsagePerAction.new(resource_key)
|
||||
|
||||
_throttled?(key, scope: scope, strategy: strategy, threshold: threshold, interval: interval)
|
||||
_throttled?(key, scope: scope, strategy: strategy, threshold: threshold, interval: interval, peek: peek)
|
||||
end
|
||||
|
||||
# Similar to #throttled? above but checks for the bypass header in the request and logs the request when it is over the rate limit
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ module Gitlab
|
|||
|
||||
if user_finder.source_user_accepted?(collaborator)
|
||||
membership = existing_user_membership(user_id)
|
||||
return if membership && membership[:access_level] >= map_access_level
|
||||
return if membership && membership[:access_level] > map_access_level
|
||||
|
||||
create_membership!(user_id, access_level)
|
||||
else
|
||||
|
|
@ -40,7 +40,11 @@ module Gitlab
|
|||
private
|
||||
|
||||
def existing_user_membership(user_id)
|
||||
members_finder.execute.find_by_user_id(user_id)
|
||||
members_finder.execute(include_relations: member_finder_relations).find_by_user_id(user_id)
|
||||
end
|
||||
|
||||
def member_finder_relations
|
||||
::Import::ReassignPlaceholderUserRecordsService::PROJECT_FINDER_MEMBER_RELATIONS
|
||||
end
|
||||
|
||||
def map_access_level
|
||||
|
|
|
|||
|
|
@ -14,6 +14,12 @@ module Gitlab
|
|||
end
|
||||
end
|
||||
|
||||
def exceeded_limits?
|
||||
limits.filter.any? do |limit|
|
||||
throttled?(limit, peek: true)
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def limits
|
||||
|
|
@ -22,7 +28,7 @@ module Gitlab
|
|||
Gitlab::SidekiqLimits.limits_for(@params[:worker_name])
|
||||
end
|
||||
|
||||
def throttled?(limit)
|
||||
def throttled?(limit, peek: false)
|
||||
# Return false as some scopes are missing avoid inflating another limit's count
|
||||
scope = limit.scopes.filter_map { |sk| @params[sk.to_sym] }
|
||||
return false if scope.size != limit.scopes.size
|
||||
|
|
@ -32,7 +38,8 @@ module Gitlab
|
|||
resource_key: limit.resource_key,
|
||||
scope: scope,
|
||||
threshold: limit.threshold,
|
||||
interval: limit.interval
|
||||
interval: limit.interval,
|
||||
peek: peek
|
||||
)
|
||||
end
|
||||
end
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,315 +1,297 @@
|
|||
{
|
||||
"qa/specs/features/api/10_govern/group_access_token_spec.rb": 32.09179872,
|
||||
"qa/specs/features/api/10_govern/project_access_token_spec.rb": 70.84043446700001,
|
||||
"qa/specs/features/api/12_systems/gitaly/automatic_failover_and_recovery_spec.rb": 106.840468197,
|
||||
"qa/specs/features/api/12_systems/gitaly/backend_node_recovery_spec.rb": 115.87754678,
|
||||
"qa/specs/features/api/12_systems/gitaly/distributed_reads_spec.rb": 106.710385599,
|
||||
"qa/specs/features/api/12_systems/gitaly/gitaly_mtls_spec.rb": 19.001982918,
|
||||
"qa/specs/features/api/1_manage/import/import_github_repo_spec.rb": 63.26932629,
|
||||
"qa/specs/features/api/1_manage/integrations/webhook_events_spec.rb": 52.256671066,
|
||||
"qa/specs/features/api/1_manage/migration/gitlab_migration_group_spec.rb": 51.502758282,
|
||||
"qa/specs/features/api/1_manage/migration/gitlab_migration_issue_spec.rb": 199.076833071,
|
||||
"qa/specs/features/api/1_manage/migration/gitlab_migration_pipeline_spec.rb": 95.08253956,
|
||||
"qa/specs/features/api/1_manage/migration/gitlab_migration_project_spec.rb": 96.926171525,
|
||||
"qa/specs/features/api/1_manage/rate_limits_spec.rb": 14.295300094,
|
||||
"qa/specs/features/api/2_plan/closes_issue_via_pushing_a_commit_spec.rb": 24.292929619,
|
||||
"qa/specs/features/api/3_create/merge_request/push_options_labels_spec.rb": 30.065032042000002,
|
||||
"qa/specs/features/api/3_create/merge_request/push_options_mwps_spec.rb": 16.734459115,
|
||||
"qa/specs/features/api/3_create/merge_request/push_options_remove_source_branch_spec.rb": 35.849599535,
|
||||
"qa/specs/features/api/10_govern/group_access_token_spec.rb": 37.015454669,
|
||||
"qa/specs/features/api/10_govern/project_access_token_spec.rb": 75.724356965,
|
||||
"qa/specs/features/api/12_systems/gitaly/automatic_failover_and_recovery_spec.rb": 100.49626791899999,
|
||||
"qa/specs/features/api/12_systems/gitaly/backend_node_recovery_spec.rb": 109.495024404,
|
||||
"qa/specs/features/api/12_systems/gitaly/distributed_reads_spec.rb": 106.509403489,
|
||||
"qa/specs/features/api/12_systems/gitaly/gitaly_mtls_spec.rb": 15.799374557,
|
||||
"qa/specs/features/api/1_manage/import/import_github_repo_spec.rb": 128.368130788,
|
||||
"qa/specs/features/api/1_manage/integrations/webhook_events_spec.rb": 65.318252654,
|
||||
"qa/specs/features/api/1_manage/migration/gitlab_migration_group_spec.rb": 64.134960608,
|
||||
"qa/specs/features/api/1_manage/migration/gitlab_migration_issue_spec.rb": 224.30863738,
|
||||
"qa/specs/features/api/1_manage/migration/gitlab_migration_pipeline_spec.rb": 102.102132018,
|
||||
"qa/specs/features/api/1_manage/migration/gitlab_migration_project_spec.rb": 99.440285268,
|
||||
"qa/specs/features/api/1_manage/rate_limits_spec.rb": 15.982613437,
|
||||
"qa/specs/features/api/2_plan/closes_issue_via_pushing_a_commit_spec.rb": 20.482144219,
|
||||
"qa/specs/features/api/3_create/merge_request/push_options_labels_spec.rb": 36.28319341,
|
||||
"qa/specs/features/api/3_create/merge_request/push_options_mwps_spec.rb": 12.446403762,
|
||||
"qa/specs/features/api/3_create/merge_request/push_options_remove_source_branch_spec.rb": 27.518031778,
|
||||
"qa/specs/features/api/3_create/merge_request/push_options_target_branch_spec.rb": 31.133650909,
|
||||
"qa/specs/features/api/3_create/merge_request/push_options_title_description_spec.rb": 31.637965331,
|
||||
"qa/specs/features/api/3_create/merge_request/view_merge_requests_spec.rb": 2.412787835,
|
||||
"qa/specs/features/api/3_create/repository/add_list_delete_branches_spec.rb": 18.299660092,
|
||||
"qa/specs/features/api/3_create/repository/commit_to_templated_project_spec.rb": 21.469919996,
|
||||
"qa/specs/features/api/3_create/repository/default_branch_name_setting_spec.rb": 15.021574573999999,
|
||||
"qa/specs/features/api/3_create/repository/files_spec.rb": 7.660189947999999,
|
||||
"qa/specs/features/api/3_create/repository/project_archive_compare_spec.rb": 14.958655179,
|
||||
"qa/specs/features/api/3_create/repository/push_postreceive_idempotent_spec.rb": 26.505414728,
|
||||
"qa/specs/features/api/3_create/repository/storage_size_spec.rb": 16.014137689,
|
||||
"qa/specs/features/api/3_create/repository/tag_revision_trigger_prereceive_hook_spec.rb": 8.728627083,
|
||||
"qa/specs/features/api/4_verify/api_variable_inheritance_with_forward_pipeline_variables_spec.rb": 78.89262624,
|
||||
"qa/specs/features/api/4_verify/cancel_pipeline_when_block_user_spec.rb": 15.48289999,
|
||||
"qa/specs/features/api/4_verify/file_variable_spec.rb": 63.981808694,
|
||||
"qa/specs/features/api/4_verify/job_downloads_artifacts_spec.rb": 52.288782966,
|
||||
"qa/specs/features/api/5_package/container_registry/saas/container_registry_spec.rb": 71.800959886,
|
||||
"qa/specs/features/api/8_monitor/metrics_spec.rb": 5.257570875,
|
||||
"qa/specs/features/api/9_data_stores/user_inherited_access_spec.rb": 136.275449175,
|
||||
"qa/specs/features/api/9_data_stores/users_spec.rb": 6.899767240999999,
|
||||
"qa/specs/features/browser_ui/10_govern/group/group_access_token_spec.rb": 19.844721573,
|
||||
"qa/specs/features/browser_ui/10_govern/login/2fa_recovery_spec.rb": 44.100941593,
|
||||
"qa/specs/features/browser_ui/10_govern/login/2fa_ssh_recovery_spec.rb": 45.583287338,
|
||||
"qa/specs/features/browser_ui/10_govern/login/log_in_spec.rb": 13.401347702,
|
||||
"qa/specs/features/browser_ui/10_govern/login/log_in_with_2fa_spec.rb": 85.925896927,
|
||||
"qa/specs/features/browser_ui/10_govern/login/log_into_gitlab_via_ldap_spec.rb": 4.034288774,
|
||||
"qa/specs/features/browser_ui/10_govern/login/log_into_mattermost_via_gitlab_spec.rb": 29.35834189,
|
||||
"qa/specs/features/browser_ui/10_govern/login/login_via_instance_wide_saml_sso_spec.rb": 17.313229202,
|
||||
"qa/specs/features/browser_ui/10_govern/login/oauth_login_with_github_spec.rb": 41.213389322,
|
||||
"qa/specs/features/browser_ui/10_govern/login/register_spec.rb": 177.063061658,
|
||||
"qa/specs/features/browser_ui/10_govern/project/project_access_token_spec.rb": 23.114883894,
|
||||
"qa/specs/features/browser_ui/10_govern/user/impersonation_token_spec.rb": 33.895819022,
|
||||
"qa/specs/features/browser_ui/10_govern/user/user_access_termination_spec.rb": 45.065414806,
|
||||
"qa/specs/features/browser_ui/14_analytics/performance_bar_spec.rb": 26.921009558,
|
||||
"qa/specs/features/browser_ui/14_analytics/service_ping_default_enabled_spec.rb": 16.247576949,
|
||||
"qa/specs/features/browser_ui/14_analytics/service_ping_disabled_spec.rb": 11.621520023,
|
||||
"qa/specs/features/browser_ui/1_manage/integrations/jenkins/jenkins_build_status_spec.rb": 76.323214588,
|
||||
"qa/specs/features/browser_ui/1_manage/integrations/jira/jira_basic_integration_spec.rb": 62.873560731000005,
|
||||
"qa/specs/features/browser_ui/1_manage/integrations/jira/jira_issue_import_spec.rb": 37.627080824,
|
||||
"qa/specs/features/browser_ui/1_manage/integrations/pipeline_status_emails_spec.rb": 70.607680189,
|
||||
"qa/specs/features/browser_ui/1_manage/migration/gitlab_migration_group_spec.rb": 54.13425361,
|
||||
"qa/specs/features/browser_ui/1_manage/migration/gitlab_migration_user_contribution_reassignment_spec.rb": 183.431762919,
|
||||
"qa/specs/features/browser_ui/2_plan/design_management/add_design_content_spec.rb": 25.85949383,
|
||||
"qa/specs/features/browser_ui/2_plan/design_management/archive_design_content_spec.rb": 29.851323213,
|
||||
"qa/specs/features/browser_ui/2_plan/design_management/modify_design_content_spec.rb": 25.113726787,
|
||||
"qa/specs/features/browser_ui/2_plan/email/trigger_email_notification_spec.rb": 16.703454046,
|
||||
"qa/specs/features/browser_ui/2_plan/issue/check_mentions_for_xss_spec.rb": 29.64007647,
|
||||
"qa/specs/features/browser_ui/2_plan/issue/collapse_comments_in_discussions_spec.rb": 24.060903882,
|
||||
"qa/specs/features/browser_ui/2_plan/issue/comment_issue_spec.rb": 25.328070515,
|
||||
"qa/specs/features/browser_ui/2_plan/issue/create_issue_spec.rb": 80.24420816700001,
|
||||
"qa/specs/features/browser_ui/2_plan/issue/custom_issue_template_spec.rb": 26.879063725,
|
||||
"qa/specs/features/browser_ui/2_plan/issue/export_as_csv_spec.rb": 23.048566907,
|
||||
"qa/specs/features/browser_ui/2_plan/issue/filter_issue_comments_spec.rb": 26.140969635,
|
||||
"qa/specs/features/browser_ui/2_plan/issue/issue_suggestions_spec.rb": 21.950209933,
|
||||
"qa/specs/features/browser_ui/2_plan/issue/mentions_spec.rb": 31.058895067,
|
||||
"qa/specs/features/browser_ui/2_plan/issue/real_time_assignee_spec.rb": 26.107155823,
|
||||
"qa/specs/features/browser_ui/2_plan/issue_boards/focus_mode_spec.rb": 18.166378483,
|
||||
"qa/specs/features/browser_ui/2_plan/milestone/assign_milestone_spec.rb": 105.543095554,
|
||||
"qa/specs/features/browser_ui/2_plan/milestone/create_group_milestone_spec.rb": 23.728998484,
|
||||
"qa/specs/features/browser_ui/2_plan/milestone/create_project_milestone_spec.rb": 25.537766604,
|
||||
"qa/specs/features/browser_ui/2_plan/project_wiki/project_based_content_creation_spec.rb": 113.445383183,
|
||||
"qa/specs/features/browser_ui/2_plan/project_wiki/project_based_content_manipulation_spec.rb": 70.63853635000001,
|
||||
"qa/specs/features/browser_ui/2_plan/project_wiki/project_based_directory_management_spec.rb": 22.714283984,
|
||||
"qa/specs/features/browser_ui/2_plan/project_wiki/project_based_file_upload_spec.rb": 39.66400416,
|
||||
"qa/specs/features/browser_ui/2_plan/project_wiki/project_based_list_spec.rb": 74.829817515,
|
||||
"qa/specs/features/browser_ui/2_plan/project_wiki/project_based_page_deletion_spec.rb": 59.478185997,
|
||||
"qa/specs/features/browser_ui/2_plan/related_issues/related_issues_spec.rb": 22.828525823,
|
||||
"qa/specs/features/browser_ui/3_create/merge_request/cherry_pick/cherry_pick_a_merge_spec.rb": 47.831726855,
|
||||
"qa/specs/features/browser_ui/3_create/merge_request/cherry_pick/cherry_pick_commit_spec.rb": 42.210410523,
|
||||
"qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_spec.rb": 77.674572313,
|
||||
"qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_via_template_spec.rb": 42.884679903,
|
||||
"qa/specs/features/browser_ui/3_create/merge_request/merge_merge_request_from_fork_spec.rb": 42.39481007,
|
||||
"qa/specs/features/browser_ui/3_create/merge_request/merge_request_set_to_auto_merge_spec.rb": 66.316861225,
|
||||
"qa/specs/features/browser_ui/3_create/merge_request/rebase_merge_request_spec.rb": 78.839397559,
|
||||
"qa/specs/features/browser_ui/3_create/merge_request/revert/revert_commit_spec.rb": 32.719442996,
|
||||
"qa/specs/features/browser_ui/3_create/merge_request/revert/reverting_merge_request_spec.rb": 44.662585073,
|
||||
"qa/specs/features/browser_ui/3_create/merge_request/squash_merge_request_spec.rb": 43.188893906,
|
||||
"qa/specs/features/browser_ui/3_create/merge_request/suggestions/batch_suggestion_spec.rb": 68.1749663,
|
||||
"qa/specs/features/browser_ui/3_create/merge_request/suggestions/custom_commit_suggestion_spec.rb": 66.211108869,
|
||||
"qa/specs/features/browser_ui/3_create/merge_request/view_merge_request_diff_patch_spec.rb": 50.689415686000004,
|
||||
"qa/specs/features/browser_ui/3_create/repository/add_file_template_spec.rb": 102.208961399,
|
||||
"qa/specs/features/browser_ui/3_create/repository/add_new_branch_rule_spec.rb": 36.464513447,
|
||||
"qa/specs/features/browser_ui/3_create/repository/branch_with_unusual_name_spec.rb": 23.728558417,
|
||||
"qa/specs/features/browser_ui/3_create/repository/clone_spec.rb": 23.797389396,
|
||||
"qa/specs/features/browser_ui/3_create/repository/file/create_file_via_web_spec.rb": 26.457367728,
|
||||
"qa/specs/features/browser_ui/3_create/repository/file/delete_file_via_web_spec.rb": 23.011221592,
|
||||
"qa/specs/features/browser_ui/3_create/repository/file/edit_file_via_web_spec.rb": 25.267087996,
|
||||
"qa/specs/features/browser_ui/3_create/repository/file/file_with_unusual_name_spec.rb": 30.818279196,
|
||||
"qa/specs/features/browser_ui/3_create/repository/license_detection_spec.rb": 33.215890676,
|
||||
"qa/specs/features/browser_ui/3_create/repository/protected_tags_spec.rb": 143.819267186,
|
||||
"qa/specs/features/browser_ui/3_create/repository/protocol_v2_push_http_spec.rb": 25.250917316,
|
||||
"qa/specs/features/browser_ui/3_create/repository/protocol_v2_push_ssh_spec.rb": 29.749885185,
|
||||
"qa/specs/features/browser_ui/3_create/repository/push_http_private_token_spec.rb": 28.959297006,
|
||||
"qa/specs/features/browser_ui/3_create/repository/push_mirroring_lfs_over_http_spec.rb": 76.192584769,
|
||||
"qa/specs/features/browser_ui/3_create/repository/push_mirroring_over_http_spec.rb": 69.755045933,
|
||||
"qa/specs/features/browser_ui/3_create/repository/push_over_http_file_size_spec.rb": 46.870759926,
|
||||
"qa/specs/features/browser_ui/3_create/repository/push_over_http_spec.rb": 35.941708872999996,
|
||||
"qa/specs/features/browser_ui/3_create/repository/push_over_ssh_spec.rb": 52.645359239,
|
||||
"qa/specs/features/browser_ui/3_create/repository/push_protected_branch_spec.rb": 23.909537047,
|
||||
"qa/specs/features/browser_ui/3_create/repository/push_to_canary_gitaly_spec.rb": 24.10235971,
|
||||
"qa/specs/features/browser_ui/3_create/repository/ssh_key_support_create_spec.rb": 35.533406608,
|
||||
"qa/specs/features/browser_ui/3_create/repository/ssh_key_support_delete_spec.rb": 31.337760044,
|
||||
"qa/specs/features/browser_ui/3_create/repository/user_views_commit_diff_patch_spec.rb": 44.643508223,
|
||||
"qa/specs/features/browser_ui/3_create/snippet/add_comment_to_snippet_spec.rb": 55.933738827,
|
||||
"qa/specs/features/browser_ui/3_create/snippet/add_file_to_snippet_spec.rb": 48.836957866000006,
|
||||
"qa/specs/features/browser_ui/3_create/snippet/clone_push_pull_personal_snippet_spec.rb": 78.02081374900001,
|
||||
"qa/specs/features/browser_ui/3_create/snippet/clone_push_pull_project_snippet_spec.rb": 75.211790901,
|
||||
"qa/specs/features/browser_ui/3_create/snippet/copy_snippet_file_contents_spec.rb": 49.988234528,
|
||||
"qa/specs/features/browser_ui/3_create/snippet/create_personal_snippet_spec.rb": 14.174265896,
|
||||
"qa/specs/features/browser_ui/3_create/snippet/create_personal_snippet_with_multiple_files_spec.rb": 14.639778009,
|
||||
"qa/specs/features/browser_ui/3_create/snippet/create_project_snippet_spec.rb": 22.832990738,
|
||||
"qa/specs/features/browser_ui/3_create/snippet/create_project_snippet_with_multiple_files_spec.rb": 30.003782008,
|
||||
"qa/specs/features/browser_ui/3_create/snippet/delete_file_from_snippet_spec.rb": 46.354167631,
|
||||
"qa/specs/features/browser_ui/3_create/snippet/share_snippet_spec.rb": 32.431142643,
|
||||
"qa/specs/features/browser_ui/3_create/snippet/snippet_index_page_spec.rb": 88.360735764,
|
||||
"qa/specs/features/browser_ui/3_create/source_editor/source_editor_toolbar_spec.rb": 28.113785988,
|
||||
"qa/specs/features/browser_ui/3_create/web_ide/add_first_file_in_web_ide_spec.rb": 51.825862273,
|
||||
"qa/specs/features/browser_ui/3_create/web_ide/add_new_directory_in_web_ide_spec.rb": 82.160765005,
|
||||
"qa/specs/features/browser_ui/3_create/web_ide/closing_web_ide_with_unsaved_changes_spec.rb": 23.81562883,
|
||||
"qa/specs/features/browser_ui/3_create/web_ide/upload_new_file_in_web_ide_spec.rb": 96.516777787,
|
||||
"qa/specs/features/browser_ui/4_verify/ci_components_catalog/ci_catalog_sorting_spec.rb": 90.14169191600001,
|
||||
"qa/specs/features/browser_ui/4_verify/ci_components_catalog/release_with_glab_spec.rb": 168.190569452,
|
||||
"qa/specs/features/browser_ui/4_verify/ci_components_catalog/release_with_release_cli_spec.rb": 113.110485423,
|
||||
"qa/specs/features/browser_ui/4_verify/ci_components_catalog/run_component_in_project_pipeline_spec.rb": 52.640730466,
|
||||
"qa/specs/features/browser_ui/4_verify/ci_job_artifacts/expose_job_artifacts_in_mr_spec.rb": 78.097937916,
|
||||
"qa/specs/features/browser_ui/4_verify/ci_job_artifacts/job_artifacts_access_keyword_spec.rb": 229.44415739200002,
|
||||
"qa/specs/features/browser_ui/4_verify/ci_job_artifacts/unlocking_job_artifacts_across_pipelines_spec.rb": 241.475671391,
|
||||
"qa/specs/features/browser_ui/4_verify/ci_project_artifacts/user_can_bulk_delete_artifacts_spec.rb": 86.877077345,
|
||||
"qa/specs/features/browser_ui/4_verify/ci_variable/custom_variable_spec.rb": 45.569080506,
|
||||
"qa/specs/features/browser_ui/4_verify/ci_variable/pipeline_with_protected_variable_spec.rb": 105.582527266,
|
||||
"qa/specs/features/browser_ui/4_verify/ci_variable/prefill_variables_spec.rb": 62.516032486,
|
||||
"qa/specs/features/browser_ui/4_verify/ci_variable/raw_variables_defined_in_yaml_spec.rb": 29.595233703,
|
||||
"qa/specs/features/browser_ui/4_verify/ci_variable/ui_variable_inheritable_when_forward_pipeline_variables_true_spec.rb": 155.588445339,
|
||||
"qa/specs/features/browser_ui/4_verify/pipeline/include_local_config_file_paths_with_wildcard_spec.rb": 23.459718339,
|
||||
"qa/specs/features/browser_ui/4_verify/pipeline/include_multiple_files_from_a_project_spec.rb": 82.948983168,
|
||||
"qa/specs/features/browser_ui/4_verify/pipeline/include_multiple_files_from_multiple_projects_spec.rb": 48.272808897,
|
||||
"qa/specs/features/browser_ui/4_verify/pipeline/parent_child_pipelines_independent_relationship_spec.rb": 84.137052289,
|
||||
"qa/specs/features/browser_ui/4_verify/pipeline/pass_dotenv_variables_to_downstream_via_bridge_spec.rb": 56.5634157,
|
||||
"qa/specs/features/browser_ui/4_verify/pipeline/run_pipeline_with_manual_jobs_spec.rb": 73.453418726,
|
||||
"qa/specs/features/browser_ui/4_verify/pipeline/trigger_child_pipeline_with_manual_spec.rb": 44.490095637,
|
||||
"qa/specs/features/browser_ui/4_verify/pipeline/trigger_matrix_spec.rb": 32.912208563,
|
||||
"qa/specs/features/browser_ui/4_verify/pipeline/update_ci_file_with_pipeline_editor_spec.rb": 33.41696766,
|
||||
"qa/specs/features/browser_ui/4_verify/runner/deprecated_registration_token_spec.rb": 27.255567205,
|
||||
"qa/specs/features/browser_ui/4_verify/runner/deprecated_unregister_runner_spec.rb": 34.72891057,
|
||||
"qa/specs/features/browser_ui/4_verify/runner/fleet_visibility/group_runner_counts_spec.rb": 23.788181643,
|
||||
"qa/specs/features/browser_ui/4_verify/runner/fleet_visibility/group_runner_status_counts_spec.rb": 18.169601756,
|
||||
"qa/specs/features/browser_ui/4_verify/runner/register_group_runner_spec.rb": 20.202194613,
|
||||
"qa/specs/features/browser_ui/4_verify/runner/register_project_runner_spec.rb": 58.906034581,
|
||||
"qa/specs/features/browser_ui/4_verify/testing/endpoint_coverage_spec.rb": 51.836840746,
|
||||
"qa/specs/features/browser_ui/5_package/container_registry/saas/container_registry_spec.rb": 163.193004342,
|
||||
"qa/specs/features/browser_ui/5_package/container_registry/self_managed/container_registry_spec.rb": 328.62547077700003,
|
||||
"qa/specs/features/browser_ui/5_package/dependency_proxy/dependency_proxy_spec.rb": 184.010261683,
|
||||
"qa/specs/features/browser_ui/5_package/package_registry/composer_registry_spec.rb": 62.08611696,
|
||||
"qa/specs/features/browser_ui/5_package/package_registry/conan_repository_spec.rb": 107.864049619,
|
||||
"qa/specs/features/browser_ui/5_package/package_registry/generic_repository_spec.rb": 62.388574114,
|
||||
"qa/specs/features/browser_ui/5_package/package_registry/helm_registry_spec.rb": 309.293218726,
|
||||
"qa/specs/features/browser_ui/5_package/package_registry/maven/maven_group_level_spec.rb": 594.456026716,
|
||||
"qa/specs/features/browser_ui/5_package/package_registry/maven/maven_project_level_spec.rb": 306.303958561,
|
||||
"qa/specs/features/browser_ui/5_package/package_registry/maven_gradle_repository_spec.rb": 309.32504019099997,
|
||||
"qa/specs/features/browser_ui/5_package/package_registry/npm/npm_group_level_spec.rb": 301.125697193,
|
||||
"qa/specs/features/browser_ui/5_package/package_registry/npm/npm_instance_level_spec.rb": 348.076428846,
|
||||
"qa/specs/features/browser_ui/5_package/package_registry/pypi_repository_spec.rb": 106.406871549,
|
||||
"qa/specs/features/browser_ui/6_release/deploy_key/add_deploy_key_spec.rb": 29.327765963,
|
||||
"qa/specs/features/browser_ui/6_release/deploy_key/clone_using_deploy_key_spec.rb": 188.715691628,
|
||||
"qa/specs/features/browser_ui/6_release/deploy_token/add_deploy_token_spec.rb": 14.698590564,
|
||||
"qa/specs/features/browser_ui/8_monitor/alert_management/alert_settings_create_new_alerts_spec.rb": 52.357856561999995,
|
||||
"qa/specs/features/browser_ui/8_monitor/alert_management/automatically_creates_incident_for_alert_spec.rb": 62.049963033,
|
||||
"qa/specs/features/browser_ui/8_monitor/alert_management/create_alert_using_authorization_key_spec.rb": 50.577361765,
|
||||
"qa/specs/features/browser_ui/8_monitor/alert_management/email_notification_for_alert_spec.rb": 72.42221105899999,
|
||||
"qa/specs/features/browser_ui/8_monitor/alert_management/recovery_alert_resolves_correct_alert_spec.rb": 29.470219297,
|
||||
"qa/specs/features/browser_ui/9_data_stores/group/create_group_with_mattermost_team_spec.rb": 8.143943888,
|
||||
"qa/specs/features/browser_ui/9_data_stores/group/group_member_access_request_spec.rb": 59.317936782,
|
||||
"qa/specs/features/browser_ui/9_data_stores/group/transfer_project_spec.rb": 22.223200836,
|
||||
"qa/specs/features/browser_ui/9_data_stores/project/add_project_member_spec.rb": 30.228395089,
|
||||
"qa/specs/features/browser_ui/9_data_stores/project/create_project_badge_spec.rb": 26.47440979,
|
||||
"qa/specs/features/browser_ui/9_data_stores/project/create_project_spec.rb": 56.924557956,
|
||||
"qa/specs/features/browser_ui/9_data_stores/project/dashboard_images_spec.rb": 18.117264133,
|
||||
"qa/specs/features/browser_ui/9_data_stores/project/invite_group_to_project_spec.rb": 77.063808379,
|
||||
"qa/specs/features/browser_ui/9_data_stores/project/project_owner_permissions_spec.rb": 100.707811271,
|
||||
"qa/specs/features/browser_ui/9_data_stores/project/view_project_activity_spec.rb": 30.729891519,
|
||||
"qa/specs/features/browser_ui/9_data_stores/user/follow_user_activity_spec.rb": 28.12556536,
|
||||
"qa/specs/features/browser_ui/9_data_stores/user/parent_group_access_termination_spec.rb": 25.595656177,
|
||||
"qa/specs/features/browser_ui/9_data_stores/user/user_inherited_access_spec.rb": 24.790635015,
|
||||
"qa/specs/features/ee/api/10_govern/compliance_pipeline_spec.rb": 44.953216412,
|
||||
"qa/specs/features/ee/api/10_govern/instance_audit_event_streaming_spec.rb": 42.961544382,
|
||||
"qa/specs/features/ee/api/10_govern/user/minimal_access_user_spec.rb": 82.76316740200001,
|
||||
"qa/specs/features/ee/api/1_manage/import/import_github_repo_spec.rb": 124.452661764,
|
||||
"qa/specs/features/ee/api/1_manage/integrations/group_webhook_events_spec.rb": 11.694093681,
|
||||
"qa/specs/features/ee/api/1_manage/migration/gitlab_migration_group_spec.rb": 82.717425116,
|
||||
"qa/specs/features/ee/api/2_plan/analytics/dora_metrics_spec.rb": 2.610463819,
|
||||
"qa/specs/features/ee/api/2_plan/epics_milestone_dates_spec.rb": 67.78791177400001,
|
||||
"qa/specs/features/ee/api/3_create/code_suggestions_spec.rb": 34.997776423,
|
||||
"qa/specs/features/ee/api/9_data_stores/elasticsearch/advanced_global_advanced_syntax_search_spec.rb": 177.463967942,
|
||||
"qa/specs/features/ee/api/9_data_stores/elasticsearch/elasticsearch_api_spec.rb": 88.774664526,
|
||||
"qa/specs/features/ee/api/9_data_stores/elasticsearch/index_tests/commit_index/commit_index_spec.rb": 113.761138715,
|
||||
"qa/specs/features/ee/api/9_data_stores/elasticsearch/index_tests/issues_index/issue_index_spec.rb": 94.191328237,
|
||||
"qa/specs/features/ee/api/9_data_stores/elasticsearch/index_tests/main_index/blob_index_spec.rb": 44.073263399,
|
||||
"qa/specs/features/ee/api/9_data_stores/elasticsearch/index_tests/merge_request_index/merge_request_index_spec.rb": 53.637057678,
|
||||
"qa/specs/features/ee/api/9_data_stores/elasticsearch/index_tests/notes_index/note_index_spec.rb": 57.685242512,
|
||||
"qa/specs/features/ee/api/9_data_stores/elasticsearch/index_tests/user_index/user_index_spec.rb": 53.947907517,
|
||||
"qa/specs/features/ee/api/9_data_stores/elasticsearch/nightly_elasticsearch_test_spec.rb": 22.758491453,
|
||||
"qa/specs/features/ee/browser_ui/10_govern/change_vulnerability_status_spec.rb": 129.474175645,
|
||||
"qa/specs/features/ee/browser_ui/10_govern/create_merge_request_with_secure_spec.rb": 67.504473966,
|
||||
"qa/specs/features/ee/browser_ui/10_govern/dismissed_vulnerabilities_in_security_widget_spec.rb": 120.244884641,
|
||||
"qa/specs/features/ee/browser_ui/10_govern/explain_this_vulnerability_spec.rb": 54.82291775,
|
||||
"qa/specs/features/ee/browser_ui/10_govern/export_vulnerability_report_spec.rb": 27.923855203,
|
||||
"qa/specs/features/ee/browser_ui/10_govern/fix_vulnerability_workflow_spec.rb": 198.566644822,
|
||||
"qa/specs/features/ee/browser_ui/10_govern/group/group_audit_event_streaming_spec.rb": 56.923835319,
|
||||
"qa/specs/features/ee/browser_ui/10_govern/group/group_audit_logs_1_spec.rb": 98.63632659299999,
|
||||
"qa/specs/features/ee/browser_ui/10_govern/group/group_ldap_sync_spec.rb": 127.38219135,
|
||||
"qa/specs/features/ee/browser_ui/10_govern/group/restrict_by_ip_address_spec.rb": 140.456834634,
|
||||
"qa/specs/features/ee/browser_ui/10_govern/group_pipeline_execution_policy_spec.rb": 310.737996319,
|
||||
"qa/specs/features/ee/browser_ui/10_govern/instance/instance_audit_logs_spec.rb": 102.084300353,
|
||||
"qa/specs/features/ee/browser_ui/10_govern/project/project_audit_logs_spec.rb": 238.71019868399998,
|
||||
"qa/specs/features/ee/browser_ui/10_govern/project_security_dashboard_spec.rb": 66.03155057699999,
|
||||
"qa/specs/features/ee/browser_ui/10_govern/resolve_this_vulnerability_spec.rb": 62.073244889,
|
||||
"qa/specs/features/ee/browser_ui/10_govern/resolve_vulnerability_in_merge_request_duo_spec.rb": 74.938109056,
|
||||
"qa/specs/features/ee/browser_ui/10_govern/scan_execution_policy_vulnerabilities_spec.rb": 150.84264386,
|
||||
"qa/specs/features/ee/browser_ui/10_govern/scan_result_policy_license_finding_spec.rb": 111.94132359,
|
||||
"qa/specs/features/ee/browser_ui/10_govern/scan_result_policy_vulnerabilities_spec.rb": 165.70961095799998,
|
||||
"qa/specs/features/ee/browser_ui/10_govern/security_policies_spec.rb": 73.778541443,
|
||||
"qa/specs/features/ee/browser_ui/10_govern/security_reports_spec.rb": 273.721594878,
|
||||
"qa/specs/features/ee/browser_ui/10_govern/user/minimal_access_user_spec.rb": 19.450109901,
|
||||
"qa/specs/features/ee/browser_ui/10_govern/vulnerabilities_jira_integration_spec.rb": 37.673220483,
|
||||
"qa/specs/features/ee/browser_ui/10_govern/vulnerability_management_spec.rb": 361.351684089,
|
||||
"qa/specs/features/ee/browser_ui/10_govern/vulnerability_security_training_spec.rb": 140.28406531500002,
|
||||
"qa/specs/features/ee/browser_ui/11_fulfillment/license/cloud_activation_spec.rb": 24.76485774,
|
||||
"qa/specs/features/ee/browser_ui/11_fulfillment/license/license_spec.rb": 5.131675512,
|
||||
"qa/specs/features/ee/browser_ui/11_fulfillment/saas_user_limit_experience_spec.rb": 166.484828247,
|
||||
"qa/specs/features/ee/browser_ui/11_fulfillment/utilization/free_namespace_storage_spec.rb": 338.338097346,
|
||||
"qa/specs/features/ee/browser_ui/11_fulfillment/utilization/namespace_storage_limit_spec.rb": 360.676223119,
|
||||
"qa/specs/features/ee/browser_ui/11_fulfillment/utilization/saas_user_caps_spec.rb": 40.118905731,
|
||||
"qa/specs/features/ee/browser_ui/11_fulfillment/utilization/user_registration_billing_spec.rb": 16.159188081,
|
||||
"qa/specs/features/ee/browser_ui/13_secure/cvs_dependency_scanning_spec.rb": 49.641502586,
|
||||
"qa/specs/features/ee/browser_ui/13_secure/enable_advanced_sast_spec.rb": 112.049596474,
|
||||
"qa/specs/features/ee/browser_ui/13_secure/enable_scanning_from_configuration_spec.rb": 178.765604474,
|
||||
"qa/specs/features/ee/browser_ui/13_secure/license_scanning_spec.rb": 125.274490067,
|
||||
"qa/specs/features/ee/browser_ui/13_secure/secret_push_protection_spec.rb": 106.725161695,
|
||||
"qa/specs/features/ee/browser_ui/15_growth/free_trial_spec.rb": 66.452879784,
|
||||
"qa/specs/features/ee/browser_ui/16_ai_powered/duo_chat/duo_chat_spec.rb": 48.929879781,
|
||||
"qa/specs/features/ee/browser_ui/16_ai_powered/duo_chat/root_cause_analysis_with_duo_chat_spec.rb": 38.493899247,
|
||||
"qa/specs/features/ee/browser_ui/1_manage/integrations/jira_issues_list_spec.rb": 56.004191573,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/analytics/contribution_analytics_spec.rb": 157.222857101,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/analytics/mr_analytics_spec.rb": 60.625560632,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/analytics/value_stream_analytics_spec.rb": 73.986416961,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/burndown_chart/burndown_chart_spec.rb": 24.113672335,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/custom_email/custom_email_spec.rb": 19.752673914,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/epic/epics_management_spec.rb": 319.49968694200004,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/epic/promote_issue_to_epic_spec.rb": 32.244788208,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/epic/roadmap_spec.rb": 14.062045857,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/group_wiki/create_group_wiki_page_spec.rb": 44.644047068000006,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/group_wiki/delete_group_wiki_page_spec.rb": 17.442662008,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/group_wiki/file_upload_group_wiki_page_spec.rb": 36.175085225,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/insights/default_insights_spec.rb": 34.773120551000005,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/issue/default_issue_template_spec.rb": 31.559494821,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/issue_boards/configurable_issue_board_spec.rb": 21.200958268,
|
||||
"qa/specs/features/api/3_create/merge_request/push_options_title_description_spec.rb": 28.38659008,
|
||||
"qa/specs/features/api/3_create/merge_request/view_merge_requests_spec.rb": 1.066474312,
|
||||
"qa/specs/features/api/3_create/repository/add_list_delete_branches_spec.rb": 17.302973593,
|
||||
"qa/specs/features/api/3_create/repository/commit_to_templated_project_spec.rb": 11.947510366,
|
||||
"qa/specs/features/api/3_create/repository/default_branch_name_setting_spec.rb": 12.55827129,
|
||||
"qa/specs/features/api/3_create/repository/files_spec.rb": 6.238860785,
|
||||
"qa/specs/features/api/3_create/repository/project_archive_compare_spec.rb": 6.915351225,
|
||||
"qa/specs/features/api/3_create/repository/push_postreceive_idempotent_spec.rb": 15.161442064,
|
||||
"qa/specs/features/api/3_create/repository/storage_size_spec.rb": 19.619850314,
|
||||
"qa/specs/features/api/3_create/repository/tag_revision_trigger_prereceive_hook_spec.rb": 7.566050907,
|
||||
"qa/specs/features/api/4_verify/api_variable_inheritance_with_forward_pipeline_variables_spec.rb": 70.961604516,
|
||||
"qa/specs/features/api/4_verify/cancel_pipeline_when_block_user_spec.rb": 23.319435391,
|
||||
"qa/specs/features/api/4_verify/file_variable_spec.rb": 45.828631361999996,
|
||||
"qa/specs/features/api/4_verify/job_downloads_artifacts_spec.rb": 42.621245139,
|
||||
"qa/specs/features/api/8_monitor/metrics_spec.rb": 4.437687256,
|
||||
"qa/specs/features/api/9_data_stores/user_inherited_access_spec.rb": 109.366308708,
|
||||
"qa/specs/features/api/9_data_stores/users_spec.rb": 3.24238859,
|
||||
"qa/specs/features/browser_ui/10_govern/group/group_access_token_spec.rb": 20.884159578,
|
||||
"qa/specs/features/browser_ui/10_govern/login/2fa_recovery_spec.rb": 48.6030293,
|
||||
"qa/specs/features/browser_ui/10_govern/login/2fa_ssh_recovery_spec.rb": 46.12915366,
|
||||
"qa/specs/features/browser_ui/10_govern/login/log_in_spec.rb": 13.470389703,
|
||||
"qa/specs/features/browser_ui/10_govern/login/log_in_with_2fa_spec.rb": 96.799800295,
|
||||
"qa/specs/features/browser_ui/10_govern/login/log_into_gitlab_via_ldap_spec.rb": 3.675757443,
|
||||
"qa/specs/features/browser_ui/10_govern/login/log_into_mattermost_via_gitlab_spec.rb": 29.499194668,
|
||||
"qa/specs/features/browser_ui/10_govern/login/login_via_instance_wide_saml_sso_spec.rb": 15.675629414,
|
||||
"qa/specs/features/browser_ui/10_govern/login/oauth_login_with_github_spec.rb": 41.344800517,
|
||||
"qa/specs/features/browser_ui/10_govern/login/register_spec.rb": 154.740306079,
|
||||
"qa/specs/features/browser_ui/10_govern/project/project_access_token_spec.rb": 23.619697619,
|
||||
"qa/specs/features/browser_ui/10_govern/user/impersonation_token_spec.rb": 31.737938604,
|
||||
"qa/specs/features/browser_ui/10_govern/user/user_access_termination_spec.rb": 38.388527405,
|
||||
"qa/specs/features/browser_ui/14_analytics/performance_bar_spec.rb": 29.550035142,
|
||||
"qa/specs/features/browser_ui/14_analytics/service_ping_default_enabled_spec.rb": 12.507425154,
|
||||
"qa/specs/features/browser_ui/14_analytics/service_ping_disabled_spec.rb": 11.554329748,
|
||||
"qa/specs/features/browser_ui/1_manage/integrations/jenkins/jenkins_build_status_spec.rb": 74.75657917,
|
||||
"qa/specs/features/browser_ui/1_manage/integrations/jira/jira_basic_integration_spec.rb": 50.204610974,
|
||||
"qa/specs/features/browser_ui/1_manage/integrations/jira/jira_issue_import_spec.rb": 46.263476784,
|
||||
"qa/specs/features/browser_ui/1_manage/integrations/pipeline_status_emails_spec.rb": 72.538779858,
|
||||
"qa/specs/features/browser_ui/1_manage/migration/gitlab_migration_group_spec.rb": 66.548360156,
|
||||
"qa/specs/features/browser_ui/1_manage/migration/gitlab_migration_user_contribution_reassignment_spec.rb": 184.810823405,
|
||||
"qa/specs/features/browser_ui/2_plan/design_management/add_design_content_spec.rb": 17.112755198,
|
||||
"qa/specs/features/browser_ui/2_plan/design_management/archive_design_content_spec.rb": 20.622880317,
|
||||
"qa/specs/features/browser_ui/2_plan/design_management/modify_design_content_spec.rb": 24.396673998,
|
||||
"qa/specs/features/browser_ui/2_plan/email/trigger_email_notification_spec.rb": 18.837022052,
|
||||
"qa/specs/features/browser_ui/2_plan/issue/check_mentions_for_xss_spec.rb": 25.513142393,
|
||||
"qa/specs/features/browser_ui/2_plan/issue/collapse_comments_in_discussions_spec.rb": 23.130392583,
|
||||
"qa/specs/features/browser_ui/2_plan/issue/comment_issue_spec.rb": 23.799777454,
|
||||
"qa/specs/features/browser_ui/2_plan/issue/create_issue_spec.rb": 68.938706691,
|
||||
"qa/specs/features/browser_ui/2_plan/issue/custom_issue_template_spec.rb": 28.123835432,
|
||||
"qa/specs/features/browser_ui/2_plan/issue/export_as_csv_spec.rb": 25.793262974,
|
||||
"qa/specs/features/browser_ui/2_plan/issue/filter_issue_comments_spec.rb": 27.9527115,
|
||||
"qa/specs/features/browser_ui/2_plan/issue/issue_suggestions_spec.rb": 22.082827172,
|
||||
"qa/specs/features/browser_ui/2_plan/issue/mentions_spec.rb": 29.762502589,
|
||||
"qa/specs/features/browser_ui/2_plan/issue/real_time_assignee_spec.rb": 18.243268385,
|
||||
"qa/specs/features/browser_ui/2_plan/issue_boards/focus_mode_spec.rb": 13.205469003,
|
||||
"qa/specs/features/browser_ui/2_plan/milestone/assign_milestone_spec.rb": 102.2504107,
|
||||
"qa/specs/features/browser_ui/2_plan/milestone/create_group_milestone_spec.rb": 14.578324534,
|
||||
"qa/specs/features/browser_ui/2_plan/milestone/create_project_milestone_spec.rb": 25.551894049,
|
||||
"qa/specs/features/browser_ui/2_plan/project_wiki/project_based_content_creation_spec.rb": 68.947195244,
|
||||
"qa/specs/features/browser_ui/2_plan/project_wiki/project_based_content_manipulation_spec.rb": 39.248787877,
|
||||
"qa/specs/features/browser_ui/2_plan/project_wiki/project_based_directory_management_spec.rb": 19.344108191,
|
||||
"qa/specs/features/browser_ui/2_plan/project_wiki/project_based_file_upload_spec.rb": 34.361448197,
|
||||
"qa/specs/features/browser_ui/2_plan/project_wiki/project_based_list_spec.rb": 45.837270816,
|
||||
"qa/specs/features/browser_ui/2_plan/project_wiki/project_based_page_deletion_spec.rb": 37.486972924,
|
||||
"qa/specs/features/browser_ui/2_plan/related_issues/related_issues_spec.rb": 23.959302156,
|
||||
"qa/specs/features/browser_ui/3_create/merge_request/cherry_pick/cherry_pick_a_merge_spec.rb": 42.896576228,
|
||||
"qa/specs/features/browser_ui/3_create/merge_request/cherry_pick/cherry_pick_commit_spec.rb": 35.344173919,
|
||||
"qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_spec.rb": 84.083543569,
|
||||
"qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_via_template_spec.rb": 35.080966204,
|
||||
"qa/specs/features/browser_ui/3_create/merge_request/merge_merge_request_from_fork_spec.rb": 59.780308378,
|
||||
"qa/specs/features/browser_ui/3_create/merge_request/merge_request_set_to_auto_merge_spec.rb": 64.4228714,
|
||||
"qa/specs/features/browser_ui/3_create/merge_request/rebase_merge_request_spec.rb": 64.580042078,
|
||||
"qa/specs/features/browser_ui/3_create/merge_request/revert/revert_commit_spec.rb": 29.634038914,
|
||||
"qa/specs/features/browser_ui/3_create/merge_request/revert/reverting_merge_request_spec.rb": 39.661481913,
|
||||
"qa/specs/features/browser_ui/3_create/merge_request/squash_merge_request_spec.rb": 33.270783184,
|
||||
"qa/specs/features/browser_ui/3_create/merge_request/suggestions/batch_suggestion_spec.rb": 62.738790531,
|
||||
"qa/specs/features/browser_ui/3_create/merge_request/suggestions/custom_commit_suggestion_spec.rb": 45.482610788,
|
||||
"qa/specs/features/browser_ui/3_create/merge_request/view_merge_request_diff_patch_spec.rb": 42.546968276,
|
||||
"qa/specs/features/browser_ui/3_create/repository/add_file_template_spec.rb": 80.265672967,
|
||||
"qa/specs/features/browser_ui/3_create/repository/add_new_branch_rule_spec.rb": 19.150883778,
|
||||
"qa/specs/features/browser_ui/3_create/repository/branch_with_unusual_name_spec.rb": 14.062908421,
|
||||
"qa/specs/features/browser_ui/3_create/repository/clone_spec.rb": 23.650358949,
|
||||
"qa/specs/features/browser_ui/3_create/repository/file/create_file_via_web_spec.rb": 13.465740873,
|
||||
"qa/specs/features/browser_ui/3_create/repository/file/delete_file_via_web_spec.rb": 12.293439471,
|
||||
"qa/specs/features/browser_ui/3_create/repository/file/edit_file_via_web_spec.rb": 25.052504758,
|
||||
"qa/specs/features/browser_ui/3_create/repository/file/file_with_unusual_name_spec.rb": 19.696802301,
|
||||
"qa/specs/features/browser_ui/3_create/repository/license_detection_spec.rb": 39.871681443,
|
||||
"qa/specs/features/browser_ui/3_create/repository/protected_tags_spec.rb": 90.961013423,
|
||||
"qa/specs/features/browser_ui/3_create/repository/protocol_v2_push_http_spec.rb": 18.312376595,
|
||||
"qa/specs/features/browser_ui/3_create/repository/protocol_v2_push_ssh_spec.rb": 14.736077082,
|
||||
"qa/specs/features/browser_ui/3_create/repository/push_http_private_token_spec.rb": 22.757864065,
|
||||
"qa/specs/features/browser_ui/3_create/repository/push_mirroring_lfs_over_http_spec.rb": 56.914073221,
|
||||
"qa/specs/features/browser_ui/3_create/repository/push_mirroring_over_http_spec.rb": 55.727138589,
|
||||
"qa/specs/features/browser_ui/3_create/repository/push_over_http_file_size_spec.rb": 49.757619446,
|
||||
"qa/specs/features/browser_ui/3_create/repository/push_over_http_spec.rb": 32.956181928,
|
||||
"qa/specs/features/browser_ui/3_create/repository/push_over_ssh_spec.rb": 46.763286418,
|
||||
"qa/specs/features/browser_ui/3_create/repository/push_protected_branch_spec.rb": 9.029045173,
|
||||
"qa/specs/features/browser_ui/3_create/repository/push_to_canary_gitaly_spec.rb": 21.429995577,
|
||||
"qa/specs/features/browser_ui/3_create/repository/ssh_key_support_create_spec.rb": 26.508486488,
|
||||
"qa/specs/features/browser_ui/3_create/repository/ssh_key_support_delete_spec.rb": 27.461300325,
|
||||
"qa/specs/features/browser_ui/3_create/repository/user_views_commit_diff_patch_spec.rb": 55.358643376,
|
||||
"qa/specs/features/browser_ui/3_create/snippet/add_comment_to_snippet_spec.rb": 39.454183363,
|
||||
"qa/specs/features/browser_ui/3_create/snippet/add_file_to_snippet_spec.rb": 41.717485904,
|
||||
"qa/specs/features/browser_ui/3_create/snippet/clone_push_pull_personal_snippet_spec.rb": 44.387163855,
|
||||
"qa/specs/features/browser_ui/3_create/snippet/clone_push_pull_project_snippet_spec.rb": 49.022856312,
|
||||
"qa/specs/features/browser_ui/3_create/snippet/copy_snippet_file_contents_spec.rb": 28.945912195,
|
||||
"qa/specs/features/browser_ui/3_create/snippet/create_personal_snippet_spec.rb": 14.603115557,
|
||||
"qa/specs/features/browser_ui/3_create/snippet/create_personal_snippet_with_multiple_files_spec.rb": 9.928460233,
|
||||
"qa/specs/features/browser_ui/3_create/snippet/create_project_snippet_spec.rb": 14.187126475,
|
||||
"qa/specs/features/browser_ui/3_create/snippet/create_project_snippet_with_multiple_files_spec.rb": 20.229409726,
|
||||
"qa/specs/features/browser_ui/3_create/snippet/delete_file_from_snippet_spec.rb": 39.718815249,
|
||||
"qa/specs/features/browser_ui/3_create/snippet/share_snippet_spec.rb": 24.427666539,
|
||||
"qa/specs/features/browser_ui/3_create/snippet/snippet_index_page_spec.rb": 51.683108373,
|
||||
"qa/specs/features/browser_ui/3_create/source_editor/source_editor_toolbar_spec.rb": 16.659267465,
|
||||
"qa/specs/features/browser_ui/3_create/web_ide/add_first_file_in_web_ide_spec.rb": 44.996488613,
|
||||
"qa/specs/features/browser_ui/3_create/web_ide/add_new_directory_in_web_ide_spec.rb": 60.052025751,
|
||||
"qa/specs/features/browser_ui/3_create/web_ide/closing_web_ide_with_unsaved_changes_spec.rb": 16.098516881,
|
||||
"qa/specs/features/browser_ui/3_create/web_ide/upload_new_file_in_web_ide_spec.rb": 124.171771431,
|
||||
"qa/specs/features/browser_ui/4_verify/ci_components_catalog/ci_catalog_sorting_spec.rb": 89.650983162,
|
||||
"qa/specs/features/browser_ui/4_verify/ci_components_catalog/release_with_glab_spec.rb": 120.466968316,
|
||||
"qa/specs/features/browser_ui/4_verify/ci_components_catalog/release_with_release_cli_spec.rb": 110.272751849,
|
||||
"qa/specs/features/browser_ui/4_verify/ci_components_catalog/run_component_in_project_pipeline_spec.rb": 59.471201613,
|
||||
"qa/specs/features/browser_ui/4_verify/ci_job_artifacts/expose_job_artifacts_in_mr_spec.rb": 45.067420642,
|
||||
"qa/specs/features/browser_ui/4_verify/ci_job_artifacts/job_artifacts_access_keyword_spec.rb": 188.88536632799998,
|
||||
"qa/specs/features/browser_ui/4_verify/ci_job_artifacts/unlocking_job_artifacts_across_pipelines_spec.rb": 241.750068223,
|
||||
"qa/specs/features/browser_ui/4_verify/ci_project_artifacts/user_can_bulk_delete_artifacts_spec.rb": 93.836106531,
|
||||
"qa/specs/features/browser_ui/4_verify/ci_variable/custom_variable_spec.rb": 48.024213995,
|
||||
"qa/specs/features/browser_ui/4_verify/ci_variable/pipeline_with_protected_variable_spec.rb": 93.671990631,
|
||||
"qa/specs/features/browser_ui/4_verify/ci_variable/prefill_variables_spec.rb": 34.91721646,
|
||||
"qa/specs/features/browser_ui/4_verify/ci_variable/raw_variables_defined_in_yaml_spec.rb": 30.904135899,
|
||||
"qa/specs/features/browser_ui/4_verify/ci_variable/ui_variable_inheritable_when_forward_pipeline_variables_true_spec.rb": 77.762237231,
|
||||
"qa/specs/features/browser_ui/4_verify/pipeline/include_local_config_file_paths_with_wildcard_spec.rb": 16.459257098,
|
||||
"qa/specs/features/browser_ui/4_verify/pipeline/include_multiple_files_from_a_project_spec.rb": 45.310208661,
|
||||
"qa/specs/features/browser_ui/4_verify/pipeline/include_multiple_files_from_multiple_projects_spec.rb": 36.273191348,
|
||||
"qa/specs/features/browser_ui/4_verify/pipeline/parent_child_pipelines_independent_relationship_spec.rb": 85.963783286,
|
||||
"qa/specs/features/browser_ui/4_verify/pipeline/pass_dotenv_variables_to_downstream_via_bridge_spec.rb": 57.639760794,
|
||||
"qa/specs/features/browser_ui/4_verify/pipeline/run_pipeline_with_manual_jobs_spec.rb": 57.584826949,
|
||||
"qa/specs/features/browser_ui/4_verify/pipeline/trigger_child_pipeline_with_manual_spec.rb": 43.224803965,
|
||||
"qa/specs/features/browser_ui/4_verify/pipeline/trigger_matrix_spec.rb": 62.718836569,
|
||||
"qa/specs/features/browser_ui/4_verify/pipeline/update_ci_file_with_pipeline_editor_spec.rb": 30.10048182,
|
||||
"qa/specs/features/browser_ui/4_verify/runner/deprecated_registration_token_spec.rb": 15.951011883,
|
||||
"qa/specs/features/browser_ui/4_verify/runner/deprecated_unregister_runner_spec.rb": 29.562428523,
|
||||
"qa/specs/features/browser_ui/4_verify/runner/fleet_visibility/group_runner_counts_spec.rb": 24.808070433,
|
||||
"qa/specs/features/browser_ui/4_verify/runner/fleet_visibility/group_runner_status_counts_spec.rb": 14.921769528,
|
||||
"qa/specs/features/browser_ui/4_verify/runner/register_group_runner_spec.rb": 17.852138531,
|
||||
"qa/specs/features/browser_ui/4_verify/runner/register_project_runner_spec.rb": 27.274066684,
|
||||
"qa/specs/features/browser_ui/4_verify/testing/endpoint_coverage_spec.rb": 48.670504167,
|
||||
"qa/specs/features/browser_ui/5_package/container_registry/self_managed/container_registry_spec.rb": 342.91872073900004,
|
||||
"qa/specs/features/browser_ui/5_package/dependency_proxy/dependency_proxy_spec.rb": 167.621924289,
|
||||
"qa/specs/features/browser_ui/5_package/package_registry/composer_registry_spec.rb": 36.168808185,
|
||||
"qa/specs/features/browser_ui/5_package/package_registry/conan_repository_spec.rb": 74.173228599,
|
||||
"qa/specs/features/browser_ui/5_package/package_registry/generic_repository_spec.rb": 58.14390326,
|
||||
"qa/specs/features/browser_ui/5_package/package_registry/helm_registry_spec.rb": 242.55800127199998,
|
||||
"qa/specs/features/browser_ui/5_package/package_registry/maven/maven_group_level_spec.rb": 461.349986329,
|
||||
"qa/specs/features/browser_ui/5_package/package_registry/maven/maven_project_level_spec.rb": 287.101986024,
|
||||
"qa/specs/features/browser_ui/5_package/package_registry/maven_gradle_repository_spec.rb": 246.54245700399997,
|
||||
"qa/specs/features/browser_ui/5_package/package_registry/npm/npm_group_level_spec.rb": 278.234447754,
|
||||
"qa/specs/features/browser_ui/5_package/package_registry/npm/npm_instance_level_spec.rb": 306.639067572,
|
||||
"qa/specs/features/browser_ui/5_package/package_registry/pypi_repository_spec.rb": 89.191043624,
|
||||
"qa/specs/features/browser_ui/6_release/deploy_key/add_deploy_key_spec.rb": 26.403964987,
|
||||
"qa/specs/features/browser_ui/6_release/deploy_key/clone_using_deploy_key_spec.rb": 135.265758206,
|
||||
"qa/specs/features/browser_ui/6_release/deploy_token/add_deploy_token_spec.rb": 7.15636057,
|
||||
"qa/specs/features/browser_ui/8_monitor/alert_management/alert_settings_create_new_alerts_spec.rb": 48.756705049000004,
|
||||
"qa/specs/features/browser_ui/8_monitor/alert_management/automatically_creates_incident_for_alert_spec.rb": 46.608928257,
|
||||
"qa/specs/features/browser_ui/8_monitor/alert_management/create_alert_using_authorization_key_spec.rb": 46.130182371000004,
|
||||
"qa/specs/features/browser_ui/8_monitor/alert_management/email_notification_for_alert_spec.rb": 63.31910753300001,
|
||||
"qa/specs/features/browser_ui/8_monitor/alert_management/recovery_alert_resolves_correct_alert_spec.rb": 22.255371439,
|
||||
"qa/specs/features/browser_ui/9_data_stores/group/create_group_with_mattermost_team_spec.rb": 8.218689961,
|
||||
"qa/specs/features/browser_ui/9_data_stores/group/group_member_access_request_spec.rb": 62.590563953,
|
||||
"qa/specs/features/browser_ui/9_data_stores/group/transfer_project_spec.rb": 21.377610899,
|
||||
"qa/specs/features/browser_ui/9_data_stores/project/add_project_member_spec.rb": 29.94356556,
|
||||
"qa/specs/features/browser_ui/9_data_stores/project/create_project_badge_spec.rb": 18.211674726,
|
||||
"qa/specs/features/browser_ui/9_data_stores/project/create_project_spec.rb": 51.785685975,
|
||||
"qa/specs/features/browser_ui/9_data_stores/project/dashboard_images_spec.rb": 12.009003165,
|
||||
"qa/specs/features/browser_ui/9_data_stores/project/invite_group_to_project_spec.rb": 75.93151621499999,
|
||||
"qa/specs/features/browser_ui/9_data_stores/project/project_owner_permissions_spec.rb": 98.39806995,
|
||||
"qa/specs/features/browser_ui/9_data_stores/project/view_project_activity_spec.rb": 25.584366387,
|
||||
"qa/specs/features/browser_ui/9_data_stores/user/follow_user_activity_spec.rb": 30.704322695,
|
||||
"qa/specs/features/browser_ui/9_data_stores/user/parent_group_access_termination_spec.rb": 24.760187266,
|
||||
"qa/specs/features/browser_ui/9_data_stores/user/user_inherited_access_spec.rb": 34.281755143,
|
||||
"qa/specs/features/ee/api/10_govern/compliance_pipeline_spec.rb": 37.249822315,
|
||||
"qa/specs/features/ee/api/10_govern/instance_audit_event_streaming_spec.rb": 38.148216598000005,
|
||||
"qa/specs/features/ee/api/10_govern/user/minimal_access_user_spec.rb": 79.301462194,
|
||||
"qa/specs/features/ee/api/1_manage/import/import_github_repo_spec.rb": 68.157577469,
|
||||
"qa/specs/features/ee/api/1_manage/integrations/group_webhook_events_spec.rb": 6.175398375,
|
||||
"qa/specs/features/ee/api/1_manage/migration/gitlab_migration_group_spec.rb": 76.611877391,
|
||||
"qa/specs/features/ee/api/2_plan/epics_milestone_dates_spec.rb": 59.947881054999996,
|
||||
"qa/specs/features/ee/api/3_create/code_suggestions_spec.rb": 32.81480769099999,
|
||||
"qa/specs/features/ee/api/9_data_stores/elasticsearch/advanced_global_advanced_syntax_search_spec.rb": 221.522062269,
|
||||
"qa/specs/features/ee/api/9_data_stores/elasticsearch/elasticsearch_api_spec.rb": 50.21099164399999,
|
||||
"qa/specs/features/ee/api/9_data_stores/elasticsearch/index_tests/commit_index/commit_index_spec.rb": 25.281285966,
|
||||
"qa/specs/features/ee/api/9_data_stores/elasticsearch/index_tests/issues_index/issue_index_spec.rb": 68.643452195,
|
||||
"qa/specs/features/ee/api/9_data_stores/elasticsearch/index_tests/main_index/blob_index_spec.rb": 25.124937659,
|
||||
"qa/specs/features/ee/api/9_data_stores/elasticsearch/index_tests/merge_request_index/merge_request_index_spec.rb": 65.973047329,
|
||||
"qa/specs/features/ee/api/9_data_stores/elasticsearch/index_tests/notes_index/note_index_spec.rb": 127.609178426,
|
||||
"qa/specs/features/ee/api/9_data_stores/elasticsearch/index_tests/user_index/user_index_spec.rb": 31.673484341,
|
||||
"qa/specs/features/ee/api/9_data_stores/elasticsearch/nightly_elasticsearch_test_spec.rb": 12.993213276,
|
||||
"qa/specs/features/ee/browser_ui/10_govern/change_vulnerability_status_spec.rb": 118.256470398,
|
||||
"qa/specs/features/ee/browser_ui/10_govern/create_merge_request_with_secure_spec.rb": 83.41515636,
|
||||
"qa/specs/features/ee/browser_ui/10_govern/dismissed_vulnerabilities_in_security_widget_spec.rb": 97.634803005,
|
||||
"qa/specs/features/ee/browser_ui/10_govern/export_vulnerability_report_spec.rb": 27.580469374,
|
||||
"qa/specs/features/ee/browser_ui/10_govern/fix_vulnerability_workflow_spec.rb": 132.622915286,
|
||||
"qa/specs/features/ee/browser_ui/10_govern/group/group_audit_event_streaming_spec.rb": 36.154071701,
|
||||
"qa/specs/features/ee/browser_ui/10_govern/group/group_audit_logs_1_spec.rb": 105.533416678,
|
||||
"qa/specs/features/ee/browser_ui/10_govern/group/group_ldap_sync_spec.rb": 96.86058676500001,
|
||||
"qa/specs/features/ee/browser_ui/10_govern/group/restrict_by_ip_address_spec.rb": 125.106864246,
|
||||
"qa/specs/features/ee/browser_ui/10_govern/group_pipeline_execution_policy_spec.rb": 218.93958026299998,
|
||||
"qa/specs/features/ee/browser_ui/10_govern/instance/instance_audit_logs_spec.rb": 94.88584477100001,
|
||||
"qa/specs/features/ee/browser_ui/10_govern/project/project_audit_logs_spec.rb": 147.195983343,
|
||||
"qa/specs/features/ee/browser_ui/10_govern/project_security_dashboard_spec.rb": 59.656660243,
|
||||
"qa/specs/features/ee/browser_ui/10_govern/scan_execution_policy_vulnerabilities_spec.rb": 165.05305199499998,
|
||||
"qa/specs/features/ee/browser_ui/10_govern/scan_result_policy_vulnerabilities_spec.rb": 116.254902098,
|
||||
"qa/specs/features/ee/browser_ui/10_govern/security_policies_spec.rb": 78.632534646,
|
||||
"qa/specs/features/ee/browser_ui/10_govern/security_reports_spec.rb": 218.76989548,
|
||||
"qa/specs/features/ee/browser_ui/10_govern/user/minimal_access_user_spec.rb": 11.265978197,
|
||||
"qa/specs/features/ee/browser_ui/10_govern/vulnerabilities_jira_integration_spec.rb": 22.508863297,
|
||||
"qa/specs/features/ee/browser_ui/10_govern/vulnerability_management_spec.rb": 376.789075965,
|
||||
"qa/specs/features/ee/browser_ui/10_govern/vulnerability_security_training_spec.rb": 117.87720234400001,
|
||||
"qa/specs/features/ee/browser_ui/11_fulfillment/license/cloud_activation_spec.rb": 36.771045692,
|
||||
"qa/specs/features/ee/browser_ui/11_fulfillment/license/license_spec.rb": 9.665360797,
|
||||
"qa/specs/features/ee/browser_ui/11_fulfillment/utilization/user_registration_billing_spec.rb": 14.977692629,
|
||||
"qa/specs/features/ee/browser_ui/13_secure/cvs_dependency_scanning_spec.rb": 51.608331159,
|
||||
"qa/specs/features/ee/browser_ui/13_secure/enable_advanced_sast_spec.rb": 116.03136399,
|
||||
"qa/specs/features/ee/browser_ui/13_secure/enable_scanning_from_configuration_spec.rb": 56.57263501,
|
||||
"qa/specs/features/ee/browser_ui/13_secure/secret_push_protection_spec.rb": 98.280735822,
|
||||
"qa/specs/features/ee/browser_ui/16_ai_powered/duo_chat/duo_chat_spec.rb": 10.692725172,
|
||||
"qa/specs/features/ee/browser_ui/1_manage/integrations/jira_issues_list_spec.rb": 55.95333230200001,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/analytics/contribution_analytics_spec.rb": 40.807896316,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/analytics/mr_analytics_spec.rb": 36.103928129,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/analytics/value_stream_analytics_spec.rb": 40.281826064,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/burndown_chart/burndown_chart_spec.rb": 12.659101894,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/custom_email/custom_email_spec.rb": 11.58376173,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/epic/epics_management_spec.rb": 141.806334702,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/epic/promote_issue_to_epic_spec.rb": 22.525327881,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/epic/roadmap_spec.rb": 7.500150224,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/group_wiki/create_group_wiki_page_spec.rb": 25.702277770000002,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/group_wiki/delete_group_wiki_page_spec.rb": 9.675779404,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/group_wiki/file_upload_group_wiki_page_spec.rb": 30.957822153,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/insights/default_insights_spec.rb": 16.238390096,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/issue/default_issue_template_spec.rb": 29.249965,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/issue_boards/configurable_issue_board_spec.rb": 17.492410485,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/issue_boards/configure_issue_board_by_label_spec.rb": 37.026881088,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/issue_boards/create_group_issue_board_spec.rb": 40.297194774,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/issue_boards/group_issue_boards_spec.rb": 33.053333919,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/issue_boards/project_issue_boards_spec.rb": 76.522728512,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/issue_boards/read_only_board_configuration_spec.rb": 31.591133683,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/issue_boards/sum_of_issues_weights_spec.rb": 24.444189943,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/issues_analytics/issues_analytics_spec.rb": 31.975009607000004,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/issues_weight/issue_weight_visualization_spec.rb": 24.741162705,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/iterations/assign_group_iteration_spec.rb": 30.638181297,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/iterations/create_group_iteration_spec.rb": 43.798707881,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/multiple_assignees_for_issues/four_assignees_spec.rb": 30.591574551,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/multiple_assignees_for_issues/more_than_four_assignees_spec.rb": 65.155360614,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/scoped_labels/editing_scoped_labels_spec.rb": 22.698721453,
|
||||
"qa/specs/features/ee/browser_ui/3_create/merge_request/add_batch_comments_in_merge_request_spec.rb": 93.028857252,
|
||||
"qa/specs/features/ee/browser_ui/3_create/merge_request/approval_rules_spec.rb": 123.610149575,
|
||||
"qa/specs/features/ee/browser_ui/3_create/merge_request/default_merge_request_template_spec.rb": 47.439682203,
|
||||
"qa/specs/features/ee/browser_ui/3_create/merge_request/generate_commit_message_spec.rb": 31.625208,
|
||||
"qa/specs/features/ee/browser_ui/3_create/remote_development/workspace_actions_spec.rb": 571.157858578,
|
||||
"qa/specs/features/ee/browser_ui/3_create/repository/assign_code_owners_spec.rb": 62.104326601,
|
||||
"qa/specs/features/ee/browser_ui/3_create/repository/code_owners_spec.rb": 30.475563695,
|
||||
"qa/specs/features/ee/browser_ui/3_create/repository/code_owners_with_protected_branch_and_squashed_commits_spec.rb": 33.75106562,
|
||||
"qa/specs/features/ee/browser_ui/3_create/repository/duo_chat_explain_code_spec.rb": 28.478300814,
|
||||
"qa/specs/features/ee/browser_ui/3_create/repository/file_locking_spec.rb": 278.9392209,
|
||||
"qa/specs/features/ee/browser_ui/3_create/repository/group_file_template_spec.rb": 175.183385209,
|
||||
"qa/specs/features/ee/browser_ui/3_create/repository/merge_with_code_owner_in_root_group_spec.rb": 120.362887472,
|
||||
"qa/specs/features/ee/browser_ui/3_create/repository/merge_with_code_owner_in_subgroup_spec.rb": 191.874764999,
|
||||
"qa/specs/features/ee/browser_ui/3_create/repository/project_templates_spec.rb": 168.886061192,
|
||||
"qa/specs/features/ee/browser_ui/3_create/repository/pull_mirroring_over_http_spec.rb": 48.211144716,
|
||||
"qa/specs/features/ee/browser_ui/3_create/repository/pull_mirroring_over_ssh_with_key_spec.rb": 63.208217308,
|
||||
"qa/specs/features/ee/browser_ui/3_create/repository/push_rules_spec.rb": 446.51060266400003,
|
||||
"qa/specs/features/ee/browser_ui/3_create/repository/restrict_push_protected_branch_spec.rb": 265.375694367,
|
||||
"qa/specs/features/ee/browser_ui/3_create/web_ide/code_suggestions_in_web_ide_spec.rb": 170.044621673,
|
||||
"qa/specs/features/ee/browser_ui/3_create/web_ide/duo_chat_in_web_ide_spec.rb": 35.11706178,
|
||||
"qa/specs/features/ee/browser_ui/4_verify/multi-project_pipelines_spec.rb": 54.267491703,
|
||||
"qa/specs/features/ee/browser_ui/4_verify/parent_child_pipelines_dependent_relationship_spec.rb": 95.794113369,
|
||||
"qa/specs/features/ee/browser_ui/4_verify/pipeline_for_merged_result_spec.rb": 62.295641429,
|
||||
"qa/specs/features/ee/browser_ui/4_verify/pipeline_subscription_with_group_owned_project_spec.rb": 66.629194377,
|
||||
"qa/specs/features/ee/browser_ui/8_monitor/incident_management/incident_quick_action_spec.rb": 22.324902426,
|
||||
"qa/specs/features/ee/browser_ui/9_data_stores/elasticsearch/elasticsearch_reindexing_spec.rb": 137.001752409,
|
||||
"qa/specs/features/ee/browser_ui/9_data_stores/group/prevent_forking_outside_group_spec.rb": 50.627923284000005,
|
||||
"qa/specs/features/ee/browser_ui/9_data_stores/group/share_group_with_group_spec.rb": 38.096980432
|
||||
"qa/specs/features/ee/browser_ui/2_plan/issue_boards/create_group_issue_board_spec.rb": 21.34695632,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/issue_boards/group_issue_boards_spec.rb": 16.793227441,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/issue_boards/project_issue_boards_spec.rb": 38.686717357999996,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/issue_boards/read_only_board_configuration_spec.rb": 20.336747158,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/issue_boards/sum_of_issues_weights_spec.rb": 13.48637805,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/issues_analytics/issues_analytics_spec.rb": 17.763977946,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/issues_weight/issue_weight_visualization_spec.rb": 25.342011643,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/iterations/assign_group_iteration_spec.rb": 29.066942874,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/iterations/create_group_iteration_spec.rb": 39.446017202,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/multiple_assignees_for_issues/four_assignees_spec.rb": 27.22286239,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/multiple_assignees_for_issues/more_than_four_assignees_spec.rb": 44.784409726,
|
||||
"qa/specs/features/ee/browser_ui/2_plan/scoped_labels/editing_scoped_labels_spec.rb": 18.807005081,
|
||||
"qa/specs/features/ee/browser_ui/3_create/merge_request/add_batch_comments_in_merge_request_spec.rb": 96.47948463099999,
|
||||
"qa/specs/features/ee/browser_ui/3_create/merge_request/approval_rules_spec.rb": 74.671810428,
|
||||
"qa/specs/features/ee/browser_ui/3_create/merge_request/default_merge_request_template_spec.rb": 37.714924927,
|
||||
"qa/specs/features/ee/browser_ui/3_create/repository/assign_code_owners_spec.rb": 44.637867443,
|
||||
"qa/specs/features/ee/browser_ui/3_create/repository/code_owners_spec.rb": 26.644627482,
|
||||
"qa/specs/features/ee/browser_ui/3_create/repository/code_owners_with_protected_branch_and_squashed_commits_spec.rb": 30.831724099,
|
||||
"qa/specs/features/ee/browser_ui/3_create/repository/file_locking_spec.rb": 189.527641821,
|
||||
"qa/specs/features/ee/browser_ui/3_create/repository/group_file_template_spec.rb": 119.58081441099999,
|
||||
"qa/specs/features/ee/browser_ui/3_create/repository/merge_with_code_owner_in_root_group_spec.rb": 89.85365523,
|
||||
"qa/specs/features/ee/browser_ui/3_create/repository/merge_with_code_owner_in_subgroup_spec.rb": 149.80125508,
|
||||
"qa/specs/features/ee/browser_ui/3_create/repository/project_templates_spec.rb": 66.12111692799999,
|
||||
"qa/specs/features/ee/browser_ui/3_create/repository/pull_mirroring_over_http_spec.rb": 27.106594879,
|
||||
"qa/specs/features/ee/browser_ui/3_create/repository/pull_mirroring_over_ssh_with_key_spec.rb": 46.357188145,
|
||||
"qa/specs/features/ee/browser_ui/3_create/repository/push_rules_spec.rb": 312.002049168,
|
||||
"qa/specs/features/ee/browser_ui/3_create/repository/restrict_push_protected_branch_spec.rb": 234.001492907,
|
||||
"qa/specs/features/ee/browser_ui/3_create/web_ide/code_suggestions_in_web_ide_spec.rb": 173.89521384699998,
|
||||
"qa/specs/features/ee/browser_ui/4_verify/multi-project_pipelines_spec.rb": 74.40245243,
|
||||
"qa/specs/features/ee/browser_ui/4_verify/parent_child_pipelines_dependent_relationship_spec.rb": 114.19058237600001,
|
||||
"qa/specs/features/ee/browser_ui/4_verify/pipeline_for_merged_result_spec.rb": 34.890185963,
|
||||
"qa/specs/features/ee/browser_ui/4_verify/pipeline_subscription_with_group_owned_project_spec.rb": 46.661045643,
|
||||
"qa/specs/features/ee/browser_ui/8_monitor/incident_management/incident_quick_action_spec.rb": 15.961611537,
|
||||
"qa/specs/features/ee/browser_ui/9_data_stores/elasticsearch/elasticsearch_reindexing_spec.rb": 180.952814972,
|
||||
"qa/specs/features/ee/browser_ui/9_data_stores/group/prevent_forking_outside_group_spec.rb": 41.987987374,
|
||||
"qa/specs/features/ee/browser_ui/9_data_stores/group/share_group_with_group_spec.rb": 41.767111724
|
||||
}
|
||||
|
|
|
|||
|
|
@ -141,5 +141,32 @@ RSpec.describe UserSettings::PersonalAccessTokensController, feature_category: :
|
|||
it 'sets available scopes' do
|
||||
expect(assigns(:scopes)).to eq(Gitlab::Auth.available_scopes_for(access_token_user))
|
||||
end
|
||||
|
||||
context 'with feature flags virtual_registry_maven and dependency_proxy_read_write_scopes disabled' do
|
||||
before do
|
||||
stub_feature_flags(virtual_registry_maven: false, dependency_proxy_read_write_scopes: false)
|
||||
stub_config(dependency_proxy: { enabled: true })
|
||||
|
||||
get :index
|
||||
end
|
||||
|
||||
it 'does not include the virtual registry scopes' do
|
||||
expect(assigns(:scopes)).not_to include(Gitlab::Auth::READ_VIRTUAL_REGISTRY_SCOPE)
|
||||
expect(assigns(:scopes)).not_to include(Gitlab::Auth::WRITE_VIRTUAL_REGISTRY_SCOPE)
|
||||
end
|
||||
|
||||
%i[virtual_registry_maven dependency_proxy_read_write_scopes].each do |feature_flag|
|
||||
context "with feature flag #{feature_flag} enabled" do
|
||||
before do
|
||||
stub_feature_flags(feature_flag => true)
|
||||
end
|
||||
|
||||
it 'includes the virtual registry scopes' do
|
||||
expect(assigns(:scopes)).not_to include(::Gitlab::Auth::READ_VIRTUAL_REGISTRY_SCOPE)
|
||||
expect(assigns(:scopes)).not_to include(::Gitlab::Auth::WRITE_VIRTUAL_REGISTRY_SCOPE)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -173,7 +173,6 @@ describe('ModelCreate', () => {
|
|||
createWrapper();
|
||||
findNameInput().vm.$emit('input', 'gpt-alice-1');
|
||||
findDescriptionInput().vm.$emit('input', 'My model description');
|
||||
jest.spyOn(apolloProvider.defaultClient, 'mutate');
|
||||
|
||||
await submitForm();
|
||||
});
|
||||
|
|
@ -190,7 +189,6 @@ describe('ModelCreate', () => {
|
|||
.fn()
|
||||
.mockResolvedValue(createModelResponses.validationFailure);
|
||||
createWrapper(failedCreateModelResolver);
|
||||
jest.spyOn(apolloProvider.defaultClient, 'mutate');
|
||||
|
||||
findNameInput().vm.$emit('input', 'gpt-alice-1');
|
||||
await submitForm();
|
||||
|
|
@ -207,15 +205,17 @@ describe('ModelCreate', () => {
|
|||
|
||||
it('Logs to sentry upon an exception', async () => {
|
||||
const error = new Error('Runtime error');
|
||||
createWrapper();
|
||||
jest.spyOn(apolloProvider.defaultClient, 'mutate').mockImplementation(() => {
|
||||
const errorResolver = jest.fn().mockImplementation(() => {
|
||||
throw error;
|
||||
});
|
||||
createWrapper(errorResolver);
|
||||
|
||||
findNameInput().vm.$emit('input', 'gpt-alice-1');
|
||||
await submitForm();
|
||||
|
||||
expect(Sentry.captureException).toHaveBeenCalledWith(error);
|
||||
expect(Sentry.captureException).toHaveBeenCalledWith(
|
||||
new Error('Unexpected error whilst calling request handler: Runtime error'),
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@ jest.mock('~/lib/utils/url_utility', () => ({
|
|||
describe('ModelEdit', () => {
|
||||
let wrapper;
|
||||
let apolloProvider;
|
||||
const successfulEditModelResolver = jest.fn().mockResolvedValue(editModelResponses.success);
|
||||
|
||||
beforeEach(() => {
|
||||
jest.spyOn(Sentry, 'captureException').mockImplementation();
|
||||
|
|
@ -30,10 +31,7 @@ describe('ModelEdit', () => {
|
|||
apolloProvider = null;
|
||||
});
|
||||
|
||||
const createWrapper = (
|
||||
modelProp = model,
|
||||
editModelResolver = jest.fn().mockResolvedValue(editModelResponses.success),
|
||||
) => {
|
||||
const createWrapper = (modelProp = model, editModelResolver = successfulEditModelResolver) => {
|
||||
const requestHandlers = [[editModelMutation, editModelResolver]];
|
||||
apolloProvider = createMockApollo(requestHandlers);
|
||||
|
||||
|
|
@ -118,23 +116,17 @@ describe('ModelEdit', () => {
|
|||
createWrapper();
|
||||
findMarkdownEditor().vm.$emit('input', 'My model description');
|
||||
await Vue.nextTick();
|
||||
jest.spyOn(apolloProvider.defaultClient, 'mutate');
|
||||
|
||||
await submitForm();
|
||||
});
|
||||
|
||||
it('makes a create model mutation upon confirm', () => {
|
||||
expect(apolloProvider.defaultClient.mutate).toHaveBeenCalledWith(
|
||||
expect.objectContaining({
|
||||
mutation: editModelMutation,
|
||||
variables: {
|
||||
description: 'My model description',
|
||||
modelId: 1,
|
||||
name: model.name,
|
||||
projectPath: 'some/project',
|
||||
},
|
||||
}),
|
||||
);
|
||||
expect(successfulEditModelResolver).toHaveBeenCalledWith({
|
||||
description: 'My model description',
|
||||
modelId: 1,
|
||||
name: model.name,
|
||||
projectPath: 'some/project',
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
|
|
@ -143,8 +135,6 @@ describe('ModelEdit', () => {
|
|||
createWrapper(model, jest.fn().mockResolvedValue(editModelResponses.validationFailure));
|
||||
findMarkdownEditor().vm.$emit('input', 'My model description');
|
||||
await Vue.nextTick();
|
||||
jest.spyOn(apolloProvider.defaultClient, 'mutate');
|
||||
|
||||
await submitForm();
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -389,6 +389,28 @@ RSpec.describe Gitlab::ApplicationRateLimiter, :clean_gitlab_redis_rate_limiting
|
|||
end
|
||||
end
|
||||
|
||||
context 'with peek' do
|
||||
let(:scope) { [user, project] }
|
||||
let(:start_time) { Time.current.beginning_of_hour }
|
||||
let(:kwargs) { { scope: scope, resource_key: resource_key, threshold: threshold, interval: interval } }
|
||||
|
||||
it 'allows peeking at the current resource usage without changing its value' do
|
||||
travel_to(start_time) do
|
||||
# increment usage up to threshold
|
||||
expect(subject.resource_usage_throttled?(:test_action, **kwargs)).to eq(false)
|
||||
|
||||
# peeking at current usage returns false because the value is still the same as threshold
|
||||
expect(subject.resource_usage_throttled?(:test_action, peek: true, **kwargs)).to eq(false)
|
||||
|
||||
# increment again, current usage is now > threshold
|
||||
expect(subject.resource_usage_throttled?(:test_action, **kwargs)).to eq(true)
|
||||
|
||||
# peeking again
|
||||
expect(subject.resource_usage_throttled?(:test_action, peek: true, **kwargs)).to eq(true)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'when tracking resource usage throttles' do
|
||||
let(:histogram_double) { instance_double(Prometheus::Client::Histogram) }
|
||||
|
||||
|
|
|
|||
|
|
@ -45,10 +45,10 @@ RSpec.describe Gitlab::GithubImport::Importer::CollaboratorImporter, feature_cat
|
|||
}.stringify_keys
|
||||
end
|
||||
|
||||
let(:member_finder_relations) { ::Import::ReassignPlaceholderUserRecordsService::PROJECT_FINDER_MEMBER_RELATIONS }
|
||||
|
||||
describe '#execute' do
|
||||
before do
|
||||
# We don't import collaborators/members if the user mapping feature is enabled
|
||||
stub_feature_flags(github_user_mapping: false)
|
||||
allow_next_instance_of(Gitlab::GithubImport::UserFinder) do |finder|
|
||||
allow(finder).to receive(:find).with(github_user_id, user.username).and_return(user.id)
|
||||
end
|
||||
|
|
@ -115,6 +115,26 @@ RSpec.describe Gitlab::GithubImport::Importer::CollaboratorImporter, feature_cat
|
|||
end
|
||||
end
|
||||
|
||||
context 'when finding existing memberships' do
|
||||
let(:github_role_name) { 'admin' }
|
||||
|
||||
before do
|
||||
create(:group_member, group: group, user: user, access_level: Gitlab::Access::DEVELOPER)
|
||||
end
|
||||
|
||||
it 'passes the correct member finder relations to the members finder' do
|
||||
source_user.accept!
|
||||
expect_next_instance_of(MembersFinder) do |members_finder|
|
||||
expect(members_finder)
|
||||
.to receive(:execute)
|
||||
.with(include_relations: member_finder_relations)
|
||||
.and_call_original
|
||||
end
|
||||
|
||||
importer.execute
|
||||
end
|
||||
end
|
||||
|
||||
context 'when user has lower role in a project group' do
|
||||
before do
|
||||
create(:group_member, group: group, user: user, access_level: Gitlab::Access::DEVELOPER)
|
||||
|
|
|
|||
|
|
@ -3,37 +3,39 @@
|
|||
require 'spec_helper'
|
||||
|
||||
RSpec.describe Gitlab::ResourceUsageLimiter, feature_category: :shared do
|
||||
let(:resource_key) { 'db_duration_s' }
|
||||
let(:worker_name) { 'test_worker' }
|
||||
let(:threshold) { 100 }
|
||||
let(:interval) { 60 }
|
||||
|
||||
let(:limits) do
|
||||
[
|
||||
Gitlab::SidekiqLimits::Limit.new(
|
||||
:test_limit_per_user,
|
||||
resource_key,
|
||||
%w[worker_name user_id],
|
||||
nil,
|
||||
threshold,
|
||||
interval
|
||||
),
|
||||
Gitlab::SidekiqLimits::Limit.new(
|
||||
:test_limit,
|
||||
resource_key,
|
||||
%w[worker_name],
|
||||
nil,
|
||||
threshold,
|
||||
interval
|
||||
)
|
||||
]
|
||||
end
|
||||
|
||||
before do
|
||||
allow(Gitlab::ApplicationContext).to receive(:current).and_return({ user_id: 1 })
|
||||
allow(Gitlab::SidekiqLimits).to receive(:limits_for).and_return(limits)
|
||||
end
|
||||
|
||||
describe '.exceeded_limits' do
|
||||
let(:resource_key) { 'db_duration_s' }
|
||||
let(:worker_name) { 'test_worker' }
|
||||
let(:threshold) { 100 }
|
||||
let(:interval) { 60 }
|
||||
|
||||
let(:limits) do
|
||||
[
|
||||
Gitlab::SidekiqLimits::Limit.new(
|
||||
:test_limit_per_user,
|
||||
resource_key,
|
||||
%w[worker_name user_id],
|
||||
nil,
|
||||
threshold,
|
||||
interval
|
||||
),
|
||||
Gitlab::SidekiqLimits::Limit.new(
|
||||
:test_limit,
|
||||
resource_key,
|
||||
%w[worker_name],
|
||||
nil,
|
||||
threshold,
|
||||
interval
|
||||
)
|
||||
]
|
||||
end
|
||||
|
||||
before do
|
||||
allow(Gitlab::ApplicationContext).to receive(:current).and_return({ user_id: 1 })
|
||||
allow(Gitlab::SidekiqLimits).to receive(:limits_for).and_return(limits)
|
||||
end
|
||||
let(:peek) { false }
|
||||
|
||||
it 'returns empty list if worker_name is missing' do
|
||||
expect(described_class.new.exceeded_limits).to eq([])
|
||||
|
|
@ -44,13 +46,13 @@ RSpec.describe Gitlab::ResourceUsageLimiter, feature_category: :shared do
|
|||
.to receive(:resource_usage_throttled?)
|
||||
.once
|
||||
.with(:test_limit, resource_key: resource_key, scope: [worker_name],
|
||||
threshold: threshold, interval: interval)
|
||||
threshold: threshold, interval: interval, peek: peek)
|
||||
|
||||
expect(Gitlab::ApplicationRateLimiter)
|
||||
.to receive(:resource_usage_throttled?)
|
||||
.once
|
||||
.with(:test_limit_per_user, resource_key: resource_key, scope: [worker_name,
|
||||
1], threshold: threshold, interval: interval)
|
||||
1], threshold: threshold, interval: interval, peek: peek)
|
||||
|
||||
described_class.new(worker_name: worker_name).exceeded_limits
|
||||
end
|
||||
|
|
@ -70,4 +72,76 @@ RSpec.describe Gitlab::ResourceUsageLimiter, feature_category: :shared do
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe '.exceeded_limits?' do
|
||||
let(:peek) { true }
|
||||
let(:resource_usage_limiter) { described_class.new(worker_name: worker_name) }
|
||||
|
||||
subject(:exceeded_limits?) { resource_usage_limiter.exceeded_limits? }
|
||||
|
||||
it 'returns false if worker_name is missing' do
|
||||
expect(described_class.new).not_to be_exceeded_limits
|
||||
end
|
||||
|
||||
it 'checks against all limits with peek' do
|
||||
expect(Gitlab::ApplicationRateLimiter)
|
||||
.to receive(:resource_usage_throttled?)
|
||||
.once
|
||||
.with(:test_limit, resource_key: resource_key, scope: [worker_name],
|
||||
threshold: threshold, interval: interval, peek: peek)
|
||||
|
||||
expect(Gitlab::ApplicationRateLimiter)
|
||||
.to receive(:resource_usage_throttled?)
|
||||
.once
|
||||
.with(:test_limit_per_user, resource_key: resource_key, scope: [worker_name,
|
||||
1], threshold: threshold, interval: interval, peek: peek)
|
||||
|
||||
exceeded_limits?
|
||||
end
|
||||
|
||||
context 'when one limit is throttled' do
|
||||
before do
|
||||
allow(Gitlab::ApplicationRateLimiter).to receive(:resource_usage_throttled?)
|
||||
.with(:test_limit_per_user, anything)
|
||||
.and_return(true)
|
||||
allow(Gitlab::ApplicationRateLimiter).to receive(:resource_usage_throttled?)
|
||||
.with(:test_limit, anything)
|
||||
.and_return(false)
|
||||
end
|
||||
|
||||
it 'returns true' do
|
||||
expect(resource_usage_limiter).to be_exceeded_limits
|
||||
end
|
||||
end
|
||||
|
||||
context 'when no limit is throttled' do
|
||||
before do
|
||||
allow(Gitlab::ApplicationRateLimiter).to receive(:resource_usage_throttled?)
|
||||
.with(:test_limit_per_user, anything)
|
||||
.and_return(false)
|
||||
allow(Gitlab::ApplicationRateLimiter).to receive(:resource_usage_throttled?)
|
||||
.with(:test_limit, anything)
|
||||
.and_return(false)
|
||||
end
|
||||
|
||||
it 'returns false' do
|
||||
expect(resource_usage_limiter).not_to be_exceeded_limits
|
||||
end
|
||||
end
|
||||
|
||||
context 'when scopes are missing' do
|
||||
before do
|
||||
allow(Gitlab::ApplicationContext).to receive(:current).and_return({})
|
||||
end
|
||||
|
||||
it 'skips limit check' do
|
||||
expect(Gitlab::ApplicationRateLimiter)
|
||||
.to receive(:resource_usage_throttled?)
|
||||
.once
|
||||
.with(:test_limit, anything)
|
||||
|
||||
exceeded_limits?
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -290,4 +290,22 @@ RSpec.describe WebHookLog, feature_category: :webhooks do
|
|||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe 'routing table switch' do
|
||||
context 'with ff enabled' do
|
||||
it 'returns daily partitioned table' do
|
||||
expect(described_class.table_name).to eq('web_hook_logs_daily')
|
||||
end
|
||||
end
|
||||
|
||||
context 'with ff disabled' do
|
||||
before do
|
||||
stub_feature_flags(web_hook_logs_daily_enabled: false)
|
||||
end
|
||||
|
||||
it 'returns monthly partitioned table' do
|
||||
expect(described_class.table_name).to eq('web_hook_logs')
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -62,4 +62,39 @@ RSpec.describe Admin::ImpersonationTokensController, :enable_admin_mode, feature
|
|||
let(:token_attributes) { attributes_for(:personal_access_token, impersonation: true) }
|
||||
end
|
||||
end
|
||||
|
||||
describe '#index', :with_current_organization do
|
||||
it 'sets available scopes' do
|
||||
get admin_user_impersonation_tokens_path(user_id: user.username)
|
||||
|
||||
expect(assigns(:scopes)).to include(::Gitlab::Auth::API_SCOPE)
|
||||
end
|
||||
|
||||
context 'with feature flags virtual_registry_maven and dependency_proxy_read_write_scopes disabled' do
|
||||
before do
|
||||
stub_feature_flags(virtual_registry_maven: false, dependency_proxy_read_write_scopes: false)
|
||||
stub_config(dependency_proxy: { enabled: true })
|
||||
|
||||
get admin_user_impersonation_tokens_path(user_id: user.username)
|
||||
end
|
||||
|
||||
it 'does not include the virtual registry scopes' do
|
||||
expect(assigns(:scopes)).not_to include(Gitlab::Auth::READ_VIRTUAL_REGISTRY_SCOPE)
|
||||
expect(assigns(:scopes)).not_to include(Gitlab::Auth::WRITE_VIRTUAL_REGISTRY_SCOPE)
|
||||
end
|
||||
|
||||
%i[virtual_registry_maven dependency_proxy_read_write_scopes].each do |feature_flag|
|
||||
context "with feature flag #{feature_flag} enabled" do
|
||||
before do
|
||||
stub_feature_flags(feature_flag => true)
|
||||
end
|
||||
|
||||
it 'includes the virtual registry scopes' do
|
||||
expect(assigns(:scopes)).not_to include(::Gitlab::Auth::READ_VIRTUAL_REGISTRY_SCOPE)
|
||||
expect(assigns(:scopes)).not_to include(::Gitlab::Auth::WRITE_VIRTUAL_REGISTRY_SCOPE)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ RSpec.describe 'Reassign an import source user', feature_category: :importers do
|
|||
end
|
||||
|
||||
it 'reassign import source user', :aggregate_failures do
|
||||
expect(Notify).to receive_message_chain(:import_source_user_reassign, :deliver_now)
|
||||
expect(Notify).to receive_message_chain(:import_source_user_reassign, :deliver_later)
|
||||
|
||||
post_graphql_mutation(mutation, current_user: current_user)
|
||||
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ RSpec.describe 'Resend notification to the reassigned user of an import source u
|
|||
|
||||
context 'when user is authorized' do
|
||||
it 'resends notification and does not change status', :aggregate_failures do
|
||||
expect(Notify).to receive_message_chain(:import_source_user_reassign, :deliver_now)
|
||||
expect(Notify).to receive_message_chain(:import_source_user_reassign, :deliver_later)
|
||||
|
||||
post_graphql_mutation(mutation, current_user: current_user)
|
||||
|
||||
|
|
|
|||
|
|
@ -123,5 +123,32 @@ RSpec.describe Projects::Settings::AccessTokensController, feature_category: :sy
|
|||
expect(assigns(:scopes)).to include(Gitlab::Auth::K8S_PROXY_SCOPE)
|
||||
expect(assigns(:scopes)).to include(Gitlab::Auth::SELF_ROTATE_SCOPE)
|
||||
end
|
||||
|
||||
context 'with feature flags virtual_registry_maven and dependency_proxy_read_write_scopes disabled' do
|
||||
before do
|
||||
stub_feature_flags(virtual_registry_maven: false, dependency_proxy_read_write_scopes: false)
|
||||
stub_config(dependency_proxy: { enabled: true })
|
||||
|
||||
get project_settings_access_tokens_path(resource)
|
||||
end
|
||||
|
||||
it 'does not include the virtual registry scopes' do
|
||||
expect(assigns(:scopes)).not_to include(Gitlab::Auth::READ_VIRTUAL_REGISTRY_SCOPE)
|
||||
expect(assigns(:scopes)).not_to include(Gitlab::Auth::WRITE_VIRTUAL_REGISTRY_SCOPE)
|
||||
end
|
||||
|
||||
%i[virtual_registry_maven dependency_proxy_read_write_scopes].each do |feature_flag|
|
||||
context "with feature flag #{feature_flag} enabled" do
|
||||
before do
|
||||
stub_feature_flags(feature_flag => true)
|
||||
end
|
||||
|
||||
it 'includes the virtual registry scopes' do
|
||||
expect(assigns(:scopes)).not_to include(::Gitlab::Auth::READ_VIRTUAL_REGISTRY_SCOPE)
|
||||
expect(assigns(:scopes)).not_to include(::Gitlab::Auth::WRITE_VIRTUAL_REGISTRY_SCOPE)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -12,7 +12,7 @@ RSpec.describe Import::SourceUsers::ReassignService, feature_category: :importer
|
|||
describe '#execute' do
|
||||
context 'when reassignment is successful' do
|
||||
it 'returns success' do
|
||||
expect(Notify).to receive_message_chain(:import_source_user_reassign, :deliver_now)
|
||||
expect(Notify).to receive_message_chain(:import_source_user_reassign, :deliver_later)
|
||||
|
||||
result = service.execute
|
||||
|
||||
|
|
@ -104,7 +104,7 @@ RSpec.describe Import::SourceUsers::ReassignService, feature_category: :importer
|
|||
let(:assignee_user) { create(:user, :admin) }
|
||||
|
||||
it 'assigns the user' do
|
||||
expect(Notify).to receive_message_chain(:import_source_user_reassign, :deliver_now)
|
||||
expect(Notify).to receive_message_chain(:import_source_user_reassign, :deliver_later)
|
||||
|
||||
expect(service.execute).to be_success
|
||||
end
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ RSpec.describe Import::SourceUsers::ResendNotificationService, feature_category:
|
|||
describe '#execute' do
|
||||
context 'when notification is successfully sent' do
|
||||
it 'returns success' do
|
||||
expect(Notify).to receive_message_chain(:import_source_user_reassign, :deliver_now)
|
||||
expect(Notify).to receive_message_chain(:import_source_user_reassign, :deliver_later)
|
||||
|
||||
result = service.execute
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue