Add latest changes from gitlab-org/gitlab@master

This commit is contained in:
GitLab Bot 2025-05-02 06:07:45 +00:00
parent 531cba7aff
commit da10347975
37 changed files with 1677 additions and 1349 deletions

View File

@ -1 +1 @@
02ff05833da52a69f4c16fa94e539c6f3ab306ea
e8c0552b8152cf9363ccd1d9e9002225904d5202

View File

@ -76,6 +76,14 @@ export const TOKENS = [
unique: true,
options: [{ value: 'placeholder', title: s__('UserMapping|Placeholder') }],
},
{
title: s__('AdminUsers|LDAP sync'),
type: 'ldap_sync',
token: GlFilteredSearchToken,
operators: OPERATORS_IS,
unique: true,
options: [{ value: 'ldap_sync', title: __('True') }],
},
];
export const SOLO_OWNED_ORGANIZATIONS_REQUESTED_COUNT = 10;

View File

@ -21,6 +21,7 @@ export default class GlFieldErrors {
'input[type=email]',
'input[type=url]',
'input[type=number]',
'input[type=tel]',
'textarea',
'select',
].join(',');

View File

@ -71,15 +71,13 @@ export default {
<div v-if="user.note" class="gl-p-1 gl-text-subtle">
<gl-icon v-gl-tooltip="userNoteShort" name="document" />
</div>
<div
v-for="(badge, idx) in user.badges"
:key="idx"
class="gl-p-1"
:class="{ 'gl-pb-0': glFeatures.simplifiedBadges }"
>
<gl-badge class="!gl-flex" :variant="badge.variant">{{ badge.text }}</gl-badge>
</div>
</template>
<div class="gl-flex gl-flex-wrap gl-pt-2">
<div v-for="badge in user.badges" :key="badge.text" class="gl-pr-2">
<gl-badge :variant="badge.variant">{{ badge.text }}</gl-badge>
</div>
</div>
</gl-avatar-labeled>
</div>
</template>

View File

@ -327,7 +327,7 @@ class Admin::UsersController < Admin::ApplicationController
end
def users_with_included_associations(users)
users.includes(:authorized_projects, :trusted_with_spam_attribute) # rubocop: disable CodeReuse/ActiveRecord
users.includes(:authorized_projects, :trusted_with_spam_attribute, :identities) # rubocop: disable CodeReuse/ActiveRecord
end
def admin_making_changes_for_another_user?

View File

@ -10,6 +10,13 @@ module UploadsActions
UPLOAD_MOUNTS = %w[avatar attachment file logo pwa_icon header_logo favicon screenshot].freeze
# We need to avoid setting certain formats. For example, using the :js format
# would trigger Rails' cross-origin JavaScript protection. To avoid this, we use
# the :text format for JS files instead.
CUSTOM_REQUEST_FORMAT_MAPPING = {
js: :text
}.freeze
included do
prepend_before_action :set_request_format_from_path_extension
rescue_from FileUploader::InvalidSecret, with: :render_404
@ -85,7 +92,9 @@ module UploadsActions
format = Mime[match.captures.first]
request.format = format.symbol if format
return if format.blank?
request.format = CUSTOM_REQUEST_FORMAT_MAPPING[format.symbol] || format.symbol
end
def content_disposition

View File

@ -28,7 +28,7 @@ module Resolvers
def preloads
{
user: [:user]
user: [{ user: [:identities] }]
}
end
end

View File

@ -141,6 +141,7 @@ module UsersHelper
badges << { text: s_("AdminUsers|It's you!"), variant: 'muted' } if current_user == user
badges << { text: s_("AdminUsers|Locked"), variant: 'warning' } if user.access_locked?
badges << { text: s_("UserMapping|Placeholder"), variant: 'muted' } if user.placeholder?
badges << { text: s_('AdminUsers|LDAP'), variant: 'info' } if user.ldap_user?
end
end

View File

@ -682,6 +682,7 @@ class User < ApplicationRecord
scope :dormant, -> { with_state(:active).human_or_service_user.where('last_activity_on <= ?', Gitlab::CurrentSettings.deactivate_dormant_users_period.day.ago.to_date) }
scope :with_no_activity, -> { with_state(:active).human_or_service_user.where(last_activity_on: nil).where('created_at <= ?', MINIMUM_DAYS_CREATED.day.ago.to_date) }
scope :by_provider_and_extern_uid, ->(provider, extern_uid) { joins(:identities).merge(Identity.with_extern_uid(provider, extern_uid)) }
scope :ldap, -> { joins(:identities).where('identities.provider LIKE ?', 'ldap%') }
scope :by_ids, ->(ids) { where(id: ids) }
scope :by_ids_or_usernames, ->(ids, usernames) { where(username: usernames).or(where(id: ids)) }
scope :without_forbidden_states, -> { where.not(state: FORBIDDEN_SEARCH_STATES) }
@ -886,12 +887,14 @@ class User < ApplicationRecord
without_projects
when 'external'
external
when "trusted"
when 'trusted'
trusted
when "placeholder"
when 'placeholder'
placeholder
when "without_placeholders"
when 'without_placeholders'
without_placeholders
when 'ldap_sync'
ldap
else
all_without_ghosts
end

View File

@ -0,0 +1,10 @@
---
name: duo_code_review_full_file
description:
feature_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/510266
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/189314
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/537556
milestone: '18.0'
group: group::code review
type: beta
default_enabled: false

View File

@ -4,5 +4,5 @@ introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/92218
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/367666
milestone: '15.4'
type: development
group: group::organizations
group: group::authorization
default_enabled: false

View File

@ -0,0 +1,8 @@
---
migration_job_name: BackfillResourceIterationEventsNamespaceId
description: Backfills sharding key for resource_iteration_events.namespace_id
feature_category: team_planning
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/187487
milestone: '17.11'
queued_migration_version: 20250409172701
finalized_by: # version of the migration that finalized this BBM

View File

@ -0,0 +1,27 @@
# frozen_string_literal: true
class QueueBackfillResourceIterationEventsNamespaceId < Gitlab::Database::Migration[2.2]
milestone '17.11'
restrict_gitlab_migration gitlab_schema: :gitlab_main
MIGRATION = "BackfillResourceIterationEventsNamespaceId"
DELAY_INTERVAL = 2.minutes
BATCH_SIZE = 10000
SUB_BATCH_SIZE = 100
def up
queue_batched_background_migration(
MIGRATION,
:resource_iteration_events,
:id,
job_interval: DELAY_INTERVAL,
batch_size: BATCH_SIZE,
sub_batch_size: SUB_BATCH_SIZE
)
end
def down
delete_batched_background_migration(MIGRATION, :resource_iteration_events, :id, [])
end
end

View File

@ -0,0 +1 @@
9b9e08f01422c89998b6dcd36552eda1219bd2aec90d6da4e6eb763aeae546f6

View File

@ -10,7 +10,7 @@ title: CI mirrored tables
As part of the database [decomposition work](https://gitlab.com/groups/gitlab-org/-/epics/6168),
which had the goal of splitting the single database GitLab is using, into two databases: `main` and
`ci`, came the big challenge of
[removing all joins between the `main` and the `ci` tables](multiple_databases.md#removing-joins-between-ci-and-non-ci-tables).
[removing all joins between the `main` and the `ci` tables](multiple_databases.md#removing-joins-between-main-and-non-main-tables).
That is because PostgreSQL doesn't support joins between tables that belong to different databases.
However, some core application models in the main database are queried very often by the CI side.
For example:

View File

@ -7,7 +7,7 @@ title: Multiple Databases
To allow GitLab to scale further we
[decomposed the GitLab application database into multiple databases](https://gitlab.com/groups/gitlab-org/-/epics/6168).
The main databases are `main`, `ci`, and (optionally) `sec`. GitLab supports being run with one, two, or three databases.
The main databases are `main`, `ci`, and `sec`. GitLab supports being run with one, two, or three databases.
On GitLab.com we are using separate `main` `ci`, and `sec` databases.
For the purpose of building the [Cells](https://handbook.gitlab.com/handbook/engineering/architecture/design-documents/cells/) architecture, we are decomposing
@ -68,7 +68,7 @@ The `gitlab_schema` primary purpose is to introduce a barrier between different
This is used as a primary source of classification for:
- [Discovering cross-joins across tables from different schemas](#removing-joins-between-ci-and-non-ci-tables)
- [Discovering cross-joins across tables from different schemas](#removing-joins-between-main-and-non-main-tables)
- [Discovering cross-database transactions across tables from different schemas](#removing-cross-database-transactions)
### The special purpose of `gitlab_shared`
@ -102,7 +102,7 @@ might be missing some of those application-defined `gitlab_shared` tables (like
Read [Migrations for Multiple Databases](migrations_for_multiple_databases.md).
## CI/CD Database
## CI and Sec Databases
### Configure single database
@ -111,7 +111,7 @@ By default, GDK is configured to run with multiple databases.
{{< alert type="warning" >}}
Switching back-and-forth between single and multiple databases in
the same development instance is discouraged. Any data in the `ci`
the same development instance is discouraged. Any data in the `ci` or `sec`
database will not be accessible in single database mode. For single database, you should use a separate development instance.
{{< /alert >}}
@ -122,6 +122,7 @@ To configure GDK to use a single database:
```shell
gdk config set gitlab.rails.databases.ci.enabled false
gdk config set gitlab.rails.databases.sec.enabled false
```
1. Reconfigure GDK:
@ -130,7 +131,7 @@ To configure GDK to use a single database:
gdk reconfigure
```
To switch back to using multiple databases, set `gitlab.rails.databases.ci.enabled` to `true` and run `gdk reconfigure`.
To switch back to using multiple databases, set `gitlab.rails.databases.<db_name>.enabled` to `true` and run `gdk reconfigure`.
<!--
The `validate_cross_joins!` method in `spec/support/database/prevent_cross_joins.rb` references
@ -138,13 +139,13 @@ the following heading in the code, so if you make a change to this heading, make
the corresponding documentation URL used in `spec/support/database/prevent_cross_joins.rb`.
-->
### Removing joins between `ci` and non `ci` tables
### Removing joins between `main` and non `main` tables
Queries that join across databases raise an error. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/68620)
in GitLab 14.3, for new queries only. Pre-existing queries do not raise an error.
Because GitLab can be run with multiple separate databases, referencing `ci`
tables with non `ci` tables in a single query is not possible. Therefore,
Because GitLab can be run with multiple separate databases, referencing `main`
tables with non `main` tables in a single query is not possible. Therefore,
using any kind of `JOIN` in SQL queries will not work.
#### Suggestions for removing cross-database joins
@ -296,13 +297,13 @@ met:
1. The data does not update often (for example, the `project_id` column is almost
never updated for most tables).
One example we found was the `security_scans` table. This table has a foreign
key `security_scans.build_id` which allows you to join to the build. Therefore
One example we found was the `terraform_state_versions` table. This table has a foreign
key `terraform_state_versions.ci_build_id` which allows you to join to the build. Therefore
you could join to the project like so:
```sql
select projects.* from security_scans
inner join ci_builds on security_scans.build_id = ci_builds.id
select projects.* from terraform_state_versions
inner join ci_builds on terraform_state_versions.ci_build_id = ci_builds.id
inner join projects on ci_builds.project_id = projects.id
```
@ -310,14 +311,14 @@ The problem with this query is that `ci_builds` is in a different database
from the other two tables.
The solution in this case is to add the `project_id` column to
`security_scans`. This doesn't use much extra storage, and due to the way
`terraform_state_versions`. This doesn't use much extra storage, and due to the way
these features work, it's never updated (a build never moves projects).
This simplified the query to:
```sql
select projects.* from security_scans
inner join projects on security_scans.project_id = projects.id
select projects.* from terraform_state_versions
inner join projects on terraform_state_versions.project_id = projects.id
```
This also improves performance because you don't need to join through an extra
@ -754,12 +755,13 @@ to limit the modes where tests can run, and skip them on any other modes.
## Locking writes on the tables that don't belong to the database schemas
When the CI database is promoted and the two databases are fully split,
When a separate database is promoted and the split from main,
as an extra safeguard against creating a split brain situation,
run the Rake task `gitlab:db:lock_writes`. This command locks writes on:
- The `gitlab_main` tables on the CI Database.
- The `gitlab_ci` tables on the Main Database.
- Legacy tables on `gitlab_ci` belonging to the Main or Sec Databases.
- Legacy tables on `gitlab_main` belonging to the CI or Sec Databases.
- Legacy tables on `gitlab_sec` belonging to the CI or Main Databases.
This Rake task adds triggers to all the tables, to prevent any
`INSERT`, `UPDATE`, `DELETE`, or `TRUNCATE` statements from running
@ -832,7 +834,7 @@ end
## Truncating tables
When the databases `main` and `ci` are fully split, we can free up disk
When separate databases from `main` are fully split, we can free up disk
space by truncating tables. This results in a smaller data set: For example,
the data in `users` table on CI database is no longer read and also no
longer updated. So this data can be removed by truncating the tables.

View File

@ -198,29 +198,29 @@ behavior of projects that are assigned to a compliance framework.
| Control name | Control ID | Description |
|:---------------------------------------------------------|:-----------------------------------------------------------|:------------|
| API Security Running | `scanner_api_security_running` | Ensures that [API security scanning](../application_security/api_security/_index.md) is configured and running in the project pipelines. |
| API security running | `scanner_api_security_running` | Ensures that [API security scanning](../application_security/api_security/_index.md) is configured and running in the project pipelines. |
| At least two approvals | `minimum_approvals_required_2` | Ensures that merge requests [require at least two approvals](../project/merge_requests/approvals/_index.md) before merging. |
| Auth SSO Enabled | `auth_sso_enabled` | Ensures that [Single Sign-On (SSO) authentication](../group/saml_sso/_index.md) is enabled for the project. |
| Auth SSO enabled | `auth_sso_enabled` | Ensures that [Single Sign-On (SSO) authentication](../group/saml_sso/_index.md) is enabled for the project. |
| Author approved merge request | `merge_request_prevent_author_approval` | Ensures that the author of a merge request [cannot approve their own changes](../project/merge_requests/approvals/_index.md). |
| Branch Deletion Disabled | `branch_deletion_disabled` | Ensures that [branches can't be deleted](../project/repository/branches/protected.md). |
| CICD Job Token Scope Enabled | `cicd_job_token_scope_enabled` | Ensures that [CI/CD job token](../../ci/jobs/ci_job_token.md) scope restrictions are enabled. |
| Code Changes Requires Code Owners | `code_changes_requires_code_owners` | Ensures that code changes require approval from [code owners](../project/codeowners/_index.md). |
| Code Quality Running | `scanner_code_quality_running` | Ensures that [code quality scanning](../../ci/testing/code_quality.md) is configured and running in the project pipelines. |
| Branch deletion disabled | `branch_deletion_disabled` | Ensures that [branches can't be deleted](../project/repository/branches/protected.md). |
| CI/CD job token scope enabled | `cicd_job_token_scope_enabled` | Ensures that [CI/CD job token](../../ci/jobs/ci_job_token.md) scope restrictions are enabled. |
| Code changes requires code owners | `code_changes_requires_code_owners` | Ensures that code changes require approval from [code owners](../project/codeowners/_index.md). |
| Code quality running | `scanner_code_quality_running` | Ensures that [code quality scanning](../../ci/testing/code_quality.md) is configured and running in the project pipelines. |
| Committers approved merge request | `merge_request_prevent_committers_approval` | Ensures that users who have [committed to a merge request cannot approve it](../project/merge_requests/approvals/_index.md). |
| Container Scanning Running | `scanner_container_scanning_running` | Ensures that [container scanning](../application_security/container_scanning/_index.md) is configured and running in the project pipelines. |
| DAST Running | `scanner_dast_running` | Ensures that [Dynamic Application Security Testing](../application_security/dast/_index.md) (DAST) is configured and running in the project pipelines. |
| Container scanning running | `scanner_container_scanning_running` | Ensures that [container scanning](../application_security/container_scanning/_index.md) is configured and running in the project pipelines. |
| DAST running | `scanner_dast_running` | Ensures that [Dynamic Application Security Testing](../application_security/dast/_index.md) (DAST) is configured and running in the project pipelines. |
| Default branch protected | `default_branch_protected` | Ensures that the default branch has [protection rules](../project/repository/branches/protected.md) enabled. |
| Default branch Protected From Direct Push | `default_branch_protected_from_direct_push` | [Prevents direct pushes to the default branch](../project/repository/branches/protected.md). |
| Default branch Users Can Merge | `default_branch_users_can_merge` | Controls [whether users can merge changes to the default branch](../project/repository/branches/protected.md). |
| Default branch Users Can Push | `default_branch_users_can_push` | Controls [whether users can push directly to the default branch](../project/repository/branches/protected.md). |
| Dependency Scanning Running | `scanner_dep_scanning_running` | Ensures that [dependency scanning](../application_security/dependency_scanning/_index.md) is configured and running in the project pipelines. |
| Ensure 2 Admins per Repository | `ensure_2_admins_per_repo` | Ensures that [at least two administrators](../project/members/_index.md) are assigned to each repository. |
| Error Tracking Enabled | `error_tracking_enabled` | Ensures that [error tracking](../../operations/error_tracking.md) is enabled for the project. |
| Force Push Disabled | `force_push_disabled` | Prevents [force pushing](../project/repository/branches/protected.md) to repositories. |
| Fuzz Testing Running | `scanner_fuzz_testing_running` | Ensures that [fuzz testing](../application_security/coverage_fuzzing/_index.md) is configured and running in the project pipelines. |
| GitLab License Level Ultimate | `gitlab_license_level_ultimate` | Ensures that the GitLab instance is using an [Ultimate license](https://about.gitlab.com/pricing/feature-comparison/). |
| Has valid Ci Config | `has_valid_ci_config` | Ensures that the project has a [valid CI/CD configuration](../../ci/yaml/_index.md). |
| IaC Scanning Running | `scanner_iac_running` | Ensures [Infrastructure as Code (IaC) scanning](../application_security/iac_scanning/_index.md) is configured and running in the project pipelines. |
| Default branch protected from direct push | `default_branch_protected_from_direct_push` | [Prevents direct pushes to the default branch](../project/repository/branches/protected.md). |
| Default branch users can merge | `default_branch_users_can_merge` | Controls [whether users can merge changes to the default branch](../project/repository/branches/protected.md). |
| Default branch users can push | `default_branch_users_can_push` | Controls [whether users can push directly to the default branch](../project/repository/branches/protected.md). |
| Dependency scanning running | `scanner_dep_scanning_running` | Ensures that [dependency scanning](../application_security/dependency_scanning/_index.md) is configured and running in the project pipelines. |
| Ensure two administrators per repository | `ensure_2_admins_per_repo` | Ensures that [at least two administrators](../project/members/_index.md) are assigned to each repository. |
| Error tracking enabled | `error_tracking_enabled` | Ensures that [error tracking](../../operations/error_tracking.md) is enabled for the project. |
| Force push disabled | `force_push_disabled` | Prevents [force pushing](../project/repository/branches/protected.md) to repositories. |
| Fuzz testing running | `scanner_fuzz_testing_running` | Ensures that [fuzz testing](../application_security/coverage_fuzzing/_index.md) is configured and running in the project pipelines. |
| GitLab license level Ultimate | `gitlab_license_level_ultimate` | Ensures that the GitLab instance is using an [Ultimate license](https://about.gitlab.com/pricing/feature-comparison/). |
| Has valid CI/CD configuration | `has_valid_ci_config` | Ensures that the project has a [valid CI/CD configuration](../../ci/yaml/_index.md). |
| IaC scanning running | `scanner_iac_running` | Ensures [Infrastructure as Code (IaC) scanning](../application_security/iac_scanning/_index.md) is configured and running in the project pipelines. |
| Internal visibility is forbidden | `project_visibility_not_internal` | Ensures that projects are not set to [internal visibility](../public_access.md). |
| Issue Tracking Enabled | `issue_tracking_enabled` | Ensures that [issue tracking](../project/issues/_index.md) is enabled for the project. |
| License Compliance Running | `scanner_license_compliance_running` | Ensures that [license compliance scanning](license_approval_policies.md) is configured and running in the project pipelines. |

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,29 @@
# frozen_string_literal: true
module Gitlab
module BackgroundMigration
class BackfillResourceIterationEventsNamespaceId < BatchedMigrationJob
operation_name :update_namespace_id
feature_category :team_planning
def perform
each_sub_batch do |sub_batch|
connection.execute(
<<~SQL
WITH sub_batch AS MATERIALIZED (#{sub_batch.select(:id, :iteration_id).limit(sub_batch_size).to_sql})
UPDATE
"resource_iteration_events"
SET
"namespace_id" = "sprints"."group_id"
FROM
"sub_batch"
INNER JOIN "sprints" ON "sprints"."id" = "sub_batch"."iteration_id"
WHERE
"resource_iteration_events"."id" = "sub_batch"."id"
SQL
)
end
end
end
end
end

View File

@ -11,7 +11,6 @@ module Gitlab
def perform!
if pipeline_config&.exists?
build_pipeline_config
@command.config_content = pipeline_config.content
@pipeline.config_source = pipeline_config.source
@command.pipeline_config = pipeline_config
@ -40,16 +39,6 @@ module Gitlab
)
end
end
def build_pipeline_config
# Inputs may contain secrets, so we don't want to save them in the DB as plain text.
# It's safe to not save a pipeline-config because we are currently considering
# dropping the `p_ci_pipelines_config` table because it's not used anywhere.
# https://gitlab.com/gitlab-org/gitlab/-/issues/520828#note_2364398251
return if @command.inputs.present?
@pipeline.build_pipeline_config(content: pipeline_config.content, project_id: @pipeline.project_id)
end
end
end
end

View File

@ -2644,9 +2644,6 @@ msgstr ""
msgid "About this feature"
msgstr ""
msgid "About your company"
msgstr ""
msgid "Abuse reports"
msgstr ""
@ -5171,9 +5168,15 @@ msgstr ""
msgid "AdminUsers|It's you!"
msgstr ""
msgid "AdminUsers|LDAP"
msgstr ""
msgid "AdminUsers|LDAP Blocked"
msgstr ""
msgid "AdminUsers|LDAP sync"
msgstr ""
msgid "AdminUsers|Learn more about %{link_start}banned users.%{link_end}"
msgstr ""
@ -31788,10 +31791,13 @@ msgstr ""
msgid "InProductMarketing|%{upper_start}Free 60-day trial%{upper_end} %{lower_start}GitLab Ultimate & GitLab Duo Enterprise%{lower_end} %{last_start}Sign up for a free trial of the most comprehensive AI-powered DevSecOps Platform%{last_end}"
msgstr ""
msgid "InProductMarketing|60-day trial period"
msgstr ""
msgid "InProductMarketing|Boost efficiency and collaboration"
msgstr ""
msgid "InProductMarketing|Built-in security"
msgid "InProductMarketing|Build in security"
msgstr ""
msgid "InProductMarketing|End-to-end security and compliance"
@ -31800,6 +31806,9 @@ msgstr ""
msgid "InProductMarketing|Ensure compliance"
msgstr ""
msgid "InProductMarketing|Experience the power of Ultimate + GitLab Duo Enterprise"
msgstr ""
msgid "InProductMarketing|Free guest users"
msgstr ""
@ -31824,9 +31833,6 @@ msgstr ""
msgid "InProductMarketing|Start a Self-Managed trial"
msgstr ""
msgid "InProductMarketing|Start your 60-day free trial"
msgstr ""
msgid "InProductMarketing|Team members collaborating"
msgstr ""
@ -59976,6 +59982,9 @@ msgstr ""
msgid "Telephone number"
msgstr ""
msgid "Tell us about your company"
msgstr ""
msgid "Tell us what you think"
msgstr ""
@ -63685,9 +63694,6 @@ msgstr ""
msgid "TrialDiscover|Why Ultimate & GitLab Duo Enterprise?"
msgstr ""
msgid "TrialRegistration|To complete registration, we need additional details from you."
msgstr ""
msgid "TrialWidget|%{daysLeft} days left in trial"
msgstr ""
@ -63763,6 +63769,9 @@ msgstr ""
msgid "Trial|Continue"
msgstr ""
msgid "Trial|Continue with trial"
msgstr ""
msgid "Trial|Cookie Policy."
msgstr ""
@ -63781,9 +63790,6 @@ msgstr ""
msgid "Trial|Select state or province"
msgstr ""
msgid "Trial|Start free Ultimate + GitLab Duo Enterprise trial"
msgstr ""
msgid "Trial|Start your free Ultimate and GitLab Duo Enterprise trial"
msgstr ""
@ -63793,7 +63799,7 @@ msgstr ""
msgid "Trial|State or province"
msgstr ""
msgid "Trial|To activate your trial, we need additional details from you."
msgid "Trial|We need a few more details from you to activate your trial."
msgstr ""
msgid "Trial|Your free Ultimate & GitLab Duo Enterprise Trial lasts for 60 days. After this period, you can maintain a GitLab Free account forever, or upgrade to a paid plan."
@ -67715,9 +67721,6 @@ msgstr ""
msgid "Webhooks|You've reached the maximum number of custom headers."
msgstr ""
msgid "Website"
msgstr ""
msgid "Website:"
msgstr ""

File diff suppressed because it is too large Load Diff

View File

@ -1,273 +1,293 @@
{
"qa/specs/features/api/10_govern/group_access_token_spec.rb": 41.89152790999999,
"qa/specs/features/api/10_govern/project_access_token_spec.rb": 70.851877031,
"qa/specs/features/api/12_systems/gitaly/automatic_failover_and_recovery_spec.rb": 95.432449593,
"qa/specs/features/api/12_systems/gitaly/backend_node_recovery_spec.rb": 99.391011406,
"qa/specs/features/api/12_systems/gitaly/distributed_reads_spec.rb": 109.46771509,
"qa/specs/features/api/12_systems/gitaly/gitaly_mtls_spec.rb": 17.343291911,
"qa/specs/features/api/1_manage/import/import_github_repo_spec.rb": 129.164534484,
"qa/specs/features/api/1_manage/integrations/webhook_events_spec.rb": 65.229723744,
"qa/specs/features/api/1_manage/migration/gitlab_migration_group_spec.rb": 48.070470498,
"qa/specs/features/api/1_manage/migration/gitlab_migration_issue_spec.rb": 207.126358293,
"qa/specs/features/api/1_manage/migration/gitlab_migration_pipeline_spec.rb": 93.817009078,
"qa/specs/features/api/1_manage/migration/gitlab_migration_project_spec.rb": 88.488855084,
"qa/specs/features/api/1_manage/rate_limits_spec.rb": 10.817814349,
"qa/specs/features/api/2_plan/closes_issue_via_pushing_a_commit_spec.rb": 25.181362408,
"qa/specs/features/api/3_create/merge_request/push_options_mwps_spec.rb": 21.039227909,
"qa/specs/features/api/3_create/merge_request/push_options_remove_source_branch_spec.rb": 14.02142123,
"qa/specs/features/api/3_create/merge_request/push_options_spec.rb": 37.865117153999996,
"qa/specs/features/api/3_create/merge_request/view_merge_requests_spec.rb": 0.626406801,
"qa/specs/features/api/3_create/repository/add_list_delete_branches_spec.rb": 17.916767084,
"qa/specs/features/api/3_create/repository/commit_to_templated_project_spec.rb": 20.598149251,
"qa/specs/features/api/3_create/repository/default_branch_name_setting_spec.rb": 14.032271367,
"qa/specs/features/api/3_create/repository/files_spec.rb": 13.535752991,
"qa/specs/features/api/3_create/repository/project_archive_compare_spec.rb": 15.889818879,
"qa/specs/features/api/3_create/repository/push_postreceive_idempotent_spec.rb": 21.785407327,
"qa/specs/features/api/3_create/repository/storage_size_spec.rb": 28.971710849,
"qa/specs/features/api/3_create/repository/tag_revision_trigger_prereceive_hook_spec.rb": 6.921551015,
"qa/specs/features/api/4_verify/api_variable_inheritance_with_forward_pipeline_variables_spec.rb": 71.715082498,
"qa/specs/features/api/4_verify/cancel_pipeline_when_block_user_spec.rb": 17.328745451,
"qa/specs/features/api/4_verify/file_variable_spec.rb": 64.614498647,
"qa/specs/features/api/4_verify/job_downloads_artifacts_spec.rb": 30.637977485,
"qa/specs/features/api/8_monitor/metrics_spec.rb": 4.9947513059999995,
"qa/specs/features/api/9_tenant_scale/user_inherited_access_spec.rb": 99.27348326900001,
"qa/specs/features/api/9_tenant_scale/users_spec.rb": 7.4314368129999995,
"qa/specs/features/browser_ui/10_govern/group/group_access_token_spec.rb": 19.842973029,
"qa/specs/features/browser_ui/10_govern/login/2fa_recovery_spec.rb": 54.068209482,
"qa/specs/features/browser_ui/10_govern/login/2fa_ssh_recovery_spec.rb": 50.374047094,
"qa/specs/features/browser_ui/10_govern/login/log_in_spec.rb": 13.416315795,
"qa/specs/features/browser_ui/10_govern/login/log_in_with_2fa_spec.rb": 99.725940112,
"qa/specs/features/browser_ui/10_govern/login/log_into_gitlab_via_ldap_spec.rb": 2.246884586,
"qa/specs/features/browser_ui/10_govern/login/log_into_mattermost_via_gitlab_spec.rb": 30.622130294,
"qa/specs/features/browser_ui/10_govern/login/login_via_instance_wide_saml_sso_spec.rb": 16.142231526,
"qa/specs/features/browser_ui/10_govern/login/oauth_login_with_github_spec.rb": 41.299020436,
"qa/specs/features/browser_ui/10_govern/login/register_spec.rb": 84.45297341,
"qa/specs/features/browser_ui/10_govern/project/project_access_token_spec.rb": 23.872107364,
"qa/specs/features/browser_ui/10_govern/user/impersonation_token_spec.rb": 28.468018175,
"qa/specs/features/browser_ui/10_govern/user/user_access_termination_spec.rb": 37.641448239,
"qa/specs/features/browser_ui/14_analytics/performance_bar_spec.rb": 40.632777364,
"qa/specs/features/browser_ui/14_analytics/service_ping_default_enabled_spec.rb": 12.320565322,
"qa/specs/features/browser_ui/14_analytics/service_ping_disabled_spec.rb": 13.042966732,
"qa/specs/features/browser_ui/1_manage/integrations/jenkins/jenkins_build_status_spec.rb": 56.880689742,
"qa/specs/features/browser_ui/1_manage/integrations/jira/jira_basic_integration_spec.rb": 57.073159272,
"qa/specs/features/browser_ui/1_manage/integrations/jira/jira_issue_import_spec.rb": 50.263795869,
"qa/specs/features/browser_ui/1_manage/integrations/pipeline_status_emails_spec.rb": 61.991930411,
"qa/specs/features/browser_ui/1_manage/migration/gitlab_migration_group_spec.rb": 59.967414554,
"qa/specs/features/browser_ui/1_manage/migration/gitlab_migration_user_contribution_reassignment_spec.rb": 178.914027498,
"qa/specs/features/browser_ui/2_plan/design_management/add_design_content_spec.rb": 20.491100126,
"qa/specs/features/browser_ui/2_plan/design_management/archive_design_content_spec.rb": 26.178544114,
"qa/specs/features/browser_ui/2_plan/design_management/modify_design_content_spec.rb": 20.094203457,
"qa/specs/features/browser_ui/2_plan/email/trigger_email_notification_spec.rb": 22.630998895,
"qa/specs/features/browser_ui/2_plan/issue/collapse_comments_in_discussions_spec.rb": 23.429482699,
"qa/specs/features/browser_ui/2_plan/issue/comment_issue_spec.rb": 23.141392028,
"qa/specs/features/browser_ui/2_plan/issue/create_issue_spec.rb": 210.43566028199996,
"qa/specs/features/browser_ui/2_plan/issue/custom_issue_template_spec.rb": 22.576892653,
"qa/specs/features/browser_ui/2_plan/issue/export_as_csv_spec.rb": 38.055066272,
"qa/specs/features/browser_ui/2_plan/issue/filter_issue_comments_spec.rb": 22.468371256,
"qa/specs/features/browser_ui/2_plan/issue/issue_suggestions_spec.rb": 24.090504464,
"qa/specs/features/browser_ui/2_plan/issue/mentions_spec.rb": 28.753010077,
"qa/specs/features/browser_ui/2_plan/issue/real_time_assignee_spec.rb": 22.667435895,
"qa/specs/features/browser_ui/2_plan/issue_boards/focus_mode_spec.rb": 11.468357899,
"qa/specs/features/browser_ui/2_plan/milestone/assign_milestone_spec.rb": 107.468536777,
"qa/specs/features/browser_ui/2_plan/milestone/create_group_milestone_spec.rb": 15.670750371,
"qa/specs/features/browser_ui/2_plan/milestone/create_project_milestone_spec.rb": 26.489814779,
"qa/specs/features/browser_ui/2_plan/project_wiki/project_based_content_creation_spec.rb": 70.59044387700001,
"qa/specs/features/browser_ui/2_plan/project_wiki/project_based_content_manipulation_spec.rb": 47.661285024,
"qa/specs/features/browser_ui/2_plan/project_wiki/project_based_directory_management_spec.rb": 13.196745475,
"qa/specs/features/browser_ui/2_plan/project_wiki/project_based_file_upload_spec.rb": 33.939516299,
"qa/specs/features/browser_ui/2_plan/project_wiki/project_based_list_spec.rb": 64.986832706,
"qa/specs/features/browser_ui/2_plan/project_wiki/project_based_page_deletion_spec.rb": 38.596370586999996,
"qa/specs/features/browser_ui/2_plan/related_issues/related_issues_spec.rb": 23.637905719,
"qa/specs/features/browser_ui/3_create/merge_request/add_batch_comments_in_merge_request_spec.rb": 94.804965046,
"qa/specs/features/browser_ui/3_create/merge_request/cherry_pick/cherry_pick_a_merge_spec.rb": 61.876072121,
"qa/specs/features/browser_ui/3_create/merge_request/cherry_pick/cherry_pick_commit_spec.rb": 38.641931169,
"qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_spec.rb": 99.27304443099999,
"qa/specs/features/browser_ui/3_create/merge_request/merge_merge_request_from_fork_spec.rb": 32.097362975,
"qa/specs/features/browser_ui/3_create/merge_request/merge_request_set_to_auto_merge_spec.rb": 98.399291819,
"qa/specs/features/browser_ui/3_create/merge_request/rebase_merge_request_spec.rb": 78.358625484,
"qa/specs/features/browser_ui/3_create/merge_request/revert/revert_commit_spec.rb": 29.099789056,
"qa/specs/features/browser_ui/3_create/merge_request/revert/reverting_merge_request_spec.rb": 63.884452512,
"qa/specs/features/browser_ui/3_create/merge_request/suggestions/batch_suggestion_spec.rb": 73.312219981,
"qa/specs/features/browser_ui/3_create/merge_request/suggestions/custom_commit_suggestion_spec.rb": 59.663104611,
"qa/specs/features/browser_ui/3_create/merge_request/view_merge_request_diff_patch_spec.rb": 48.528793085000004,
"qa/specs/features/browser_ui/3_create/repository/add_file_template_spec.rb": 23.227132854,
"qa/specs/features/browser_ui/3_create/repository/add_new_branch_rule_spec.rb": 20.079322063,
"qa/specs/features/browser_ui/3_create/repository/branch_with_unusual_name_spec.rb": 11.048957115,
"qa/specs/features/browser_ui/3_create/repository/clone_spec.rb": 36.377727971,
"qa/specs/features/browser_ui/3_create/repository/license_detection_spec.rb": 35.583181482,
"qa/specs/features/browser_ui/3_create/repository/protected_tags_spec.rb": 92.027908827,
"qa/specs/features/browser_ui/3_create/repository/protocol_v2_push_http_spec.rb": 11.203736041,
"qa/specs/features/browser_ui/3_create/repository/protocol_v2_push_ssh_spec.rb": 28.745375984,
"qa/specs/features/browser_ui/3_create/repository/push_http_private_token_spec.rb": 25.42428777,
"qa/specs/features/browser_ui/3_create/repository/push_mirroring_lfs_over_http_spec.rb": 61.079432326,
"qa/specs/features/browser_ui/3_create/repository/push_mirroring_over_http_spec.rb": 74.21166571,
"qa/specs/features/browser_ui/3_create/repository/push_over_http_file_size_spec.rb": 43.247076832000005,
"qa/specs/features/browser_ui/3_create/repository/push_over_http_spec.rb": 29.612369532,
"qa/specs/features/browser_ui/3_create/repository/push_over_ssh_file_size_spec.rb": 53.361605086000004,
"qa/specs/features/browser_ui/3_create/repository/push_over_ssh_spec.rb": 66.632248425,
"qa/specs/features/browser_ui/3_create/repository/push_protected_branch_spec.rb": 8.917192596,
"qa/specs/features/browser_ui/3_create/repository/push_to_canary_gitaly_spec.rb": 21.862953077,
"qa/specs/features/browser_ui/3_create/repository/ssh_key_support_create_spec.rb": 21.292720569,
"qa/specs/features/browser_ui/3_create/repository/ssh_key_support_delete_spec.rb": 24.869882249,
"qa/specs/features/browser_ui/3_create/repository/user_views_commit_diff_patch_spec.rb": 32.124700605,
"qa/specs/features/browser_ui/3_create/snippet/add_comment_to_snippet_spec.rb": 24.469544398,
"qa/specs/features/browser_ui/3_create/snippet/add_file_to_snippet_spec.rb": 24.404964006,
"qa/specs/features/browser_ui/3_create/snippet/clone_push_pull_personal_snippet_spec.rb": 49.104983997999994,
"qa/specs/features/browser_ui/3_create/snippet/clone_push_pull_project_snippet_spec.rb": 48.835432894,
"qa/specs/features/browser_ui/3_create/snippet/copy_snippet_file_contents_spec.rb": 10.025282312,
"qa/specs/features/api/10_govern/group_access_token_spec.rb": 32.98999308,
"qa/specs/features/api/10_govern/project_access_token_spec.rb": 75.62535221,
"qa/specs/features/api/12_systems/gitaly/automatic_failover_and_recovery_spec.rb": 97.971406904,
"qa/specs/features/api/12_systems/gitaly/backend_node_recovery_spec.rb": 99.394917952,
"qa/specs/features/api/12_systems/gitaly/distributed_reads_spec.rb": 111.202909403,
"qa/specs/features/api/12_systems/gitaly/gitaly_mtls_spec.rb": 23.128792633,
"qa/specs/features/api/1_manage/import/import_github_repo_spec.rb": 98.601690677,
"qa/specs/features/api/1_manage/integrations/webhook_events_spec.rb": 63.884309438,
"qa/specs/features/api/1_manage/migration/gitlab_migration_group_spec.rb": 60.555716827,
"qa/specs/features/api/1_manage/migration/gitlab_migration_issue_spec.rb": 185.120150591,
"qa/specs/features/api/1_manage/migration/gitlab_migration_pipeline_spec.rb": 97.451122042,
"qa/specs/features/api/1_manage/migration/gitlab_migration_project_spec.rb": 101.663654195,
"qa/specs/features/api/1_manage/rate_limits_spec.rb": 14.907381728,
"qa/specs/features/api/2_plan/closes_issue_via_pushing_a_commit_spec.rb": 25.755076546,
"qa/specs/features/api/3_create/merge_request/push_options_mwps_spec.rb": 16.82332341,
"qa/specs/features/api/3_create/merge_request/push_options_remove_source_branch_spec.rb": 22.433046338,
"qa/specs/features/api/3_create/merge_request/push_options_spec.rb": 39.80516242,
"qa/specs/features/api/3_create/merge_request/view_merge_requests_spec.rb": 1.38181908,
"qa/specs/features/api/3_create/repository/add_list_delete_branches_spec.rb": 25.431371545,
"qa/specs/features/api/3_create/repository/commit_to_templated_project_spec.rb": 22.631262867,
"qa/specs/features/api/3_create/repository/default_branch_name_setting_spec.rb": 26.793694843000004,
"qa/specs/features/api/3_create/repository/project_archive_compare_spec.rb": 16.670677201,
"qa/specs/features/api/3_create/repository/push_postreceive_idempotent_spec.rb": 25.454150535,
"qa/specs/features/api/3_create/repository/storage_size_spec.rb": 28.961005929,
"qa/specs/features/api/3_create/repository/tag_revision_trigger_prereceive_hook_spec.rb": 10.547959073,
"qa/specs/features/api/4_verify/api_variable_inheritance_with_forward_pipeline_variables_spec.rb": 95.84142065,
"qa/specs/features/api/4_verify/cancel_pipeline_when_block_user_spec.rb": 26.575834034,
"qa/specs/features/api/4_verify/file_variable_spec.rb": 60.79006248,
"qa/specs/features/api/4_verify/job_downloads_artifacts_spec.rb": 39.828565691,
"qa/specs/features/api/5_package/container_registry/saas/container_registry_spec.rb": 69.770433031,
"qa/specs/features/api/8_monitor/metrics_spec.rb": 5.996862642,
"qa/specs/features/api/9_tenant_scale/user_inherited_access_spec.rb": 145.832127287,
"qa/specs/features/api/9_tenant_scale/users_spec.rb": 3.88771732,
"qa/specs/features/browser_ui/10_govern/group/group_access_token_spec.rb": 18.955245548,
"qa/specs/features/browser_ui/10_govern/login/2fa_recovery_spec.rb": 51.379482902,
"qa/specs/features/browser_ui/10_govern/login/2fa_ssh_recovery_spec.rb": 63.15838517,
"qa/specs/features/browser_ui/10_govern/login/log_in_spec.rb": 13.427990734,
"qa/specs/features/browser_ui/10_govern/login/log_in_with_2fa_spec.rb": 94.549567111,
"qa/specs/features/browser_ui/10_govern/login/log_into_gitlab_via_ldap_spec.rb": 4.26200593,
"qa/specs/features/browser_ui/10_govern/login/log_into_mattermost_via_gitlab_spec.rb": 30.355360322,
"qa/specs/features/browser_ui/10_govern/login/login_via_instance_wide_saml_sso_spec.rb": 16.78395848,
"qa/specs/features/browser_ui/10_govern/login/oauth_login_with_github_spec.rb": 41.820836674,
"qa/specs/features/browser_ui/10_govern/login/register_spec.rb": 101.892100194,
"qa/specs/features/browser_ui/10_govern/project/project_access_token_spec.rb": 25.906346348,
"qa/specs/features/browser_ui/10_govern/user/impersonation_token_spec.rb": 30.138602861,
"qa/specs/features/browser_ui/10_govern/user/user_access_termination_spec.rb": 44.138226734999996,
"qa/specs/features/browser_ui/14_analytics/performance_bar_spec.rb": 60.04423653,
"qa/specs/features/browser_ui/14_analytics/service_ping_default_enabled_spec.rb": 18.762676849,
"qa/specs/features/browser_ui/14_analytics/service_ping_disabled_spec.rb": 13.578009866,
"qa/specs/features/browser_ui/1_manage/integrations/jenkins/jenkins_build_status_spec.rb": 61.994387357,
"qa/specs/features/browser_ui/1_manage/integrations/jira/jira_basic_integration_spec.rb": 65.227220864,
"qa/specs/features/browser_ui/1_manage/integrations/jira/jira_issue_import_spec.rb": 46.776170762,
"qa/specs/features/browser_ui/1_manage/integrations/pipeline_status_emails_spec.rb": 73.78475297,
"qa/specs/features/browser_ui/1_manage/migration/gitlab_migration_group_spec.rb": 57.03791635,
"qa/specs/features/browser_ui/1_manage/migration/gitlab_migration_user_contribution_reassignment_spec.rb": 181.520241604,
"qa/specs/features/browser_ui/2_plan/design_management/add_design_content_spec.rb": 23.031130269,
"qa/specs/features/browser_ui/2_plan/design_management/archive_design_content_spec.rb": 29.780177896,
"qa/specs/features/browser_ui/2_plan/design_management/modify_design_content_spec.rb": 30.636613756,
"qa/specs/features/browser_ui/2_plan/email/trigger_email_notification_spec.rb": 16.470446876,
"qa/specs/features/browser_ui/2_plan/issue/collapse_comments_in_discussions_spec.rb": 23.402340109,
"qa/specs/features/browser_ui/2_plan/issue/comment_issue_spec.rb": 26.608420993,
"qa/specs/features/browser_ui/2_plan/issue/create_issue_spec.rb": 226.30203992999998,
"qa/specs/features/browser_ui/2_plan/issue/custom_issue_template_spec.rb": 30.203090855,
"qa/specs/features/browser_ui/2_plan/issue/export_as_csv_spec.rb": 40.13231434,
"qa/specs/features/browser_ui/2_plan/issue/filter_issue_comments_spec.rb": 24.860881753,
"qa/specs/features/browser_ui/2_plan/issue/issue_suggestions_spec.rb": 24.575106282,
"qa/specs/features/browser_ui/2_plan/issue/mentions_spec.rb": 33.018544554,
"qa/specs/features/browser_ui/2_plan/issue/real_time_assignee_spec.rb": 26.291870234,
"qa/specs/features/browser_ui/2_plan/issue_boards/focus_mode_spec.rb": 17.561810633,
"qa/specs/features/browser_ui/2_plan/milestone/assign_milestone_spec.rb": 106.336658382,
"qa/specs/features/browser_ui/2_plan/milestone/create_group_milestone_spec.rb": 22.587552274,
"qa/specs/features/browser_ui/2_plan/milestone/create_project_milestone_spec.rb": 28.049283666,
"qa/specs/features/browser_ui/2_plan/project_wiki/project_based_content_creation_spec.rb": 108.875066367,
"qa/specs/features/browser_ui/2_plan/project_wiki/project_based_content_manipulation_spec.rb": 69.419140123,
"qa/specs/features/browser_ui/2_plan/project_wiki/project_based_directory_management_spec.rb": 25.037219196,
"qa/specs/features/browser_ui/2_plan/project_wiki/project_based_file_upload_spec.rb": 38.413254353,
"qa/specs/features/browser_ui/2_plan/project_wiki/project_based_list_spec.rb": 70.598098006,
"qa/specs/features/browser_ui/2_plan/project_wiki/project_based_page_deletion_spec.rb": 59.092698467000005,
"qa/specs/features/browser_ui/2_plan/related_issues/related_issues_spec.rb": 24.049024633,
"qa/specs/features/browser_ui/3_create/merge_request/add_batch_comments_in_merge_request_spec.rb": 83.35424972999999,
"qa/specs/features/browser_ui/3_create/merge_request/cherry_pick/cherry_pick_a_merge_spec.rb": 65.769218013,
"qa/specs/features/browser_ui/3_create/merge_request/cherry_pick/cherry_pick_commit_spec.rb": 30.017509364,
"qa/specs/features/browser_ui/3_create/merge_request/create_merge_request_spec.rb": 92.452005772,
"qa/specs/features/browser_ui/3_create/merge_request/merge_merge_request_from_fork_spec.rb": 46.535589667,
"qa/specs/features/browser_ui/3_create/merge_request/merge_request_set_to_auto_merge_spec.rb": 85.059614424,
"qa/specs/features/browser_ui/3_create/merge_request/rebase_merge_request_spec.rb": 58.678788745,
"qa/specs/features/browser_ui/3_create/merge_request/revert/revert_commit_spec.rb": 38.031947034,
"qa/specs/features/browser_ui/3_create/merge_request/revert/reverting_merge_request_spec.rb": 107.744959716,
"qa/specs/features/browser_ui/3_create/merge_request/suggestions/batch_suggestion_spec.rb": 64.079688598,
"qa/specs/features/browser_ui/3_create/merge_request/suggestions/custom_commit_suggestion_spec.rb": 60.464588091,
"qa/specs/features/browser_ui/3_create/merge_request/view_merge_request_diff_patch_spec.rb": 47.575329799,
"qa/specs/features/browser_ui/3_create/repository/add_file_template_spec.rb": 27.119274477,
"qa/specs/features/browser_ui/3_create/repository/add_new_branch_rule_spec.rb": 30.340932638,
"qa/specs/features/browser_ui/3_create/repository/branch_with_unusual_name_spec.rb": 24.416460797,
"qa/specs/features/browser_ui/3_create/repository/clone_spec.rb": 26.239438601,
"qa/specs/features/browser_ui/3_create/repository/license_detection_spec.rb": 37.20657738,
"qa/specs/features/browser_ui/3_create/repository/protected_tags_spec.rb": 142.734936736,
"qa/specs/features/browser_ui/3_create/repository/protocol_v2_push_http_spec.rb": 24.264817229,
"qa/specs/features/browser_ui/3_create/repository/protocol_v2_push_ssh_spec.rb": 27.222468229,
"qa/specs/features/browser_ui/3_create/repository/push_http_private_token_spec.rb": 49.703005927,
"qa/specs/features/browser_ui/3_create/repository/push_mirroring_lfs_over_http_spec.rb": 84.31200969,
"qa/specs/features/browser_ui/3_create/repository/push_mirroring_over_http_spec.rb": 77.096792386,
"qa/specs/features/browser_ui/3_create/repository/push_over_http_file_size_spec.rb": 54.592720064000005,
"qa/specs/features/browser_ui/3_create/repository/push_over_http_spec.rb": 43.343972126,
"qa/specs/features/browser_ui/3_create/repository/push_over_ssh_file_size_spec.rb": 100.70291134499999,
"qa/specs/features/browser_ui/3_create/repository/push_over_ssh_spec.rb": 57.116473049999996,
"qa/specs/features/browser_ui/3_create/repository/push_protected_branch_spec.rb": 22.332861645,
"qa/specs/features/browser_ui/3_create/repository/push_to_canary_gitaly_spec.rb": 21.55505836,
"qa/specs/features/browser_ui/3_create/repository/ssh_key_support_create_spec.rb": 29.287778902,
"qa/specs/features/browser_ui/3_create/repository/ssh_key_support_delete_spec.rb": 26.294830596,
"qa/specs/features/browser_ui/3_create/repository/user_views_commit_diff_patch_spec.rb": 65.051120837,
"qa/specs/features/browser_ui/3_create/snippet/add_comment_to_snippet_spec.rb": 31.803789523,
"qa/specs/features/browser_ui/3_create/snippet/add_file_to_snippet_spec.rb": 51.590373962,
"qa/specs/features/browser_ui/3_create/snippet/clone_push_pull_personal_snippet_spec.rb": 83.905883157,
"qa/specs/features/browser_ui/3_create/snippet/clone_push_pull_project_snippet_spec.rb": 73.04176784399999,
"qa/specs/features/browser_ui/3_create/snippet/copy_snippet_file_contents_spec.rb": 20.481249541,
"qa/specs/features/browser_ui/3_create/snippet/create_personal_snippet_spec.rb": 8.514641421,
"qa/specs/features/browser_ui/3_create/snippet/create_personal_snippet_with_multiple_files_spec.rb": 9.570704381,
"qa/specs/features/browser_ui/3_create/snippet/create_project_snippet_with_multiple_files_spec.rb": 23.238740797,
"qa/specs/features/browser_ui/3_create/snippet/delete_file_from_snippet_spec.rb": 23.457603789,
"qa/specs/features/browser_ui/3_create/snippet/share_snippet_spec.rb": 25.280216447,
"qa/specs/features/browser_ui/3_create/source_editor/source_editor_toolbar_spec.rb": 17.545476927,
"qa/specs/features/browser_ui/3_create/web_ide/add_first_file_in_web_ide_spec.rb": 34.662669595,
"qa/specs/features/browser_ui/3_create/web_ide/add_new_directory_in_web_ide_spec.rb": 66.200562963,
"qa/specs/features/browser_ui/3_create/web_ide/closing_web_ide_with_unsaved_changes_spec.rb": 15.322529505,
"qa/specs/features/browser_ui/3_create/web_ide/settings_sync_web_ide_spec.rb": 166.47355206,
"qa/specs/features/browser_ui/3_create/web_ide/upload_new_file_in_web_ide_spec.rb": 66.619502943,
"qa/specs/features/browser_ui/4_verify/ci_components_catalog/ci_catalog_sorting_spec.rb": 82.42868249,
"qa/specs/features/browser_ui/4_verify/ci_components_catalog/release_with_glab_spec.rb": 133.642486192,
"qa/specs/features/browser_ui/4_verify/ci_components_catalog/release_with_release_cli_spec.rb": 113.834911288,
"qa/specs/features/browser_ui/4_verify/ci_components_catalog/run_component_in_project_pipeline_spec.rb": 57.249749289,
"qa/specs/features/browser_ui/4_verify/ci_job_artifacts/expose_job_artifacts_in_mr_spec.rb": 58.427087267,
"qa/specs/features/browser_ui/4_verify/ci_job_artifacts/job_artifacts_access_keyword_spec.rb": 249.439823524,
"qa/specs/features/browser_ui/4_verify/ci_job_artifacts/unlocking_job_artifacts_across_pipelines_spec.rb": 312.44583669,
"qa/specs/features/browser_ui/4_verify/ci_project_artifacts/user_can_bulk_delete_artifacts_spec.rb": 54.950096164,
"qa/specs/features/browser_ui/4_verify/ci_variable/pipeline_with_protected_variable_spec.rb": 122.875642881,
"qa/specs/features/browser_ui/4_verify/ci_variable/raw_variables_defined_in_yaml_spec.rb": 35.246744232,
"qa/specs/features/browser_ui/4_verify/ci_variable/ui_variable_inheritable_when_forward_pipeline_variables_true_spec.rb": 94.619528505,
"qa/specs/features/browser_ui/4_verify/pipeline/include_local_config_file_paths_with_wildcard_spec.rb": 13.837831845,
"qa/specs/features/browser_ui/4_verify/pipeline/include_multiple_files_from_a_project_spec.rb": 60.85158251,
"qa/specs/features/browser_ui/4_verify/pipeline/include_multiple_files_from_multiple_projects_spec.rb": 45.45791998,
"qa/specs/features/browser_ui/4_verify/pipeline/parent_child_pipelines_independent_relationship_spec.rb": 90.84630595499999,
"qa/specs/features/browser_ui/4_verify/pipeline/pass_dotenv_variables_to_downstream_via_bridge_spec.rb": 46.28532263,
"qa/specs/features/browser_ui/4_verify/pipeline/run_pipeline_with_manual_jobs_spec.rb": 73.642136838,
"qa/specs/features/browser_ui/4_verify/pipeline/trigger_child_pipeline_with_manual_spec.rb": 77.531970216,
"qa/specs/features/browser_ui/4_verify/pipeline/trigger_matrix_spec.rb": 48.58576106,
"qa/specs/features/browser_ui/4_verify/pipeline/update_ci_file_with_pipeline_editor_spec.rb": 31.212123043,
"qa/specs/features/browser_ui/4_verify/runner/deprecated_registration_token_spec.rb": 17.247276666,
"qa/specs/features/browser_ui/4_verify/runner/deprecated_unregister_runner_spec.rb": 30.996238731,
"qa/specs/features/browser_ui/4_verify/runner/fleet_visibility/group_runner_counts_spec.rb": 23.910167087,
"qa/specs/features/browser_ui/4_verify/runner/fleet_visibility/group_runner_status_counts_spec.rb": 8.92125161,
"qa/specs/features/browser_ui/4_verify/runner/register_group_runner_spec.rb": 17.1114281,
"qa/specs/features/browser_ui/4_verify/runner/register_project_runner_spec.rb": 34.284755192,
"qa/specs/features/browser_ui/4_verify/runner/unregister_runner_spec.rb": 21.522259966,
"qa/specs/features/browser_ui/4_verify/testing/endpoint_coverage_spec.rb": 52.162786658,
"qa/specs/features/browser_ui/5_package/container_registry/self_managed/container_registry_spec.rb": 373.500013924,
"qa/specs/features/browser_ui/5_package/dependency_proxy/dependency_proxy_spec.rb": 180.723964984,
"qa/specs/features/browser_ui/5_package/package_registry/composer_registry_spec.rb": 59.730133437,
"qa/specs/features/browser_ui/5_package/package_registry/conan_repository_spec.rb": 68.298383306,
"qa/specs/features/browser_ui/5_package/package_registry/generic_repository_spec.rb": 75.839250653,
"qa/specs/features/browser_ui/5_package/package_registry/helm_registry_spec.rb": 247.22047817600003,
"qa/specs/features/browser_ui/5_package/package_registry/maven/maven_group_level_spec.rb": 484.390195019,
"qa/specs/features/browser_ui/5_package/package_registry/maven/maven_project_level_spec.rb": 269.336205395,
"qa/specs/features/browser_ui/5_package/package_registry/maven_gradle_repository_spec.rb": 259.698535986,
"qa/specs/features/browser_ui/5_package/package_registry/npm/npm_group_level_spec.rb": 297.910586706,
"qa/specs/features/browser_ui/5_package/package_registry/npm/npm_instance_level_spec.rb": 301.29194994,
"qa/specs/features/browser_ui/5_package/package_registry/pypi_repository_spec.rb": 96.771360244,
"qa/specs/features/browser_ui/6_release/deploy_key/add_deploy_key_spec.rb": 28.190565917,
"qa/specs/features/browser_ui/6_release/deploy_key/clone_using_deploy_key_spec.rb": 151.863373456,
"qa/specs/features/browser_ui/6_release/deploy_token/add_deploy_token_spec.rb": 12.316922408,
"qa/specs/features/browser_ui/8_monitor/alert_management/alert_settings_create_new_alerts_spec.rb": 45.776404371,
"qa/specs/features/browser_ui/8_monitor/alert_management/automatically_creates_incident_for_alert_spec.rb": 51.078624882,
"qa/specs/features/browser_ui/8_monitor/alert_management/create_alert_using_authorization_key_spec.rb": 45.418273453,
"qa/specs/features/browser_ui/8_monitor/alert_management/email_notification_for_alert_spec.rb": 63.056196486,
"qa/specs/features/browser_ui/8_monitor/alert_management/recovery_alert_resolves_correct_alert_spec.rb": 16.929797753,
"qa/specs/features/browser_ui/9_tenant_scale/group/create_group_with_mattermost_team_spec.rb": 11.556969526,
"qa/specs/features/browser_ui/9_tenant_scale/group/group_member_access_request_spec.rb": 56.76733375800001,
"qa/specs/features/browser_ui/9_tenant_scale/group/transfer_project_spec.rb": 25.786212519,
"qa/specs/features/browser_ui/9_tenant_scale/project/add_project_member_spec.rb": 26.637145377,
"qa/specs/features/browser_ui/9_tenant_scale/project/create_project_badge_spec.rb": 24.693772213,
"qa/specs/features/browser_ui/9_tenant_scale/project/create_project_spec.rb": 59.179694752,
"qa/specs/features/browser_ui/9_tenant_scale/project/dashboard_images_spec.rb": 10.907782001000001,
"qa/specs/features/browser_ui/9_tenant_scale/project/invite_group_to_project_spec.rb": 49.103437086,
"qa/specs/features/browser_ui/9_tenant_scale/project/project_owner_permissions_spec.rb": 173.02086177,
"qa/specs/features/browser_ui/9_tenant_scale/project/view_project_activity_spec.rb": 30.567224495,
"qa/specs/features/browser_ui/9_tenant_scale/user/follow_user_activity_spec.rb": 22.821764772,
"qa/specs/features/browser_ui/9_tenant_scale/user/parent_group_access_termination_spec.rb": 30.262389539,
"qa/specs/features/browser_ui/9_tenant_scale/user/user_inherited_access_spec.rb": 22.910057593,
"qa/specs/features/ee/api/10_govern/compliance_pipeline_spec.rb": 50.816734194,
"qa/specs/features/ee/api/10_govern/instance_audit_event_streaming_spec.rb": 49.073527357,
"qa/specs/features/ee/api/10_govern/user/minimal_access_user_spec.rb": 66.002169944,
"qa/specs/features/ee/api/1_manage/import/import_github_repo_spec.rb": 67.681438798,
"qa/specs/features/ee/api/1_manage/integrations/group_webhook_events_spec.rb": 7.522709878,
"qa/specs/features/ee/api/1_manage/migration/gitlab_migration_group_spec.rb": 73.01876149,
"qa/specs/features/ee/api/2_plan/epics_milestone_dates_spec.rb": 59.090955218000005,
"qa/specs/features/ee/api/3_create/code_suggestions_spec.rb": 45.086595003999996,
"qa/specs/features/ee/browser_ui/10_govern/change_vulnerability_status_spec.rb": 103.38601722499999,
"qa/specs/features/ee/browser_ui/10_govern/create_merge_request_with_secure_spec.rb": 68.657010137,
"qa/specs/features/ee/browser_ui/10_govern/dismissed_vulnerabilities_in_security_widget_spec.rb": 91.386168894,
"qa/specs/features/ee/browser_ui/10_govern/export_vulnerability_report_spec.rb": 20.804818843,
"qa/specs/features/ee/browser_ui/10_govern/fix_vulnerability_workflow_spec.rb": 141.324680587,
"qa/specs/features/ee/browser_ui/10_govern/group/group_audit_event_streaming_spec.rb": 66.040902286,
"qa/specs/features/ee/browser_ui/10_govern/group/group_audit_logs_1_spec.rb": 108.451956255,
"qa/specs/features/ee/browser_ui/10_govern/group/group_ldap_sync_spec.rb": 128.68466909900002,
"qa/specs/features/ee/browser_ui/10_govern/group/restrict_by_ip_address_spec.rb": 116.897048713,
"qa/specs/features/ee/browser_ui/10_govern/group_pipeline_execution_policy_spec.rb": 180.46779755,
"qa/specs/features/ee/browser_ui/10_govern/instance/instance_audit_logs_spec.rb": 97.280846308,
"qa/specs/features/ee/browser_ui/10_govern/project/project_audit_logs_spec.rb": 142.568276085,
"qa/specs/features/ee/browser_ui/10_govern/project_security_dashboard_spec.rb": 57.657883554,
"qa/specs/features/ee/browser_ui/10_govern/scan_execution_policy_vulnerabilities_spec.rb": 165.518080902,
"qa/specs/features/ee/browser_ui/10_govern/scan_result_policy_vulnerabilities_spec.rb": 123.75335889000002,
"qa/specs/features/ee/browser_ui/10_govern/security_policies_spec.rb": 84.16228416199999,
"qa/specs/features/ee/browser_ui/10_govern/security_reports_spec.rb": 363.622779702,
"qa/specs/features/ee/browser_ui/10_govern/user/minimal_access_user_spec.rb": 12.783057761,
"qa/specs/features/ee/browser_ui/10_govern/vulnerabilities_jira_integration_spec.rb": 41.254110492,
"qa/specs/features/ee/browser_ui/10_govern/vulnerability_management_spec.rb": 358.3432609,
"qa/specs/features/ee/browser_ui/11_fulfillment/license/cloud_activation_spec.rb": 14.016590081,
"qa/specs/features/ee/browser_ui/11_fulfillment/license/license_spec.rb": 5.39033329,
"qa/specs/features/ee/browser_ui/11_fulfillment/utilization/user_registration_billing_spec.rb": 16.506609457,
"qa/specs/features/ee/browser_ui/13_secure/cvs_dependency_scanning_spec.rb": 27.190837332,
"qa/specs/features/ee/browser_ui/13_secure/on_demand_dast_spec.rb": 129.57212996,
"qa/specs/features/ee/browser_ui/16_ai_powered/duo_chat/duo_chat_spec.rb": 16.736182891,
"qa/specs/features/ee/browser_ui/1_manage/integrations/jira_issues_list_spec.rb": 55.17808449899999,
"qa/specs/features/ee/browser_ui/2_plan/analytics/contribution_analytics_spec.rb": 73.532939838,
"qa/specs/features/ee/browser_ui/2_plan/analytics/mr_analytics_spec.rb": 48.521325192,
"qa/specs/features/ee/browser_ui/2_plan/analytics/value_stream_analytics_spec.rb": 30.000179338,
"qa/specs/features/ee/browser_ui/2_plan/burndown_chart/burndown_chart_spec.rb": 21.527917249,
"qa/specs/features/ee/browser_ui/2_plan/custom_email/custom_email_spec.rb": 13.979232287,
"qa/specs/features/ee/browser_ui/2_plan/epic/epics_management_spec.rb": 199.27937587600002,
"qa/specs/features/ee/browser_ui/2_plan/epic/promote_issue_to_epic_spec.rb": 46.375081679,
"qa/specs/features/ee/browser_ui/2_plan/epic/roadmap_spec.rb": 8.06298025,
"qa/specs/features/ee/browser_ui/2_plan/group_wiki/create_group_wiki_page_spec.rb": 22.378114707,
"qa/specs/features/ee/browser_ui/2_plan/group_wiki/delete_group_wiki_page_spec.rb": 16.458226292,
"qa/specs/features/ee/browser_ui/2_plan/group_wiki/file_upload_group_wiki_page_spec.rb": 27.464608761,
"qa/specs/features/ee/browser_ui/2_plan/insights/default_insights_spec.rb": 26.454088007,
"qa/specs/features/ee/browser_ui/2_plan/issue/default_issue_template_spec.rb": 30.080699217,
"qa/specs/features/ee/browser_ui/2_plan/issue_boards/configurable_issue_board_spec.rb": 17.376470062,
"qa/specs/features/ee/browser_ui/2_plan/issue_boards/configure_issue_board_by_label_spec.rb": 24.665774586,
"qa/specs/features/ee/browser_ui/2_plan/issue_boards/create_group_issue_board_spec.rb": 22.804704234,
"qa/specs/features/ee/browser_ui/2_plan/issue_boards/group_issue_boards_spec.rb": 15.620382211,
"qa/specs/features/ee/browser_ui/2_plan/issue_boards/project_issue_boards_spec.rb": 47.242724384,
"qa/specs/features/ee/browser_ui/2_plan/issue_boards/read_only_board_configuration_spec.rb": 21.419591115,
"qa/specs/features/ee/browser_ui/2_plan/issue_boards/sum_of_issues_weights_spec.rb": 14.38292385,
"qa/specs/features/ee/browser_ui/2_plan/issues_analytics/issues_analytics_spec.rb": 18.465045738,
"qa/specs/features/ee/browser_ui/2_plan/issues_weight/issue_weight_visualization_spec.rb": 27.18952343,
"qa/specs/features/ee/browser_ui/2_plan/iterations/assign_group_iteration_spec.rb": 17.28927439,
"qa/specs/features/ee/browser_ui/2_plan/iterations/create_group_iteration_spec.rb": 36.317261154,
"qa/specs/features/ee/browser_ui/2_plan/multiple_assignees_for_issues/four_assignees_spec.rb": 43.217480413,
"qa/specs/features/ee/browser_ui/2_plan/multiple_assignees_for_issues/more_than_four_assignees_spec.rb": 55.06851288599999,
"qa/specs/features/ee/browser_ui/2_plan/scoped_labels/editing_scoped_labels_spec.rb": 15.888986762,
"qa/specs/features/ee/browser_ui/3_create/merge_request/approval_rules_spec.rb": 81.516824255,
"qa/specs/features/ee/browser_ui/3_create/merge_request/default_merge_request_template_spec.rb": 19.924696388,
"qa/specs/features/ee/browser_ui/3_create/repository/assign_code_owners_spec.rb": 42.055998775,
"qa/specs/features/ee/browser_ui/3_create/repository/code_owners_spec.rb": 28.884191453,
"qa/specs/features/ee/browser_ui/3_create/repository/file_locking_spec.rb": 149.098831152,
"qa/specs/features/ee/browser_ui/3_create/repository/group_file_template_spec.rb": 30.036853988,
"qa/specs/features/ee/browser_ui/3_create/repository/merge_with_code_owner_in_root_group_spec.rb": 123.885874959,
"qa/specs/features/ee/browser_ui/3_create/repository/merge_with_code_owner_in_subgroup_spec.rb": 182.74925166600002,
"qa/specs/features/ee/browser_ui/3_create/repository/prevent_forking_outside_group_spec.rb": 44.803314304,
"qa/specs/features/ee/browser_ui/3_create/repository/project_templates_spec.rb": 71.093189651,
"qa/specs/features/ee/browser_ui/3_create/repository/pull_mirroring_over_http_spec.rb": 26.408467189,
"qa/specs/features/ee/browser_ui/3_create/repository/pull_mirroring_over_ssh_with_key_spec.rb": 55.784349268,
"qa/specs/features/ee/browser_ui/3_create/repository/push_rules_spec.rb": 298.09492799300006,
"qa/specs/features/ee/browser_ui/3_create/repository/restrict_push_protected_branch_spec.rb": 177.829345208,
"qa/specs/features/ee/browser_ui/3_create/web_ide/code_suggestions_in_web_ide_spec.rb": 128.765366845,
"qa/specs/features/ee/browser_ui/4_verify/multi-project_pipelines_spec.rb": 34.817199201,
"qa/specs/features/ee/browser_ui/4_verify/parent_child_pipelines_dependent_relationship_spec.rb": 79.786370246,
"qa/specs/features/ee/browser_ui/4_verify/pipeline_for_merged_result_spec.rb": 48.548480024,
"qa/specs/features/ee/browser_ui/4_verify/pipeline_subscription_with_group_owned_project_spec.rb": 58.251654546,
"qa/specs/features/ee/browser_ui/8_monitor/incident_management/incident_quick_action_spec.rb": 20.689093678,
"qa/specs/features/ee/browser_ui/9_tenant_scale/group/share_group_with_group_spec.rb": 23.810004361
"qa/specs/features/browser_ui/3_create/snippet/create_personal_snippet_with_multiple_files_spec.rb": 14.67105945,
"qa/specs/features/browser_ui/3_create/snippet/create_project_snippet_with_multiple_files_spec.rb": 28.514565884,
"qa/specs/features/browser_ui/3_create/snippet/delete_file_from_snippet_spec.rb": 47.298550792,
"qa/specs/features/browser_ui/3_create/snippet/share_snippet_spec.rb": 34.434016889,
"qa/specs/features/browser_ui/3_create/source_editor/source_editor_toolbar_spec.rb": 25.014898858,
"qa/specs/features/browser_ui/3_create/web_ide/add_first_file_in_web_ide_spec.rb": 42.752924537,
"qa/specs/features/browser_ui/3_create/web_ide/add_new_directory_in_web_ide_spec.rb": 84.502238036,
"qa/specs/features/browser_ui/3_create/web_ide/closing_web_ide_with_unsaved_changes_spec.rb": 24.250358427,
"qa/specs/features/browser_ui/3_create/web_ide/settings_sync_web_ide_spec.rb": 180.07976596700001,
"qa/specs/features/browser_ui/3_create/web_ide/upload_new_file_in_web_ide_spec.rb": 96.65252819099999,
"qa/specs/features/browser_ui/4_verify/ci_components_catalog/ci_catalog_sorting_spec.rb": 86.128659366,
"qa/specs/features/browser_ui/4_verify/ci_components_catalog/release_with_glab_spec.rb": 121.634773435,
"qa/specs/features/browser_ui/4_verify/ci_components_catalog/release_with_release_cli_spec.rb": 116.303910391,
"qa/specs/features/browser_ui/4_verify/ci_components_catalog/run_component_in_project_pipeline_spec.rb": 55.741715074,
"qa/specs/features/browser_ui/4_verify/ci_job_artifacts/expose_job_artifacts_in_mr_spec.rb": 66.436168654,
"qa/specs/features/browser_ui/4_verify/ci_job_artifacts/job_artifacts_access_keyword_spec.rb": 260.885521371,
"qa/specs/features/browser_ui/4_verify/ci_job_artifacts/unlocking_job_artifacts_across_pipelines_spec.rb": 319.85414603000004,
"qa/specs/features/browser_ui/4_verify/ci_project_artifacts/user_can_bulk_delete_artifacts_spec.rb": 73.521802689,
"qa/specs/features/browser_ui/4_verify/ci_variable/pipeline_with_protected_variable_spec.rb": 134.719012043,
"qa/specs/features/browser_ui/4_verify/ci_variable/raw_variables_defined_in_yaml_spec.rb": 33.577634151,
"qa/specs/features/browser_ui/4_verify/ci_variable/ui_variable_inheritable_when_forward_pipeline_variables_true_spec.rb": 84.286087112,
"qa/specs/features/browser_ui/4_verify/pipeline/include_local_config_file_paths_with_wildcard_spec.rb": 18.525020519,
"qa/specs/features/browser_ui/4_verify/pipeline/include_multiple_files_from_a_project_spec.rb": 54.886224503,
"qa/specs/features/browser_ui/4_verify/pipeline/include_multiple_files_from_multiple_projects_spec.rb": 64.229339559,
"qa/specs/features/browser_ui/4_verify/pipeline/parent_child_pipelines_independent_relationship_spec.rb": 112.862791923,
"qa/specs/features/browser_ui/4_verify/pipeline/pass_dotenv_variables_to_downstream_via_bridge_spec.rb": 66.298914071,
"qa/specs/features/browser_ui/4_verify/pipeline/run_pipeline_with_manual_jobs_spec.rb": 66.049358924,
"qa/specs/features/browser_ui/4_verify/pipeline/trigger_child_pipeline_with_manual_spec.rb": 65.493875232,
"qa/specs/features/browser_ui/4_verify/pipeline/trigger_matrix_spec.rb": 50.079680864,
"qa/specs/features/browser_ui/4_verify/pipeline/update_ci_file_with_pipeline_editor_spec.rb": 31.110243067,
"qa/specs/features/browser_ui/4_verify/runner/deprecated_registration_token_spec.rb": 23.618801349,
"qa/specs/features/browser_ui/4_verify/runner/deprecated_unregister_runner_spec.rb": 39.029569115,
"qa/specs/features/browser_ui/4_verify/runner/fleet_visibility/group_runner_counts_spec.rb": 25.616882657,
"qa/specs/features/browser_ui/4_verify/runner/fleet_visibility/group_runner_status_counts_spec.rb": 17.609245948,
"qa/specs/features/browser_ui/4_verify/runner/register_group_runner_spec.rb": 20.499690898,
"qa/specs/features/browser_ui/4_verify/runner/register_project_runner_spec.rb": 45.242119367,
"qa/specs/features/browser_ui/4_verify/runner/unregister_runner_spec.rb": 26.076009522,
"qa/specs/features/browser_ui/4_verify/testing/endpoint_coverage_spec.rb": 54.246992046,
"qa/specs/features/browser_ui/5_package/container_registry/saas/container_registry_spec.rb": 165.693115559,
"qa/specs/features/browser_ui/5_package/container_registry/self_managed/container_registry_spec.rb": 345.187678671,
"qa/specs/features/browser_ui/5_package/dependency_proxy/dependency_proxy_spec.rb": 172.648268037,
"qa/specs/features/browser_ui/5_package/package_registry/composer_registry_spec.rb": 67.483790802,
"qa/specs/features/browser_ui/5_package/package_registry/conan_repository_spec.rb": 97.870222592,
"qa/specs/features/browser_ui/5_package/package_registry/generic_repository_spec.rb": 133.504862177,
"qa/specs/features/browser_ui/5_package/package_registry/helm_registry_spec.rb": 382.312482672,
"qa/specs/features/browser_ui/5_package/package_registry/maven/maven_group_level_spec.rb": 591.8489436350001,
"qa/specs/features/browser_ui/5_package/package_registry/maven/maven_project_level_spec.rb": 285.250109461,
"qa/specs/features/browser_ui/5_package/package_registry/maven_gradle_repository_spec.rb": 304.329392175,
"qa/specs/features/browser_ui/5_package/package_registry/npm/npm_group_level_spec.rb": 335.093454552,
"qa/specs/features/browser_ui/5_package/package_registry/npm/npm_instance_level_spec.rb": 285.115592965,
"qa/specs/features/browser_ui/5_package/package_registry/pypi_repository_spec.rb": 107.899088585,
"qa/specs/features/browser_ui/6_release/deploy_key/add_deploy_key_spec.rb": 29.988003167,
"qa/specs/features/browser_ui/6_release/deploy_key/clone_using_deploy_key_spec.rb": 187.45400691700002,
"qa/specs/features/browser_ui/6_release/deploy_token/add_deploy_token_spec.rb": 15.694988036,
"qa/specs/features/browser_ui/8_monitor/alert_management/alert_settings_create_new_alerts_spec.rb": 56.424444699,
"qa/specs/features/browser_ui/8_monitor/alert_management/automatically_creates_incident_for_alert_spec.rb": 69.98793122000001,
"qa/specs/features/browser_ui/8_monitor/alert_management/create_alert_using_authorization_key_spec.rb": 47.768660694,
"qa/specs/features/browser_ui/8_monitor/alert_management/email_notification_for_alert_spec.rb": 69.965951869,
"qa/specs/features/browser_ui/8_monitor/alert_management/recovery_alert_resolves_correct_alert_spec.rb": 29.011678497,
"qa/specs/features/browser_ui/9_tenant_scale/group/create_group_with_mattermost_team_spec.rb": 9.344660726,
"qa/specs/features/browser_ui/9_tenant_scale/group/group_member_access_request_spec.rb": 65.26559089599999,
"qa/specs/features/browser_ui/9_tenant_scale/group/transfer_project_spec.rb": 27.244025476,
"qa/specs/features/browser_ui/9_tenant_scale/project/add_project_member_spec.rb": 32.014529209,
"qa/specs/features/browser_ui/9_tenant_scale/project/create_project_badge_spec.rb": 20.068110387,
"qa/specs/features/browser_ui/9_tenant_scale/project/create_project_spec.rb": 67.337069478,
"qa/specs/features/browser_ui/9_tenant_scale/project/dashboard_images_spec.rb": 22.587608685,
"qa/specs/features/browser_ui/9_tenant_scale/project/invite_group_to_project_spec.rb": 53.449546747,
"qa/specs/features/browser_ui/9_tenant_scale/project/project_owner_permissions_spec.rb": 171.14910748399998,
"qa/specs/features/browser_ui/9_tenant_scale/project/view_project_activity_spec.rb": 35.743874052,
"qa/specs/features/browser_ui/9_tenant_scale/user/follow_user_activity_spec.rb": 31.223309247,
"qa/specs/features/browser_ui/9_tenant_scale/user/parent_group_access_termination_spec.rb": 27.375015555,
"qa/specs/features/browser_ui/9_tenant_scale/user/user_inherited_access_spec.rb": 66.960839159,
"qa/specs/features/ee/api/10_govern/compliance_pipeline_spec.rb": 38.562984764,
"qa/specs/features/ee/api/10_govern/instance_audit_event_streaming_spec.rb": 37.026030479,
"qa/specs/features/ee/api/10_govern/user/minimal_access_user_spec.rb": 80.57801924500001,
"qa/specs/features/ee/api/1_manage/import/import_github_repo_spec.rb": 131.481349437,
"qa/specs/features/ee/api/1_manage/integrations/group_webhook_events_spec.rb": 13.047155732,
"qa/specs/features/ee/api/1_manage/migration/gitlab_migration_group_spec.rb": 62.834426385,
"qa/specs/features/ee/api/2_plan/analytics/dora_metrics_spec.rb": 2.3438559850000003,
"qa/specs/features/ee/api/2_plan/epics_milestone_dates_spec.rb": 82.006404714,
"qa/specs/features/ee/api/3_create/code_suggestions_spec.rb": 39.562657235,
"qa/specs/features/ee/api/9_tenant_scale/elasticsearch/advanced_global_advanced_syntax_search_spec.rb": 105.411032861,
"qa/specs/features/ee/api/9_tenant_scale/elasticsearch/elasticsearch_api_spec.rb": 95.84806871400001,
"qa/specs/features/ee/api/9_tenant_scale/elasticsearch/index_tests/commit_index/commit_index_spec.rb": 31.44747142,
"qa/specs/features/ee/api/9_tenant_scale/elasticsearch/index_tests/issues_index/issue_index_spec.rb": 72.872250958,
"qa/specs/features/ee/api/9_tenant_scale/elasticsearch/index_tests/main_index/blob_index_spec.rb": 40.252409182,
"qa/specs/features/ee/api/9_tenant_scale/elasticsearch/index_tests/merge_request_index/merge_request_index_spec.rb": 63.477970837,
"qa/specs/features/ee/api/9_tenant_scale/elasticsearch/index_tests/notes_index/note_index_spec.rb": 62.85925672,
"qa/specs/features/ee/browser_ui/10_govern/change_vulnerability_status_spec.rb": 133.854524265,
"qa/specs/features/ee/browser_ui/10_govern/create_merge_request_with_secure_spec.rb": 71.378891385,
"qa/specs/features/ee/browser_ui/10_govern/dismissed_vulnerabilities_in_security_widget_spec.rb": 106.310033633,
"qa/specs/features/ee/browser_ui/10_govern/explain_this_vulnerability_spec.rb": 48.656577734,
"qa/specs/features/ee/browser_ui/10_govern/export_vulnerability_report_spec.rb": 15.908063331,
"qa/specs/features/ee/browser_ui/10_govern/fix_vulnerability_workflow_spec.rb": 144.069410289,
"qa/specs/features/ee/browser_ui/10_govern/group/group_audit_event_streaming_spec.rb": 58.155441685,
"qa/specs/features/ee/browser_ui/10_govern/group/group_audit_logs_1_spec.rb": 115.65698714400001,
"qa/specs/features/ee/browser_ui/10_govern/group/group_ldap_sync_spec.rb": 122.51110615500002,
"qa/specs/features/ee/browser_ui/10_govern/group/restrict_by_ip_address_spec.rb": 123.506448268,
"qa/specs/features/ee/browser_ui/10_govern/group_pipeline_execution_policy_spec.rb": 244.91917489399998,
"qa/specs/features/ee/browser_ui/10_govern/instance/instance_audit_logs_spec.rb": 167.819808879,
"qa/specs/features/ee/browser_ui/10_govern/project/project_audit_logs_spec.rb": 231.473886222,
"qa/specs/features/ee/browser_ui/10_govern/project_security_dashboard_spec.rb": 62.095760528,
"qa/specs/features/ee/browser_ui/10_govern/scan_execution_policy_vulnerabilities_spec.rb": 158.81351263,
"qa/specs/features/ee/browser_ui/10_govern/scan_result_policy_license_finding_spec.rb": 49.199501503,
"qa/specs/features/ee/browser_ui/10_govern/scan_result_policy_vulnerabilities_spec.rb": 210.54865648499998,
"qa/specs/features/ee/browser_ui/10_govern/security_policies_spec.rb": 81.540982641,
"qa/specs/features/ee/browser_ui/10_govern/security_reports_spec.rb": 363.572918207,
"qa/specs/features/ee/browser_ui/10_govern/user/minimal_access_user_spec.rb": 24.151715831,
"qa/specs/features/ee/browser_ui/10_govern/vulnerabilities_jira_integration_spec.rb": 42.562710221,
"qa/specs/features/ee/browser_ui/10_govern/vulnerability_management_spec.rb": 342.169147882,
"qa/specs/features/ee/browser_ui/11_fulfillment/license/cloud_activation_spec.rb": 19.519817991,
"qa/specs/features/ee/browser_ui/11_fulfillment/license/license_spec.rb": 7.57460835,
"qa/specs/features/ee/browser_ui/11_fulfillment/saas_user_limit_experience_spec.rb": 184.78561392999998,
"qa/specs/features/ee/browser_ui/11_fulfillment/utilization/free_namespace_storage_spec.rb": 341.009588447,
"qa/specs/features/ee/browser_ui/11_fulfillment/utilization/saas_user_caps_spec.rb": 44.723411659,
"qa/specs/features/ee/browser_ui/11_fulfillment/utilization/user_registration_billing_spec.rb": 23.297850153,
"qa/specs/features/ee/browser_ui/13_secure/cvs_dependency_scanning_spec.rb": 75.638407947,
"qa/specs/features/ee/browser_ui/13_secure/license_scanning_spec.rb": 116.30680739,
"qa/specs/features/ee/browser_ui/13_secure/on_demand_dast_spec.rb": 110.920330885,
"qa/specs/features/ee/browser_ui/15_growth/free_trial_spec.rb": 68.967794595,
"qa/specs/features/ee/browser_ui/16_ai_powered/duo_chat/duo_chat_spec.rb": 43.075428703,
"qa/specs/features/ee/browser_ui/16_ai_powered/duo_chat/root_cause_analysis_with_duo_chat_spec.rb": 37.931425691,
"qa/specs/features/ee/browser_ui/1_manage/integrations/jira_issues_list_spec.rb": 58.653198608000004,
"qa/specs/features/ee/browser_ui/2_plan/analytics/contribution_analytics_spec.rb": 211.292243553,
"qa/specs/features/ee/browser_ui/2_plan/analytics/mr_analytics_spec.rb": 74.28075828,
"qa/specs/features/ee/browser_ui/2_plan/analytics/value_stream_analytics_spec.rb": 75.671017318,
"qa/specs/features/ee/browser_ui/2_plan/burndown_chart/burndown_chart_spec.rb": 22.641035335,
"qa/specs/features/ee/browser_ui/2_plan/custom_email/custom_email_spec.rb": 16.821151717,
"qa/specs/features/ee/browser_ui/2_plan/epic/epics_management_spec.rb": 375.506600713,
"qa/specs/features/ee/browser_ui/2_plan/epic/promote_issue_to_epic_spec.rb": 63.20070909,
"qa/specs/features/ee/browser_ui/2_plan/epic/roadmap_spec.rb": 14.576608489,
"qa/specs/features/ee/browser_ui/2_plan/group_wiki/create_group_wiki_page_spec.rb": 41.373198799,
"qa/specs/features/ee/browser_ui/2_plan/group_wiki/delete_group_wiki_page_spec.rb": 17.600620542,
"qa/specs/features/ee/browser_ui/2_plan/group_wiki/file_upload_group_wiki_page_spec.rb": 35.702110881,
"qa/specs/features/ee/browser_ui/2_plan/insights/default_insights_spec.rb": 34.127026174,
"qa/specs/features/ee/browser_ui/2_plan/issue/default_issue_template_spec.rb": 30.402700367,
"qa/specs/features/ee/browser_ui/2_plan/issue_boards/configurable_issue_board_spec.rb": 19.263109267,
"qa/specs/features/ee/browser_ui/2_plan/issue_boards/configure_issue_board_by_label_spec.rb": 26.399046988,
"qa/specs/features/ee/browser_ui/2_plan/issue_boards/create_group_issue_board_spec.rb": 44.058644116,
"qa/specs/features/ee/browser_ui/2_plan/issue_boards/group_issue_boards_spec.rb": 42.505086799,
"qa/specs/features/ee/browser_ui/2_plan/issue_boards/project_issue_boards_spec.rb": 66.01471323000001,
"qa/specs/features/ee/browser_ui/2_plan/issue_boards/read_only_board_configuration_spec.rb": 32.519977572,
"qa/specs/features/ee/browser_ui/2_plan/issue_boards/sum_of_issues_weights_spec.rb": 22.535067519,
"qa/specs/features/ee/browser_ui/2_plan/issues_analytics/issues_analytics_spec.rb": 31.517568487,
"qa/specs/features/ee/browser_ui/2_plan/issues_weight/issue_weight_visualization_spec.rb": 34.898537993,
"qa/specs/features/ee/browser_ui/2_plan/iterations/assign_group_iteration_spec.rb": 22.289509862,
"qa/specs/features/ee/browser_ui/2_plan/iterations/create_group_iteration_spec.rb": 45.105684972999995,
"qa/specs/features/ee/browser_ui/2_plan/multiple_assignees_for_issues/four_assignees_spec.rb": 39.05453727,
"qa/specs/features/ee/browser_ui/2_plan/multiple_assignees_for_issues/more_than_four_assignees_spec.rb": 82.65206438300001,
"qa/specs/features/ee/browser_ui/2_plan/scoped_labels/editing_scoped_labels_spec.rb": 24.677114242,
"qa/specs/features/ee/browser_ui/3_create/merge_request/approval_rules_spec.rb": 106.008473686,
"qa/specs/features/ee/browser_ui/3_create/merge_request/default_merge_request_template_spec.rb": 48.185280618,
"qa/specs/features/ee/browser_ui/3_create/merge_request/generate_commit_message_spec.rb": 40.390914617,
"qa/specs/features/ee/browser_ui/3_create/remote_development/workspace_actions_spec.rb": 656.975314259,
"qa/specs/features/ee/browser_ui/3_create/repository/assign_code_owners_spec.rb": 77.835283702,
"qa/specs/features/ee/browser_ui/3_create/repository/code_owners_spec.rb": 29.858441116,
"qa/specs/features/ee/browser_ui/3_create/repository/duo_chat_explain_code_spec.rb": 28.16854103,
"qa/specs/features/ee/browser_ui/3_create/repository/file_locking_spec.rb": 255.24311795800003,
"qa/specs/features/ee/browser_ui/3_create/repository/group_file_template_spec.rb": 43.29283679,
"qa/specs/features/ee/browser_ui/3_create/repository/merge_with_code_owner_in_root_group_spec.rb": 133.52674356,
"qa/specs/features/ee/browser_ui/3_create/repository/merge_with_code_owner_in_subgroup_spec.rb": 314.069409969,
"qa/specs/features/ee/browser_ui/3_create/repository/prevent_forking_outside_group_spec.rb": 49.551448328,
"qa/specs/features/ee/browser_ui/3_create/repository/project_templates_spec.rb": 195.161257407,
"qa/specs/features/ee/browser_ui/3_create/repository/pull_mirroring_over_http_spec.rb": 54.098731282,
"qa/specs/features/ee/browser_ui/3_create/repository/pull_mirroring_over_ssh_with_key_spec.rb": 54.379182606,
"qa/specs/features/ee/browser_ui/3_create/repository/push_rules_spec.rb": 434.95902557700003,
"qa/specs/features/ee/browser_ui/3_create/repository/restrict_push_protected_branch_spec.rb": 259.66672728500004,
"qa/specs/features/ee/browser_ui/3_create/web_ide/code_suggestions_in_web_ide_spec.rb": 106.25856156900001,
"qa/specs/features/ee/browser_ui/4_verify/multi-project_pipelines_spec.rb": 89.697462894,
"qa/specs/features/ee/browser_ui/4_verify/parent_child_pipelines_dependent_relationship_spec.rb": 110.677573526,
"qa/specs/features/ee/browser_ui/4_verify/pipeline_for_merged_result_spec.rb": 53.854234828,
"qa/specs/features/ee/browser_ui/4_verify/pipeline_subscription_with_group_owned_project_spec.rb": 61.396500039,
"qa/specs/features/ee/browser_ui/8_monitor/incident_management/incident_quick_action_spec.rb": 16.936613385,
"qa/specs/features/ee/browser_ui/9_tenant_scale/group/share_group_with_group_spec.rb": 33.98725241
}

View File

@ -148,7 +148,7 @@ RSpec.describe 'Admin::Users::User', feature_category: :user_management, quarant
end
it "displays `Locked` next to user's name" do
expect(page).to have_content("#{locked_user.name} Locked")
expect(page).to have_content("#{locked_user.name} #{locked_user.email} Locked")
end
it 'allows a user to be unlocked from the `User administration dropdown', :js do

View File

@ -257,7 +257,7 @@ RSpec.describe 'Admin::Users', :with_current_organization, feature_category: :us
let_it_be(:locked_user) { create(:user, locked_at: DateTime.parse('2020-02-25 10:30:00 -0700')) }
it "displays `Locked` badge next to user" do
expect(page).to have_content("#{locked_user.name} Locked")
expect(page).to have_content("#{locked_user.name} #{locked_user.email} Locked")
end
it 'allows a user to be unlocked from the `User administration dropdown', :js do

View File

@ -3,7 +3,7 @@ import { shallowMount } from '@vue/test-utils';
import { nextTick } from 'vue';
import { visitUrl, getBaseURL } from '~/lib/utils/url_utility';
import AdminUsersFilterApp from '~/admin/users/components/admin_users_filter_app.vue';
import { TOKENS } from 'ee_else_ce/admin/users/constants';
import { expectedTokens, expectedAccessLevelToken } from '../mock_data';
const mockToken = [
{
@ -12,8 +12,6 @@ const mockToken = [
},
];
const accessLevelToken = TOKENS.filter(({ type }) => type === 'access_level');
jest.mock('~/lib/utils/url_utility', () => {
return {
...jest.requireActual('~/lib/utils/url_utility'),
@ -33,14 +31,8 @@ describe('AdminUsersFilterApp', () => {
it('includes all the tokens', () => {
createComponent();
const actualOptions = findAvailableTokens()
.flatMap(({ options }) => options.map(({ value }) => value))
.sort();
const expectedOptions = TOKENS.flatMap(({ options }) =>
options.map(({ value }) => value),
).sort();
expect(actualOptions).toMatchObject(expectedOptions);
expect(findAvailableTokens()).toMatchObject(expectedTokens);
});
describe('when a token is selected', () => {
@ -53,7 +45,7 @@ describe('AdminUsersFilterApp', () => {
findFilteredSearch().vm.$emit('input', mockToken);
await nextTick();
expect(findAvailableTokens()).toEqual(accessLevelToken);
expect(findAvailableTokens()).toEqual([expectedAccessLevelToken]);
});
});
@ -68,7 +60,7 @@ describe('AdminUsersFilterApp', () => {
]);
await nextTick();
expect(findAvailableTokens()).toEqual(TOKENS);
expect(findAvailableTokens()).toEqual(expectedTokens);
});
});
@ -81,7 +73,7 @@ describe('AdminUsersFilterApp', () => {
window.history.replaceState({}, '', '/?filter=admins');
createComponent();
expect(findAvailableTokens()).toEqual(accessLevelToken);
expect(findAvailableTokens()).toEqual([expectedAccessLevelToken]);
});
it('replace the initial token when another token is selected', async () => {
@ -90,7 +82,7 @@ describe('AdminUsersFilterApp', () => {
findFilteredSearch().vm.$emit('input', mockToken);
await nextTick();
expect(findAvailableTokens()).toEqual(accessLevelToken);
expect(findAvailableTokens()).toEqual([expectedAccessLevelToken]);
});
});

View File

@ -1,4 +1,6 @@
import { GlFilteredSearchToken } from '@gitlab/ui';
import { range } from 'lodash';
import { OPERATORS_IS } from '~/vue_shared/components/filtered_search_bar/constants';
import { OBSTACLE_TYPES } from '~/vue_shared/components/user_deletion_obstacles/constants';
import { SOLO_OWNED_ORGANIZATIONS_REQUESTED_COUNT } from '~/admin/users/constants';
@ -103,3 +105,68 @@ export const multipleWithExtrasSoloOwnedOrganizations = {
count: 12,
nodes: range(SOLO_OWNED_ORGANIZATIONS_REQUESTED_COUNT).map((index) => organization(index)),
};
export const expectedAccessLevelToken = {
title: 'Access level',
type: 'access_level',
token: GlFilteredSearchToken,
operators: OPERATORS_IS,
unique: true,
options: IS_EE
? [
{ value: 'admins', title: 'Administrator' },
{ value: 'auditors', title: 'Auditor' },
{ value: 'external', title: 'External' },
]
: [
{ value: 'admins', title: 'Administrator' },
{ value: 'external', title: 'External' },
],
};
export const expectedTokens = [
expectedAccessLevelToken,
{
title: 'State',
type: 'state',
token: GlFilteredSearchToken,
operators: OPERATORS_IS,
unique: true,
options: [
{ value: 'active', title: 'Active' },
{ value: 'banned', title: 'Banned' },
{ value: 'blocked', title: 'Blocked' },
{ value: 'deactivated', title: 'Deactivated' },
{ value: 'blocked_pending_approval', title: 'Pending approval' },
{ value: 'trusted', title: 'Trusted' },
{ value: 'wop', title: 'Without projects' },
],
},
{
title: 'Two-factor authentication',
type: '2fa',
token: GlFilteredSearchToken,
operators: OPERATORS_IS,
unique: true,
options: [
{ value: 'two_factor_enabled', title: 'On' },
{ value: 'two_factor_disabled', title: 'Off' },
],
},
{
title: 'Type',
type: 'type',
token: GlFilteredSearchToken,
operators: OPERATORS_IS,
unique: true,
options: [{ value: 'placeholder', title: 'Placeholder' }],
},
{
title: 'LDAP sync',
type: 'ldap_sync',
token: GlFilteredSearchToken,
operators: OPERATORS_IS,
unique: true,
options: [{ value: 'ldap_sync', title: 'True' }],
},
];

View File

@ -6,6 +6,7 @@ RSpec.describe UsersHelper, feature_category: :user_management do
include TermsHelper
let_it_be(:user) { create(:user, timezone: ActiveSupport::TimeZone::MAPPING['UTC']) }
let_it_be(:admin) { create(:admin) }
def filter_ee_badges(badges)
badges.reject { |badge| badge[:text] == 'Is using seat' }
@ -271,94 +272,70 @@ RSpec.describe UsersHelper, feature_category: :user_management do
describe '#user_badges_in_admin_section' do
before do
allow(helper).to receive(:current_user).and_return(user)
allow(helper).to receive(:current_user).and_return(admin)
end
subject(:badges) { filter_ee_badges(helper.user_badges_in_admin_section(user)) }
context 'with a blocked user' do
it "returns the blocked badge" do
blocked_user = create(:user, state: 'blocked')
let(:user) { create(:user, state: 'blocked') }
badges = helper.user_badges_in_admin_section(blocked_user)
expect(filter_ee_badges(badges)).to match_array([text: s_("AdminUsers|Blocked"), variant: "danger"])
end
it { is_expected.to match_array([{ text: s_("AdminUsers|Blocked"), variant: "danger" }]) }
end
context 'with a pending approval user' do
it 'returns the pending approval badge' do
blocked_pending_approval_user = create(:user, :blocked_pending_approval)
let(:user) { create(:user, :blocked_pending_approval) }
badges = helper.user_badges_in_admin_section(blocked_pending_approval_user)
expect(filter_ee_badges(badges)).to match_array([text: s_('AdminUsers|Pending approval'), variant: 'info'])
end
it { is_expected.to match_array([{ text: s_('AdminUsers|Pending approval'), variant: 'info' }]) }
end
context 'with a banned user' do
it 'returns the banned badge' do
banned_user = create(:user, :banned)
let(:user) { create(:user, :banned) }
badges = helper.user_badges_in_admin_section(banned_user)
expect(filter_ee_badges(badges)).to match_array([text: s_('AdminUsers|Banned'), variant: 'danger'])
end
it { is_expected.to match_array([{ text: s_('AdminUsers|Banned'), variant: 'danger' }]) }
end
context 'with an admin user' do
it "returns the admin badge" do
admin_user = create(:admin)
let(:user) { create(:admin) }
badges = helper.user_badges_in_admin_section(admin_user)
expect(filter_ee_badges(badges)).to match_array([text: s_("AdminUsers|Admin"), variant: "success"])
end
it { is_expected.to match_array([{ text: s_("AdminUsers|Admin"), variant: "success" }]) }
end
context 'with a bot' do
it "returns the bot badge" do
bot = create(:user, :bot)
let(:user) { create(:user, :bot) }
badges = helper.user_badges_in_admin_section(bot)
expect(filter_ee_badges(badges)).to match_array([text: s_('AdminUsers|Bot'), variant: "muted"])
end
it { is_expected.to match_array([{ text: s_('AdminUsers|Bot'), variant: "muted" }]) }
end
context 'with a deactivated user' do
it "returns the deactivated badge" do
deactivated = create(:user, :deactivated)
let(:user) { create(:user, :deactivated) }
badges = helper.user_badges_in_admin_section(deactivated)
expect(filter_ee_badges(badges)).to match_array([text: s_('AdminUsers|Deactivated'), variant: "danger"])
end
it { is_expected.to match_array([{ text: s_('AdminUsers|Deactivated'), variant: "danger" }]) }
end
context 'with an external user' do
it 'returns the external badge' do
external_user = create(:user, external: true)
let(:user) { create(:user, external: true) }
badges = helper.user_badges_in_admin_section(external_user)
expect(filter_ee_badges(badges)).to match_array([text: s_("AdminUsers|External"), variant: "secondary"])
end
it { is_expected.to match_array([{ text: s_("AdminUsers|External"), variant: "secondary" }]) }
end
context 'with the current user' do
it 'returns the "It\'s You" badge' do
badges = helper.user_badges_in_admin_section(user)
let(:user) { admin }
expect(filter_ee_badges(badges)).to match_array([text: s_("AdminUsers|It's you!"), variant: "muted"])
it "returns admin and it's you badges" do
is_expected.to match_array(
[
{ text: s_("AdminUsers|Admin"), variant: "success" },
{ text: s_("AdminUsers|It's you!"), variant: "muted" }
])
end
end
context 'with an external blocked admin' do
let(:user) { create(:admin, state: 'blocked', external: true) }
it 'returns the blocked, admin and external badges' do
user = create(:admin, state: 'blocked', external: true)
badges = helper.user_badges_in_admin_section(user)
expect(badges).to match_array(
is_expected.to match_array(
[
{ text: s_("AdminUsers|Blocked"), variant: "danger" },
{ text: s_("AdminUsers|Admin"), variant: "success" },
@ -368,33 +345,27 @@ RSpec.describe UsersHelper, feature_category: :user_management do
end
context 'with a locked user', time_travel_to: '2020-02-25 10:30:45 -0700' do
it 'returns the "Locked" badge' do
locked_user = create(:user, locked_at: DateTime.parse('2020-02-25 10:30:00 -0700'))
let(:user) { create(:user, locked_at: DateTime.parse('2020-02-25 10:30:00 -0700')) }
badges = helper.user_badges_in_admin_section(locked_user)
expect(filter_ee_badges(badges)).to match_array([text: s_("AdminUsers|Locked"), variant: "warning"])
end
it { is_expected.to match_array([{ text: s_("AdminUsers|Locked"), variant: "warning" }]) }
end
context 'with a placeholder user' do
it 'returns the "Placeholder" badge' do
placeholder_user = create(:user, :placeholder)
let(:user) { create(:user, :placeholder) }
badges = helper.user_badges_in_admin_section(placeholder_user)
it { is_expected.to match_array([{ text: s_("UserMapping|Placeholder"), variant: "muted" }]) }
end
expect(filter_ee_badges(badges)).to match_array([text: s_("UserMapping|Placeholder"), variant: "muted"])
end
context 'with an LDAP user' do
let(:user) { create(:omniauth_user, provider: "ldapmain") }
it { is_expected.to match_array([{ text: 'LDAP', variant: 'info' }]) }
end
context 'get badges for normal user' do
it 'returns no badges' do
user = create(:user)
let(:user) { create(:user) }
badges = helper.user_badges_in_admin_section(user)
expect(filter_ee_badges(badges)).to be_empty
end
it { is_expected.to be_empty }
end
end

View File

@ -0,0 +1,126 @@
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe Gitlab::BackgroundMigration::BackfillResourceIterationEventsNamespaceId, feature_category: :team_planning do
let(:resource_iteration_events) { table(:resource_iteration_events) }
let(:iterations) { table(:sprints) }
let(:organization) { table(:organizations).create!(name: 'organization', path: 'organization') }
let(:namespace1) do
table(:namespaces).create!(name: "group1", path: "group1", organization_id: organization.id)
end
let(:namespace2) do
table(:namespaces).create!(name: "group2", path: "group2", organization_id: organization.id)
end
let(:fake_namespace) do
# Can't create description_versions without a namespace in specs due to the invalid FK already created
table(:namespaces).create!(id: 0, name: "fake", path: "fake", organization_id: organization.id)
end
let(:iteration1) do
iterations.create!(
title: 'iteration1',
group_id: namespace1.id, iid: 1,
start_date: 1.day.ago,
due_date: 1.day.from_now
)
end
let(:iteration2) do
iterations.create!(
title: 'iteration2',
group_id: namespace2.id, iid: 1,
start_date: 1.day.ago,
due_date: 1.day.from_now
)
end
let(:issue_work_item_type_id) { table(:work_item_types).find_by(name: 'Issue').id }
let(:issue) do
table(:issues).create!(
title: 'First issue',
iid: 1,
namespace_id: namespace1.id,
work_item_type_id: issue_work_item_type_id
)
end
let(:user) { table(:users).create!(username: 'john_doe', email: 'johndoe@gitlab.com', projects_limit: 2) }
let!(:issue_resource_event1) do
resource_iteration_events.create!(
issue_id: issue.id,
user_id: user.id,
action: 1,
iteration_id: iteration1.id,
namespace_id: fake_namespace.id
)
end
let!(:issue_resource_event2) do
resource_iteration_events.create!(
issue_id: issue.id,
user_id: user.id,
action: 1,
iteration_id: iteration1.id,
namespace_id: fake_namespace.id
)
end
let!(:issue_resource_event3) do
resource_iteration_events.create!(
issue_id: issue.id,
user_id: user.id,
action: 1,
iteration_id: iteration2.id,
namespace_id: fake_namespace.id
)
end
let!(:issue_resource_event4) do
resource_iteration_events.create!(
issue_id: issue.id,
user_id: user.id,
action: 1,
iteration_id: iteration2.id,
namespace_id: fake_namespace.id
)
end
let(:migration) do
start_id, end_id = resource_iteration_events.pick('MIN(id), MAX(id)')
described_class.new(
start_id: start_id,
end_id: end_id,
batch_table: :resource_iteration_events,
batch_column: :id,
sub_batch_size: 2,
pause_ms: 0,
job_arguments: [],
connection: ApplicationRecord.connection
)
end
subject(:migrate) { migration.perform }
describe '#up' do
it 'updates records in batches' do
expect do
migrate
end.to make_queries_matching(/UPDATE\s+"resource_iteration_events"/, 2)
end
it 'sets correct namespace_id in every record' do
expect { migrate }.to change { issue_resource_event1.reload.namespace_id }.from(0).to(namespace1.id).and(
change { issue_resource_event2.reload.namespace_id }.from(0).to(namespace1.id)
).and(
change { issue_resource_event3.reload.namespace_id }.from(0).to(namespace2.id)
).and(
change { issue_resource_event4.reload.namespace_id }.from(0).to(namespace2.id)
)
end
end
end

View File

@ -54,7 +54,6 @@ RSpec.describe Gitlab::Ci::Pipeline::Chain::Config::Content, feature_category: :
subject.perform!
expect(pipeline.config_source).to eq 'repository_source'
expect(pipeline.pipeline_config.content).to eq(config_content_result)
expect(command.config_content).to eq(config_content_result)
expect(command.pipeline_config.internal_include_prepended?).to eq(true)
end
@ -74,7 +73,6 @@ RSpec.describe Gitlab::Ci::Pipeline::Chain::Config::Content, feature_category: :
subject.perform!
expect(pipeline.config_source).to eq 'remote_source'
expect(pipeline.pipeline_config.content).to eq(config_content_result)
expect(command.config_content).to eq(config_content_result)
expect(command.pipeline_config.internal_include_prepended?).to eq(true)
end
@ -95,7 +93,6 @@ RSpec.describe Gitlab::Ci::Pipeline::Chain::Config::Content, feature_category: :
subject.perform!
expect(pipeline.config_source).to eq 'external_project_source'
expect(pipeline.pipeline_config.content).to eq(config_content_result)
expect(command.config_content).to eq(config_content_result)
expect(command.pipeline_config.internal_include_prepended?).to eq(true)
end
@ -116,7 +113,6 @@ RSpec.describe Gitlab::Ci::Pipeline::Chain::Config::Content, feature_category: :
subject.perform!
expect(pipeline.config_source).to eq 'external_project_source'
expect(pipeline.pipeline_config.content).to eq(config_content_result)
expect(command.config_content).to eq(config_content_result)
expect(command.pipeline_config.internal_include_prepended?).to eq(true)
end
@ -144,7 +140,6 @@ RSpec.describe Gitlab::Ci::Pipeline::Chain::Config::Content, feature_category: :
subject.perform!
expect(pipeline.config_source).to eq 'repository_source'
expect(pipeline.pipeline_config.content).to eq(config_content_result)
expect(command.config_content).to eq(config_content_result)
expect(command.pipeline_config.internal_include_prepended?).to eq(true)
end
@ -177,7 +172,6 @@ RSpec.describe Gitlab::Ci::Pipeline::Chain::Config::Content, feature_category: :
subject.perform!
expect(pipeline.config_source).to eq 'repository_source'
expect(pipeline.pipeline_config).to be_nil
expect(command.config_content).to eq(config_content_result)
expect(command.pipeline_config.internal_include_prepended?).to eq(true)
expect(command.pipeline_config.inputs_for_pipeline_creation).to eq({})
@ -203,7 +197,6 @@ RSpec.describe Gitlab::Ci::Pipeline::Chain::Config::Content, feature_category: :
subject.perform!
expect(pipeline.config_source).to eq 'auto_devops_source'
expect(pipeline.pipeline_config.content).to eq(config_content_result)
expect(command.config_content).to eq(config_content_result)
expect(command.pipeline_config.internal_include_prepended?).to eq(true)
end
@ -224,7 +217,6 @@ RSpec.describe Gitlab::Ci::Pipeline::Chain::Config::Content, feature_category: :
subject.perform!
expect(pipeline.config_source).to eq 'parameter_source'
expect(pipeline.pipeline_config.content).to eq(content)
expect(command.config_content).to eq(content)
expect(command.pipeline_config.internal_include_prepended?).to eq(false)
end
@ -244,7 +236,6 @@ RSpec.describe Gitlab::Ci::Pipeline::Chain::Config::Content, feature_category: :
subject.perform!
expect(pipeline.config_source).to eq 'parameter_source'
expect(pipeline.pipeline_config).to be_nil
expect(command.config_content).to eq(content)
expect(command.pipeline_config.internal_include_prepended?).to eq(false)
expect(command.pipeline_config.inputs_for_pipeline_creation).to eq(inputs)
@ -263,7 +254,6 @@ RSpec.describe Gitlab::Ci::Pipeline::Chain::Config::Content, feature_category: :
subject.perform!
expect(pipeline.config_source).to eq('unknown_source')
expect(pipeline.pipeline_config).to be_nil
expect(command.config_content).to be_nil
expect(command.pipeline_config).to be_nil
expect(pipeline.errors.full_messages).to include('Missing CI config file')

View File

@ -275,6 +275,7 @@ RSpec.describe 'new tables missing sharding_key', feature_category: :cell do
"ai_duo_chat_events" => "https://gitlab.com/gitlab-org/gitlab/-/issues/516140",
"fork_networks" => "https://gitlab.com/gitlab-org/gitlab/-/issues/522958",
"merge_request_diff_commit_users" => "https://gitlab.com/gitlab-org/gitlab/-/issues/526725",
"bulk_import_configurations" => "https://gitlab.com/gitlab-org/gitlab/-/issues/536521",
# All the tables below related to uploads are part of the same work to
# add sharding key to the table
"uploads" => "https://gitlab.com/gitlab-org/gitlab/-/issues/398199",

View File

@ -0,0 +1,27 @@
# frozen_string_literal: true
require 'spec_helper'
require_migration!
RSpec.describe QueueBackfillResourceIterationEventsNamespaceId, migration: :gitlab_main, feature_category: :team_planning do
let!(:batched_migration) { described_class::MIGRATION }
it 'schedules a new batched migration' do
reversible_migration do |migration|
migration.before -> {
expect(batched_migration).not_to have_scheduled_batched_migration
}
migration.after -> {
expect(batched_migration).to have_scheduled_batched_migration(
gitlab_schema: :gitlab_main,
table_name: :resource_iteration_events,
column_name: :id,
interval: described_class::DELAY_INTERVAL,
batch_size: described_class::BATCH_SIZE,
sub_batch_size: described_class::SUB_BATCH_SIZE
)
}
end
end
end

View File

@ -3292,6 +3292,7 @@ RSpec.describe User, feature_category: :user_profile do
:without_projects | 'wop'
:trusted | 'trusted'
:external | 'external'
:ldap | 'ldap_sync'
end
with_them do
@ -8803,6 +8804,19 @@ RSpec.describe User, feature_category: :user_profile do
end
end
describe '.ldap' do
subject(:ldap) { described_class.ldap }
let_it_be(:ldap_user) { create(:omniauth_user, provider: "ldapmain") }
let_it_be(:gitlab_user) { create(:omniauth_user, provider: "gitlab") }
let_it_be(:regular_user) { create(:user) }
it 'returns LDAP users' do
expect(ldap).to include(ldap_user)
expect(ldap).not_to include(gitlab_user, regular_user)
end
end
describe '#unset_secondary_emails_matching_deleted_email!' do
let(:deleted_email) { 'kermit@muppets.com' }

View File

@ -10,6 +10,16 @@ RSpec.describe Admin::UsersController, :enable_admin_mode, feature_category: :us
sign_in(admin)
end
describe 'GET #index' do
it 'avoids N+1 query', :use_sql_query_cache do
base_query_count = ActiveRecord::QueryRecorder.new(skip_cached: false) { get admin_users_path }
create_list(:user, 3)
expect { get admin_users_path }.not_to exceed_query_limit(base_query_count)
end
end
describe 'PATCH #update' do
let(:user) { create(:user) }

View File

@ -158,11 +158,6 @@ RSpec.describe Ci::CreatePipelineService, :clean_gitlab_redis_cache, feature_cat
execute_service
end
it 'creates pipeline_config' do
expect { execute_service }
.to change { Ci::PipelineConfig.count }.by(1)
end
context 'when merge requests already exist for this source branch' do
let!(:merge_request_1) do
create(:merge_request, source_branch: 'feature', target_branch: "master", source_project: project)

View File

@ -45,7 +45,7 @@ module Database
Thread.current[:has_cross_join_exception] = true
raise CrossJoinAcrossUnsupportedTablesError,
"Unsupported cross-join across '#{tables.join(', ')}' querying '#{schemas.to_a.join(', ')}' discovered " \
"when executing query '#{sql}'. Please refer to https://docs.gitlab.com/ee/development/database/multiple_databases.html#removing-joins-between-ci_-and-non-ci_-tables for details on how to resolve this exception."
"when executing query '#{sql}'. Please refer to https://docs.gitlab.com/ee/development/database/multiple_databases.html#removing-joins-between-main_-and-non-main_-tables for details on how to resolve this exception."
end
end

View File

@ -112,6 +112,32 @@ RSpec.shared_examples 'handle uploads' do
expect(response.headers['Content-Type']).to eq('application/octet-stream')
end
it 'sets the :html request format' do
get :show, params: params.merge(secret: secret, filename: filename)
expect(response.request.format.symbol).to eq(:html)
end
end
context 'when the upload has a MIME type that Rails knows' do
let(:filename) { 'image.png' }
it 'sets the correct request format' do
get :show, params: params.merge(secret: secret, filename: filename)
expect(response.request.format.symbol).to eq(:png)
end
context 'when the upload is a JS file' do
let(:filename) { 'axios.min.js' }
it 'sets the :text request format' do
get :show, params: params.merge(secret: secret, filename: filename)
expect(response.request.format.symbol).to eq(:text)
end
end
end
context "when the model is public" do