Add latest changes from gitlab-org/gitlab@master

This commit is contained in:
GitLab Bot 2023-06-30 03:08:09 +00:00
parent 091b62a159
commit f80c3dfdfc
28 changed files with 180 additions and 92 deletions

View File

@ -1522,21 +1522,6 @@ Layout/ArgumentAlignment:
- 'spec/components/previews/pajamas/alert_component_preview.rb'
- 'spec/components/previews/pajamas/banner_component_preview.rb'
- 'spec/components/previews/pajamas/button_component_preview.rb'
- 'spec/features/error_tracking/user_filters_errors_by_status_spec.rb'
- 'spec/features/error_tracking/user_searches_sentry_errors_spec.rb'
- 'spec/features/error_tracking/user_sees_error_details_spec.rb'
- 'spec/features/error_tracking/user_sees_error_index_spec.rb'
- 'spec/features/groups_spec.rb'
- 'spec/features/help_pages_spec.rb'
- 'spec/features/ics/dashboard_issues_spec.rb'
- 'spec/features/ics/group_issues_spec.rb'
- 'spec/features/ics/project_issues_spec.rb'
- 'spec/features/incidents/incident_timeline_events_spec.rb'
- 'spec/features/incidents/user_views_incident_spec.rb'
- 'spec/features/issuables/issuable_list_spec.rb'
- 'spec/features/issues/create_issue_for_single_discussion_in_merge_request_spec.rb'
- 'spec/features/issues/user_creates_branch_and_merge_request_spec.rb'
- 'spec/features/issues/user_filters_issues_spec.rb'
- 'spec/features/jira_oauth_provider_authorize_spec.rb'
- 'spec/features/markdown/gitlab_flavored_markdown_spec.rb'
- 'spec/features/nav/top_nav_tooltip_spec.rb'

View File

@ -0,0 +1,11 @@
# frozen_string_literal: true
class AddProjectIdToScanResultPolicies < Gitlab::Database::Migration[2.1]
def up
add_column :scan_result_policies, :project_id, :bigint
end
def down
remove_column :scan_result_policies, :project_id
end
end

View File

@ -0,0 +1,15 @@
# frozen_string_literal: true
class AddIndexToScanResultPoliciesOnProjectId < Gitlab::Database::Migration[2.1]
INDEX_NAME = 'index_scan_result_policies_on_project_id'
disable_ddl_transaction!
def up
add_concurrent_index :scan_result_policies, :project_id, name: INDEX_NAME
end
def down
remove_concurrent_index_by_name :scan_result_policies, INDEX_NAME
end
end

View File

@ -0,0 +1,16 @@
# frozen_string_literal: true
class AddProjectIdForeignKeyToScanResultPolicies < Gitlab::Database::Migration[2.1]
disable_ddl_transaction!
def up
add_concurrent_foreign_key :scan_result_policies,
:projects,
column: :project_id,
on_delete: :cascade
end
def down
remove_foreign_key_if_exists :scan_result_policies, column: :project_id
end
end

View File

@ -0,0 +1 @@
542e2345a171e46512d793cc764fdbb279d9bf40e65e021d249953b29ff66dcb

View File

@ -0,0 +1 @@
633753a79a9d4f251c89b7fdbbf5fa17d2c85ceba091c450d377ab4e50bd9bce

View File

@ -0,0 +1 @@
a702fd86f25c3044e7eb8195349aec6f0627e258946c996164880c0f72998176

View File

@ -22337,6 +22337,7 @@ CREATE TABLE scan_result_policies (
age_operator smallint,
age_interval smallint,
vulnerability_attributes jsonb DEFAULT '{}'::jsonb,
project_id bigint,
CONSTRAINT age_value_null_or_positive CHECK (((age_value IS NULL) OR (age_value >= 0)))
);
@ -32812,6 +32813,8 @@ CREATE UNIQUE INDEX index_sbom_sources_on_source_type_and_source ON sbom_sources
CREATE INDEX index_scan_result_policies_on_policy_configuration_id ON scan_result_policies USING btree (security_orchestration_policy_configuration_id);
CREATE INDEX index_scan_result_policies_on_project_id ON scan_result_policies USING btree (project_id);
CREATE INDEX index_schema_inconsistencies_on_issue_id ON schema_inconsistencies USING btree (issue_id);
CREATE INDEX index_scim_identities_on_group_id ON scim_identities USING btree (group_id);
@ -35732,6 +35735,9 @@ ALTER TABLE ONLY lists
ALTER TABLE ONLY protected_branches
ADD CONSTRAINT fk_7a9c6d93e7 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
ALTER TABLE ONLY scan_result_policies
ADD CONSTRAINT fk_7aa24439f1 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
ALTER TABLE ONLY vulnerabilities
ADD CONSTRAINT fk_7ac31eacb9 FOREIGN KEY (updated_by_id) REFERENCES users(id) ON DELETE SET NULL;

View File

@ -274,6 +274,7 @@ query {
logIdName
googleProjectIdName
privateKey
clientEmail
}
}
}
@ -392,7 +393,7 @@ by [listing all the external destinations](#list-streaming-destinations).
```graphql
mutation {
googleCloudLoggingConfigurationUpdate(
input: {id: "gid://gitlab/AuditEvents::GoogleCloudLoggingConfiguration/1", groupPath: "my-group", googleProjectIdName: "my-google-project", clientEmail: "my-email@my-google-project.iam.gservice.account.com", privateKey: "YOUR_PRIVATE_KEY", logIdName: "audit-events"}
input: {id: "gid://gitlab/AuditEvents::GoogleCloudLoggingConfiguration/1", googleProjectIdName: "my-google-project", clientEmail: "my-email@my-google-project.iam.gservice.account.com", privateKey: "YOUR_PRIVATE_KEY", logIdName: "audit-events"}
) {
errors
googleCloudLoggingConfiguration {
@ -400,6 +401,7 @@ mutation {
logIdName
privateKey
googleProjectIdName
clientEmail
}
}
}

View File

@ -51,7 +51,8 @@ Code Quality results are shown in the:
> [Moved](https://gitlab.com/gitlab-org/gitlab/-/issues/212499) to GitLab Free in 13.2.
Code Quality analysis results display in the merge request widget area if a report from the target
branch is available for comparison.
branch is available for comparison. The merge request widget displays Code Quality findings and resolutions that
were introduced by the changes made in the merge request.
![Code Quality Widget](img/code_quality_widget_13_11.png)
@ -70,7 +71,8 @@ issues are marked by an indicator beside the gutter. Hover over the marker for d
### Pipeline details view **(PREMIUM)**
The full list of Code Quality violations generated by a pipeline is shown in the **Code Quality**
tab of the pipeline's details page.
tab of the pipeline's details page. The pipeline details view displays all Code Quality findings
that were found on the branch it was run on.
![Code Quality Report](img/code_quality_report_13_11.png)

View File

@ -339,7 +339,7 @@ The following package managers use lockfiles that GitLab analyzers are capable o
| Composer | Not applicable | [1.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/php-composer/default/composer.lock) |
| Conan | 0.4 | [1.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/c-conan/default/conan.lock#L38) |
| Go | Not applicable | [1.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/go-modules/gosum/default/go.sum) <sup><strong><a href="#notes-regarding-parsing-lockfiles-1">1</a></strong></sup> |
| NuGet | v1 | [4.9](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/csharp-nuget-dotnetcore/default/src/web.api/packages.lock.json#L2) |
| NuGet | v1, v2 | [4.9](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/csharp-nuget-dotnetcore/default/src/web.api/packages.lock.json#L2) |
| npm | v1, v2, v3<sup><b><a href="#notes-regarding-parsing-lockfiles-2">2</a></b></sup> | [6.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/js-npm/default/package-lock.json#L4), [7.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/js-npm/lockfileVersion2/package-lock.json#L4), [9.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/scanner/parser/npm/fixtures/lockfile-v3/simple/package-lock.json#L4) |
| pnpm | v5.3, v5.4, v6 | [7.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/js-pnpm/default/pnpm-lock.yaml#L1), [8.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/scanner/parser/pnpm/fixtures/v6/simple/pnpm-lock.yaml#L1) |
| yarn | v1, v2<sup><b><a href="#notes-regarding-parsing-lockfiles-3">3</a></b></sup>, v3<sup><b><a href="#notes-regarding-parsing-lockfiles-3">3</a></b></sup> | [1.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/js-yarn/classic/default/yarn.lock#L2), [2.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/js-yarn/berry/v2/default/yarn.lock), [3.x](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/blob/master/qa/fixtures/js-yarn/berry/v3/default/yarn.lock) |

View File

@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'When a user filters Sentry errors by status', :js, :use_clean_rails_memory_store_caching, :sidekiq_inline,
feature_category: :error_tracking do
feature_category: :error_tracking do
include_context 'sentry error tracking context feature'
let_it_be(:issues_response_body) { fixture_file('sentry/issues_sample_response.json') }

View File

@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'When a user searches for Sentry errors', :js, :use_clean_rails_memory_store_caching, :sidekiq_inline,
feature_category: :error_tracking do
feature_category: :error_tracking do
include_context 'sentry error tracking context feature'
let_it_be(:issues_response_body) { fixture_file('sentry/issues_sample_response.json') }

View File

@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'View error details page', :js, :use_clean_rails_memory_store_caching, :sidekiq_inline,
feature_category: :error_tracking do
feature_category: :error_tracking do
include_context 'sentry error tracking context feature'
context 'with current user as project owner' do

View File

@ -3,7 +3,7 @@
require 'spec_helper'
RSpec.describe 'View error index page', :js, :use_clean_rails_memory_store_caching, :sidekiq_inline,
feature_category: :error_tracking do
feature_category: :error_tracking do
include_context 'sentry error tracking context feature'
let_it_be(:issues_response_body) { fixture_file('sentry/issues_sample_response.json') }

View File

@ -461,9 +461,11 @@ RSpec.describe 'Group', feature_category: :groups_and_projects do
describe 'new subgroup / project button' do
let_it_be(:group, reload: true) do
create(:group,
project_creation_level: Gitlab::Access::NO_ONE_PROJECT_ACCESS,
subgroup_creation_level: Gitlab::Access::OWNER_SUBGROUP_ACCESS)
create(
:group,
project_creation_level: Gitlab::Access::NO_ONE_PROJECT_ACCESS,
subgroup_creation_level: Gitlab::Access::OWNER_SUBGROUP_ACCESS
)
end
before do

View File

@ -47,9 +47,11 @@ RSpec.describe 'Help Pages', feature_category: :shared do
describe 'when help page is customized' do
before do
stub_application_setting(help_page_hide_commercial_content: true,
help_page_text: 'My Custom Text',
help_page_support_url: 'http://example.com/help')
stub_application_setting(
help_page_hide_commercial_content: true,
help_page_text: 'My Custom Text',
help_page_support_url: 'http://example.com/help'
)
sign_in(create(:user))
visit help_path

View File

@ -29,9 +29,11 @@ RSpec.describe 'Dashboard Issues Calendar Feed', feature_category: :team_plannin
context 'with no referer' do
it 'renders calendar feed' do
sign_in user
visit issues_dashboard_path(:ics,
due_date: Issue::DueNextMonthAndPreviousTwoWeeks.name,
sort: 'closest_future_date')
visit issues_dashboard_path(
:ics,
due_date: Issue::DueNextMonthAndPreviousTwoWeeks.name,
sort: 'closest_future_date'
)
expect(response_headers['Content-Type']).to have_content('text/calendar')
expect(body).to have_text('BEGIN:VCALENDAR')
@ -42,9 +44,11 @@ RSpec.describe 'Dashboard Issues Calendar Feed', feature_category: :team_plannin
it 'renders calendar feed as text/plain' do
sign_in user
page.driver.header('Referer', issues_dashboard_url(host: Settings.gitlab.base_url))
visit issues_dashboard_path(:ics,
due_date: Issue::DueNextMonthAndPreviousTwoWeeks.name,
sort: 'closest_future_date')
visit issues_dashboard_path(
:ics,
due_date: Issue::DueNextMonthAndPreviousTwoWeeks.name,
sort: 'closest_future_date'
)
expect(response_headers['Content-Type']).to have_content('text/plain')
expect(body).to have_text('BEGIN:VCALENDAR')
@ -54,10 +58,12 @@ RSpec.describe 'Dashboard Issues Calendar Feed', feature_category: :team_plannin
context 'when filtered by milestone' do
it 'renders calendar feed' do
sign_in user
visit issues_dashboard_path(:ics,
due_date: Issue::DueNextMonthAndPreviousTwoWeeks.name,
sort: 'closest_future_date',
milestone_title: milestone.title)
visit issues_dashboard_path(
:ics,
due_date: Issue::DueNextMonthAndPreviousTwoWeeks.name,
sort: 'closest_future_date',
milestone_title: milestone.title
)
expect(response_headers['Content-Type']).to have_content('text/calendar')
expect(body).to have_text('BEGIN:VCALENDAR')
@ -69,10 +75,12 @@ RSpec.describe 'Dashboard Issues Calendar Feed', feature_category: :team_plannin
it 'renders calendar feed' do
personal_access_token = create(:personal_access_token, user: user)
visit issues_dashboard_path(:ics,
due_date: Issue::DueNextMonthAndPreviousTwoWeeks.name,
sort: 'closest_future_date',
private_token: personal_access_token.token)
visit issues_dashboard_path(
:ics,
due_date: Issue::DueNextMonthAndPreviousTwoWeeks.name,
sort: 'closest_future_date',
private_token: personal_access_token.token
)
expect(response_headers['Content-Type']).to have_content('text/calendar')
expect(body).to have_text('BEGIN:VCALENDAR')
@ -81,10 +89,12 @@ RSpec.describe 'Dashboard Issues Calendar Feed', feature_category: :team_plannin
context 'when authenticated via feed token' do
it 'renders calendar feed' do
visit issues_dashboard_path(:ics,
due_date: Issue::DueNextMonthAndPreviousTwoWeeks.name,
sort: 'closest_future_date',
feed_token: user.feed_token)
visit issues_dashboard_path(
:ics,
due_date: Issue::DueNextMonthAndPreviousTwoWeeks.name,
sort: 'closest_future_date',
feed_token: user.feed_token
)
expect(response_headers['Content-Type']).to have_content('text/calendar')
expect(body).to have_text('BEGIN:VCALENDAR')
@ -93,15 +103,24 @@ RSpec.describe 'Dashboard Issues Calendar Feed', feature_category: :team_plannin
context 'issue with due date' do
let!(:issue) do
create(:issue, author: user, assignees: [assignee], project: project, title: 'test title',
description: 'test desc', due_date: Date.tomorrow)
create(
:issue,
author: user,
assignees: [assignee],
project: project,
title: 'test title',
description: 'test desc',
due_date: Date.tomorrow
)
end
it 'renders issue fields' do
visit issues_dashboard_path(:ics,
due_date: Issue::DueNextMonthAndPreviousTwoWeeks.name,
sort: 'closest_future_date',
feed_token: user.feed_token)
visit issues_dashboard_path(
:ics,
due_date: Issue::DueNextMonthAndPreviousTwoWeeks.name,
sort: 'closest_future_date',
feed_token: user.feed_token
)
expect(body).to have_text("SUMMARY:test title (in #{project.full_path})")
# line length for ics is 75 chars

View File

@ -71,8 +71,15 @@ RSpec.describe 'Group Issues Calendar Feed', feature_category: :groups_and_proje
context 'issue with due date' do
let!(:issue) do
create(:issue, author: user, assignees: [assignee], project: project, title: 'test title',
description: 'test desc', due_date: Date.tomorrow)
create(
:issue,
author: user,
assignees: [assignee],
project: project,
title: 'test title',
description: 'test desc',
due_date: Date.tomorrow
)
end
it 'renders issue fields' do

View File

@ -70,8 +70,15 @@ RSpec.describe 'Project Issues Calendar Feed', feature_category: :groups_and_pro
context 'issue with due date' do
let!(:issue) do
create(:issue, author: user, assignees: [assignee], project: project, title: 'test title',
description: 'test desc', due_date: Date.tomorrow)
create(
:issue,
author: user,
assignees: [assignee],
project: project,
title: 'test title',
description: 'test desc',
due_date: Date.tomorrow
)
end
it 'renders issue fields' do

View File

@ -93,7 +93,7 @@ RSpec.describe 'Incident timeline events', :js, feature_category: :incident_mana
end
it_behaves_like 'for each incident details route',
'add, edit, and delete timeline events',
tab_text: s_('Incident|Timeline'),
tab: 'timeline'
'add, edit, and delete timeline events',
tab_text: s_('Incident|Timeline'),
tab: 'timeline'
end

View File

@ -31,10 +31,12 @@ RSpec.describe "User views incident", feature_category: :incident_management do
describe 'user actions' do
it 'shows the merge request and incident actions', :js, :aggregate_failures do
expected_href = new_project_issue_path(project,
issuable_template: 'incident',
issue: { issue_type: 'incident' },
add_related_issue: incident.iid)
expected_href = new_project_issue_path(
project,
issuable_template: 'incident',
issue: { issue_type: 'incident' },
add_related_issue: incident.iid
)
click_button 'Incident actions'

View File

@ -99,9 +99,7 @@ RSpec.describe 'issuable list', :js, feature_category: :team_planning do
if issuable_type == :issue
issue = Issue.reorder(:iid).first
merge_request = create(:merge_request,
source_project: project,
source_branch: generate(:branch))
merge_request = create(:merge_request, source_project: project, source_branch: generate(:branch))
create(:merge_requests_closing_issues, issue: issue, merge_request: merge_request)
end

View File

@ -74,8 +74,11 @@ RSpec.describe 'Resolve an open thread in a merge request by creating an issue',
before do
project.add_reporter(user)
sign_in user
visit new_project_issue_path(project, merge_request_to_resolve_discussions_of: merge_request.iid,
discussion_to_resolve: discussion.id)
visit new_project_issue_path(
project,
merge_request_to_resolve_discussions_of: merge_request.iid,
discussion_to_resolve: discussion.id
)
end
it 'shows a notice to ask someone else to resolve the threads' do

View File

@ -137,13 +137,25 @@ RSpec.describe 'User creates branch and merge request on issue page', :js, featu
context "when there is a referenced merge request" do
let!(:note) do
create(:note, :on_issue, :system, project: project, noteable: issue,
note: "mentioned in #{referenced_mr.to_reference}")
create(
:note,
:on_issue,
:system,
project: project,
noteable: issue,
note: "mentioned in #{referenced_mr.to_reference}"
)
end
let(:referenced_mr) do
create(:merge_request, :simple, source_project: project, target_project: project,
description: "Fixes #{issue.to_reference}", author: user)
create(
:merge_request,
:simple,
source_project: project,
target_project: project,
description: "Fixes #{issue.to_reference}",
author: user
)
end
before do

View File

@ -8,11 +8,13 @@ RSpec.describe 'User filters issues', :js, feature_category: :team_planning do
before do
%w[foobar barbaz].each do |title|
create(:issue,
author: user,
assignees: [user],
project: project,
title: title)
create(
:issue,
author: user,
assignees: [user],
project: project,
title: title
)
end
@issue = Issue.find_by(title: 'foobar')

View File

@ -808,6 +808,7 @@ project:
- design_management_repository
- design_management_repository_state
- compliance_standards_adherence
- scan_result_policy_reads
award_emoji:
- awardable
- user

View File

@ -59,8 +59,7 @@ RSpec.describe ApplicationSetting, feature_category: :shared, type: :model do
it { is_expected.to allow_value("dev.gitlab.com").for(:commit_email_hostname) }
it { is_expected.not_to allow_value("@dev.gitlab").for(:commit_email_hostname) }
it { is_expected.to allow_value(true).for(:container_expiration_policies_enable_historic_entries) }
it { is_expected.to allow_value(false).for(:container_expiration_policies_enable_historic_entries) }
it { is_expected.to allow_value(true, false).for(:container_expiration_policies_enable_historic_entries) }
it { is_expected.not_to allow_value(nil).for(:container_expiration_policies_enable_historic_entries) }
it { is_expected.to allow_value("myemail@gitlab.com").for(:lets_encrypt_notification_email) }
@ -100,8 +99,7 @@ RSpec.describe ApplicationSetting, feature_category: :shared, type: :model do
it { is_expected.to validate_numericality_of(:container_registry_cleanup_tags_service_max_list_size).only_integer.is_greater_than_or_equal_to(0) }
it { is_expected.to validate_numericality_of(:container_registry_data_repair_detail_worker_max_concurrency).only_integer.is_greater_than_or_equal_to(0) }
it { is_expected.to validate_numericality_of(:container_registry_expiration_policies_worker_capacity).only_integer.is_greater_than_or_equal_to(0) }
it { is_expected.to allow_value(true).for(:container_registry_expiration_policies_caching) }
it { is_expected.to allow_value(false).for(:container_registry_expiration_policies_caching) }
it { is_expected.to allow_value(true, false).for(:container_registry_expiration_policies_caching) }
it { is_expected.to validate_numericality_of(:container_registry_import_max_tags_count).only_integer.is_greater_than_or_equal_to(0) }
it { is_expected.to validate_numericality_of(:container_registry_import_max_retries).only_integer.is_greater_than_or_equal_to(0) }
@ -134,8 +132,7 @@ RSpec.describe ApplicationSetting, feature_category: :shared, type: :model do
it { is_expected.to validate_numericality_of(:snippet_size_limit).only_integer.is_greater_than(0) }
it { is_expected.to validate_numericality_of(:wiki_page_max_content_bytes).only_integer.is_greater_than_or_equal_to(1024) }
it { is_expected.to allow_value(true).for(:wiki_asciidoc_allow_uri_includes) }
it { is_expected.to allow_value(false).for(:wiki_asciidoc_allow_uri_includes) }
it { is_expected.to allow_value(true, false).for(:wiki_asciidoc_allow_uri_includes) }
it { is_expected.not_to allow_value(nil).for(:wiki_asciidoc_allow_uri_includes) }
it { is_expected.to validate_presence_of(:max_artifacts_size) }
it { is_expected.to validate_numericality_of(:max_artifacts_size).only_integer.is_greater_than(0) }
@ -148,8 +145,7 @@ RSpec.describe ApplicationSetting, feature_category: :shared, type: :model do
it { is_expected.to validate_presence_of(:max_terraform_state_size_bytes) }
it { is_expected.to validate_numericality_of(:max_terraform_state_size_bytes).only_integer.is_greater_than_or_equal_to(0) }
it { is_expected.to allow_value(true).for(:user_defaults_to_private_profile) }
it { is_expected.to allow_value(false).for(:user_defaults_to_private_profile) }
it { is_expected.to allow_value(true, false).for(:user_defaults_to_private_profile) }
it { is_expected.not_to allow_value(nil).for(:user_defaults_to_private_profile) }
it { is_expected.to allow_values([true, false]).for(:deny_all_requests_except_allowed) }
@ -250,16 +246,13 @@ RSpec.describe ApplicationSetting, feature_category: :shared, type: :model do
it { is_expected.to allow_value(http).for(:jira_connect_proxy_url) }
it { is_expected.to allow_value(https).for(:jira_connect_proxy_url) }
it { is_expected.to allow_value(true).for(:bulk_import_enabled) }
it { is_expected.to allow_value(false).for(:bulk_import_enabled) }
it { is_expected.to allow_value(true, false).for(:bulk_import_enabled) }
it { is_expected.not_to allow_value(nil).for(:bulk_import_enabled) }
it { is_expected.to allow_value(true).for(:allow_runner_registration_token) }
it { is_expected.to allow_value(false).for(:allow_runner_registration_token) }
it { is_expected.to allow_value(true, false).for(:allow_runner_registration_token) }
it { is_expected.not_to allow_value(nil).for(:allow_runner_registration_token) }
it { is_expected.to allow_value(true).for(:gitlab_dedicated_instance) }
it { is_expected.to allow_value(false).for(:gitlab_dedicated_instance) }
it { is_expected.to allow_value(true, false).for(:gitlab_dedicated_instance) }
it { is_expected.not_to allow_value(nil).for(:gitlab_dedicated_instance) }
it { is_expected.not_to allow_value(random: :value).for(:database_apdex_settings) }