From e9aabbc4b5c80a569ce7e5909bd9d8def11b7a1b Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Wed, 6 Dec 2023 12:11:09 +0000 Subject: [PATCH] Add latest changes from gitlab-org/gitlab@master --- .gitlab/ci/qa-common/main.gitlab-ci.yml | 2 +- .rubocop_todo/capybara/visibility_matcher.yml | 1 - .rubocop_todo/layout/line_length.yml | 2 - .../rspec/before_all_role_assignment.yml | 2 - .rubocop_todo/rspec/context_wording.yml | 4 - .../rspec/factory_bot/avoid_create.yml | 6 - .rubocop_todo/rspec/feature_category.yml | 4 - .../badges/components/badge_form.vue | 8 +- .../clusters_list/components/clusters.vue | 7 +- .../components/new_deploy_token.vue | 2 - .../components/error_details.vue | 10 +- app/assets/javascripts/gfm_auto_complete.js | 7 +- .../graphql/services/local_storage_cache.js | 4 +- app/assets/javascripts/lib/utils/regexp.js | 9 +- .../javascripts/lib/utils/text_utility.js | 6 +- .../work_item_attributes_wrapper.vue | 33 +- ...parent.vue => work_item_parent_inline.vue} | 0 .../components/work_item_parent_with_edit.vue | 295 ++++++ app/helpers/packages_helper.rb | 8 +- app/models/project_feature.rb | 2 +- .../bulk_imports/file_download_service.rb | 7 + app/views/layouts/fullscreen.html.haml | 4 +- .../layouts/nav/sidebar/_admin.html.haml | 1 - .../layouts/nav/sidebar/_explore.html.haml | 1 - .../layouts/nav/sidebar/_group.html.haml | 2 - .../nav/sidebar/_organization.html.haml | 1 - .../layouts/nav/sidebar/_profile.html.haml | 1 - .../layouts/nav/sidebar/_project.html.haml | 1 - .../layouts/nav/sidebar/_search.html.haml | 1 - .../nav/sidebar/_user_profile.html.haml | 1 - .../layouts/nav/sidebar/_your_work.html.haml | 1 - .../projects/pages/_pages_settings.html.haml | 6 +- .../packages_and_registries/show.html.haml | 2 +- .../shared/_sidebar_toggle_button.html.haml | 7 - .../shared/nav/_admin_scope_header.html.haml | 6 - .../nav/_explore_scope_header.html.haml | 6 - app/views/shared/nav/_scope_menu.html.haml | 6 - app/views/shared/nav/_sidebar.html.haml | 16 - .../nav/_sidebar_hidden_menu_item.html.haml | 3 - app/views/shared/nav/_sidebar_menu.html.haml | 19 - .../shared/nav/_sidebar_menu_item.html.haml | 11 - .../shared/nav/_sidebar_submenu.html.haml | 12 - .../nav/_user_settings_scope_header.html.haml | 4 - .../nav/_your_work_scope_header.html.haml | 6 - app/workers/all_queues.yml | 6 +- .../process_runner_version_update_worker.rb | 2 +- ...le_existing_runner_versions_cron_worker.rb | 2 +- .../stale_machines_cleanup_cron_worker.rb | 2 +- config/feature_categories.yml | 3 +- ..._mode_scope_for_personal_access_tokens.yml | 2 +- ...ll_code_suggestions_namespace_settings.yml | 2 +- ...lt_branch_protection_namespace_setting.yml | 2 +- ...ackfill_design_management_repositories.yml | 2 +- ...ismissal_reason_in_vulnerability_reads.yml | 2 +- ...backfill_finding_id_in_vulnerabilities.yml | 2 +- ...s_merge_request_of_vulnerability_reads.yml | 2 +- ...as_remediations_of_vulnerability_reads.yml | 2 +- ...ackfill_merge_request_diffs_project_id.yml | 2 +- .../backfill_missing_ci_cd_settings.yml | 2 +- ...issing_vulnerability_dismissal_details.yml | 2 +- .../backfill_nuget_normalized_version.yml | 2 +- .../backfill_packages_tags_project_id.yml | 2 +- ...atistics_storage_size_with_recent_size.yml | 2 +- ...ze_without_pipeline_artifacts_size_job.yml | 2 +- .../backfill_project_wiki_repositories.yml | 2 +- .../backfill_resource_link_events.yml | 2 +- ..._storage_statistics_fork_storage_sizes.yml | 2 +- ...ackfill_user_preferences_with_defaults.yml | 2 +- .../backfill_users_with_defaults.yml | 2 +- ...on_column_in_vulnerability_occurrences.yml | 2 +- .../backfill_work_item_type_id_for_issues.yml | 2 +- ...ckfill_workspace_personal_access_token.yml | 2 +- ...onal_access_tokens_with_nil_expires_at.yml | 2 +- ..._credit_card_validation_data_to_hashes.yml | 2 +- .../create_compliance_standards_adherence.yml | 2 +- ...d_protected_branch_merge_access_levels.yml | 2 +- ...id_protected_branch_push_access_levels.yml | 2 +- ...lid_protected_tag_create_access_levels.yml | 2 +- ...ned_transferred_project_approval_rules.yml | 2 +- ..._orphans_approval_merge_request_rules2.yml | 2 +- ...delete_orphans_approval_project_rules2.yml | 2 +- ...dants_override_disabled_shared_runners.yml | 2 +- ...x_namespace_ids_of_vulnerability_reads.yml | 2 +- ...duplicate_npm_packages_for_destruction.yml | 2 +- .../migrate_human_user_type.yml | 2 +- ...ormalized_columns_for_sbom_occurrences.yml | 2 +- ...opulate_vulnerability_dismissal_fields.yml | 2 +- ...ove_invalid_deploy_access_level_groups.yml | 2 +- .../sync_scan_result_policies.yml | 2 +- ...ode_suggestions_for_namespace_settings.yml | 2 +- ..._users_set_external_if_service_account.yml | 2 +- .../update_workspaces_config_version.yml | 2 +- db/docs/ci_runner_machines.yml | 2 +- db/docs/ci_runner_versions.yml | 2 +- db/docs/ci_runners.yml | 2 +- db/docs/namespace_ci_cd_settings.yml | 2 +- .../p_ci_finished_build_ch_sync_events.yml | 2 +- db/docs/p_ci_runner_machine_builds.yml | 2 +- db/docs/project_ci_cd_settings.yml | 2 +- ...1113901_add_url_sub_fields_to_workspace.rb | 22 + ...ove_not_null_constraint_from_url_column.rb | 14 + ...add_owasp_top_10_to_vulnerability_reads.rb | 10 + db/schema_migrations/20231201113901 | 1 + db/schema_migrations/20231201114233 | 1 + db/schema_migrations/20231201122830 | 1 + db/structure.sql | 11 +- .../auth/ldap/ldap-troubleshooting.md | 19 + doc/administration/monitoring/ip_allowlist.md | 6 +- .../ci_gcp_secrets_manager/index.md | 2 +- doc/development/fe_guide/architecture.md | 57 +- doc/user/permissions.md | 3 +- doc/user/project/pages/index.md | 2 +- lib/api/ci/runner.rb | 2 +- lib/api/user_runners.rb | 2 +- lib/bulk_imports/network_error.rb | 4 +- ...d_background_migration_dictionary.template | 2 +- ...ndants_override_disabled_shared_runners.rb | 2 +- locale/gitlab.pot | 12 +- qa/qa/page/component/badges.rb | 16 +- ...atched_background_migrations_dictionary.rb | 7 +- .../background_migration/dictionary_file.rb | 9 + .../admin/runner_projects_controller_spec.rb | 2 +- .../admin/runners_controller_spec.rb | 2 +- .../groups/runners_controller_spec.rb | 2 +- .../runner_projects_controller_spec.rb | 2 +- .../projects/runners_controller_spec.rb | 2 +- spec/features/admin/admin_runners_spec.rb | 2 +- spec/features/groups/group_runners_spec.rb | 2 +- spec/features/runners_spec.rb | 2 +- spec/finders/ci/runners_finder_spec.rb | 2 +- .../components/error_details_spec.js | 2 +- spec/frontend/fixtures/runner.rb | 2 +- .../components/import_table_spec.js | 55 +- .../work_item_attributes_wrapper_spec.js | 73 +- ...pec.js => work_item_parent_inline_spec.js} | 6 +- .../work_item_parent_with_edit_spec.js | 409 ++++++++ spec/frontend/work_items/mock_data.js | 16 +- .../mutations/ci/runner/bulk_delete_spec.rb | 2 +- .../mutations/ci/runner/delete_spec.rb | 2 +- .../mutations/ci/runner/update_spec.rb | 2 +- .../ci/group_runners_resolver_spec.rb | 2 +- .../ci/project_runners_resolver_spec.rb | 2 +- .../ci/runner_groups_resolver_spec.rb | 2 +- .../ci/runner_job_count_resolver_spec.rb | 2 +- .../resolvers/ci/runner_jobs_resolver_spec.rb | 2 +- .../ci/runner_platforms_resolver_spec.rb | 2 +- .../ci/runner_projects_resolver_spec.rb | 2 +- .../ci/runner_setup_resolver_spec.rb | 2 +- .../ci/runner_status_resolver_spec.rb | 2 +- .../resolvers/ci/runners_resolver_spec.rb | 2 +- spec/graphql/types/ci/job_base_field_spec.rb | 2 +- .../runner_countable_connection_type_spec.rb | 2 +- .../types/ci/runner_manager_type_spec.rb | 2 +- .../types/ci/runner_platform_type_spec.rb | 2 +- .../types/ci/runner_setup_type_spec.rb | 2 +- .../ci/runner_upgrade_status_enum_spec.rb | 2 +- .../types/ci/runner_web_url_edge_spec.rb | 2 +- spec/helpers/ci/runners_helper_spec.rb | 2 +- spec/lib/api/ci/helpers/runner_spec.rb | 2 +- spec/lib/bulk_imports/pipeline/runner_spec.rb | 2 +- ...y_batched_migration_dictionary_matcher.txt | 2 +- ...s_override_disabled_shared_runners_spec.rb | 3 +- .../lib/gitlab/ci/runner_instructions_spec.rb | 2 +- spec/lib/gitlab/ci/runner_releases_spec.rb | 2 +- .../gitlab/ci/runner_upgrade_check_spec.rb | 2 +- spec/lib/gitlab/doctor/reset_tokens_spec.rb | 2 +- .../runner_fleet_pipeline_seeder_spec.rb | 2 +- .../ci/runner/runner_fleet_seeder_spec.rb | 2 +- ...s_override_disabled_shared_runners_spec.rb | 2 +- spec/models/ci/runner_manager_build_spec.rb | 2 +- spec/models/ci/runner_manager_spec.rb | 2 +- spec/models/ci/runner_version_spec.rb | 2 +- .../runner_manager_policy_preloader_spec.rb | 2 +- .../policies/ci/runner_manager_policy_spec.rb | 2 +- .../api/ci/runner/runners_delete_spec.rb | 2 +- .../api/ci/runner/runners_post_spec.rb | 2 +- .../api/ci/runner/runners_reset_spec.rb | 2 +- .../runners_reset_registration_token_spec.rb | 2 +- spec/requests/api/ci/runners_spec.rb | 2 +- spec/requests/api/graphql/ci/runner_spec.rb | 2 +- .../graphql/ci/runner_web_url_edge_spec.rb | 2 +- spec/requests/api/graphql/ci/runners_spec.rb | 2 +- .../mutations/ci/runner/create_spec.rb | 2 +- .../runners_registration_token/reset_spec.rb | 2 +- spec/requests/api/user_runners_spec.rb | 2 +- spec/requests/runner_setup_controller_spec.rb | 2 +- .../dictionary_file_spec.rb | 39 +- .../file_download_service_spec.rb | 15 +- .../ci/runners/assign_runner_service_spec.rb | 2 +- .../bulk_delete_runners_service_spec.rb | 2 +- .../ci/runners/create_runner_service_spec.rb | 2 +- ...cess_runner_version_update_service_spec.rb | 2 +- ...e_existing_runner_versions_service_spec.rb | 2 +- .../runners/register_runner_service_spec.rb | 2 +- .../reset_registration_token_service_spec.rb | 2 +- ...runner_associated_projects_service_spec.rb | 2 +- .../stale_managers_cleanup_service_spec.rb | 2 +- .../runners/unassign_runner_service_spec.rb | 2 +- .../unregister_runner_manager_service_spec.rb | 2 +- .../runners/unregister_runner_service_spec.rb | 2 +- .../ci/runners/update_runner_service_spec.rb | 2 +- .../stuck_builds/drop_pending_service_spec.rb | 2 +- .../stuck_builds/drop_running_service_spec.rb | 2 +- .../drop_scheduled_service_spec.rb | 2 +- spec/support/rspec_order_todo.yml | 9 - .../features/work_items_shared_examples.rb | 32 +- spec/tasks/gitlab/doctor/secrets_rake_spec.rb | 2 +- .../gitlab/seed/runner_fleet_rake_spec.rb | 2 +- .../layouts/fullscreen.html.haml_spec.rb | 34 - .../nav/sidebar/_admin.html.haml_spec.rb | 161 --- .../nav/sidebar/_group.html.haml_spec.rb | 187 ---- .../nav/sidebar/_profile.html.haml_spec.rb | 30 - .../nav/sidebar/_project.html.haml_spec.rb | 958 ------------------ .../pages/_pages_settings.html.haml_spec.rb | 2 +- .../shared/nav/_sidebar.html.haml_spec.rb | 43 - .../runners/_runner_details.html.haml_spec.rb | 2 +- ...ocess_runner_version_update_worker_spec.rb | 2 +- ...isting_runner_versions_cron_worker_spec.rb | 2 +- ...stale_machines_cleanup_cron_worker_spec.rb | 2 +- 219 files changed, 1271 insertions(+), 1820 deletions(-) rename app/assets/javascripts/work_items/components/{work_item_parent.vue => work_item_parent_inline.vue} (100%) create mode 100644 app/assets/javascripts/work_items/components/work_item_parent_with_edit.vue delete mode 100644 app/views/layouts/nav/sidebar/_admin.html.haml delete mode 100644 app/views/layouts/nav/sidebar/_explore.html.haml delete mode 100644 app/views/layouts/nav/sidebar/_group.html.haml delete mode 100644 app/views/layouts/nav/sidebar/_organization.html.haml delete mode 100644 app/views/layouts/nav/sidebar/_profile.html.haml delete mode 100644 app/views/layouts/nav/sidebar/_project.html.haml delete mode 100644 app/views/layouts/nav/sidebar/_search.html.haml delete mode 100644 app/views/layouts/nav/sidebar/_user_profile.html.haml delete mode 100644 app/views/layouts/nav/sidebar/_your_work.html.haml delete mode 100644 app/views/shared/_sidebar_toggle_button.html.haml delete mode 100644 app/views/shared/nav/_admin_scope_header.html.haml delete mode 100644 app/views/shared/nav/_explore_scope_header.html.haml delete mode 100644 app/views/shared/nav/_scope_menu.html.haml delete mode 100644 app/views/shared/nav/_sidebar.html.haml delete mode 100644 app/views/shared/nav/_sidebar_hidden_menu_item.html.haml delete mode 100644 app/views/shared/nav/_sidebar_menu.html.haml delete mode 100644 app/views/shared/nav/_sidebar_menu_item.html.haml delete mode 100644 app/views/shared/nav/_sidebar_submenu.html.haml delete mode 100644 app/views/shared/nav/_user_settings_scope_header.html.haml delete mode 100644 app/views/shared/nav/_your_work_scope_header.html.haml create mode 100644 db/migrate/20231201113901_add_url_sub_fields_to_workspace.rb create mode 100644 db/migrate/20231201114233_remove_not_null_constraint_from_url_column.rb create mode 100644 db/migrate/20231201122830_add_owasp_top_10_to_vulnerability_reads.rb create mode 100644 db/schema_migrations/20231201113901 create mode 100644 db/schema_migrations/20231201114233 create mode 100644 db/schema_migrations/20231201122830 rename spec/frontend/work_items/components/{work_item_parent_spec.js => work_item_parent_inline_spec.js} (97%) create mode 100644 spec/frontend/work_items/components/work_item_parent_with_edit_spec.js delete mode 100644 spec/views/layouts/nav/sidebar/_admin.html.haml_spec.rb delete mode 100644 spec/views/layouts/nav/sidebar/_group.html.haml_spec.rb delete mode 100644 spec/views/layouts/nav/sidebar/_profile.html.haml_spec.rb delete mode 100644 spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb delete mode 100644 spec/views/shared/nav/_sidebar.html.haml_spec.rb diff --git a/.gitlab/ci/qa-common/main.gitlab-ci.yml b/.gitlab/ci/qa-common/main.gitlab-ci.yml index 27a807005b1..dc00299cc61 100644 --- a/.gitlab/ci/qa-common/main.gitlab-ci.yml +++ b/.gitlab/ci/qa-common/main.gitlab-ci.yml @@ -14,7 +14,7 @@ include: gitlab_auth_token_variable_name: "PROJECT_TOKEN_FOR_CI_SCRIPTS_API_USAGE" allure_job_name: "${QA_RUN_TYPE}" - project: gitlab-org/quality/pipeline-common - ref: 7.13.3 + ref: 8.0.0 file: - /ci/base.gitlab-ci.yml - /ci/knapsack-report.yml diff --git a/.rubocop_todo/capybara/visibility_matcher.yml b/.rubocop_todo/capybara/visibility_matcher.yml index 6ea7500863b..9a2a85a7cf8 100644 --- a/.rubocop_todo/capybara/visibility_matcher.yml +++ b/.rubocop_todo/capybara/visibility_matcher.yml @@ -66,6 +66,5 @@ Capybara/VisibilityMatcher: - 'spec/support/shared_examples/features/rss_shared_examples.rb' - 'spec/support/shared_examples/features/wiki/file_attachments_shared_examples.rb' - 'spec/views/import/gitlab_projects/new.html.haml_spec.rb' - - 'spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb' - 'spec/views/profiles/preferences/show.html.haml_spec.rb' - 'spec/views/projects/merge_requests/edit.html.haml_spec.rb' diff --git a/.rubocop_todo/layout/line_length.yml b/.rubocop_todo/layout/line_length.yml index e0e2ac0dc32..a68124c649b 100644 --- a/.rubocop_todo/layout/line_length.yml +++ b/.rubocop_todo/layout/line_length.yml @@ -2288,7 +2288,6 @@ Layout/LineLength: - 'ee/spec/views/compliance_management/compliance_framework/_project_settings.html.haml_spec.rb' - 'ee/spec/views/groups/security/discover/show.html.haml_spec.rb' - 'ee/spec/views/layouts/header/_current_user_dropdown.html.haml_spec.rb' - - 'ee/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb' - 'ee/spec/views/operations/environments.html.haml_spec.rb' - 'ee/spec/views/projects/security/discover/show.html.haml_spec.rb' - 'ee/spec/views/shared/_mirror_status.html.haml_spec.rb' @@ -4885,7 +4884,6 @@ Layout/LineLength: - 'spec/views/groups/edit.html.haml_spec.rb' - 'spec/views/help/index.html.haml_spec.rb' - 'spec/views/layouts/_head.html.haml_spec.rb' - - 'spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb' - 'spec/views/notify/push_to_merge_request_email.text.haml_spec.rb' - 'spec/views/profiles/keys/_form.html.haml_spec.rb' - 'spec/views/projects/commits/_commit.html.haml_spec.rb' diff --git a/.rubocop_todo/rspec/before_all_role_assignment.yml b/.rubocop_todo/rspec/before_all_role_assignment.yml index 7f4eeeb3d00..d35df4df983 100644 --- a/.rubocop_todo/rspec/before_all_role_assignment.yml +++ b/.rubocop_todo/rspec/before_all_role_assignment.yml @@ -735,8 +735,6 @@ RSpec/BeforeAllRoleAssignment: - 'ee/spec/support/shared_examples/serializers/report_status_shared_examples.rb' - 'ee/spec/views/compliance_management/compliance_framework/_project_settings.html.haml_spec.rb' - 'ee/spec/views/layouts/header/_new_dropdown.haml_spec.rb' - - 'ee/spec/views/layouts/nav/sidebar/_group.html.haml_spec.rb' - - 'ee/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb' - 'ee/spec/views/shared/promotions/_promotion_link_project.html.haml_spec.rb' - 'ee/spec/workers/abuse/new_abuse_report_worker_spec.rb' - 'ee/spec/workers/app_sec/dast/profile_schedule_worker_spec.rb' diff --git a/.rubocop_todo/rspec/context_wording.yml b/.rubocop_todo/rspec/context_wording.yml index d3ebe8427fd..1120d9e8a14 100644 --- a/.rubocop_todo/rspec/context_wording.yml +++ b/.rubocop_todo/rspec/context_wording.yml @@ -852,9 +852,6 @@ RSpec/ContextWording: - 'ee/spec/views/groups/edit.html.haml_spec.rb' - 'ee/spec/views/groups/security/discover/show.html.haml_spec.rb' - 'ee/spec/views/layouts/header/_read_only_banner.html.haml_spec.rb' - - 'ee/spec/views/layouts/nav/sidebar/_admin.html.haml_spec.rb' - - 'ee/spec/views/layouts/nav/sidebar/_group.html.haml_spec.rb' - - 'ee/spec/views/layouts/nav/sidebar/_push_rules_link.html.haml_spec.rb' - 'ee/spec/views/profiles/preferences/show.html.haml_spec.rb' - 'ee/spec/views/projects/security/discover/show.html.haml_spec.rb' - 'ee/spec/views/shared/_clone_panel.html.haml_spec.rb' @@ -3006,7 +3003,6 @@ RSpec/ContextWording: - 'spec/views/groups/_home_panel.html.haml_spec.rb' - 'spec/views/groups/edit.html.haml_spec.rb' - 'spec/views/layouts/application.html.haml_spec.rb' - - 'spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb' - 'spec/views/notify/changed_milestone_email.html.haml_spec.rb' - 'spec/views/profiles/keys/_key.html.haml_spec.rb' - 'spec/views/profiles/preferences/show.html.haml_spec.rb' diff --git a/.rubocop_todo/rspec/factory_bot/avoid_create.yml b/.rubocop_todo/rspec/factory_bot/avoid_create.yml index ca85767e0f1..7439f18b06e 100644 --- a/.rubocop_todo/rspec/factory_bot/avoid_create.yml +++ b/.rubocop_todo/rspec/factory_bot/avoid_create.yml @@ -207,8 +207,6 @@ RSpec/FactoryBot/AvoidCreate: - 'ee/spec/views/layouts/group.html.haml_spec.rb' - 'ee/spec/views/layouts/header/_current_user_dropdown.html.haml_spec.rb' - 'ee/spec/views/layouts/header/_read_only_banner.html.haml_spec.rb' - - 'ee/spec/views/layouts/nav/sidebar/_group.html.haml_spec.rb' - - 'ee/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb' - 'ee/spec/views/layouts/project.html.haml_spec.rb' - 'ee/spec/views/projects/edit.html.haml_spec.rb' - 'ee/spec/views/projects/on_demand_scans/index.html.haml_spec.rb' @@ -569,9 +567,6 @@ RSpec/FactoryBot/AvoidCreate: - 'spec/views/layouts/application.html.haml_spec.rb' - 'spec/views/layouts/devise.html.haml_spec.rb' - 'spec/views/layouts/fullscreen.html.haml_spec.rb' - - 'spec/views/layouts/nav/sidebar/_group.html.haml_spec.rb' - - 'spec/views/layouts/nav/sidebar/_profile.html.haml_spec.rb' - - 'spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb' - 'spec/views/layouts/profile.html.haml_spec.rb' - 'spec/views/layouts/terms.html.haml_spec.rb' - 'spec/views/notify/approved_merge_request_email.html.haml_spec.rb' @@ -627,7 +622,6 @@ RSpec/FactoryBot/AvoidCreate: - 'spec/views/shared/issuable/_sidebar.html.haml_spec.rb' - 'spec/views/shared/milestones/_issuable.html.haml_spec.rb' - 'spec/views/shared/milestones/_top.html.haml_spec.rb' - - 'spec/views/shared/nav/_sidebar.html.haml_spec.rb' - 'spec/views/shared/projects/_inactive_project_deletion_alert.html.haml_spec.rb' - 'spec/views/shared/projects/_list.html.haml_spec.rb' - 'spec/views/shared/projects/_project.html.haml_spec.rb' diff --git a/.rubocop_todo/rspec/feature_category.yml b/.rubocop_todo/rspec/feature_category.yml index 37d27964038..346e259b4dd 100644 --- a/.rubocop_todo/rspec/feature_category.yml +++ b/.rubocop_todo/rspec/feature_category.yml @@ -1450,7 +1450,6 @@ RSpec/FeatureCategory: - 'ee/spec/views/layouts/header/_current_user_dropdown.html.haml_spec.rb' - 'ee/spec/views/layouts/header/_ee_subscribable_banner.html.haml_spec.rb' - 'ee/spec/views/layouts/header/_read_only_banner.html.haml_spec.rb' - - 'ee/spec/views/layouts/nav/sidebar/_group.html.haml_spec.rb' - 'ee/spec/views/operations/environments.html.haml_spec.rb' - 'ee/spec/views/operations/index.html.haml_spec.rb' - 'ee/spec/views/profiles/preferences/show.html.haml_spec.rb' @@ -5408,8 +5407,6 @@ RSpec/FeatureCategory: - 'spec/views/layouts/devise_empty.html.haml_spec.rb' - 'spec/views/layouts/fullscreen.html.haml_spec.rb' - 'spec/views/layouts/header/_gitlab_version.html.haml_spec.rb' - - 'spec/views/layouts/nav/sidebar/_group.html.haml_spec.rb' - - 'spec/views/layouts/nav/sidebar/_profile.html.haml_spec.rb' - 'spec/views/layouts/profile.html.haml_spec.rb' - 'spec/views/layouts/signup_onboarding.html.haml_spec.rb' - 'spec/views/layouts/terms.html.haml_spec.rb' @@ -5474,7 +5471,6 @@ RSpec/FeatureCategory: - 'spec/views/shared/milestones/_issuable.html.haml_spec.rb' - 'spec/views/shared/milestones/_issuables.html.haml_spec.rb' - 'spec/views/shared/milestones/_top.html.haml_spec.rb' - - 'spec/views/shared/nav/_sidebar.html.haml_spec.rb' - 'spec/views/shared/projects/_inactive_project_deletion_alert.html.haml_spec.rb' - 'spec/views/shared/projects/_list.html.haml_spec.rb' - 'spec/views/shared/projects/_project.html.haml_spec.rb' diff --git a/app/assets/javascripts/badges/components/badge_form.vue b/app/assets/javascripts/badges/components/badge_form.vue index 0645ffa35dc..fbe773e6e2d 100644 --- a/app/assets/javascripts/badges/components/badge_form.vue +++ b/app/assets/javascripts/badges/components/badge_form.vue @@ -213,7 +213,7 @@ export default { @submit.prevent.stop="onSubmit" > - +
@@ -222,7 +222,7 @@ export default { {{ saveText }} diff --git a/app/assets/javascripts/clusters_list/components/clusters.vue b/app/assets/javascripts/clusters_list/components/clusters.vue index 0258d8e0da0..77c962e4056 100644 --- a/app/assets/javascripts/clusters_list/components/clusters.vue +++ b/app/assets/javascripts/clusters_list/components/clusters.vue @@ -252,12 +252,7 @@ export default { class="gl-w-6 gl-h-6 gl-display-flex gl-align-items-center" /> - + {{ item.name }} diff --git a/app/assets/javascripts/deploy_tokens/components/new_deploy_token.vue b/app/assets/javascripts/deploy_tokens/components/new_deploy_token.vue index f21086185fb..d0885fb8687 100644 --- a/app/assets/javascripts/deploy_tokens/components/new_deploy_token.vue +++ b/app/assets/javascripts/deploy_tokens/components/new_deploy_token.vue @@ -266,7 +266,6 @@ export default { class="gl-form-input-xl" name="deploy_token_expires_at" :value="formattedExpiryDate" - data-qa-selector="deploy_token_expires_at_field" /> {{ scope.scopeName }} diff --git a/app/assets/javascripts/error_tracking/components/error_details.vue b/app/assets/javascripts/error_tracking/components/error_details.vue index 01879a092ed..0fabe1779a8 100644 --- a/app/assets/javascripts/error_tracking/components/error_details.vue +++ b/app/assets/javascripts/error_tracking/components/error_details.vue @@ -169,16 +169,10 @@ export default { { text: this.ignoreBtnLabel, action: this.onIgnoreStatusUpdate, - extraAttrs: { - 'data-qa-selector': 'update_ignore_status_button', - }, }, { text: this.resolveBtnLabel, action: this.onResolveStatusUpdate, - extraAttrs: { - 'data-qa-selector': 'update_resolve_status_button', - }, }, ]; }, @@ -187,7 +181,7 @@ export default { text: __('View issue'), href: this.error.gitlabIssuePath, extraAttrs: { - 'data-qa-selector': 'view_issue_button', + 'data-testid': 'view-issue-button', }, }; }, @@ -342,7 +336,7 @@ export default { diff --git a/app/assets/javascripts/gfm_auto_complete.js b/app/assets/javascripts/gfm_auto_complete.js index 1babccff425..e116f64f927 100644 --- a/app/assets/javascripts/gfm_auto_complete.js +++ b/app/assets/javascripts/gfm_auto_complete.js @@ -11,7 +11,7 @@ import { state } from '~/sidebar/components/reviewers/sidebar_reviewers.vue'; import AjaxCache from './lib/utils/ajax_cache'; import { spriteIcon } from './lib/utils/common_utils'; import { parsePikadayDate } from './lib/utils/datetime_utility'; -import glRegexp from './lib/utils/regexp'; +import { unicodeLetters } from './lib/utils/regexp'; const USERS_ALIAS = 'users'; const ISSUES_ALIAS = 'issues'; @@ -307,10 +307,7 @@ class GfmAutoComplete { callbacks: { ...this.getDefaultCallbacks(), matcher(flag, subtext) { - const regexp = new RegExp( - `(?:[^${glRegexp.unicodeLetters}0-9:]|\n|^):([^ :][^:]*)?$`, - 'gi', - ); + const regexp = new RegExp(`(?:[^${unicodeLetters}0-9:]|\n|^):([^ :][^:]*)?$`, 'gi'); const match = regexp.exec(subtext); if (match && match.length) { diff --git a/app/assets/javascripts/import_entities/import_groups/graphql/services/local_storage_cache.js b/app/assets/javascripts/import_entities/import_groups/graphql/services/local_storage_cache.js index f5bc0866948..a186b366ea9 100644 --- a/app/assets/javascripts/import_entities/import_groups/graphql/services/local_storage_cache.js +++ b/app/assets/javascripts/import_entities/import_groups/graphql/services/local_storage_cache.js @@ -1,8 +1,8 @@ import { debounce, merge } from 'lodash'; import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants'; -const OLD_KEY = 'gl-bulk-imports-import-state'; -export const KEY = 'gl-bulk-imports-import-state-v2'; +const OLD_KEY = 'gl-bulk-imports-import-state-v2'; +export const KEY = 'gl-bulk-imports-import-state-v3'; export const DEBOUNCE_INTERVAL = DEFAULT_DEBOUNCE_AND_THROTTLE_MS; export class LocalStorageCache { diff --git a/app/assets/javascripts/lib/utils/regexp.js b/app/assets/javascripts/lib/utils/regexp.js index f212bf80bd7..8f3c3fccc97 100644 --- a/app/assets/javascripts/lib/utils/regexp.js +++ b/app/assets/javascripts/lib/utils/regexp.js @@ -4,12 +4,5 @@ // Inspired by https://github.com/mishoo/UglifyJS/blob/2bc1d02363db3798d5df41fb5059a19edca9b7eb/lib/parse-js.js#L203 // Unicode 6.1 -const unicodeLetters = +export const unicodeLetters = '\\u0041-\\u005A\\u0061-\\u007A\\u00AA\\u00B5\\u00BA\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u0527\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0\\u08A2-\\u08AC\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0977\\u0979-\\u097F\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C33\\u0C35-\\u0C39\\u0C3D\\u0C58\\u0C59\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D60\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F0\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191C\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19C1-\\u19C7\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FCC\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA697\\uA6A0-\\uA6EF\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA78E\\uA790-\\uA793\\uA7A0-\\uA7AA\\uA7F8-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA80-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uABC0-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC'; - -/** - * A regex that matches all single quotes in a string - */ -export const allSingleQuotes = /'/g; - -export default { unicodeLetters, allSingleQuotes }; diff --git a/app/assets/javascripts/lib/utils/text_utility.js b/app/assets/javascripts/lib/utils/text_utility.js index 638ee1f7e5a..6c30294cbbb 100644 --- a/app/assets/javascripts/lib/utils/text_utility.js +++ b/app/assets/javascripts/lib/utils/text_utility.js @@ -5,7 +5,6 @@ import { TRUNCATE_WIDTH_DEFAULT_WIDTH, TRUNCATE_WIDTH_DEFAULT_FONT_SIZE, } from '~/lib/utils/constants'; -import { allSingleQuotes } from '~/lib/utils/regexp'; export const COLON = ':'; export const HYPHEN = '-'; @@ -445,6 +444,11 @@ export const markdownConfig = { ALLOW_DATA_ATTR: false, }; +/** + * A regex that matches all single quotes in a string + */ +const allSingleQuotes = /'/g; + /** * Escapes a string into a shell string, for example * when you want to give a user the command to checkout diff --git a/app/assets/javascripts/work_items/components/work_item_attributes_wrapper.vue b/app/assets/javascripts/work_items/components/work_item_attributes_wrapper.vue index 01545fe91c9..3c788e74268 100644 --- a/app/assets/javascripts/work_items/components/work_item_attributes_wrapper.vue +++ b/app/assets/javascripts/work_items/components/work_item_attributes_wrapper.vue @@ -19,7 +19,8 @@ import WorkItemDueDate from './work_item_due_date.vue'; import WorkItemAssignees from './work_item_assignees.vue'; import WorkItemLabels from './work_item_labels.vue'; import WorkItemMilestone from './work_item_milestone.vue'; -import WorkItemParent from './work_item_parent.vue'; +import WorkItemParentInline from './work_item_parent_inline.vue'; +import WorkItemParent from './work_item_parent_with_edit.vue'; export default { components: { @@ -28,6 +29,7 @@ export default { WorkItemAssignees, WorkItemDueDate, WorkItemParent, + WorkItemParentInline, WorkItemWeightInline: () => import('ee_component/work_items/components/work_item_weight_inline.vue'), WorkItemWeight: () => @@ -209,14 +211,25 @@ export default { :work-item-type="workItemType" @error="$emit('error', $event)" /> - +
diff --git a/app/assets/javascripts/work_items/components/work_item_parent.vue b/app/assets/javascripts/work_items/components/work_item_parent_inline.vue similarity index 100% rename from app/assets/javascripts/work_items/components/work_item_parent.vue rename to app/assets/javascripts/work_items/components/work_item_parent_inline.vue diff --git a/app/assets/javascripts/work_items/components/work_item_parent_with_edit.vue b/app/assets/javascripts/work_items/components/work_item_parent_with_edit.vue new file mode 100644 index 00000000000..75c49ed5027 --- /dev/null +++ b/app/assets/javascripts/work_items/components/work_item_parent_with_edit.vue @@ -0,0 +1,295 @@ + + + diff --git a/app/helpers/packages_helper.rb b/app/helpers/packages_helper.rb index 887f63ce05d..595bb69709f 100644 --- a/app/helpers/packages_helper.rb +++ b/app/helpers/packages_helper.rb @@ -97,11 +97,11 @@ module PackagesHelper } end - def settings_data + def settings_data(project) cleanup_settings_data.merge( - show_container_registry_settings: show_container_registry_settings(@project).to_s, - show_package_registry_settings: show_package_registry_settings(@project).to_s, - cleanup_settings_path: cleanup_image_tags_project_settings_packages_and_registries_path(@project) + show_container_registry_settings: show_container_registry_settings(project).to_s, + show_package_registry_settings: show_package_registry_settings(project).to_s, + cleanup_settings_path: cleanup_image_tags_project_settings_packages_and_registries_path(project) ) end end diff --git a/app/models/project_feature.rb b/app/models/project_feature.rb index c8287628716..fa19ffe86da 100644 --- a/app/models/project_feature.rb +++ b/app/models/project_feature.rb @@ -30,7 +30,7 @@ class ProjectFeature < ApplicationRecord model_registry ].freeze - EXPORTABLE_FEATURES = (FEATURES - [:security_and_compliance, :pages]).freeze + EXPORTABLE_FEATURES = (FEATURES - [:security_and_compliance, :pages, :metrics_dashboard]).freeze set_available_features(FEATURES) diff --git a/app/services/bulk_imports/file_download_service.rb b/app/services/bulk_imports/file_download_service.rb index 321e6b3783e..8f72c35a94c 100644 --- a/app/services/bulk_imports/file_download_service.rb +++ b/app/services/bulk_imports/file_download_service.rb @@ -58,6 +58,13 @@ module BulkImports http_client.stream(relative_url) do |chunk| next if bytes_downloaded == 0 && [301, 302, 303, 307, 308].include?(chunk.code) + if BulkImports::NetworkError::RETRIABLE_HTTP_CODES.include?(chunk.code) + raise BulkImports::NetworkError.new( + "Error downloading file from #{relative_url}. Error code: #{chunk.code}", + response: chunk.http_response + ) + end + @response_code = chunk.code @response_headers ||= Gitlab::HTTP::Response::Headers.new(chunk.http_response.to_hash) @last_chunk_context = chunk.to_s.truncate(LAST_CHUNK_CONTEXT_CHAR_LIMIT) diff --git a/app/views/layouts/fullscreen.html.haml b/app/views/layouts/fullscreen.html.haml index 787c8cda3cb..d17212bd61b 100644 --- a/app/views/layouts/fullscreen.html.haml +++ b/app/views/layouts/fullscreen.html.haml @@ -4,9 +4,7 @@ %body{ class: "#{user_tab_width} #{@body_class} fullscreen-layout", data: { page: body_data_page } } = render 'peek/bar' = header_message - .gl--flex-full.gl-h-full{ class: nav ? ["layout-page", page_with_sidebar_class, "gl-mt-0!"]: '' } - - if defined?(nav) && nav - = render "layouts/nav/sidebar/#{nav}" + .gl--flex-full.gl-h-full .gl--flex-full.gl-flex-direction-column.gl-w-full .alert-wrapper = render 'shared/outdated_browser' diff --git a/app/views/layouts/nav/sidebar/_admin.html.haml b/app/views/layouts/nav/sidebar/_admin.html.haml deleted file mode 100644 index bffc030dbd9..00000000000 --- a/app/views/layouts/nav/sidebar/_admin.html.haml +++ /dev/null @@ -1 +0,0 @@ -= render partial: 'shared/nav/sidebar', object: Sidebars::Admin::Panel.new(Sidebars::Context.new(current_user: current_user, container: nil)) diff --git a/app/views/layouts/nav/sidebar/_explore.html.haml b/app/views/layouts/nav/sidebar/_explore.html.haml deleted file mode 100644 index ccbcb434af1..00000000000 --- a/app/views/layouts/nav/sidebar/_explore.html.haml +++ /dev/null @@ -1 +0,0 @@ -= render partial: 'shared/nav/sidebar', object: Sidebars::Explore::Panel.new(Sidebars::Context.new(current_user: current_user, container: nil)) diff --git a/app/views/layouts/nav/sidebar/_group.html.haml b/app/views/layouts/nav/sidebar/_group.html.haml deleted file mode 100644 index fd0e47b543f..00000000000 --- a/app/views/layouts/nav/sidebar/_group.html.haml +++ /dev/null @@ -1,2 +0,0 @@ -- group = @parent_group || @group -= render partial: 'shared/nav/sidebar', object: Sidebars::Groups::Panel.new(group_sidebar_context(group, current_user)) diff --git a/app/views/layouts/nav/sidebar/_organization.html.haml b/app/views/layouts/nav/sidebar/_organization.html.haml deleted file mode 100644 index de6c87f97d7..00000000000 --- a/app/views/layouts/nav/sidebar/_organization.html.haml +++ /dev/null @@ -1 +0,0 @@ -= render partial: 'shared/nav/sidebar', object: Sidebars::Organizations::Panel.new(organization_sidebar_context(@organization, current_user)) diff --git a/app/views/layouts/nav/sidebar/_profile.html.haml b/app/views/layouts/nav/sidebar/_profile.html.haml deleted file mode 100644 index d53316442f8..00000000000 --- a/app/views/layouts/nav/sidebar/_profile.html.haml +++ /dev/null @@ -1 +0,0 @@ -= render partial: 'shared/nav/sidebar', object: Sidebars::UserSettings::Panel.new(Sidebars::Context.new(current_user: current_user, container: current_user)) diff --git a/app/views/layouts/nav/sidebar/_project.html.haml b/app/views/layouts/nav/sidebar/_project.html.haml deleted file mode 100644 index 67c3cd9cc54..00000000000 --- a/app/views/layouts/nav/sidebar/_project.html.haml +++ /dev/null @@ -1 +0,0 @@ -= render partial: 'shared/nav/sidebar', object: Sidebars::Projects::Panel.new(project_sidebar_context(@project, current_user, current_ref, ref_type: @ref_type)) diff --git a/app/views/layouts/nav/sidebar/_search.html.haml b/app/views/layouts/nav/sidebar/_search.html.haml deleted file mode 100644 index 956079c351a..00000000000 --- a/app/views/layouts/nav/sidebar/_search.html.haml +++ /dev/null @@ -1 +0,0 @@ --# if this file is missing empty or not the old left menu throws error diff --git a/app/views/layouts/nav/sidebar/_user_profile.html.haml b/app/views/layouts/nav/sidebar/_user_profile.html.haml deleted file mode 100644 index b24334f48c4..00000000000 --- a/app/views/layouts/nav/sidebar/_user_profile.html.haml +++ /dev/null @@ -1 +0,0 @@ -= render partial: 'shared/nav/sidebar', object: Sidebars::UserProfile::Panel.new(Sidebars::Context.new(current_user: current_user, container: @user)) diff --git a/app/views/layouts/nav/sidebar/_your_work.html.haml b/app/views/layouts/nav/sidebar/_your_work.html.haml deleted file mode 100644 index 0da66c2e14e..00000000000 --- a/app/views/layouts/nav/sidebar/_your_work.html.haml +++ /dev/null @@ -1 +0,0 @@ -= render partial: 'shared/nav/sidebar', object: Sidebars::YourWork::Panel.new(your_work_sidebar_context(current_user)) diff --git a/app/views/projects/pages/_pages_settings.html.haml b/app/views/projects/pages/_pages_settings.html.haml index 1aa8148dfed..4c18609ad59 100644 --- a/app/views/projects/pages/_pages_settings.html.haml +++ b/app/views/projects/pages/_pages_settings.html.haml @@ -24,10 +24,12 @@ .form-group = f.fields_for :project_setting do |settings| = settings.gitlab_ui_checkbox_component :pages_multiple_versions_enabled, - s_('GitLabPages|Use multiple versions'), + s_('GitLabPages|Use multiple deployments'), label_options: { class: 'label-bold' } %p.gl-pl-6 - = s_("GitLabPages|When enabled, you can create multiple versions of your pages site.").html_safe + = safe_format(s_("GitLabPages|When enabled, you can create multiple deployments of your pages site. %{docs_link_start}Learn More.%{link_end}"), + tag_pair(tag.a(href: help_page_path('user/project/pages/index', anchor: 'create-multiple-deployments'), target: '_blank'), + :docs_link_start, :link_end)) .gl-mt-3 = f.submit s_('GitLabPages|Save changes'), pajamas_button: true diff --git a/app/views/projects/settings/packages_and_registries/show.html.haml b/app/views/projects/settings/packages_and_registries/show.html.haml index 6f38a3ace92..d6c2228a6c2 100644 --- a/app/views/projects/settings/packages_and_registries/show.html.haml +++ b/app/views/projects/settings/packages_and_registries/show.html.haml @@ -2,4 +2,4 @@ - page_title _('Packages and registries settings') - @force_desktop_expanded_sidebar = true -#js-registry-settings{ data: settings_data } +#js-registry-settings{ data: settings_data(@project) } diff --git a/app/views/shared/_sidebar_toggle_button.html.haml b/app/views/shared/_sidebar_toggle_button.html.haml deleted file mode 100644 index 4cdf1340d64..00000000000 --- a/app/views/shared/_sidebar_toggle_button.html.haml +++ /dev/null @@ -1,7 +0,0 @@ -%a.toggle-sidebar-button.js-toggle-sidebar.rspec-toggle-sidebar{ role: "button", type: "button", title: "Toggle sidebar" } - = sprite_icon('chevron-double-lg-left', size: 12, css_class: 'icon-chevron-double-lg-left') - %span.collapse-text.gl-ml-3= _("Collapse sidebar") - -= button_tag class: 'close-nav-button', type: 'button' do - = sprite_icon('close') - %span.collapse-text.gl-ml-3= _("Close sidebar") diff --git a/app/views/shared/nav/_admin_scope_header.html.haml b/app/views/shared/nav/_admin_scope_header.html.haml deleted file mode 100644 index 3a18b3660d4..00000000000 --- a/app/views/shared/nav/_admin_scope_header.html.haml +++ /dev/null @@ -1,6 +0,0 @@ -%li.context-header - = link_to admin_root_path, title: _('Admin Area'), class: 'has-tooltip', data: { container: 'body', placement: 'right' } do - %span.avatar-container.icon-avatar.rect-avatar.s32 - = sprite_icon('admin', size: 18) - %span.sidebar-context-title - = _('Admin Area') diff --git a/app/views/shared/nav/_explore_scope_header.html.haml b/app/views/shared/nav/_explore_scope_header.html.haml deleted file mode 100644 index da22d6dbcf2..00000000000 --- a/app/views/shared/nav/_explore_scope_header.html.haml +++ /dev/null @@ -1,6 +0,0 @@ -%li.context-header - = link_to explore_root_url, title: _('Explore'), class: 'has-tooltip', data: { container: 'body', placement: 'right' } do - %span.avatar-container.icon-avatar.rect-avatar.s32 - = sprite_icon('compass', size: 18) - %span.sidebar-context-title - = _('Explore') diff --git a/app/views/shared/nav/_scope_menu.html.haml b/app/views/shared/nav/_scope_menu.html.haml deleted file mode 100644 index 4e570086bf8..00000000000 --- a/app/views/shared/nav/_scope_menu.html.haml +++ /dev/null @@ -1,6 +0,0 @@ -= nav_link(**scope_menu.active_routes, html_options: scope_menu.nav_link_html_options) do - = link_to scope_menu.link, **scope_menu.link_html_options, data: { qa_selector: 'sidebar_menu_link', qa_menu_item: scope_qa_menu_item(scope_menu.container) } do - %span{ class: scope_avatar_classes(scope_menu.container) } - = source_icon(scope_menu.container, alt: scope_menu.title, class: ['avatar', 'avatar-tile', 's32'], width: 32, height: 32) - %span.sidebar-context-title - = scope_menu.title diff --git a/app/views/shared/nav/_sidebar.html.haml b/app/views/shared/nav/_sidebar.html.haml deleted file mode 100644 index 91b0582e04a..00000000000 --- a/app/views/shared/nav/_sidebar.html.haml +++ /dev/null @@ -1,16 +0,0 @@ -%aside.nav-sidebar{ class: ('sidebar-collapsed-desktop' if collapsed_sidebar?), **sidebar_tracking_attributes_by_object(sidebar.container), 'aria-label': sidebar.aria_label } - .nav-sidebar-inner-scroll - %ul.sidebar-top-level-items{ data: { testid: sidebar_qa_selector(sidebar.container) } } - - if sidebar.render_raw_scope_menu_partial - = render sidebar.render_raw_scope_menu_partial - - elsif sidebar.scope_menu - = render partial: 'shared/nav/scope_menu', object: sidebar.scope_menu - - - if sidebar.renderable_menus.any? - = render partial: 'shared/nav/sidebar_menu', collection: sidebar.renderable_menus - - - if sidebar.render_raw_menus_partial - = render sidebar.render_raw_menus_partial - - = render partial: 'shared/nav/sidebar_hidden_menu_item', collection: sidebar.hidden_menu&.renderable_items - = render 'shared/sidebar_toggle_button' diff --git a/app/views/shared/nav/_sidebar_hidden_menu_item.html.haml b/app/views/shared/nav/_sidebar_hidden_menu_item.html.haml deleted file mode 100644 index d0ae5e99707..00000000000 --- a/app/views/shared/nav/_sidebar_hidden_menu_item.html.haml +++ /dev/null @@ -1,3 +0,0 @@ -%li.hidden - = link_to sidebar_hidden_menu_item.link, **sidebar_hidden_menu_item.link_html_options do - = sidebar_hidden_menu_item.title diff --git a/app/views/shared/nav/_sidebar_menu.html.haml b/app/views/shared/nav/_sidebar_menu.html.haml deleted file mode 100644 index 27f77ed4813..00000000000 --- a/app/views/shared/nav/_sidebar_menu.html.haml +++ /dev/null @@ -1,19 +0,0 @@ -= nav_link(**sidebar_menu.all_active_routes, html_options: sidebar_menu.nav_link_html_options) do - - if sidebar_menu.menu_with_partial? - = render_if_exists sidebar_menu.menu_partial, **sidebar_menu.menu_partial_options - - else - = link_to sidebar_menu.link, **sidebar_menu.link_html_options, data: { testid: 'sidebar_menu_link', qa_menu_item: sidebar_menu.title } do - - if sidebar_menu.icon_or_image? - %span.nav-icon-container - - if sidebar_menu.image_path - = image_tag(sidebar_menu.image_path, **sidebar_menu.image_html_options) - - elsif sidebar_menu.sprite_icon - = sprite_icon(sidebar_menu.sprite_icon, **sidebar_menu.sprite_icon_html_options) - - %span.nav-item-name{ **sidebar_menu.title_html_options } - = sidebar_menu.title - - if sidebar_menu.has_pill? - = gl_badge_tag({ variant: :info, size: :sm }, { class: "count #{sidebar_menu.pill_html_options[:class]}" }) do - = number_with_delimiter(sidebar_menu.pill_count) - - = render partial: 'shared/nav/sidebar_submenu', locals: { sidebar_menu: sidebar_menu } diff --git a/app/views/shared/nav/_sidebar_menu_item.html.haml b/app/views/shared/nav/_sidebar_menu_item.html.haml deleted file mode 100644 index ef488d06e87..00000000000 --- a/app/views/shared/nav/_sidebar_menu_item.html.haml +++ /dev/null @@ -1,11 +0,0 @@ -= nav_link(**sidebar_menu_item.active_routes, html_options: sidebar_menu_item.nav_link_html_options) do - = link_to sidebar_menu_item.link, **sidebar_menu_item.link_html_options, data: { testid: 'sidebar_menu_item_link', qa_menu_item: sidebar_menu_item.title } do - %span.gl-flex-grow-1 - = sidebar_menu_item.title - - if sidebar_menu_item.sprite_icon - = sprite_icon(sidebar_menu_item.sprite_icon, **sidebar_menu_item.sprite_icon_html_options) - - if sidebar_menu_item.has_pill? - = gl_badge_tag({ size: :sm, variant: :neutral }, { class: "count fly-out-badge gl-ml-3" }) do - = number_with_delimiter(sidebar_menu_item.pill_count) - - if sidebar_menu_item.show_hint? - .js-feature-highlight{ **sidebar_menu_item.hint_html_options } diff --git a/app/views/shared/nav/_sidebar_submenu.html.haml b/app/views/shared/nav/_sidebar_submenu.html.haml deleted file mode 100644 index 33b48470020..00000000000 --- a/app/views/shared/nav/_sidebar_submenu.html.haml +++ /dev/null @@ -1,12 +0,0 @@ -%ul.sidebar-sub-level-items{ class: ('is-fly-out-only' unless sidebar_menu.has_renderable_items?) } - = nav_link(**sidebar_menu.all_active_routes, html_options: { class: 'fly-out-top-item' }) do - %span.fly-out-top-item-container - %strong.fly-out-top-item-name - = sidebar_menu.title - - if sidebar_menu.has_pill? - = gl_badge_tag({ variant: :info, size: :sm }, { class: "count fly-out-badge #{sidebar_menu.pill_html_options[:class]}" }) do - = number_with_delimiter(sidebar_menu.pill_count) - - - if sidebar_menu.has_renderable_items? - %li.divider.fly-out-top-item - = render partial: 'shared/nav/sidebar_menu_item', collection: sidebar_menu.renderable_items diff --git a/app/views/shared/nav/_user_settings_scope_header.html.haml b/app/views/shared/nav/_user_settings_scope_header.html.haml deleted file mode 100644 index c1601822736..00000000000 --- a/app/views/shared/nav/_user_settings_scope_header.html.haml +++ /dev/null @@ -1,4 +0,0 @@ -%li.context-header - = link_to profile_path, title: _('User Settings'), class: 'has-tooltip', data: { container: 'body', placement: 'right' } do - = render Pajamas::AvatarComponent.new(current_user, size: 32, alt: current_user.name, class: 'gl-mr-3 js-sidebar-user-avatar', avatar_options: { data: { testid: 'sidebar-user-avatar' } }) - %span.sidebar-context-title= _('User Settings') diff --git a/app/views/shared/nav/_your_work_scope_header.html.haml b/app/views/shared/nav/_your_work_scope_header.html.haml deleted file mode 100644 index cdd0be3c682..00000000000 --- a/app/views/shared/nav/_your_work_scope_header.html.haml +++ /dev/null @@ -1,6 +0,0 @@ -%li.context-header - = link_to root_path, title: _('Your work'), class: 'has-tooltip', data: { container: 'body', placement: 'right' } do - %span.avatar-container.icon-avatar.rect-avatar.s32 - = sprite_icon('work', size: 18) - %span.sidebar-context-title - = _('Your work') diff --git a/app/workers/all_queues.yml b/app/workers/all_queues.yml index ed8a03ce998..db255f222e0 100644 --- a/app/workers/all_queues.yml +++ b/app/workers/all_queues.yml @@ -275,7 +275,7 @@ :tags: [] - :name: cronjob:ci_runners_reconcile_existing_runner_versions_cron :worker_name: Ci::Runners::ReconcileExistingRunnerVersionsCronWorker - :feature_category: :runner_fleet + :feature_category: :fleet_visibility :has_external_dependencies: false :urgency: :low :resource_boundary: :unknown @@ -284,7 +284,7 @@ :tags: [] - :name: cronjob:ci_runners_stale_machines_cleanup_cron :worker_name: Ci::Runners::StaleMachinesCleanupCronWorker - :feature_category: :runner_fleet + :feature_category: :fleet_visibility :has_external_dependencies: false :urgency: :low :resource_boundary: :unknown @@ -2741,7 +2741,7 @@ :tags: [] - :name: ci_runners_process_runner_version_update :worker_name: Ci::Runners::ProcessRunnerVersionUpdateWorker - :feature_category: :runner_fleet + :feature_category: :fleet_visibility :has_external_dependencies: false :urgency: :low :resource_boundary: :unknown diff --git a/app/workers/ci/runners/process_runner_version_update_worker.rb b/app/workers/ci/runners/process_runner_version_update_worker.rb index f1ad0c8563e..acb1aac78a4 100644 --- a/app/workers/ci/runners/process_runner_version_update_worker.rb +++ b/app/workers/ci/runners/process_runner_version_update_worker.rb @@ -7,7 +7,7 @@ module Ci data_consistency :always - feature_category :runner_fleet + feature_category :fleet_visibility urgency :low idempotent! diff --git a/app/workers/ci/runners/reconcile_existing_runner_versions_cron_worker.rb b/app/workers/ci/runners/reconcile_existing_runner_versions_cron_worker.rb index 722c513a4bb..7bcfed1580f 100644 --- a/app/workers/ci/runners/reconcile_existing_runner_versions_cron_worker.rb +++ b/app/workers/ci/runners/reconcile_existing_runner_versions_cron_worker.rb @@ -9,7 +9,7 @@ module Ci include CronjobQueue # rubocop:disable Scalability/CronWorkerContext data_consistency :sticky - feature_category :runner_fleet + feature_category :fleet_visibility urgency :low deduplicate :until_executed diff --git a/app/workers/ci/runners/stale_machines_cleanup_cron_worker.rb b/app/workers/ci/runners/stale_machines_cleanup_cron_worker.rb index 9407e7c0e0a..9831e3e98b7 100644 --- a/app/workers/ci/runners/stale_machines_cleanup_cron_worker.rb +++ b/app/workers/ci/runners/stale_machines_cleanup_cron_worker.rb @@ -9,7 +9,7 @@ module Ci include CronjobQueue # rubocop:disable Scalability/CronWorkerContext data_consistency :sticky - feature_category :runner_fleet + feature_category :fleet_visibility urgency :low idempotent! diff --git a/config/feature_categories.yml b/config/feature_categories.yml index 3eaf8b2b34d..c5ad97c9eb5 100644 --- a/config/feature_categories.yml +++ b/config/feature_categories.yml @@ -24,7 +24,6 @@ - build_artifacts - capacity_planning - cell -- ci-cd_visibility - cloud_connector - cloud_native_installation - code_quality @@ -61,6 +60,7 @@ - error_tracking - feature_flags - five_minute_production_app +- fleet_visibility - fulfillment_admin_tooling - fulfillment_infrastructure - fuzz_testing @@ -109,7 +109,6 @@ - requirements_management - review_apps - runner -- runner_fleet - runner_saas - saas_provisioning - sbom diff --git a/db/docs/batched_background_migrations/backfill_admin_mode_scope_for_personal_access_tokens.yml b/db/docs/batched_background_migrations/backfill_admin_mode_scope_for_personal_access_tokens.yml index 9309dd44980..6f4aa6005e3 100644 --- a/db/docs/batched_background_migrations/backfill_admin_mode_scope_for_personal_access_tokens.yml +++ b/db/docs/batched_background_migrations/backfill_admin_mode_scope_for_personal_access_tokens.yml @@ -4,5 +4,5 @@ description: backfills `admin_mode` scope to personal access tokens associated t administrators feature_category: system_access introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/107875 -milestone: 15.8 +milestone: '15.8' finalized_by: '20231128155514' diff --git a/db/docs/batched_background_migrations/backfill_code_suggestions_namespace_settings.yml b/db/docs/batched_background_migrations/backfill_code_suggestions_namespace_settings.yml index d0803735d0b..23f3fd43174 100644 --- a/db/docs/batched_background_migrations/backfill_code_suggestions_namespace_settings.yml +++ b/db/docs/batched_background_migrations/backfill_code_suggestions_namespace_settings.yml @@ -3,4 +3,4 @@ migration_job_name: BackfillCodeSuggestionsNamespaceSettings description: Updates default value of code_suggestions on namespace_settings table feature_category: code_suggestions introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/121126 -milestone: 16.1 +milestone: '16.1' diff --git a/db/docs/batched_background_migrations/backfill_default_branch_protection_namespace_setting.yml b/db/docs/batched_background_migrations/backfill_default_branch_protection_namespace_setting.yml index 7a9e1cb8f5b..7beca6bde50 100644 --- a/db/docs/batched_background_migrations/backfill_default_branch_protection_namespace_setting.yml +++ b/db/docs/batched_background_migrations/backfill_default_branch_protection_namespace_setting.yml @@ -3,4 +3,4 @@ migration_job_name: BackfillDefaultBranchProtectionNamespaceSetting description: This migration back fills column default_branch_protection_defaults of namespace settings table feature_category: database introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/127335/ -milestone: 16.3 +milestone: '16.3' diff --git a/db/docs/batched_background_migrations/backfill_design_management_repositories.yml b/db/docs/batched_background_migrations/backfill_design_management_repositories.yml index 95ff87869c3..cc4bf593f47 100644 --- a/db/docs/batched_background_migrations/backfill_design_management_repositories.yml +++ b/db/docs/batched_background_migrations/backfill_design_management_repositories.yml @@ -3,4 +3,4 @@ migration_job_name: BackfillDesignManagementRepositories description: Backfills the new table with project ids feature_category: geo_replication introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/116975 -milestone: 15.11 +milestone: '15.11' diff --git a/db/docs/batched_background_migrations/backfill_dismissal_reason_in_vulnerability_reads.yml b/db/docs/batched_background_migrations/backfill_dismissal_reason_in_vulnerability_reads.yml index 1a312d543c2..34954d9dd82 100644 --- a/db/docs/batched_background_migrations/backfill_dismissal_reason_in_vulnerability_reads.yml +++ b/db/docs/batched_background_migrations/backfill_dismissal_reason_in_vulnerability_reads.yml @@ -5,5 +5,5 @@ description: Backfill `dismissal_reason` for rows with `state` of `dismissed` in feature_category: vulnerability_management introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/123518 queued_migration_version: 20230612232000 -milestone: 16.1 +milestone: '16.1' finalized_by: '20231201144826' diff --git a/db/docs/batched_background_migrations/backfill_finding_id_in_vulnerabilities.yml b/db/docs/batched_background_migrations/backfill_finding_id_in_vulnerabilities.yml index 8bc99c1ca2a..0ecbdfb9151 100644 --- a/db/docs/batched_background_migrations/backfill_finding_id_in_vulnerabilities.yml +++ b/db/docs/batched_background_migrations/backfill_finding_id_in_vulnerabilities.yml @@ -4,5 +4,5 @@ description: Backfills finding_id column on vulnerabilities table for a proper 1 feature_category: vulnerability_management introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/130058 queued_migration_version: 20231116105945 -milestone: 16.4 +milestone: '16.4' finalize_after: '2023-12-15' diff --git a/db/docs/batched_background_migrations/backfill_has_merge_request_of_vulnerability_reads.yml b/db/docs/batched_background_migrations/backfill_has_merge_request_of_vulnerability_reads.yml index c6bf73622f6..d6cd709ca70 100644 --- a/db/docs/batched_background_migrations/backfill_has_merge_request_of_vulnerability_reads.yml +++ b/db/docs/batched_background_migrations/backfill_has_merge_request_of_vulnerability_reads.yml @@ -3,4 +3,4 @@ migration_job_name: BackfillHasMergeRequestOfVulnerabilityReads description: Backfills has_merge_request column for vulnerability_reads table. feature_category: database introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/130952 -milestone: 16.4 +milestone: '16.4' diff --git a/db/docs/batched_background_migrations/backfill_has_remediations_of_vulnerability_reads.yml b/db/docs/batched_background_migrations/backfill_has_remediations_of_vulnerability_reads.yml index b52816a9897..0dc085edc87 100644 --- a/db/docs/batched_background_migrations/backfill_has_remediations_of_vulnerability_reads.yml +++ b/db/docs/batched_background_migrations/backfill_has_remediations_of_vulnerability_reads.yml @@ -5,5 +5,5 @@ description: Backfills has_remediations column for vulnerability_reads table. RE-ran because there was a error in remediation ingestion logic. feature_category: database introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/133714 -milestone: 16.7 +milestone: '16.7' queued_migration_version: 20231011142714 diff --git a/db/docs/batched_background_migrations/backfill_merge_request_diffs_project_id.yml b/db/docs/batched_background_migrations/backfill_merge_request_diffs_project_id.yml index c6d7a418c96..54d38942659 100644 --- a/db/docs/batched_background_migrations/backfill_merge_request_diffs_project_id.yml +++ b/db/docs/batched_background_migrations/backfill_merge_request_diffs_project_id.yml @@ -3,7 +3,7 @@ migration_job_name: BackfillMergeRequestDiffsProjectId description: Populates the new `merge_request_diffs.project_id` column after joining with the `merge_requests` table feature_category: code_review_workflow introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/136800 -milestone: 16.7 +milestone: '16.7' queued_migration_version: 20231114043522 finalize_after: '2024-04-01' finalized_by: # version of the migration that ensured this bbm diff --git a/db/docs/batched_background_migrations/backfill_missing_ci_cd_settings.yml b/db/docs/batched_background_migrations/backfill_missing_ci_cd_settings.yml index 7606414a6ae..6ecc67531ef 100644 --- a/db/docs/batched_background_migrations/backfill_missing_ci_cd_settings.yml +++ b/db/docs/batched_background_migrations/backfill_missing_ci_cd_settings.yml @@ -4,4 +4,4 @@ description: Backfills ci_cd_settings for projects that do not have them feature_category: source_code_management introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124921 queued_migration_version: 20230628023103 -milestone: 16.2 +milestone: '16.2' diff --git a/db/docs/batched_background_migrations/backfill_missing_vulnerability_dismissal_details.yml b/db/docs/batched_background_migrations/backfill_missing_vulnerability_dismissal_details.yml index f84a6ad84ad..0c66dbb74fb 100644 --- a/db/docs/batched_background_migrations/backfill_missing_vulnerability_dismissal_details.yml +++ b/db/docs/batched_background_migrations/backfill_missing_vulnerability_dismissal_details.yml @@ -3,4 +3,4 @@ migration_job_name: BackfillMissingVulnerabilityDismissalDetails description: Backfill missing vulnerability dimissal information as a result of https://gitlab.com/gitlab-org/gitlab/-/issues/412983 feature_category: vulnerability_management introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/126253 -milestone: 16.2 +milestone: '16.2' diff --git a/db/docs/batched_background_migrations/backfill_nuget_normalized_version.yml b/db/docs/batched_background_migrations/backfill_nuget_normalized_version.yml index b0ea13472d4..cf80d03f20e 100644 --- a/db/docs/batched_background_migrations/backfill_nuget_normalized_version.yml +++ b/db/docs/batched_background_migrations/backfill_nuget_normalized_version.yml @@ -3,4 +3,4 @@ migration_job_name: BackfillNugetNormalizedVersion description: Introduce a batched background migration to backfill the normalized_version column in packages_nuget_metadata table. feature_category: package_registry introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/128675 -milestone: 16.4 +milestone: '16.4' diff --git a/db/docs/batched_background_migrations/backfill_packages_tags_project_id.yml b/db/docs/batched_background_migrations/backfill_packages_tags_project_id.yml index b8caef928bb..777ca064c0d 100644 --- a/db/docs/batched_background_migrations/backfill_packages_tags_project_id.yml +++ b/db/docs/batched_background_migrations/backfill_packages_tags_project_id.yml @@ -3,7 +3,7 @@ migration_job_name: BackfillPackagesTagsProjectId description: Populates the new `packages_tags.project_id` column after joining with the `packages_packages` table feature_category: package_registry introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/135451 -milestone: 16.6 +milestone: '16.6' queued_migration_version: 20231030071209 finalize_after: '2023-12-23' finalized_by: # version of the migration that ensured this bbm diff --git a/db/docs/batched_background_migrations/backfill_project_statistics_storage_size_with_recent_size.yml b/db/docs/batched_background_migrations/backfill_project_statistics_storage_size_with_recent_size.yml index 1ff17fd4099..b6175eb2b65 100644 --- a/db/docs/batched_background_migrations/backfill_project_statistics_storage_size_with_recent_size.yml +++ b/db/docs/batched_background_migrations/backfill_project_statistics_storage_size_with_recent_size.yml @@ -3,4 +3,4 @@ migration_job_name: BackfillProjectStatisticsStorageSizeWithRecentSize description: Refreshes ProjectStatistics to use recent_objects_size for repository_size feature_category: consumables_cost_management introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/128730 -milestone: 16.4 +milestone: '16.4' diff --git a/db/docs/batched_background_migrations/backfill_project_statistics_storage_size_without_pipeline_artifacts_size_job.yml b/db/docs/batched_background_migrations/backfill_project_statistics_storage_size_without_pipeline_artifacts_size_job.yml index c2dda4a2923..b0d27b9f1b9 100644 --- a/db/docs/batched_background_migrations/backfill_project_statistics_storage_size_without_pipeline_artifacts_size_job.yml +++ b/db/docs/batched_background_migrations/backfill_project_statistics_storage_size_without_pipeline_artifacts_size_job.yml @@ -3,4 +3,4 @@ migration_job_name: BackfillProjectStatisticsStorageSizeWithoutPipelineArtifacts description: Refreshes ProjectStatistics to remove pipeline_artifacts_size from the total storage_size feature_category: consumables_cost_management introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/126053 -milestone: 16.3 +milestone: '16.3' diff --git a/db/docs/batched_background_migrations/backfill_project_wiki_repositories.yml b/db/docs/batched_background_migrations/backfill_project_wiki_repositories.yml index 5adc58a73cd..3aaeee19c73 100644 --- a/db/docs/batched_background_migrations/backfill_project_wiki_repositories.yml +++ b/db/docs/batched_background_migrations/backfill_project_wiki_repositories.yml @@ -5,4 +5,4 @@ description: >- does not have an entry in this table. feature_category: geo introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/113783 -milestone: 15.10 +milestone: '15.10' diff --git a/db/docs/batched_background_migrations/backfill_resource_link_events.yml b/db/docs/batched_background_migrations/backfill_resource_link_events.yml index 224cf5fe06b..39c59647795 100644 --- a/db/docs/batched_background_migrations/backfill_resource_link_events.yml +++ b/db/docs/batched_background_migrations/backfill_resource_link_events.yml @@ -3,4 +3,4 @@ migration_job_name: BackfillResourceLinkEvents description: Backfills resource_link_events table based off system_note_metadata and notes feature_category: team_planning introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/118605 -milestone: 16.1 +milestone: '16.1' diff --git a/db/docs/batched_background_migrations/backfill_root_storage_statistics_fork_storage_sizes.yml b/db/docs/batched_background_migrations/backfill_root_storage_statistics_fork_storage_sizes.yml index e029488f5c4..ad1764d611a 100644 --- a/db/docs/batched_background_migrations/backfill_root_storage_statistics_fork_storage_sizes.yml +++ b/db/docs/batched_background_migrations/backfill_root_storage_statistics_fork_storage_sizes.yml @@ -3,4 +3,4 @@ migration_job_name: BackfillRootStorageStatisticsForkStorageSizes description: Backfill the public_forks_storage_size, internal_forks_storage_size, and private_forks_storage_size columns on the namespace_root_storage_statistics table feature_category: consumables_cost_management introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/120916 -milestone: 16.1 +milestone: '16.1' diff --git a/db/docs/batched_background_migrations/backfill_user_preferences_with_defaults.yml b/db/docs/batched_background_migrations/backfill_user_preferences_with_defaults.yml index bee4b1f38a9..b95527cc32c 100644 --- a/db/docs/batched_background_migrations/backfill_user_preferences_with_defaults.yml +++ b/db/docs/batched_background_migrations/backfill_user_preferences_with_defaults.yml @@ -3,4 +3,4 @@ migration_job_name: BackfillUserPreferencesWithDefaults description: Backfills the user_preferences table columns with their default values feature_category: user_profile introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/125774 -milestone: 16.4 +milestone: '16.4' diff --git a/db/docs/batched_background_migrations/backfill_users_with_defaults.yml b/db/docs/batched_background_migrations/backfill_users_with_defaults.yml index ecc86fd665c..6faa1fbf655 100644 --- a/db/docs/batched_background_migrations/backfill_users_with_defaults.yml +++ b/db/docs/batched_background_migrations/backfill_users_with_defaults.yml @@ -3,4 +3,4 @@ migration_job_name: BackfillUsersWithDefaults description: Backfills the users table columns with their default values feature_category: user_profile introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/125881 -milestone: 16.4 +milestone: '16.4' diff --git a/db/docs/batched_background_migrations/backfill_uuid_conversion_column_in_vulnerability_occurrences.yml b/db/docs/batched_background_migrations/backfill_uuid_conversion_column_in_vulnerability_occurrences.yml index 43171193f28..2735933a58c 100644 --- a/db/docs/batched_background_migrations/backfill_uuid_conversion_column_in_vulnerability_occurrences.yml +++ b/db/docs/batched_background_migrations/backfill_uuid_conversion_column_in_vulnerability_occurrences.yml @@ -3,4 +3,4 @@ migration_job_name: BackfillUuidConversionColumnInVulnerabilityOccurrences description: backfill values for `uuid_convert_string_to_uuid` column in vulnerability_occurrences table feature_category: vulnerability_management introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124986 -milestone: 16.2 +milestone: '16.2' diff --git a/db/docs/batched_background_migrations/backfill_work_item_type_id_for_issues.yml b/db/docs/batched_background_migrations/backfill_work_item_type_id_for_issues.yml index 01e9fd7528e..0b00e04dc99 100644 --- a/db/docs/batched_background_migrations/backfill_work_item_type_id_for_issues.yml +++ b/db/docs/batched_background_migrations/backfill_work_item_type_id_for_issues.yml @@ -3,4 +3,4 @@ migration_job_name: BackfillWorkItemTypeIdForIssues description: Backfills every record in the issues table with the appropriate work_item_type_id feature_category: team_planning introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/96591 -milestone: 15.4 +milestone: '15.4' diff --git a/db/docs/batched_background_migrations/backfill_workspace_personal_access_token.yml b/db/docs/batched_background_migrations/backfill_workspace_personal_access_token.yml index 53433fbb1c7..b66327e52ba 100644 --- a/db/docs/batched_background_migrations/backfill_workspace_personal_access_token.yml +++ b/db/docs/batched_background_migrations/backfill_workspace_personal_access_token.yml @@ -2,4 +2,4 @@ migration_job_name: BackfillWorkspacePersonalAccessToken description: Create personal access token for workspaces without one feature_category: remote_development introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/131516 -milestone: 16.4 +milestone: '16.4' diff --git a/db/docs/batched_background_migrations/cleanup_personal_access_tokens_with_nil_expires_at.yml b/db/docs/batched_background_migrations/cleanup_personal_access_tokens_with_nil_expires_at.yml index f89d63ff79f..e73cd747539 100644 --- a/db/docs/batched_background_migrations/cleanup_personal_access_tokens_with_nil_expires_at.yml +++ b/db/docs/batched_background_migrations/cleanup_personal_access_tokens_with_nil_expires_at.yml @@ -5,4 +5,4 @@ description: Updates value of expires_at column to 365 days from now when it's n Re-ran because there was a bypass that enabled some new PATs to be created with nil expires_at. That bypass was patched via https://gitlab.com/gitlab-org/gitlab/-/merge_requests/121370. feature_category: system_access introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/123002 -milestone: 16.1 +milestone: '16.1' diff --git a/db/docs/batched_background_migrations/convert_credit_card_validation_data_to_hashes.yml b/db/docs/batched_background_migrations/convert_credit_card_validation_data_to_hashes.yml index 4835f0ac59f..80ecde0027b 100644 --- a/db/docs/batched_background_migrations/convert_credit_card_validation_data_to_hashes.yml +++ b/db/docs/batched_background_migrations/convert_credit_card_validation_data_to_hashes.yml @@ -5,4 +5,4 @@ description: | to hash and store values in new columns. feature_category: user_profile introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/129350 -milestone: 16.4 +milestone: '16.4' diff --git a/db/docs/batched_background_migrations/create_compliance_standards_adherence.yml b/db/docs/batched_background_migrations/create_compliance_standards_adherence.yml index e946e3391cc..0f0d47b39bc 100644 --- a/db/docs/batched_background_migrations/create_compliance_standards_adherence.yml +++ b/db/docs/batched_background_migrations/create_compliance_standards_adherence.yml @@ -4,4 +4,4 @@ description: This migration creates 'project_compliance_standards_adherence' tab feature_category: compliance_management introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/129941 queued_migration_version: 20230818142801 -milestone: 16.4 +milestone: '16.4' diff --git a/db/docs/batched_background_migrations/delete_invalid_protected_branch_merge_access_levels.yml b/db/docs/batched_background_migrations/delete_invalid_protected_branch_merge_access_levels.yml index 9a8dd506809..6dccaeeeb50 100644 --- a/db/docs/batched_background_migrations/delete_invalid_protected_branch_merge_access_levels.yml +++ b/db/docs/batched_background_migrations/delete_invalid_protected_branch_merge_access_levels.yml @@ -3,5 +3,5 @@ migration_job_name: DeleteInvalidProtectedBranchMergeAccessLevels description: Remove rows from protected_branch_merge_access_levels for groups that do not have project_group_links to the project for the associated protected branch feature_category: source_code_management introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/134337 -milestone: 16.6 +milestone: '16.6' queued_migration_version: 20231016173129 diff --git a/db/docs/batched_background_migrations/delete_invalid_protected_branch_push_access_levels.yml b/db/docs/batched_background_migrations/delete_invalid_protected_branch_push_access_levels.yml index a581c43e98a..72e59e6e00f 100644 --- a/db/docs/batched_background_migrations/delete_invalid_protected_branch_push_access_levels.yml +++ b/db/docs/batched_background_migrations/delete_invalid_protected_branch_push_access_levels.yml @@ -3,5 +3,5 @@ migration_job_name: DeleteInvalidProtectedBranchPushAccessLevels description: Remove rows from protected_branch_push_access_levels for groups that do not have project_group_links to the project for the associated protected branch feature_category: source_code_management introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/134337 -milestone: 16.6 +milestone: '16.6' queued_migration_version: 20231016194927 diff --git a/db/docs/batched_background_migrations/delete_invalid_protected_tag_create_access_levels.yml b/db/docs/batched_background_migrations/delete_invalid_protected_tag_create_access_levels.yml index cd704736842..35c76b78894 100644 --- a/db/docs/batched_background_migrations/delete_invalid_protected_tag_create_access_levels.yml +++ b/db/docs/batched_background_migrations/delete_invalid_protected_tag_create_access_levels.yml @@ -3,5 +3,5 @@ migration_job_name: DeleteInvalidProtectedTagCreateAccessLevels description: Remove rows from protected_tag_create_access_levels for groups that do not have project_group_links to the project for the associated protected tag feature_category: source_code_management introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/134337 -milestone: 16.6 +milestone: '16.6' queued_migration_version: 20231016194943 diff --git a/db/docs/batched_background_migrations/delete_orphaned_transferred_project_approval_rules.yml b/db/docs/batched_background_migrations/delete_orphaned_transferred_project_approval_rules.yml index 774c529116c..eaa1a61577d 100644 --- a/db/docs/batched_background_migrations/delete_orphaned_transferred_project_approval_rules.yml +++ b/db/docs/batched_background_migrations/delete_orphaned_transferred_project_approval_rules.yml @@ -5,4 +5,4 @@ description: | that are defined for a group hierachy prior to transfer, so they cannot be applied, nor edited. feature_category: security_policy_management introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/127767 -milestone: 16.3 +milestone: '16.3' diff --git a/db/docs/batched_background_migrations/delete_orphans_approval_merge_request_rules2.yml b/db/docs/batched_background_migrations/delete_orphans_approval_merge_request_rules2.yml index b23cad14fcc..5503e958007 100644 --- a/db/docs/batched_background_migrations/delete_orphans_approval_merge_request_rules2.yml +++ b/db/docs/batched_background_migrations/delete_orphans_approval_merge_request_rules2.yml @@ -6,4 +6,4 @@ Odescription: | feature_category: security_policy_management introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/127212 queued_migration_version: 20230721095222 -milestone: 16.5 +milestone: '16.5' diff --git a/db/docs/batched_background_migrations/delete_orphans_approval_project_rules2.yml b/db/docs/batched_background_migrations/delete_orphans_approval_project_rules2.yml index 7664a9a79df..cfd19b93a3a 100644 --- a/db/docs/batched_background_migrations/delete_orphans_approval_project_rules2.yml +++ b/db/docs/batched_background_migrations/delete_orphans_approval_project_rules2.yml @@ -6,4 +6,4 @@ Odescription: | feature_category: security_policy_management introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/127212 queued_migration_version: 20230721095222 -milestone: 16.5 +milestone: '16.5' diff --git a/db/docs/batched_background_migrations/fix_allow_descendants_override_disabled_shared_runners.yml b/db/docs/batched_background_migrations/fix_allow_descendants_override_disabled_shared_runners.yml index dd35c69e744..fc69b1eb934 100644 --- a/db/docs/batched_background_migrations/fix_allow_descendants_override_disabled_shared_runners.yml +++ b/db/docs/batched_background_migrations/fix_allow_descendants_override_disabled_shared_runners.yml @@ -3,4 +3,4 @@ migration_job_name: FixAllowDescendantsOverrideDisabledSharedRunners description: Clears invalid combination of shared runners settings (fixes subgroup creation) feature_category: runner_fleet introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/128112 -milestone: 16.3 +milestone: '16.3' diff --git a/db/docs/batched_background_migrations/fix_namespace_ids_of_vulnerability_reads.yml b/db/docs/batched_background_migrations/fix_namespace_ids_of_vulnerability_reads.yml index 1bee359aef5..1d486b94808 100644 --- a/db/docs/batched_background_migrations/fix_namespace_ids_of_vulnerability_reads.yml +++ b/db/docs/batched_background_migrations/fix_namespace_ids_of_vulnerability_reads.yml @@ -3,4 +3,4 @@ migration_job_name: FixNamespaceIdsOfVulnerabilityReads description: Fixes the data integrity issues for `namespace_id` attribute of `vulnerability_reads` table feature_category: vulnerability_management introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/129244 -milestone: 16.4 +milestone: '16.4' diff --git a/db/docs/batched_background_migrations/mark_duplicate_npm_packages_for_destruction.yml b/db/docs/batched_background_migrations/mark_duplicate_npm_packages_for_destruction.yml index bd059876a25..6cc77ebfaa8 100644 --- a/db/docs/batched_background_migrations/mark_duplicate_npm_packages_for_destruction.yml +++ b/db/docs/batched_background_migrations/mark_duplicate_npm_packages_for_destruction.yml @@ -3,4 +3,4 @@ migration_job_name: MarkDuplicateNpmPackagesForDestruction description: It seeks duplicate npm packages and marks them for destruction. feature_category: package_registry introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/114695 -milestone: 16.1 +milestone: '16.1' diff --git a/db/docs/batched_background_migrations/migrate_human_user_type.yml b/db/docs/batched_background_migrations/migrate_human_user_type.yml index 869a4fe7351..161c41e2a23 100644 --- a/db/docs/batched_background_migrations/migrate_human_user_type.yml +++ b/db/docs/batched_background_migrations/migrate_human_user_type.yml @@ -3,4 +3,4 @@ migration_job_name: MigrateHumanUserType description: Migrates human user type from old value (nil) to new value (0) for better indexing feature_category: user_management introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/115849 -milestone: 16.0 +milestone: '16.0' diff --git a/db/docs/batched_background_migrations/populate_denormalized_columns_for_sbom_occurrences.yml b/db/docs/batched_background_migrations/populate_denormalized_columns_for_sbom_occurrences.yml index b85ae1c22d6..0dddf7cc263 100644 --- a/db/docs/batched_background_migrations/populate_denormalized_columns_for_sbom_occurrences.yml +++ b/db/docs/batched_background_migrations/populate_denormalized_columns_for_sbom_occurrences.yml @@ -3,4 +3,4 @@ migration_job_name: PopulateDenormalizedColumnsForSbomOccurrences description: Populates the denormalized columns for `sbom_occurrences` table. feature_category: dependency_management introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/129486 -milestone: 16.4 +milestone: '16.4' diff --git a/db/docs/batched_background_migrations/populate_vulnerability_dismissal_fields.yml b/db/docs/batched_background_migrations/populate_vulnerability_dismissal_fields.yml index 77519cc1f38..5705ebdc882 100644 --- a/db/docs/batched_background_migrations/populate_vulnerability_dismissal_fields.yml +++ b/db/docs/batched_background_migrations/populate_vulnerability_dismissal_fields.yml @@ -4,4 +4,4 @@ description: This populates missing dismissal info for vulnerabilities. feature_category: vulnerability_management introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/117478 queued_migration_version: 20230412185837 -milestone: 15.11 +milestone: '15.11' diff --git a/db/docs/batched_background_migrations/remove_invalid_deploy_access_level_groups.yml b/db/docs/batched_background_migrations/remove_invalid_deploy_access_level_groups.yml index 39d13b58443..ddb544aa22a 100644 --- a/db/docs/batched_background_migrations/remove_invalid_deploy_access_level_groups.yml +++ b/db/docs/batched_background_migrations/remove_invalid_deploy_access_level_groups.yml @@ -3,4 +3,4 @@ migration_job_name: RemoveInvalidDeployAccessLevelGroups description: This deletes protected_environment_deploy_access_levels rows that have invalid group_id. feature_category: continuous_delivery introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/121222 -milestone: 16.1 +milestone: '16.1' diff --git a/db/docs/batched_background_migrations/sync_scan_result_policies.yml b/db/docs/batched_background_migrations/sync_scan_result_policies.yml index 16786572139..69e7a5bdc0c 100644 --- a/db/docs/batched_background_migrations/sync_scan_result_policies.yml +++ b/db/docs/batched_background_migrations/sync_scan_result_policies.yml @@ -5,4 +5,4 @@ description: Security policies are stored as YAML files in the security policy p for all security policy configurations. feature_category: security_policy_management introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/128378 -milestone: 16.4 +milestone: '16.4' diff --git a/db/docs/batched_background_migrations/update_code_suggestions_for_namespace_settings.yml b/db/docs/batched_background_migrations/update_code_suggestions_for_namespace_settings.yml index e0196878d61..db55e5e005c 100644 --- a/db/docs/batched_background_migrations/update_code_suggestions_for_namespace_settings.yml +++ b/db/docs/batched_background_migrations/update_code_suggestions_for_namespace_settings.yml @@ -3,4 +3,4 @@ migration_job_name: UpdateCodeSuggestionsForNamespaceSettings description: Enables Code Suggestions for all namespaces by default feature_category: code_suggestions introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/117899 -milestone: 16.0 +milestone: '16.0' diff --git a/db/docs/batched_background_migrations/update_users_set_external_if_service_account.yml b/db/docs/batched_background_migrations/update_users_set_external_if_service_account.yml index 1b89359b270..8c389bc82b0 100644 --- a/db/docs/batched_background_migrations/update_users_set_external_if_service_account.yml +++ b/db/docs/batched_background_migrations/update_users_set_external_if_service_account.yml @@ -3,4 +3,4 @@ migration_job_name: UpdateUsersSetExternalIfServiceAccount description: Update external value for users of type Service Account feature_category: system_access introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/130597 -milestone: 16.4 +milestone: '16.4' diff --git a/db/docs/batched_background_migrations/update_workspaces_config_version.yml b/db/docs/batched_background_migrations/update_workspaces_config_version.yml index 50cdfe1f2e9..ead063ebed6 100644 --- a/db/docs/batched_background_migrations/update_workspaces_config_version.yml +++ b/db/docs/batched_background_migrations/update_workspaces_config_version.yml @@ -2,4 +2,4 @@ migration_job_name: UpdateWorkspacesConfigVersion description: Update config_version to 2 and force_include_all_resources to true for existing workspaces feature_category: remote_development introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/131402 -milestone: 16.5 +milestone: '16.5' diff --git a/db/docs/ci_runner_machines.yml b/db/docs/ci_runner_machines.yml index c7395907814..cf9e0480fe0 100644 --- a/db/docs/ci_runner_machines.yml +++ b/db/docs/ci_runner_machines.yml @@ -3,7 +3,7 @@ table_name: ci_runner_machines classes: - Ci::RunnerManager feature_categories: -- runner_fleet +- fleet_visibility description: Information about runner managers associated to Ci::Runner models introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/107801 milestone: '15.8' diff --git a/db/docs/ci_runner_versions.yml b/db/docs/ci_runner_versions.yml index cb983222a6e..aa8b5f24b46 100644 --- a/db/docs/ci_runner_versions.yml +++ b/db/docs/ci_runner_versions.yml @@ -3,7 +3,7 @@ table_name: ci_runner_versions classes: - Ci::RunnerVersion feature_categories: -- runner_fleet +- fleet_visibility description: Information about used Ci::Runner versions introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90982 milestone: '15.2' diff --git a/db/docs/ci_runners.yml b/db/docs/ci_runners.yml index 5930adf7062..33bd6ae402f 100644 --- a/db/docs/ci_runners.yml +++ b/db/docs/ci_runners.yml @@ -4,7 +4,7 @@ classes: - Ci::Runner feature_categories: - runner -- runner_fleet +- fleet_visibility - runner_saas description: Registered CI runners introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/046b28312704f3131e72dcd2dbdacc5264d4aa62 diff --git a/db/docs/namespace_ci_cd_settings.yml b/db/docs/namespace_ci_cd_settings.yml index ddfa390694c..71668b132eb 100644 --- a/db/docs/namespace_ci_cd_settings.yml +++ b/db/docs/namespace_ci_cd_settings.yml @@ -4,7 +4,7 @@ classes: - NamespaceCiCdSetting feature_categories: - continuous_integration -- runner_fleet +- fleet_visibility description: Namespace-scoped settings related to the CI/CD domain introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/86477 milestone: '15.0' diff --git a/db/docs/p_ci_finished_build_ch_sync_events.yml b/db/docs/p_ci_finished_build_ch_sync_events.yml index 09938f99b16..c8875fd3e8b 100644 --- a/db/docs/p_ci_finished_build_ch_sync_events.yml +++ b/db/docs/p_ci_finished_build_ch_sync_events.yml @@ -3,7 +3,7 @@ table_name: p_ci_finished_build_ch_sync_events classes: - Ci::FinishedBuildChSyncEvent feature_categories: -- runner_fleet +- fleet_visibility description: Holds references to finished CI builds ready to be synced to ClickHouse introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/ milestone: '16.5' diff --git a/db/docs/p_ci_runner_machine_builds.yml b/db/docs/p_ci_runner_machine_builds.yml index 55d09963acc..3f3b8373ac5 100644 --- a/db/docs/p_ci_runner_machine_builds.yml +++ b/db/docs/p_ci_runner_machine_builds.yml @@ -2,7 +2,7 @@ table_name: p_ci_runner_machine_builds classes: - Ci::RunnerManagerBuild feature_categories: -- runner_fleet +- fleet_visibility description: Relationships between builds and runner managers introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/111476 milestone: '15.9' diff --git a/db/docs/project_ci_cd_settings.yml b/db/docs/project_ci_cd_settings.yml index 0f7f59dbb15..a0643aff4b9 100644 --- a/db/docs/project_ci_cd_settings.yml +++ b/db/docs/project_ci_cd_settings.yml @@ -5,7 +5,7 @@ classes: feature_categories: - continuous_integration - continuous_delivery -- runner_fleet +- fleet_visibility description: Project-scoped settings related to the CI/CD domain introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/392c411bdc16386ef42c86afaf8c4d8e4cddb955 milestone: '10.8' diff --git a/db/migrate/20231201113901_add_url_sub_fields_to_workspace.rb b/db/migrate/20231201113901_add_url_sub_fields_to_workspace.rb new file mode 100644 index 00000000000..ac228b70665 --- /dev/null +++ b/db/migrate/20231201113901_add_url_sub_fields_to_workspace.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true + +class AddUrlSubFieldsToWorkspace < Gitlab::Database::Migration[2.2] + milestone '16.7' + disable_ddl_transaction! + + def up + add_column :workspaces, :url_prefix, :text, if_not_exists: true + add_column :workspaces, :url_domain, :text, if_not_exists: true + add_column :workspaces, :url_query_string, :text, if_not_exists: true + + add_text_limit :workspaces, :url_prefix, 256 + add_text_limit :workspaces, :url_domain, 256 + add_text_limit :workspaces, :url_query_string, 256 + end + + def down + remove_column :workspaces, :url_prefix, if_exists: true + remove_column :workspaces, :url_domain, if_exists: true + remove_column :workspaces, :url_query_string, if_exists: true + end +end diff --git a/db/migrate/20231201114233_remove_not_null_constraint_from_url_column.rb b/db/migrate/20231201114233_remove_not_null_constraint_from_url_column.rb new file mode 100644 index 00000000000..e11903b90b9 --- /dev/null +++ b/db/migrate/20231201114233_remove_not_null_constraint_from_url_column.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +class RemoveNotNullConstraintFromUrlColumn < Gitlab::Database::Migration[2.2] + milestone '16.7' + disable_ddl_transaction! + + def up + change_column_null :workspaces, :url, true + end + + def down + change_column_null :workspaces, :url, false + end +end diff --git a/db/migrate/20231201122830_add_owasp_top_10_to_vulnerability_reads.rb b/db/migrate/20231201122830_add_owasp_top_10_to_vulnerability_reads.rb new file mode 100644 index 00000000000..2428857ca7f --- /dev/null +++ b/db/migrate/20231201122830_add_owasp_top_10_to_vulnerability_reads.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: true + +class AddOwaspTop10ToVulnerabilityReads < Gitlab::Database::Migration[2.2] + enable_lock_retries! + milestone '16.7' + + def change + add_column :vulnerability_reads, :owasp_top_10, :integer, limit: 2 + end +end diff --git a/db/schema_migrations/20231201113901 b/db/schema_migrations/20231201113901 new file mode 100644 index 00000000000..d61de59e27a --- /dev/null +++ b/db/schema_migrations/20231201113901 @@ -0,0 +1 @@ +983d22809998f8bd9b6b3f10a6256e48412f4c576374d0cebf71d01ac3f603c8 \ No newline at end of file diff --git a/db/schema_migrations/20231201114233 b/db/schema_migrations/20231201114233 new file mode 100644 index 00000000000..e36b7e34b27 --- /dev/null +++ b/db/schema_migrations/20231201114233 @@ -0,0 +1 @@ +dcb5244a9dad862502025f22d05c0bf4ee9d0981de07f8d5242577f9155c5cdf \ No newline at end of file diff --git a/db/schema_migrations/20231201122830 b/db/schema_migrations/20231201122830 new file mode 100644 index 00000000000..fe135e01cf5 --- /dev/null +++ b/db/schema_migrations/20231201122830 @@ -0,0 +1 @@ +9505020f8d79fa09c6ec95c94e4296aac359258c787b1c74af6331ea79b68d4c \ No newline at end of file diff --git a/db/structure.sql b/db/structure.sql index 3596bb114ca..286cff2b88c 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -25184,6 +25184,7 @@ CREATE TABLE vulnerability_reads ( dismissal_reason smallint, has_merge_request boolean DEFAULT false, has_remediations boolean DEFAULT false NOT NULL, + owasp_top_10 smallint, CONSTRAINT check_380451bdbe CHECK ((char_length(location_image) <= 2048)), CONSTRAINT check_a105eb825a CHECK ((char_length(cluster_agent_id) <= 10)) ); @@ -25589,22 +25590,28 @@ CREATE TABLE workspaces ( devfile_path text NOT NULL, devfile text, processed_devfile text, - url text NOT NULL, + url text, deployment_resource_version text, personal_access_token_id bigint, config_version integer DEFAULT 1 NOT NULL, force_include_all_resources boolean DEFAULT true NOT NULL, + url_prefix text, + url_domain text, + url_query_string text, + CONSTRAINT check_03c5d442fd CHECK ((char_length(url_domain) <= 256)), CONSTRAINT check_15543fb0fa CHECK ((char_length(name) <= 64)), CONSTRAINT check_157d5f955c CHECK ((char_length(namespace) <= 64)), CONSTRAINT check_2b401b0034 CHECK ((char_length(deployment_resource_version) <= 64)), CONSTRAINT check_77d1a2ff50 CHECK ((char_length(processed_devfile) <= 65535)), + CONSTRAINT check_8a0ab61b6b CHECK ((char_length(url_query_string) <= 256)), CONSTRAINT check_8e363ee3ad CHECK ((char_length(devfile_ref) <= 256)), CONSTRAINT check_8e4db5ffc2 CHECK ((char_length(actual_state) <= 32)), CONSTRAINT check_9e42558c35 CHECK ((char_length(url) <= 1024)), CONSTRAINT check_b70eddcbc1 CHECK ((char_length(desired_state) <= 32)), CONSTRAINT check_d7ed376e49 CHECK ((char_length(editor) <= 256)), CONSTRAINT check_dc58d56169 CHECK ((char_length(devfile_path) <= 2048)), - CONSTRAINT check_eb32879a3d CHECK ((char_length(devfile) <= 65535)) + CONSTRAINT check_eb32879a3d CHECK ((char_length(devfile) <= 65535)), + CONSTRAINT check_ffa8cad434 CHECK ((char_length(url_prefix) <= 256)) ); CREATE SEQUENCE workspaces_id_seq diff --git a/doc/administration/auth/ldap/ldap-troubleshooting.md b/doc/administration/auth/ldap/ldap-troubleshooting.md index b4f65699dd0..3f2fe086794 100644 --- a/doc/administration/auth/ldap/ldap-troubleshooting.md +++ b/doc/administration/auth/ldap/ldap-troubleshooting.md @@ -657,6 +657,25 @@ end You can then [run a UserSync](#sync-all-users) **(PREMIUM SELF)** to sync the latest DN for each of these users. +## Could not authenticate from AzureActivedirectoryV2 because "Invalid grant" + +When converting from LDAP to SAML you might get an error in Azure that states the following: + +```plaintext +Authentication failure! invalid_credentials: OAuth2::Error, invalid_grant. +``` + +This issue occurs when both of the following are true: + +- LDAP identities still exist for users after SAML has been configured for those users. +- You disable LDAP for those users. + +You would receive both LDAP and Azure metadata in the logs, which generates the error in Azure. + +The workaround for a single user is to remove the LDAP identity from the user in **Admin > Identities**. + +To remove multiple LDAP identities, use either of the workarounds for the [`Could not authenticate you from Ldapmain because "Unknown provider"` error](#could-not-authenticate-you-from-ldapmain-because-unknown-provider). + ## `Could not authenticate you from Ldapmain because "Unknown provider"` You can receive the following error when authenticating with an LDAP server: diff --git a/doc/administration/monitoring/ip_allowlist.md b/doc/administration/monitoring/ip_allowlist.md index b3ddc05776c..0424a5b48d6 100644 --- a/doc/administration/monitoring/ip_allowlist.md +++ b/doc/administration/monitoring/ip_allowlist.md @@ -4,12 +4,12 @@ group: Cloud Connector info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments --- -# IP whitelist **(FREE SELF)** +# IP allowlist **(FREE SELF)** GitLab provides some [monitoring endpoints](health_check.md) that provide health check information when probed. -To control access to those endpoints via IP whitelisting, you can add single +To control access to those endpoints through IP allowlisting, you can add single hosts or use IP ranges: ::Tabs @@ -32,7 +32,7 @@ You can set the required IPs under the `gitlab.webservice.monitoring.ipWhitelist gitlab: webservice: monitoring: - # Monitoring IP whitelist + # Monitoring IP allowlist ipWhitelist: - 0.0.0.0/0 # Default ``` diff --git a/doc/architecture/blueprints/ci_gcp_secrets_manager/index.md b/doc/architecture/blueprints/ci_gcp_secrets_manager/index.md index 250c18c02c0..1dc529d767d 100644 --- a/doc/architecture/blueprints/ci_gcp_secrets_manager/index.md +++ b/doc/architecture/blueprints/ci_gcp_secrets_manager/index.md @@ -78,7 +78,7 @@ The proposed CI keyword would be the following: job_name: id_tokens: GCP_SM_ID_TOKEN: - aud: https://iam.googleapis.com/projects/$GCP_PROJECT_NUMBER/locations/global/workloadIdentityPools/$GCP_WORKLOAD_FEDERATION_POOL_ID/providers/$GCP_WORKLOAD_FEDERATION_PROVIDER_ID # or a custom audience as configured in GCP Workload Identity Pool Provider. + aud: my-GCP-workload-identity-federation-audience secrets: DATABASE_PASSWORD: gcp_sm: diff --git a/doc/development/fe_guide/architecture.md b/doc/development/fe_guide/architecture.md index b7e5c5f9997..971c527ef68 100644 --- a/doc/development/fe_guide/architecture.md +++ b/doc/development/fe_guide/architecture.md @@ -6,11 +6,60 @@ info: Any user with at least the Maintainer role can merge updates to this conte # Architecture -When building new features, consider reaching out to relevant stakeholders as early as possible in the process. +At GitLab, there are no dedicated "software architects". Everyone is encouraged to make their own decisions and document them appropriately. To know how or where to document these decisions, read on. -Architectural decisions should be accessible to everyone. Document -them in the relevant Merge Request discussions or by updating our documentation -when appropriate by adding an entry to this section. +## Documenting decisions + +When building new features, consider the scope and scale of what you are about to build. Depending on the answer, there are several tools or processes that could support your endeavor. We aim to keep the process of building features as efficient as possible. As a general rule, use the simplest process possible unless you need the additional support and structure of more time consuming solutions. + +### Merge requests + +When a change impacts is limited within a group or has a single contributor, the smallest possible documentation of architecture decisions is a commit and by extension a merge request (MR). MRs or commits can still be referenced even after they are merged, so it is vital to leave a good description, comments and commit messages to explain certain decisions in case it needs to be referenced later. Even a MR that is intended to be reviewed within a group should contain all relevant decision-making explicitly. + +### Architectural Issue + +When a unit of work starts to get big enough that it might impact an entire group's direction, it may be a good idea to create an architecture issue to discuss the technical direction. This process is informal and has no official requirements. Create an issue within the GitLab project where you can propose a plan for the work to be done and invite collaborators to refine the proposal with you. + +This structure allows the group to think through a proposed change, gather feedback and iterate. It also allows them to use the issue as a source of truth rather than a comments thread on the feature issue or the MRs themselves. Consider adding some kind of visual support (like a schema) to facilitate the discussion. For example, you can reference this [architectural issue of the CI/CD Catalog](https://gitlab.com/gitlab-org/gitlab/-/issues/393225). + +### Design Documents + +When the work ahead may affect more than a single group, stage or potentially an entirement department (for example, all of the Frontend team) then it is likely that there is need for a [Design Document](https://about.gitlab.com/handbook/engineering/architecture/workflow/). + +This is well documented in the handbook, but to touch on it shortly, it is **the best way** to propose large changes and gather the required feedback and support to move forward. These documents are version controlled, keep evolving with time and are a great way to share a complex understanding across the entire organization. They also require a coach, which is a great way to involve someone with a lot of experience with larger changes. This process is shared across all engineering departments and is owned by the CTO. + +To see all Design Documents, you can check the [Architecture at GitLab page](../../architecture/index.md) + +### Frontend RFCs (deprecated) + +In the past, we had a [Frontend RFC project](https://gitlab.com/gitlab-org/frontend/rfcs) which goal was to propose larger changes and get opinions from the entire department. This project is no longer used for a couple of reasons: + +1. Issues created in this project had a very low participation rate (less than 20%) +1. Controversial issues would stall with no clear way to resolve them +1. Issues that were completed often did not need a RFC in the first place (small issues) +1. Changes were often proposed "naively" without clear time and resource allocation + +In most instances where we would have created a RFC, a Design Document can be used instead as it will have it's own RFC attached to it. This makes the conversation centered around the technical design and RFCs are just a way to further the completion of the design. + +### Entry in the Frontend documentation + +Adding an architecture section to the docs is a way to tell frontend engineers how to use or build upon an existing architecture. Use it to help "onboard" engineers to a part of the application that may not be self-evident. Try to avoid documenting your group's architecture here if it has no impact on other teams. + +### Which to choose? + +As a general rule, the wider the scope of your change, the more likely it is that you and your team would benefit from a Design Document. Also consider whether your change is a true two-way door decision: changes that can easily be reverted require less thinking ahead than those that cannot. + +Work that can be achieved within a single milestone probably only needs Merge requests. Work that may take several milestone to complete, but where you are the only DRI is probably also easier done through MRs. + +When multiple DRIs are involved, ask yourself if the work ahead is clear for all of you. If the work you do is complex and affects each others, consider gathering technical feedback from your team before you start working on an Architectural issue. Write a clear proposal, involve all stakeholders early and keep yourselves accountable to the decisions made on the issue. + +Very small changes may have a very broad impact. For example, a change to any ESLint rule will impact all of engineering, but might not require a Design Document. Consider sending your proposal through Slack to gauge interest ("Should we enable X rule?") and then simply create a MR. Finally, share widely to the appropriate channels to gather feedback. + +For recommending certain code patterns in our documentation, you can write the MR that apply your proposed change, share it broadly with the department and if no strong objections are raised, merge your change. This is more efficient than RFCs because of the bias for action, while also gathering all the feedback necessary for everyone to feel included. + +If you'd like to propose a major change to the technological stack (Vue to React, JavaScript to TypeScript, etc.), start by reaching out on Slack to gauge interest. Always ask yourself whether or not the problems that you see can be fixed from our current tech stack, as we should always try to fix our problems with the tools we already have. Other departments, such as Backend and QA, do not have a clear process to propose technological changes either. That is because these changes would require huge investements from the company and probably cannot be decided without involving high-ranking executives from engineering. + +Instead, consider starting a Design Document that explains the problem and try to solve it with our current tools. Invite contribution from the department and research this thoroughly as there can only be two outcomes. Either the problem **can** be solved with our current tools or it cannot. If it can, this is a huge with for our teams since we've fixed and issue without the need to completly change our stack, and if it cannot, then the Design Document can be the start of the larger conversation around the technological change. ## Widget Architecture diff --git a/doc/user/permissions.md b/doc/user/permissions.md index 87ac456d8c3..2594effe333 100644 --- a/doc/user/permissions.md +++ b/doc/user/permissions.md @@ -122,7 +122,7 @@ The following table lists project permissions available for each role: | [License Scanning](compliance/license_scanning_of_cyclonedx_files/index.md):
View License list | | ✓ | ✓ | ✓ | ✓ | | [License approval policies](../user/compliance/license_approval_policies.md):
Manage license policy | | | | ✓ | ✓ | | [Merge requests](project/merge_requests/index.md):
Assign reviewer | | ✓ | ✓ | ✓ | ✓ | -| [Merge requests](project/merge_requests/index.md):
See list | | ✓ | ✓ | ✓ | ✓ | +| [Merge requests](project/merge_requests/index.md):
View list | (25) | ✓ | ✓ | ✓ | ✓ | | [Merge requests](project/merge_requests/index.md):
Apply code change suggestions | | | ✓ | ✓ | ✓ | | [Merge requests](project/merge_requests/index.md):
Approve (8) | | | ✓ | ✓ | ✓ | | [Merge requests](project/merge_requests/index.md):
Assign | | | ✓ | ✓ | ✓ | @@ -250,6 +250,7 @@ The following table lists project permissions available for each role: 22. You must have permission to [view the epic](group/epics/manage_epics.md#who-can-view-an-epic). 23. In GitLab 15.9 and later, users with the Guest role and an Ultimate license can view private repository content if an administrator (on self-managed) or group owner (on GitLab.com) gives those users permission. The administrator or group owner can create a [custom role](custom_roles.md) through the API and assign that role to the users. 24. In GitLab 16.4 the ability for `Developers` to change the status of a vulnerability (`admin_vulnerability`) was [deprecated](../update/deprecations.md#deprecate-change-vulnerability-status-from-the-developer-role). The `admin_vulnerability` permission will be removed, by default, from all `Developer` roles in GitLab 17.0. +25. Members with the Guest role can view the list of MRs in public projects. Private projects restrict Guests from viewing MR lists. diff --git a/doc/user/project/pages/index.md b/doc/user/project/pages/index.md index 60a5a9dee63..61024b0df62 100644 --- a/doc/user/project/pages/index.md +++ b/doc/user/project/pages/index.md @@ -175,7 +175,7 @@ To enable multiple GitLab Pages deployments: 1. On the left sidebar, select **Search or go to** and find your project. 1. Select **Deploy > Pages**. -1. Select **Use multiple versions**. +1. Select **Use multiple deployments**. ### Path clash diff --git a/lib/api/ci/runner.rb b/lib/api/ci/runner.rb index 25ac1780a36..585e9f962a3 100644 --- a/lib/api/ci/runner.rb +++ b/lib/api/ci/runner.rb @@ -93,7 +93,7 @@ module API requires :token, type: String, desc: %q(The runner's authentication token) requires :system_id, type: String, desc: %q(The runner's system identifier.) end - delete '/managers', urgency: :low, feature_category: :runner_fleet do + delete '/managers', urgency: :low, feature_category: :fleet_visibility do authenticate_runner!(ensure_runner_manager: false) destroy_conditionally!(current_runner) do diff --git a/lib/api/user_runners.rb b/lib/api/user_runners.rb index edbd0214bb8..381a1a5aab4 100644 --- a/lib/api/user_runners.rb +++ b/lib/api/user_runners.rb @@ -45,7 +45,7 @@ module API optional :maximum_timeout, type: Integer, desc: 'Maximum timeout that limits the amount of time (in seconds) that runners can run jobs' end - post 'runners', urgency: :low, feature_category: :runner_fleet do + post 'runners', urgency: :low, feature_category: :fleet_visibility do attributes = attributes_for_keys( %i[runner_type group_id project_id description maintenance_note paused locked run_untagged tag_list access_level maximum_timeout] diff --git a/lib/bulk_imports/network_error.rb b/lib/bulk_imports/network_error.rb index b21889adcb3..b49733962f4 100644 --- a/lib/bulk_imports/network_error.rb +++ b/lib/bulk_imports/network_error.rb @@ -18,7 +18,7 @@ module BulkImports Errno::ECONNRESET, Errno::ECONNREFUSED, Errno::EHOSTUNREACH, Errno::ENETUNREACH ].freeze - RETRIABLE_HTTP_CODES = [429].freeze + RETRIABLE_HTTP_CODES = [429, 500, 502, 503, 504].freeze DEFAULT_RETRY_DELAY_SECONDS = 30 @@ -57,7 +57,7 @@ module BulkImports end def retriable_http_code? - RETRIABLE_HTTP_CODES.include?(response&.code) + RETRIABLE_HTTP_CODES.include?(response&.code.to_i) end def increment(object) diff --git a/lib/generators/batched_background_migration/templates/batched_background_migration_dictionary.template b/lib/generators/batched_background_migration/templates/batched_background_migration_dictionary.template index 210225e71ef..8264a7486af 100644 --- a/lib/generators/batched_background_migration/templates/batched_background_migration_dictionary.template +++ b/lib/generators/batched_background_migration/templates/batched_background_migration_dictionary.template @@ -3,7 +3,7 @@ migration_job_name: <%= class_name %> description: # Please capture what <%= class_name %> does feature_category: <%= feature_category %> introduced_by_url: # URL of the MR (or issue/commit) that introduced the migration -milestone: <%= current_milestone %> +milestone: '<%= current_milestone %>' queued_migration_version: <%= migration_number %> # Replace with the approximate date you think it's best to ensure the completion of this BBM. finalize_after: # yyyy-mm-dd diff --git a/lib/gitlab/background_migration/fix_allow_descendants_override_disabled_shared_runners.rb b/lib/gitlab/background_migration/fix_allow_descendants_override_disabled_shared_runners.rb index 44bda3fe2b6..618944e1653 100644 --- a/lib/gitlab/background_migration/fix_allow_descendants_override_disabled_shared_runners.rb +++ b/lib/gitlab/background_migration/fix_allow_descendants_override_disabled_shared_runners.rb @@ -7,7 +7,7 @@ module Gitlab # This combination fails validation and doesn't make sense: # we always allow descendants to disable shared runners class FixAllowDescendantsOverrideDisabledSharedRunners < BatchedMigrationJob - feature_category :runner_fleet + feature_category :fleet_visibility operation_name :fix_allow_descendants_override_disabled_shared_runners def perform diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 8cf0c45c7a7..901f79bb10e 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -6683,9 +6683,6 @@ msgstr "" msgid "Artifacts|Total artifacts size" msgstr "" -msgid "As this is a newly created account, to get started, click the link below to confirm your account." -msgstr "" - msgid "As we continue to build more features for SAST, we'd love your feedback on the SAST configuration feature in %{linkStart}this issue%{linkEnd}." msgstr "" @@ -10884,9 +10881,6 @@ msgstr "" msgid "Close milestone" msgstr "" -msgid "Close sidebar" -msgstr "" - msgid "Close this %{quick_action_target}" msgstr "" @@ -22180,7 +22174,7 @@ msgstr "" msgid "GitLabPages|Updating your Pages configuration..." msgstr "" -msgid "GitLabPages|Use multiple versions" +msgid "GitLabPages|Use multiple deployments" msgstr "" msgid "GitLabPages|Use unique domain" @@ -22198,7 +22192,7 @@ msgstr "" msgid "GitLabPages|When enabled, all attempts to visit your website through HTTP are automatically redirected to HTTPS using a response with status code 301. Requires a valid certificate for all domains. %{docs_link_start}Learn more.%{link_end}" msgstr "" -msgid "GitLabPages|When enabled, you can create multiple versions of your pages site." +msgid "GitLabPages|When enabled, you can create multiple deployments of your pages site. %{docs_link_start}Learn More.%{link_end}" msgstr "" msgid "GitLabPages|When using Pages under the general domain of a GitLab instance (%{pages_host}), you cannot use HTTPS with subdomains of subdomains. If your namespace or groupname contains a dot, it does not work. This is a limitation of the HTTP Over TLS protocol. HTTP pages work if you don't redirect HTTP to HTTPS. %{docs_link_start}Learn more.%{link_end}" @@ -51943,7 +51937,7 @@ msgstr "" msgid "UsageQuota|%{percentageRemaining}%% purchased storage remaining." msgstr "" -msgid "UsageQuota|%{storage_limit_link_start}A namespace storage limit%{link_end} will soon be enforced for the %{strong_start}%{namespace_name}%{strong_end} namespace. %{extra_message}" +msgid "UsageQuota|%{storage_limit_link_start}A namespace storage limit%{link_end} of %{limit} will soon be enforced for the %{strong_start}%{namespace_name}%{strong_end} namespace. %{extra_message}" msgstr "" msgid "UsageQuota|Any additional purchased storage will be displayed here." diff --git a/qa/qa/page/component/badges.rb b/qa/qa/page/component/badges.rb index 8c0907d17b4..118e5072f0f 100644 --- a/qa/qa/page/component/badges.rb +++ b/qa/qa/page/component/badges.rb @@ -9,10 +9,10 @@ module QA end view 'app/assets/javascripts/badges/components/badge_form.vue' do - element :badge_name_field - element :badge_link_url_field - element :badge_image_url_field - element :add_badge_button + element 'badge-name-field' + element 'badge-link-url-field' + element 'badge-image-url-field' + element 'add-badge-button' end view 'app/assets/javascripts/badges/components/badge_list.vue' do @@ -29,19 +29,19 @@ module QA end def fill_name(name) - fill_element :badge_name_field, name + fill_element 'badge-name-field', name end def fill_link_url(url) - fill_element :badge_link_url_field, url + fill_element 'badge-link-url-field', url end def fill_image_url(url) - fill_element :badge_image_url_field, url + fill_element 'badge-image-url-field', url end def click_add_badge_button - click_element :add_badge_button + click_element 'add-badge-button' end def has_badge?(badge_name) diff --git a/rubocop/batched_background_migrations_dictionary.rb b/rubocop/batched_background_migrations_dictionary.rb index 286f0a57bad..70892d20796 100644 --- a/rubocop/batched_background_migrations_dictionary.rb +++ b/rubocop/batched_background_migrations_dictionary.rb @@ -16,7 +16,8 @@ module RuboCop data[dictionary['queued_migration_version'].to_s] = { introduced_by_url: dictionary['introduced_by_url'], finalize_after: dictionary['finalize_after'], - finalized_by: dictionary['finalized_by'].to_s + finalized_by: dictionary['finalized_by'].to_s, + milestone: dictionary['milestone'] } end end @@ -38,6 +39,10 @@ module RuboCop dictionary_data&.dig(:introduced_by_url) end + def milestone + dictionary_data&.dig(:milestone) + end + private def dictionary_data diff --git a/rubocop/cop/background_migration/dictionary_file.rb b/rubocop/cop/background_migration/dictionary_file.rb index 90a42135c41..abdcd7c3358 100644 --- a/rubocop/cop/background_migration/dictionary_file.rb +++ b/rubocop/cop/background_migration/dictionary_file.rb @@ -14,6 +14,7 @@ module RuboCop MSG = { invalid_url: "Invalid `%{key}` url for the dictionary. Please use the following format: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/XXX", + invalid_milestone: "Invalid `%{key}` for the dictionary. It must be a string. Please ensure it is quoted.", missing_key: "Mandatory key '%{key}' is missing from the dictionary. Please add with an appropriate value.", missing_dictionary: <<-MESSAGE.delete("\n").squeeze(' ').strip Missing %{file_name}. @@ -56,6 +57,10 @@ module RuboCop url.match?(URL_PATTERN) end + def valid_milestone?(milestone) + milestone.is_a?(String) + end + def dictionary_file?(migration_class_name) File.exist?(dictionary_file_path(migration_class_name)) end @@ -71,6 +76,10 @@ module RuboCop bbm_dictionary = RuboCop::BatchedBackgroundMigrationsDictionary.new(version(node)) + return [:missing_key, { key: :milestone }] unless bbm_dictionary.milestone.present? + + return [:invalid_milestone, { key: :milestone }] unless valid_milestone?(bbm_dictionary.milestone) + return [:missing_key, { key: :finalize_after }] unless bbm_dictionary.finalize_after.present? return [:missing_key, { key: :introduced_by_url }] unless bbm_dictionary.introduced_by_url.present? diff --git a/spec/controllers/admin/runner_projects_controller_spec.rb b/spec/controllers/admin/runner_projects_controller_spec.rb index 06a73984ac0..5cfa1287e3b 100644 --- a/spec/controllers/admin/runner_projects_controller_spec.rb +++ b/spec/controllers/admin/runner_projects_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Admin::RunnerProjectsController, feature_category: :runner_fleet do +RSpec.describe Admin::RunnerProjectsController, feature_category: :fleet_visibility do let_it_be(:group) { create(:group) } let_it_be(:project) { create(:project, group: group) } diff --git a/spec/controllers/admin/runners_controller_spec.rb b/spec/controllers/admin/runners_controller_spec.rb index 5f98004e9cf..d88fe41a869 100644 --- a/spec/controllers/admin/runners_controller_spec.rb +++ b/spec/controllers/admin/runners_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Admin::RunnersController, feature_category: :runner_fleet do +RSpec.describe Admin::RunnersController, feature_category: :fleet_visibility do let_it_be(:runner) { create(:ci_runner) } let_it_be(:user) { create(:admin) } diff --git a/spec/controllers/groups/runners_controller_spec.rb b/spec/controllers/groups/runners_controller_spec.rb index d48e9ff0d51..e732281a406 100644 --- a/spec/controllers/groups/runners_controller_spec.rb +++ b/spec/controllers/groups/runners_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Groups::RunnersController, feature_category: :runner_fleet do +RSpec.describe Groups::RunnersController, feature_category: :fleet_visibility do let_it_be(:user) { create(:user) } let_it_be(:namespace_settings) { create(:namespace_settings, runner_registration_enabled: true) } let_it_be(:group) { create(:group, namespace_settings: namespace_settings) } diff --git a/spec/controllers/projects/runner_projects_controller_spec.rb b/spec/controllers/projects/runner_projects_controller_spec.rb index beedaad0fa9..42ceeb32f51 100644 --- a/spec/controllers/projects/runner_projects_controller_spec.rb +++ b/spec/controllers/projects/runner_projects_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::RunnerProjectsController, feature_category: :runner_fleet do +RSpec.describe Projects::RunnerProjectsController, feature_category: :fleet_visibility do let_it_be(:user) { create(:user) } let_it_be(:group) { create(:group) } let_it_be(:project) { create(:project, group: group) } diff --git a/spec/controllers/projects/runners_controller_spec.rb b/spec/controllers/projects/runners_controller_spec.rb index 3602a2df959..35cfe093323 100644 --- a/spec/controllers/projects/runners_controller_spec.rb +++ b/spec/controllers/projects/runners_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::RunnersController, feature_category: :runner_fleet do +RSpec.describe Projects::RunnersController, feature_category: :fleet_visibility do let_it_be(:user) { create(:user) } let_it_be(:project) { create(:project) } let_it_be(:runner) { create(:ci_runner, :project, projects: [project]) } diff --git a/spec/features/admin/admin_runners_spec.rb b/spec/features/admin/admin_runners_spec.rb index d4e25d413dd..dad9a08fce1 100644 --- a/spec/features/admin/admin_runners_spec.rb +++ b/spec/features/admin/admin_runners_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe "Admin Runners", feature_category: :runner_fleet do +RSpec.describe "Admin Runners", feature_category: :fleet_visibility do include Features::SortingHelpers include Features::RunnersHelpers include Spec::Support::Helpers::ModalHelpers diff --git a/spec/features/groups/group_runners_spec.rb b/spec/features/groups/group_runners_spec.rb index 4e5d7c6f8e8..36f469a4d2e 100644 --- a/spec/features/groups/group_runners_spec.rb +++ b/spec/features/groups/group_runners_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe "Group Runners", feature_category: :runner_fleet do +RSpec.describe "Group Runners", feature_category: :fleet_visibility do include Features::RunnersHelpers include Spec::Support::Helpers::ModalHelpers diff --git a/spec/features/runners_spec.rb b/spec/features/runners_spec.rb index 091c318459b..e7047610180 100644 --- a/spec/features/runners_spec.rb +++ b/spec/features/runners_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Runners', feature_category: :runner_fleet do +RSpec.describe 'Runners', feature_category: :fleet_visibility do let_it_be(:user) { create(:user) } before do diff --git a/spec/finders/ci/runners_finder_spec.rb b/spec/finders/ci/runners_finder_spec.rb index 7f680f50297..fbe44244dba 100644 --- a/spec/finders/ci/runners_finder_spec.rb +++ b/spec/finders/ci/runners_finder_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::RunnersFinder, feature_category: :runner_fleet do +RSpec.describe Ci::RunnersFinder, feature_category: :fleet_visibility do context 'admin' do let_it_be(:admin) { create(:user, :admin) } diff --git a/spec/frontend/error_tracking/components/error_details_spec.js b/spec/frontend/error_tracking/components/error_details_spec.js index 977e0a55a99..f43d6a2b025 100644 --- a/spec/frontend/error_tracking/components/error_details_spec.js +++ b/spec/frontend/error_tracking/components/error_details_spec.js @@ -463,7 +463,7 @@ describe('ErrorDetails', () => { const gitlabIssuePath = 'https://gitlab.example.com/issues/1'; const findGitLabLink = () => wrapper.find(`[href="${gitlabIssuePath}"]`); const findCreateIssueButton = () => wrapper.find('[data-testid="create-issue-button"]'); - const findViewIssueButton = () => wrapper.find('[data-qa-selector="view_issue_button"]'); + const findViewIssueButton = () => wrapper.find('[data-testid="view-issue-button"]'); describe('is present', () => { beforeEach(() => { diff --git a/spec/frontend/fixtures/runner.rb b/spec/frontend/fixtures/runner.rb index a73a0dcbdd1..3b03a03cb96 100644 --- a/spec/frontend/fixtures/runner.rb +++ b/spec/frontend/fixtures/runner.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Runner (JavaScript fixtures)', feature_category: :runner_fleet do +RSpec.describe 'Runner (JavaScript fixtures)', feature_category: :fleet_visibility do include AdminModeHelper include ApiHelpers include JavaScriptFixturesHelpers diff --git a/spec/frontend/import_entities/import_groups/components/import_table_spec.js b/spec/frontend/import_entities/import_groups/components/import_table_spec.js index 4141bded502..84f149b4dd5 100644 --- a/spec/frontend/import_entities/import_groups/components/import_table_spec.js +++ b/spec/frontend/import_entities/import_groups/components/import_table_spec.js @@ -9,8 +9,9 @@ import { createMockDirective, getBinding } from 'helpers/vue_mock_directive'; import { createAlert } from '~/alert'; import { HTTP_STATUS_OK, HTTP_STATUS_TOO_MANY_REQUESTS } from '~/lib/utils/http_status'; import axios from '~/lib/utils/axios_utils'; + import { STATUSES } from '~/import_entities/constants'; -import { i18n, ROOT_NAMESPACE } from '~/import_entities/import_groups/constants'; +import { ROOT_NAMESPACE } from '~/import_entities/import_groups/constants'; import ImportTable from '~/import_entities/import_groups/components/import_table.vue'; import ImportStatus from '~/import_entities/import_groups/components/import_status.vue'; import ImportHistoryLink from '~/import_entities/import_groups/components//import_history_link.vue'; @@ -148,7 +149,7 @@ describe('import table', () => { }); await waitForPromises(); - expect(wrapper.findComponent(GlEmptyState).props().title).toBe(i18n.NO_GROUPS_FOUND); + expect(wrapper.findComponent(GlEmptyState).props().title).toBe('No groups found'); }); }); @@ -296,6 +297,42 @@ describe('import table', () => { }); }); + describe('when importGroup query is using stale data from LocalStorageCache', () => { + it('displays error', async () => { + const mockMutationWithProgressInvalid = jest.fn().mockResolvedValue({ + __typename: 'ClientBulkImportSourceGroup', + id: 1, + lastImportTarget: { id: 1, targetNamespace: 'root', newName: 'group1' }, + progress: { + __typename: 'ClientBulkImportProgress', + id: null, + status: 'failed', + message: '', + }, + }); + + createComponent({ + bulkImportSourceGroups: () => ({ + nodes: [FAKE_GROUP], + pageInfo: FAKE_PAGE_INFO, + versionValidation: FAKE_VERSION_VALIDATION, + }), + importGroups: mockMutationWithProgressInvalid, + }); + + await waitForPromises(); + await findRowImportDropdownAtIndex(0).trigger('click'); + await waitForPromises(); + + expect(mockMutationWithProgressInvalid).toHaveBeenCalled(); + expect(createAlert).toHaveBeenCalledWith({ + message: 'Importing the group failed.', + captureError: true, + error: expect.any(Error), + }); + }); + }); + it('displays error if importing group fails', async () => { createComponent({ bulkImportSourceGroups: () => ({ @@ -312,11 +349,11 @@ describe('import table', () => { await findRowImportDropdownAtIndex(0).trigger('click'); await waitForPromises(); - expect(createAlert).toHaveBeenCalledWith( - expect.objectContaining({ - message: i18n.ERROR_IMPORT, - }), - ); + expect(createAlert).toHaveBeenCalledWith({ + message: 'Importing the group failed.', + captureError: true, + error: expect.any(Error), + }); }); it('displays inline error if importing group reports rate limit', async () => { @@ -338,7 +375,9 @@ describe('import table', () => { await waitForPromises(); expect(createAlert).not.toHaveBeenCalled(); - expect(wrapper.find('tbody tr').text()).toContain(i18n.ERROR_TOO_MANY_REQUESTS); + expect(wrapper.find('tbody tr').text()).toContain( + 'Over six imports in one minute were attempted. Wait at least one minute and try again.', + ); }); it('displays inline error if backend returns validation error', async () => { diff --git a/spec/frontend/work_items/components/work_item_attributes_wrapper_spec.js b/spec/frontend/work_items/components/work_item_attributes_wrapper_spec.js index 123cf647674..48ec84ceb85 100644 --- a/spec/frontend/work_items/components/work_item_attributes_wrapper_spec.js +++ b/spec/frontend/work_items/components/work_item_attributes_wrapper_spec.js @@ -1,11 +1,20 @@ +import { nextTick } from 'vue'; import { shallowMount } from '@vue/test-utils'; import WorkItemAssignees from '~/work_items/components/work_item_assignees.vue'; import WorkItemDueDate from '~/work_items/components/work_item_due_date.vue'; import WorkItemLabels from '~/work_items/components/work_item_labels.vue'; import WorkItemMilestone from '~/work_items/components/work_item_milestone.vue'; - +import WorkItemParentInline from '~/work_items/components/work_item_parent_inline.vue'; +import WorkItemParent from '~/work_items/components/work_item_parent_with_edit.vue'; +import waitForPromises from 'helpers/wait_for_promises'; import WorkItemAttributesWrapper from '~/work_items/components/work_item_attributes_wrapper.vue'; -import { workItemResponseFactory } from '../mock_data'; +import { + workItemResponseFactory, + taskType, + issueType, + objectiveType, + keyResultType, +} from '../mock_data'; describe('WorkItemAttributesWrapper component', () => { let wrapper; @@ -16,8 +25,13 @@ describe('WorkItemAttributesWrapper component', () => { const findWorkItemAssignees = () => wrapper.findComponent(WorkItemAssignees); const findWorkItemLabels = () => wrapper.findComponent(WorkItemLabels); const findWorkItemMilestone = () => wrapper.findComponent(WorkItemMilestone); + const findWorkItemParentInline = () => wrapper.findComponent(WorkItemParentInline); + const findWorkItemParent = () => wrapper.findComponent(WorkItemParent); - const createComponent = ({ workItem = workItemQueryResponse.data.workItem } = {}) => { + const createComponent = ({ + workItem = workItemQueryResponse.data.workItem, + workItemsMvc2 = true, + } = {}) => { wrapper = shallowMount(WorkItemAttributesWrapper, { propsData: { fullPath: 'group/project', @@ -29,6 +43,9 @@ describe('WorkItemAttributesWrapper component', () => { hasOkrsFeature: true, hasIssuableHealthStatusFeature: true, projectNamespace: 'namespace', + glFeatures: { + workItemsMvc2, + }, }, stubs: { WorkItemWeight: true, @@ -94,4 +111,54 @@ describe('WorkItemAttributesWrapper component', () => { expect(findWorkItemMilestone().exists()).toBe(exists); }); }); + + describe('parent widget', () => { + describe.each` + description | workItemType | exists + ${'when work item type is task'} | ${taskType} | ${true} + ${'when work item type is objective'} | ${objectiveType} | ${true} + ${'when work item type is keyresult'} | ${keyResultType} | ${true} + ${'when work item type is issue'} | ${issueType} | ${false} + `('$description', ({ workItemType, exists }) => { + it(`${exists ? 'renders' : 'does not render'} parent component`, async () => { + const response = workItemResponseFactory({ workItemType }); + createComponent({ workItem: response.data.workItem }); + + await waitForPromises(); + + expect(findWorkItemParent().exists()).toBe(exists); + }); + }); + + it('renders WorkItemParent when workItemsMvc2 enabled', async () => { + createComponent(); + + await waitForPromises(); + + expect(findWorkItemParent().exists()).toBe(true); + expect(findWorkItemParentInline().exists()).toBe(false); + }); + + it('renders WorkItemParentInline when workItemsMvc2 disabled', async () => { + createComponent({ workItemsMvc2: false }); + + await waitForPromises(); + + expect(findWorkItemParent().exists()).toBe(false); + expect(findWorkItemParentInline().exists()).toBe(true); + }); + + it('emits an error event to the wrapper', async () => { + const response = workItemResponseFactory({ parentWidgetPresent: true }); + createComponent({ workItem: response.data.workItem }); + const updateError = 'Failed to update'; + + await waitForPromises(); + + findWorkItemParent().vm.$emit('error', updateError); + await nextTick(); + + expect(wrapper.emitted('error')).toEqual([[updateError]]); + }); + }); }); diff --git a/spec/frontend/work_items/components/work_item_parent_spec.js b/spec/frontend/work_items/components/work_item_parent_inline_spec.js similarity index 97% rename from spec/frontend/work_items/components/work_item_parent_spec.js rename to spec/frontend/work_items/components/work_item_parent_inline_spec.js index 11fe6dffbfa..3e4f99d5935 100644 --- a/spec/frontend/work_items/components/work_item_parent_spec.js +++ b/spec/frontend/work_items/components/work_item_parent_inline_spec.js @@ -6,7 +6,7 @@ import createMockApollo from 'helpers/mock_apollo_helper'; import { shallowMountExtended } from 'helpers/vue_test_utils_helper'; import * as Sentry from '~/sentry/sentry_browser_wrapper'; -import WorkItemParent from '~/work_items/components/work_item_parent.vue'; +import WorkItemParentInline from '~/work_items/components/work_item_parent_inline.vue'; import { removeHierarchyChild } from '~/work_items/graphql/cache_utils'; import updateWorkItemMutation from '~/work_items/graphql/update_work_item.mutation.graphql'; import groupWorkItemsQuery from '~/work_items/graphql/group_work_items.query.graphql'; @@ -26,7 +26,7 @@ jest.mock('~/work_items/graphql/cache_utils', () => ({ removeHierarchyChild: jest.fn(), })); -describe('WorkItemParent component', () => { +describe('WorkItemParentInline component', () => { Vue.use(VueApollo); let wrapper; @@ -50,7 +50,7 @@ describe('WorkItemParent component', () => { mutationHandler = successUpdateWorkItemMutationHandler, isGroup = false, } = {}) => { - wrapper = shallowMountExtended(WorkItemParent, { + wrapper = shallowMountExtended(WorkItemParentInline, { apolloProvider: createMockApollo([ [projectWorkItemsQuery, searchQueryHandler], [groupWorkItemsQuery, groupWorkItemsSuccessHandler], diff --git a/spec/frontend/work_items/components/work_item_parent_with_edit_spec.js b/spec/frontend/work_items/components/work_item_parent_with_edit_spec.js new file mode 100644 index 00000000000..61e43456479 --- /dev/null +++ b/spec/frontend/work_items/components/work_item_parent_with_edit_spec.js @@ -0,0 +1,409 @@ +import { GlForm, GlCollapsibleListbox } from '@gitlab/ui'; +import Vue, { nextTick } from 'vue'; +import VueApollo from 'vue-apollo'; +import waitForPromises from 'helpers/wait_for_promises'; +import createMockApollo from 'helpers/mock_apollo_helper'; +import { mountExtended } from 'helpers/vue_test_utils_helper'; +import { __ } from '~/locale'; +import * as Sentry from '~/sentry/sentry_browser_wrapper'; +import WorkItemParent from '~/work_items/components/work_item_parent_with_edit.vue'; +import { removeHierarchyChild } from '~/work_items/graphql/cache_utils'; +import updateWorkItemMutation from '~/work_items/graphql/update_work_item.mutation.graphql'; +import groupWorkItemsQuery from '~/work_items/graphql/group_work_items.query.graphql'; +import projectWorkItemsQuery from '~/work_items/graphql/project_work_items.query.graphql'; +import { WORK_ITEM_TYPE_ENUM_OBJECTIVE } from '~/work_items/constants'; + +import { + availableObjectivesResponse, + mockParentWidgetResponse, + updateWorkItemMutationResponseFactory, + searchedObjectiveResponse, + updateWorkItemMutationErrorResponse, +} from '../mock_data'; + +jest.mock('~/sentry/sentry_browser_wrapper'); +jest.mock('~/work_items/graphql/cache_utils', () => ({ + removeHierarchyChild: jest.fn(), +})); + +describe('WorkItemParent component', () => { + Vue.use(VueApollo); + + let wrapper; + + const workItemId = 'gid://gitlab/WorkItem/1'; + const workItemType = 'Objective'; + const mockFullPath = 'full-path'; + + const groupWorkItemsSuccessHandler = jest.fn().mockResolvedValue(availableObjectivesResponse); + const availableWorkItemsSuccessHandler = jest.fn().mockResolvedValue(availableObjectivesResponse); + const availableWorkItemsFailureHandler = jest.fn().mockRejectedValue(new Error()); + + const findHeader = () => wrapper.find('h3'); + const findEditButton = () => wrapper.find('[data-testid="edit-parent"]'); + const findApplyButton = () => wrapper.find('[data-testid="apply-parent"]'); + + const findLoadingIcon = () => wrapper.find('[data-testid="loading-icon-parent"]'); + const findLabel = () => wrapper.find('label'); + const findForm = () => wrapper.findComponent(GlForm); + const findCollapsibleListbox = () => wrapper.findComponent(GlCollapsibleListbox); + + const successUpdateWorkItemMutationHandler = jest + .fn() + .mockResolvedValue(updateWorkItemMutationResponseFactory({ parent: mockParentWidgetResponse })); + + const createComponent = ({ + canUpdate = true, + parent = null, + searchQueryHandler = availableWorkItemsSuccessHandler, + mutationHandler = successUpdateWorkItemMutationHandler, + isEditing = false, + isGroup = false, + } = {}) => { + wrapper = mountExtended(WorkItemParent, { + apolloProvider: createMockApollo([ + [projectWorkItemsQuery, searchQueryHandler], + [groupWorkItemsQuery, groupWorkItemsSuccessHandler], + [updateWorkItemMutation, mutationHandler], + ]), + provide: { + fullPath: mockFullPath, + isGroup, + }, + propsData: { + canUpdate, + parent, + workItemId, + workItemType, + }, + }); + + if (isEditing) { + findEditButton().trigger('click'); + } + }; + + beforeEach(() => { + createComponent(); + }); + + describe('label', () => { + it('shows header when not editing', () => { + createComponent(); + + expect(findHeader().exists()).toBe(true); + expect(findHeader().classes('gl-sr-only')).toBe(false); + expect(findLabel().exists()).toBe(false); + }); + + it('shows label and hides header while editing', async () => { + createComponent({ isEditing: true }); + + await nextTick(); + + expect(findLabel().exists()).toBe(true); + expect(findHeader().classes('gl-sr-only')).toBe(true); + }); + }); + + describe('edit button', () => { + it('is not shown if user cannot edit', () => { + createComponent({ canUpdate: false }); + + expect(findEditButton().exists()).toBe(false); + }); + + it('is shown if user can edit', () => { + createComponent({ canUpdate: true }); + + expect(findEditButton().exists()).toBe(true); + }); + + it('triggers edit mode on click', async () => { + createComponent(); + + findEditButton().trigger('click'); + + await nextTick(); + + expect(findLabel().exists()).toBe(true); + expect(findForm().exists()).toBe(true); + }); + + it('is replaced by Apply button while editing', async () => { + createComponent(); + + findEditButton().trigger('click'); + + await nextTick(); + + expect(findEditButton().exists()).toBe(false); + expect(findApplyButton().exists()).toBe(true); + }); + }); + + describe('loading icon', () => { + const selectWorkItem = async (workItem) => { + await findCollapsibleListbox().vm.$emit('select', workItem); + }; + + it('shows loading icon while update is in progress', async () => { + createComponent(); + findEditButton().trigger('click'); + + await nextTick(); + + selectWorkItem('gid://gitlab/WorkItem/716'); + + await nextTick(); + expect(findLoadingIcon().exists()).toBe(true); + await waitForPromises(); + + expect(findLoadingIcon().exists()).toBe(false); + }); + + it('shows loading icon when unassign is clicked', async () => { + createComponent({ parent: mockParentWidgetResponse }); + findEditButton().trigger('click'); + + await nextTick(); + + findCollapsibleListbox().vm.$emit('reset'); + + await nextTick(); + expect(findLoadingIcon().exists()).toBe(true); + await waitForPromises(); + + expect(findLoadingIcon().exists()).toBe(false); + }); + }); + + describe('value', () => { + it('shows None when no parent is set', () => { + createComponent(); + + expect(wrapper.text()).toContain(__('None')); + }); + + it('shows parent when parent is set', () => { + createComponent({ parent: mockParentWidgetResponse }); + + expect(wrapper.text()).not.toContain(__('None')); + expect(wrapper.text()).toContain(mockParentWidgetResponse.title); + }); + }); + + describe('form', () => { + it('is not shown while not editing', async () => { + await createComponent(); + + expect(findForm().exists()).toBe(false); + }); + + it('is shown while editing', async () => { + await createComponent({ isEditing: true }); + + expect(findForm().exists()).toBe(true); + }); + }); + + describe('Parent Input', () => { + it('is not shown while not editing', async () => { + await createComponent(); + + expect(findCollapsibleListbox().exists()).toBe(false); + }); + + it('renders the collapsible listbox with required props', async () => { + await createComponent({ isEditing: true }); + + expect(findCollapsibleListbox().exists()).toBe(true); + expect(findCollapsibleListbox().props()).toMatchObject({ + items: [], + headerText: 'Assign parent', + category: 'primary', + loading: false, + isCheckCentered: true, + searchable: true, + searching: false, + infiniteScroll: false, + noResultsText: 'No matching results', + toggleText: 'None', + searchPlaceholder: 'Search', + resetButtonLabel: 'Unassign', + }); + }); + it('shows loading while searching', async () => { + await createComponent({ isEditing: true }); + + await findCollapsibleListbox().vm.$emit('shown'); + expect(findCollapsibleListbox().props('searching')).toBe(true); + }); + }); + + describe('work items query', () => { + it('loads work items in the listbox', async () => { + await createComponent({ isEditing: true }); + await findCollapsibleListbox().vm.$emit('shown'); + + await waitForPromises(); + + expect(findCollapsibleListbox().props('searching')).toBe(false); + expect(findCollapsibleListbox().props('items')).toStrictEqual([ + { text: 'Objective 101', value: 'gid://gitlab/WorkItem/716' }, + { text: 'Objective 103', value: 'gid://gitlab/WorkItem/712' }, + { text: 'Objective 102', value: 'gid://gitlab/WorkItem/711' }, + ]); + expect(availableWorkItemsSuccessHandler).toHaveBeenCalled(); + }); + + it('emits error when the query fails', async () => { + await createComponent({ + searchQueryHandler: availableWorkItemsFailureHandler, + isEditing: true, + }); + + await findCollapsibleListbox().vm.$emit('shown'); + + await waitForPromises(); + + expect(wrapper.emitted('error')).toEqual([ + ['Something went wrong while fetching items. Please try again.'], + ]); + }); + + it('searches item when input data is entered', async () => { + const searchedItemQueryHandler = jest.fn().mockResolvedValue(searchedObjectiveResponse); + await createComponent({ + searchQueryHandler: searchedItemQueryHandler, + isEditing: true, + }); + + await findCollapsibleListbox().vm.$emit('shown'); + + await waitForPromises(); + + expect(searchedItemQueryHandler).toHaveBeenCalledWith({ + fullPath: 'full-path', + searchTerm: '', + types: [WORK_ITEM_TYPE_ENUM_OBJECTIVE], + in: undefined, + iid: null, + isNumber: false, + }); + + await findCollapsibleListbox().vm.$emit('search', 'Objective 101'); + + expect(searchedItemQueryHandler).toHaveBeenCalledWith({ + fullPath: 'full-path', + searchTerm: 'Objective 101', + types: [WORK_ITEM_TYPE_ENUM_OBJECTIVE], + in: 'TITLE', + iid: null, + isNumber: false, + }); + + await nextTick(); + + expect(findCollapsibleListbox().props('items')).toStrictEqual([ + { text: 'Objective 101', value: 'gid://gitlab/WorkItem/716' }, + ]); + }); + }); + + describe('listbox', () => { + const selectWorkItem = async (workItem) => { + await findCollapsibleListbox().vm.$emit('select', workItem); + }; + + it('calls mutation when item is selected', async () => { + await createComponent({ isEditing: true }); + selectWorkItem('gid://gitlab/WorkItem/716'); + + await waitForPromises(); + + expect(successUpdateWorkItemMutationHandler).toHaveBeenCalledWith({ + input: { + id: 'gid://gitlab/WorkItem/1', + hierarchyWidget: { + parentId: 'gid://gitlab/WorkItem/716', + }, + }, + }); + + expect(removeHierarchyChild).toHaveBeenCalledWith({ + cache: expect.anything(Object), + fullPath: mockFullPath, + iid: undefined, + isGroup: false, + workItem: { id: 'gid://gitlab/WorkItem/1' }, + }); + }); + + it('calls mutation when item is unassigned', async () => { + const unAssignParentWorkItemMutationHandler = jest + .fn() + .mockResolvedValue(updateWorkItemMutationResponseFactory({ parent: null })); + await createComponent({ + parent: { + iid: '1', + }, + mutationHandler: unAssignParentWorkItemMutationHandler, + }); + + findEditButton().trigger('click'); + + await nextTick(); + + findCollapsibleListbox().vm.$emit('reset'); + + await waitForPromises(); + + expect(unAssignParentWorkItemMutationHandler).toHaveBeenCalledWith({ + input: { + id: 'gid://gitlab/WorkItem/1', + hierarchyWidget: { + parentId: null, + }, + }, + }); + expect(removeHierarchyChild).toHaveBeenCalledWith({ + cache: expect.anything(Object), + fullPath: mockFullPath, + iid: '1', + isGroup: false, + workItem: { id: 'gid://gitlab/WorkItem/1' }, + }); + }); + + it('emits error when mutation fails', async () => { + await createComponent({ + mutationHandler: jest.fn().mockResolvedValue(updateWorkItemMutationErrorResponse), + isEditing: true, + }); + + selectWorkItem('gid://gitlab/WorkItem/716'); + + await waitForPromises(); + + expect(wrapper.emitted('error')).toEqual([['Error!']]); + }); + + it('emits error and captures exception in sentry when network request fails', async () => { + const error = new Error('error'); + await createComponent({ + mutationHandler: jest.fn().mockRejectedValue(error), + isEditing: true, + }); + + selectWorkItem('gid://gitlab/WorkItem/716'); + + await waitForPromises(); + + expect(wrapper.emitted('error')).toEqual([ + ['Something went wrong while updating the objective. Please try again.'], + ]); + expect(Sentry.captureException).toHaveBeenCalledWith(error); + }); + }); +}); diff --git a/spec/frontend/work_items/mock_data.js b/spec/frontend/work_items/mock_data.js index 8df46403b90..2295f75e54c 100644 --- a/spec/frontend/work_items/mock_data.js +++ b/spec/frontend/work_items/mock_data.js @@ -445,7 +445,7 @@ export const descriptionHtmlWithCheckboxes = ` `; -const taskType = { +export const taskType = { __typename: 'WorkItemType', id: 'gid://gitlab/WorkItems::Type/5', name: 'Task', @@ -459,6 +459,20 @@ export const objectiveType = { iconName: 'issue-type-objective', }; +export const keyResultType = { + __typename: 'WorkItemType', + id: 'gid://gitlab/WorkItems::Type/2411', + name: 'Key Result', + iconName: 'issue-type-keyresult', +}; + +export const issueType = { + __typename: 'WorkItemType', + id: 'gid://gitlab/WorkItems::Type/2411', + name: 'Issue', + iconName: 'issue-type-issue', +}; + export const mockEmptyLinkedItems = { type: WIDGET_TYPE_LINKED_ITEMS, blocked: false, diff --git a/spec/graphql/mutations/ci/runner/bulk_delete_spec.rb b/spec/graphql/mutations/ci/runner/bulk_delete_spec.rb index aaa74fa78aa..0dcfaa9b8ac 100644 --- a/spec/graphql/mutations/ci/runner/bulk_delete_spec.rb +++ b/spec/graphql/mutations/ci/runner/bulk_delete_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Mutations::Ci::Runner::BulkDelete, feature_category: :runner_fleet do +RSpec.describe Mutations::Ci::Runner::BulkDelete, feature_category: :fleet_visibility do include GraphqlHelpers let_it_be(:admin_user) { create(:user, :admin) } diff --git a/spec/graphql/mutations/ci/runner/delete_spec.rb b/spec/graphql/mutations/ci/runner/delete_spec.rb index beff18e1dfd..3617c751165 100644 --- a/spec/graphql/mutations/ci/runner/delete_spec.rb +++ b/spec/graphql/mutations/ci/runner/delete_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Mutations::Ci::Runner::Delete, feature_category: :runner_fleet do +RSpec.describe Mutations::Ci::Runner::Delete, feature_category: :fleet_visibility do include GraphqlHelpers let_it_be(:runner) { create(:ci_runner) } diff --git a/spec/graphql/mutations/ci/runner/update_spec.rb b/spec/graphql/mutations/ci/runner/update_spec.rb index 03bfd4d738b..32c4e6952e4 100644 --- a/spec/graphql/mutations/ci/runner/update_spec.rb +++ b/spec/graphql/mutations/ci/runner/update_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Mutations::Ci::Runner::Update, feature_category: :runner_fleet do +RSpec.describe Mutations::Ci::Runner::Update, feature_category: :fleet_visibility do include GraphqlHelpers let_it_be(:user) { create(:user) } diff --git a/spec/graphql/resolvers/ci/group_runners_resolver_spec.rb b/spec/graphql/resolvers/ci/group_runners_resolver_spec.rb index e0fc3b96b93..d1eec0baeea 100644 --- a/spec/graphql/resolvers/ci/group_runners_resolver_spec.rb +++ b/spec/graphql/resolvers/ci/group_runners_resolver_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Resolvers::Ci::GroupRunnersResolver, feature_category: :runner_fleet do +RSpec.describe Resolvers::Ci::GroupRunnersResolver, feature_category: :fleet_visibility do include GraphqlHelpers describe '#resolve' do diff --git a/spec/graphql/resolvers/ci/project_runners_resolver_spec.rb b/spec/graphql/resolvers/ci/project_runners_resolver_spec.rb index 9d9f0fee04a..85b55521174 100644 --- a/spec/graphql/resolvers/ci/project_runners_resolver_spec.rb +++ b/spec/graphql/resolvers/ci/project_runners_resolver_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Resolvers::Ci::ProjectRunnersResolver, feature_category: :runner_fleet do +RSpec.describe Resolvers::Ci::ProjectRunnersResolver, feature_category: :fleet_visibility do include GraphqlHelpers describe '#resolve' do diff --git a/spec/graphql/resolvers/ci/runner_groups_resolver_spec.rb b/spec/graphql/resolvers/ci/runner_groups_resolver_spec.rb index 9272689ef0b..f535f6e415d 100644 --- a/spec/graphql/resolvers/ci/runner_groups_resolver_spec.rb +++ b/spec/graphql/resolvers/ci/runner_groups_resolver_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Resolvers::Ci::RunnerGroupsResolver, feature_category: :runner_fleet do +RSpec.describe Resolvers::Ci::RunnerGroupsResolver, feature_category: :fleet_visibility do include GraphqlHelpers let_it_be(:group1) { create(:group) } diff --git a/spec/graphql/resolvers/ci/runner_job_count_resolver_spec.rb b/spec/graphql/resolvers/ci/runner_job_count_resolver_spec.rb index 6336ea883f7..18501d4add5 100644 --- a/spec/graphql/resolvers/ci/runner_job_count_resolver_spec.rb +++ b/spec/graphql/resolvers/ci/runner_job_count_resolver_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Resolvers::Ci::RunnerJobCountResolver, feature_category: :runner_fleet do +RSpec.describe Resolvers::Ci::RunnerJobCountResolver, feature_category: :fleet_visibility do include GraphqlHelpers let_it_be(:project) { create(:project, :repository) } diff --git a/spec/graphql/resolvers/ci/runner_jobs_resolver_spec.rb b/spec/graphql/resolvers/ci/runner_jobs_resolver_spec.rb index 322bead0d3c..4af87b6882f 100644 --- a/spec/graphql/resolvers/ci/runner_jobs_resolver_spec.rb +++ b/spec/graphql/resolvers/ci/runner_jobs_resolver_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Resolvers::Ci::RunnerJobsResolver, feature_category: :runner_fleet do +RSpec.describe Resolvers::Ci::RunnerJobsResolver, feature_category: :fleet_visibility do include GraphqlHelpers let_it_be(:project) { create(:project, :repository) } diff --git a/spec/graphql/resolvers/ci/runner_platforms_resolver_spec.rb b/spec/graphql/resolvers/ci/runner_platforms_resolver_spec.rb index da6a84cec44..e6238c41445 100644 --- a/spec/graphql/resolvers/ci/runner_platforms_resolver_spec.rb +++ b/spec/graphql/resolvers/ci/runner_platforms_resolver_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Resolvers::Ci::RunnerPlatformsResolver, feature_category: :runner_fleet do +RSpec.describe Resolvers::Ci::RunnerPlatformsResolver, feature_category: :fleet_visibility do include GraphqlHelpers describe '#resolve' do diff --git a/spec/graphql/resolvers/ci/runner_projects_resolver_spec.rb b/spec/graphql/resolvers/ci/runner_projects_resolver_spec.rb index 44203fb2912..c75d7fb831c 100644 --- a/spec/graphql/resolvers/ci/runner_projects_resolver_spec.rb +++ b/spec/graphql/resolvers/ci/runner_projects_resolver_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Resolvers::Ci::RunnerProjectsResolver, feature_category: :runner_fleet do +RSpec.describe Resolvers::Ci::RunnerProjectsResolver, feature_category: :fleet_visibility do include GraphqlHelpers let_it_be(:project1) { create(:project, description: 'Project1.1') } diff --git a/spec/graphql/resolvers/ci/runner_setup_resolver_spec.rb b/spec/graphql/resolvers/ci/runner_setup_resolver_spec.rb index 734337f7c92..1724623e5c4 100644 --- a/spec/graphql/resolvers/ci/runner_setup_resolver_spec.rb +++ b/spec/graphql/resolvers/ci/runner_setup_resolver_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Resolvers::Ci::RunnerSetupResolver, feature_category: :runner_fleet do +RSpec.describe Resolvers::Ci::RunnerSetupResolver, feature_category: :fleet_visibility do include GraphqlHelpers describe '#resolve' do diff --git a/spec/graphql/resolvers/ci/runner_status_resolver_spec.rb b/spec/graphql/resolvers/ci/runner_status_resolver_spec.rb index 97a10a7da33..d541bbddfe5 100644 --- a/spec/graphql/resolvers/ci/runner_status_resolver_spec.rb +++ b/spec/graphql/resolvers/ci/runner_status_resolver_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Resolvers::Ci::RunnerStatusResolver, feature_category: :runner_fleet do +RSpec.describe Resolvers::Ci::RunnerStatusResolver, feature_category: :fleet_visibility do include GraphqlHelpers describe '#resolve' do diff --git a/spec/graphql/resolvers/ci/runners_resolver_spec.rb b/spec/graphql/resolvers/ci/runners_resolver_spec.rb index 7d37d13366c..85a90924384 100644 --- a/spec/graphql/resolvers/ci/runners_resolver_spec.rb +++ b/spec/graphql/resolvers/ci/runners_resolver_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Resolvers::Ci::RunnersResolver, feature_category: :runner_fleet do +RSpec.describe Resolvers::Ci::RunnersResolver, feature_category: :fleet_visibility do include GraphqlHelpers describe '#resolve' do diff --git a/spec/graphql/types/ci/job_base_field_spec.rb b/spec/graphql/types/ci/job_base_field_spec.rb index ec7d2a7d33a..c2bf73526d2 100644 --- a/spec/graphql/types/ci/job_base_field_spec.rb +++ b/spec/graphql/types/ci/job_base_field_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Types::Ci::JobBaseField, feature_category: :runner_fleet do +RSpec.describe Types::Ci::JobBaseField, feature_category: :fleet_visibility do describe 'authorized?' do let_it_be(:current_user) { create(:user) } diff --git a/spec/graphql/types/ci/runner_countable_connection_type_spec.rb b/spec/graphql/types/ci/runner_countable_connection_type_spec.rb index 49254ed0f93..9f24909e110 100644 --- a/spec/graphql/types/ci/runner_countable_connection_type_spec.rb +++ b/spec/graphql/types/ci/runner_countable_connection_type_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Types::Ci::RunnerCountableConnectionType, feature_category: :runner_fleet do +RSpec.describe Types::Ci::RunnerCountableConnectionType, feature_category: :fleet_visibility do it 'contains attributes related to a runner connection' do expected_fields = %w[count] diff --git a/spec/graphql/types/ci/runner_manager_type_spec.rb b/spec/graphql/types/ci/runner_manager_type_spec.rb index ff7297b0a0e..ce55d6fee03 100644 --- a/spec/graphql/types/ci/runner_manager_type_spec.rb +++ b/spec/graphql/types/ci/runner_manager_type_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe GitlabSchema.types['CiRunnerManager'], feature_category: :runner_fleet do +RSpec.describe GitlabSchema.types['CiRunnerManager'], feature_category: :fleet_visibility do specify { expect(described_class.graphql_name).to eq('CiRunnerManager') } specify { expect(described_class).to require_graphql_authorizations(:read_runner_manager) } diff --git a/spec/graphql/types/ci/runner_platform_type_spec.rb b/spec/graphql/types/ci/runner_platform_type_spec.rb index 1b0f5a5ec71..f4acfc1f8ca 100644 --- a/spec/graphql/types/ci/runner_platform_type_spec.rb +++ b/spec/graphql/types/ci/runner_platform_type_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Types::Ci::RunnerPlatformType, feature_category: :runner_fleet do +RSpec.describe Types::Ci::RunnerPlatformType, feature_category: :fleet_visibility do specify { expect(described_class.graphql_name).to eq('RunnerPlatform') } it 'exposes the expected fields' do diff --git a/spec/graphql/types/ci/runner_setup_type_spec.rb b/spec/graphql/types/ci/runner_setup_type_spec.rb index d3e47b52a80..66469a35a94 100644 --- a/spec/graphql/types/ci/runner_setup_type_spec.rb +++ b/spec/graphql/types/ci/runner_setup_type_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Types::Ci::RunnerSetupType, feature_category: :runner_fleet do +RSpec.describe Types::Ci::RunnerSetupType, feature_category: :fleet_visibility do specify { expect(described_class.graphql_name).to eq('RunnerSetup') } it 'exposes the expected fields' do diff --git a/spec/graphql/types/ci/runner_upgrade_status_enum_spec.rb b/spec/graphql/types/ci/runner_upgrade_status_enum_spec.rb index 4aa9ad094a6..3f6a867de39 100644 --- a/spec/graphql/types/ci/runner_upgrade_status_enum_spec.rb +++ b/spec/graphql/types/ci/runner_upgrade_status_enum_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Types::Ci::RunnerUpgradeStatusEnum, feature_category: :runner_fleet do +RSpec.describe Types::Ci::RunnerUpgradeStatusEnum, feature_category: :fleet_visibility do let(:model_only_enum_values) { %w[not_processed] } let(:expected_graphql_source_values) do Ci::RunnerVersion.statuses.keys - model_only_enum_values diff --git a/spec/graphql/types/ci/runner_web_url_edge_spec.rb b/spec/graphql/types/ci/runner_web_url_edge_spec.rb index 07a9655b3e1..fc4e5428360 100644 --- a/spec/graphql/types/ci/runner_web_url_edge_spec.rb +++ b/spec/graphql/types/ci/runner_web_url_edge_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Types::Ci::RunnerWebUrlEdge, feature_category: :runner_fleet do +RSpec.describe Types::Ci::RunnerWebUrlEdge, feature_category: :fleet_visibility do specify { expect(described_class.graphql_name).to eq('RunnerWebUrlEdge') } it 'contains URL attributes' do diff --git a/spec/helpers/ci/runners_helper_spec.rb b/spec/helpers/ci/runners_helper_spec.rb index 12d92bc505f..583bbba1b6d 100644 --- a/spec/helpers/ci/runners_helper_spec.rb +++ b/spec/helpers/ci/runners_helper_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::RunnersHelper, feature_category: :runner_fleet do +RSpec.describe Ci::RunnersHelper, feature_category: :fleet_visibility do let_it_be(:user) { create(:user) } before do diff --git a/spec/lib/api/ci/helpers/runner_spec.rb b/spec/lib/api/ci/helpers/runner_spec.rb index b74f5bf2de8..ee0a58a4e53 100644 --- a/spec/lib/api/ci/helpers/runner_spec.rb +++ b/spec/lib/api/ci/helpers/runner_spec.rb @@ -85,7 +85,7 @@ RSpec.describe API::Ci::Helpers::Runner do end end - describe '#current_runner_manager', :freeze_time, feature_category: :runner_fleet do + describe '#current_runner_manager', :freeze_time, feature_category: :fleet_visibility do let(:runner) { create(:ci_runner, token: 'foo') } let(:runner_manager) { create(:ci_runner_machine, runner: runner, system_xid: 'bar', contacted_at: 1.hour.ago) } diff --git a/spec/lib/bulk_imports/pipeline/runner_spec.rb b/spec/lib/bulk_imports/pipeline/runner_spec.rb index 8c1a6a5b6c8..a88e8fb50d3 100644 --- a/spec/lib/bulk_imports/pipeline/runner_spec.rb +++ b/spec/lib/bulk_imports/pipeline/runner_spec.rb @@ -322,7 +322,7 @@ RSpec.describe BulkImports::Pipeline::Runner, feature_category: :importers do end context 'when exception is not retriable' do - let(:reponse_status_code) { 503 } + let(:reponse_status_code) { 505 } it_behaves_like 'failed pipeline', 'BulkImports::NetworkError', 'Net::ReadTimeout' end diff --git a/spec/lib/generators/batched_background_migration/expected_files/my_batched_migration_dictionary_matcher.txt b/spec/lib/generators/batched_background_migration/expected_files/my_batched_migration_dictionary_matcher.txt index a7d6a49c62e..240472585bb 100644 --- a/spec/lib/generators/batched_background_migration/expected_files/my_batched_migration_dictionary_matcher.txt +++ b/spec/lib/generators/batched_background_migration/expected_files/my_batched_migration_dictionary_matcher.txt @@ -3,7 +3,7 @@ migration_job_name: MyBatchedMigration description: # Please capture what MyBatchedMigration does feature_category: database introduced_by_url: # URL of the MR \(or issue/commit\) that introduced the migration -milestone: [0-9\.]+ +milestone: '[0-9\.]+' queued_migration_version: [0-9]+ # Replace with the approximate date you think it's best to ensure the completion of this BBM. finalize_after: # yyyy-mm-dd diff --git a/spec/lib/gitlab/background_migration/fix_allow_descendants_override_disabled_shared_runners_spec.rb b/spec/lib/gitlab/background_migration/fix_allow_descendants_override_disabled_shared_runners_spec.rb index 5f5dcb35836..cd99557e1d9 100644 --- a/spec/lib/gitlab/background_migration/fix_allow_descendants_override_disabled_shared_runners_spec.rb +++ b/spec/lib/gitlab/background_migration/fix_allow_descendants_override_disabled_shared_runners_spec.rb @@ -2,7 +2,8 @@ require 'spec_helper' -RSpec.describe Gitlab::BackgroundMigration::FixAllowDescendantsOverrideDisabledSharedRunners, schema: 20230802085923, feature_category: :runner_fleet do # rubocop:disable Layout/LineLength +RSpec.describe Gitlab::BackgroundMigration::FixAllowDescendantsOverrideDisabledSharedRunners, schema: 20230802085923, + feature_category: :fleet_visibility do let(:namespaces) { table(:namespaces) } let!(:valid_enabled) do diff --git a/spec/lib/gitlab/ci/runner_instructions_spec.rb b/spec/lib/gitlab/ci/runner_instructions_spec.rb index 31c53d4a030..6da649393f3 100644 --- a/spec/lib/gitlab/ci/runner_instructions_spec.rb +++ b/spec/lib/gitlab/ci/runner_instructions_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Gitlab::Ci::RunnerInstructions, feature_category: :runner_fleet do +RSpec.describe Gitlab::Ci::RunnerInstructions, feature_category: :fleet_visibility do using RSpec::Parameterized::TableSyntax let(:params) { {} } diff --git a/spec/lib/gitlab/ci/runner_releases_spec.rb b/spec/lib/gitlab/ci/runner_releases_spec.rb index 9e211327dee..126a5b85471 100644 --- a/spec/lib/gitlab/ci/runner_releases_spec.rb +++ b/spec/lib/gitlab/ci/runner_releases_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Gitlab::Ci::RunnerReleases, feature_category: :runner_fleet do +RSpec.describe Gitlab::Ci::RunnerReleases, feature_category: :fleet_visibility do subject { described_class.instance } let(:runner_releases_url) { 'http://testurl.com/runner_public_releases' } diff --git a/spec/lib/gitlab/ci/runner_upgrade_check_spec.rb b/spec/lib/gitlab/ci/runner_upgrade_check_spec.rb index 526d6cba657..778c0aa69de 100644 --- a/spec/lib/gitlab/ci/runner_upgrade_check_spec.rb +++ b/spec/lib/gitlab/ci/runner_upgrade_check_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Gitlab::Ci::RunnerUpgradeCheck, feature_category: :runner_fleet do +RSpec.describe Gitlab::Ci::RunnerUpgradeCheck, feature_category: :fleet_visibility do using RSpec::Parameterized::TableSyntax subject(:instance) { described_class.new(gitlab_version, runner_releases) } diff --git a/spec/lib/gitlab/doctor/reset_tokens_spec.rb b/spec/lib/gitlab/doctor/reset_tokens_spec.rb index 0cc947efdb4..b2155ee83ad 100644 --- a/spec/lib/gitlab/doctor/reset_tokens_spec.rb +++ b/spec/lib/gitlab/doctor/reset_tokens_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Gitlab::Doctor::ResetTokens, feature_category: :runner_fleet do +RSpec.describe Gitlab::Doctor::ResetTokens, feature_category: :fleet_visibility do let(:logger) { instance_double('Logger') } let(:model_names) { %w[Project Group] } let(:token_names) { %w[runners_token] } diff --git a/spec/lib/gitlab/seeders/ci/runner/runner_fleet_pipeline_seeder_spec.rb b/spec/lib/gitlab/seeders/ci/runner/runner_fleet_pipeline_seeder_spec.rb index a15dbccc80c..930782dfadf 100644 --- a/spec/lib/gitlab/seeders/ci/runner/runner_fleet_pipeline_seeder_spec.rb +++ b/spec/lib/gitlab/seeders/ci/runner/runner_fleet_pipeline_seeder_spec.rb @@ -5,7 +5,7 @@ require 'spec_helper' NULL_LOGGER = Gitlab::JsonLogger.new('/dev/null') TAG_LIST = Gitlab::Seeders::Ci::Runner::RunnerFleetSeeder::TAG_LIST.to_set -RSpec.describe ::Gitlab::Seeders::Ci::Runner::RunnerFleetPipelineSeeder, feature_category: :runner_fleet do +RSpec.describe ::Gitlab::Seeders::Ci::Runner::RunnerFleetPipelineSeeder, feature_category: :fleet_visibility do subject(:seeder) do described_class.new(NULL_LOGGER, projects_to_runners: projects_to_runners, job_count: job_count) end diff --git a/spec/lib/gitlab/seeders/ci/runner/runner_fleet_seeder_spec.rb b/spec/lib/gitlab/seeders/ci/runner/runner_fleet_seeder_spec.rb index 4597cc6b315..01cbce28159 100644 --- a/spec/lib/gitlab/seeders/ci/runner/runner_fleet_seeder_spec.rb +++ b/spec/lib/gitlab/seeders/ci/runner/runner_fleet_seeder_spec.rb @@ -4,7 +4,7 @@ require 'spec_helper' NULL_LOGGER = Gitlab::JsonLogger.new('/dev/null') -RSpec.describe ::Gitlab::Seeders::Ci::Runner::RunnerFleetSeeder, feature_category: :runner_fleet do +RSpec.describe ::Gitlab::Seeders::Ci::Runner::RunnerFleetSeeder, feature_category: :fleet_visibility do let_it_be(:user) { create(:user, :admin, username: 'test-admin') } subject(:seeder) do diff --git a/spec/migrations/20230802085923_queue_fix_allow_descendants_override_disabled_shared_runners_spec.rb b/spec/migrations/20230802085923_queue_fix_allow_descendants_override_disabled_shared_runners_spec.rb index c296ba24d9d..f12985bf6c9 100644 --- a/spec/migrations/20230802085923_queue_fix_allow_descendants_override_disabled_shared_runners_spec.rb +++ b/spec/migrations/20230802085923_queue_fix_allow_descendants_override_disabled_shared_runners_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' require_migration! -RSpec.describe QueueFixAllowDescendantsOverrideDisabledSharedRunners, feature_category: :runner_fleet do +RSpec.describe QueueFixAllowDescendantsOverrideDisabledSharedRunners, feature_category: :fleet_visibility do let!(:batched_migration) { described_class::MIGRATION } it 'schedules a new batched migration' do diff --git a/spec/models/ci/runner_manager_build_spec.rb b/spec/models/ci/runner_manager_build_spec.rb index 3a381313b76..a4dd3a2c748 100644 --- a/spec/models/ci/runner_manager_build_spec.rb +++ b/spec/models/ci/runner_manager_build_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::RunnerManagerBuild, model: true, feature_category: :runner_fleet do +RSpec.describe Ci::RunnerManagerBuild, model: true, feature_category: :fleet_visibility do let_it_be(:runner) { create(:ci_runner) } let_it_be(:runner_manager) { create(:ci_runner_machine, runner: runner) } let_it_be(:build) { create(:ci_build, runner_manager: runner_manager) } diff --git a/spec/models/ci/runner_manager_spec.rb b/spec/models/ci/runner_manager_spec.rb index 01275ffd31c..02a72afe0c6 100644 --- a/spec/models/ci/runner_manager_spec.rb +++ b/spec/models/ci/runner_manager_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::RunnerManager, feature_category: :runner_fleet, type: :model do +RSpec.describe Ci::RunnerManager, feature_category: :fleet_visibility, type: :model do it_behaves_like 'having unique enum values' it_behaves_like 'it has loose foreign keys' do diff --git a/spec/models/ci/runner_version_spec.rb b/spec/models/ci/runner_version_spec.rb index bce1f2a6c39..32f840a8034 100644 --- a/spec/models/ci/runner_version_spec.rb +++ b/spec/models/ci/runner_version_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::RunnerVersion, feature_category: :runner_fleet do +RSpec.describe Ci::RunnerVersion, feature_category: :fleet_visibility do let_it_be(:runner_version_upgrade_recommended) do create(:ci_runner_version, version: 'abc234', status: :recommended) end diff --git a/spec/models/preloaders/runner_manager_policy_preloader_spec.rb b/spec/models/preloaders/runner_manager_policy_preloader_spec.rb index 1977e2c5787..b1950273380 100644 --- a/spec/models/preloaders/runner_manager_policy_preloader_spec.rb +++ b/spec/models/preloaders/runner_manager_policy_preloader_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Preloaders::RunnerManagerPolicyPreloader, feature_category: :runner_fleet do +RSpec.describe Preloaders::RunnerManagerPolicyPreloader, feature_category: :fleet_visibility do let_it_be(:user) { create(:user) } let_it_be(:runner1) { create(:ci_runner) } let_it_be(:runner2) { create(:ci_runner) } diff --git a/spec/policies/ci/runner_manager_policy_spec.rb b/spec/policies/ci/runner_manager_policy_spec.rb index 11b0941024f..82894e729bf 100644 --- a/spec/policies/ci/runner_manager_policy_spec.rb +++ b/spec/policies/ci/runner_manager_policy_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::RunnerManagerPolicy, feature_category: :runner_fleet do +RSpec.describe Ci::RunnerManagerPolicy, feature_category: :fleet_visibility do let_it_be(:owner) { create(:user) } describe 'ability :read_runner_manager' do diff --git a/spec/requests/api/ci/runner/runners_delete_spec.rb b/spec/requests/api/ci/runner/runners_delete_spec.rb index d1488828bad..61420afd578 100644 --- a/spec/requests/api/ci/runner/runners_delete_spec.rb +++ b/spec/requests/api/ci/runner/runners_delete_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state, feature_category: :runner_fleet do +RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state, feature_category: :fleet_visibility do include StubGitlabCalls include RedisHelpers include WorkhorseHelpers diff --git a/spec/requests/api/ci/runner/runners_post_spec.rb b/spec/requests/api/ci/runner/runners_post_spec.rb index 1490172d1c3..748efe3cd54 100644 --- a/spec/requests/api/ci/runner/runners_post_spec.rb +++ b/spec/requests/api/ci/runner/runners_post_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state, feature_category: :runner_fleet do +RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state, feature_category: :fleet_visibility do describe '/api/v4/runners' do describe 'POST /api/v4/runners' do it_behaves_like 'runner migrations backoff' do diff --git a/spec/requests/api/ci/runner/runners_reset_spec.rb b/spec/requests/api/ci/runner/runners_reset_spec.rb index 03cb6238fc1..92de1276dbb 100644 --- a/spec/requests/api/ci/runner/runners_reset_spec.rb +++ b/spec/requests/api/ci/runner/runners_reset_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state, feature_category: :runner_fleet do +RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state, feature_category: :fleet_visibility do include StubGitlabCalls include RedisHelpers include WorkhorseHelpers diff --git a/spec/requests/api/ci/runners_reset_registration_token_spec.rb b/spec/requests/api/ci/runners_reset_registration_token_spec.rb index 98edde93e95..0b6a6abf419 100644 --- a/spec/requests/api/ci/runners_reset_registration_token_spec.rb +++ b/spec/requests/api/ci/runners_reset_registration_token_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe API::Ci::Runners, feature_category: :runner_fleet do +RSpec.describe API::Ci::Runners, feature_category: :fleet_visibility do let_it_be(:admin_mode) { false } subject { post api("#{prefix}/runners/reset_registration_token", user, admin_mode: admin_mode) } diff --git a/spec/requests/api/ci/runners_spec.rb b/spec/requests/api/ci/runners_spec.rb index ba80684e89e..187880e16a4 100644 --- a/spec/requests/api/ci/runners_spec.rb +++ b/spec/requests/api/ci/runners_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe API::Ci::Runners, :aggregate_failures, feature_category: :runner_fleet do +RSpec.describe API::Ci::Runners, :aggregate_failures, feature_category: :fleet_visibility do let_it_be(:admin) { create(:user, :admin) } let_it_be(:user) { create(:user) } let_it_be(:user2) { create(:user) } diff --git a/spec/requests/api/graphql/ci/runner_spec.rb b/spec/requests/api/graphql/ci/runner_spec.rb index 6f1eb77fa9b..8262640b283 100644 --- a/spec/requests/api/graphql/ci/runner_spec.rb +++ b/spec/requests/api/graphql/ci/runner_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'Query.runner(id)', :freeze_time, feature_category: :runner_fleet do +RSpec.describe 'Query.runner(id)', :freeze_time, feature_category: :fleet_visibility do include GraphqlHelpers using RSpec::Parameterized::TableSyntax diff --git a/spec/requests/api/graphql/ci/runner_web_url_edge_spec.rb b/spec/requests/api/graphql/ci/runner_web_url_edge_spec.rb index 76e2dda4ce2..8e3efb67ee5 100644 --- a/spec/requests/api/graphql/ci/runner_web_url_edge_spec.rb +++ b/spec/requests/api/graphql/ci/runner_web_url_edge_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe 'RunnerWebUrlEdge', feature_category: :runner_fleet do +RSpec.describe 'RunnerWebUrlEdge', feature_category: :fleet_visibility do include GraphqlHelpers describe 'inside a Query.group' do diff --git a/spec/requests/api/graphql/ci/runners_spec.rb b/spec/requests/api/graphql/ci/runners_spec.rb index 9b45e16178a..0fe14bef778 100644 --- a/spec/requests/api/graphql/ci/runners_spec.rb +++ b/spec/requests/api/graphql/ci/runners_spec.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true require 'spec_helper' -RSpec.describe 'Query.runners', feature_category: :runner_fleet do +RSpec.describe 'Query.runners', feature_category: :fleet_visibility do include GraphqlHelpers let_it_be(:current_user) { create_default(:user, :admin) } diff --git a/spec/requests/api/graphql/mutations/ci/runner/create_spec.rb b/spec/requests/api/graphql/mutations/ci/runner/create_spec.rb index b697b9f73b7..567ef12df2b 100644 --- a/spec/requests/api/graphql/mutations/ci/runner/create_spec.rb +++ b/spec/requests/api/graphql/mutations/ci/runner/create_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'RunnerCreate', feature_category: :runner_fleet do +RSpec.describe 'RunnerCreate', feature_category: :fleet_visibility do include GraphqlHelpers let_it_be(:user) { create(:user) } diff --git a/spec/requests/api/graphql/mutations/ci/runners_registration_token/reset_spec.rb b/spec/requests/api/graphql/mutations/ci/runners_registration_token/reset_spec.rb index 752242c3ab3..ef752448966 100644 --- a/spec/requests/api/graphql/mutations/ci/runners_registration_token/reset_spec.rb +++ b/spec/requests/api/graphql/mutations/ci/runners_registration_token/reset_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'RunnersRegistrationTokenReset', feature_category: :runner_fleet do +RSpec.describe 'RunnersRegistrationTokenReset', feature_category: :fleet_visibility do include GraphqlHelpers let(:mutation) { graphql_mutation(:runners_registration_token_reset, input) } diff --git a/spec/requests/api/user_runners_spec.rb b/spec/requests/api/user_runners_spec.rb index 0e40dcade19..412b2c48f3f 100644 --- a/spec/requests/api/user_runners_spec.rb +++ b/spec/requests/api/user_runners_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe API::UserRunners, :aggregate_failures, feature_category: :runner_fleet do +RSpec.describe API::UserRunners, :aggregate_failures, feature_category: :fleet_visibility do let_it_be(:admin) { create(:admin) } let_it_be(:user, reload: true) { create(:user, username: 'user.withdot') } diff --git a/spec/requests/runner_setup_controller_spec.rb b/spec/requests/runner_setup_controller_spec.rb index 8d75b9e81b7..ae52bd71b3b 100644 --- a/spec/requests/runner_setup_controller_spec.rb +++ b/spec/requests/runner_setup_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe RunnerSetupController, feature_category: :runner_fleet do +RSpec.describe RunnerSetupController, feature_category: :fleet_visibility do let(:user) { create(:user) } before do diff --git a/spec/rubocop/cop/background_migration/dictionary_file_spec.rb b/spec/rubocop/cop/background_migration/dictionary_file_spec.rb index 4fa7dede093..9b4adc87f78 100644 --- a/spec/rubocop/cop/background_migration/dictionary_file_spec.rb +++ b/spec/rubocop/cop/background_migration/dictionary_file_spec.rb @@ -136,14 +136,18 @@ RSpec.describe RuboCop::Cop::BackgroundMigration::DictionaryFile, feature_catego context 'with dictionary file' do let(:introduced_by_url) { 'https://gitlab.com/gitlab-org/gitlab/-/merge_requests/132639' } let(:finalize_after) { '20230507160251' } + let(:milestone) { '16.1' } before do + allow(File).to receive(:exist?).and_call_original allow(File).to receive(:exist?).with(dictionary_file_path).and_return(true) - - allow_next_instance_of(RuboCop::BatchedBackgroundMigrationsDictionary) do |dictionary| - allow(dictionary).to receive(:finalize_after).and_return(finalize_after) - allow(dictionary).to receive(:introduced_by_url).and_return(introduced_by_url) - end + allow(::RuboCop::BatchedBackgroundMigrationsDictionary).to receive(:dictionary_data).and_return({ + '20231118100907' => { + finalize_after: finalize_after, + introduced_by_url: introduced_by_url, + milestone: milestone + } + }) end context 'without introduced_by_url' do @@ -177,6 +181,31 @@ RSpec.describe RuboCop::Cop::BackgroundMigration::DictionaryFile, feature_catego end end + context 'without milestone' do + it_behaves_like 'migration with missing dictionary keys offense', :milestone do + let(:milestone) { nil } + end + end + + context 'when milestone is a number' do + let(:milestone) { 16.1 } + + it 'throws offense on having an invalid milestone' do + expect_offense(<<~RUBY) + class QueueMyMigration < Gitlab::Database::Migration[2.1] + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #{format('Invalid `milestone` for the dictionary. It must be a string. Please ensure it is quoted.')} + def up + queue_batched_background_migration( + 'MyMigration', + :users, + :id + ) + end + end + RUBY + end + end + context 'with required dictionary keys' do it 'does not throw offense with appropriate dictionary file' do expect_no_offenses(<<~RUBY) diff --git a/spec/services/bulk_imports/file_download_service_spec.rb b/spec/services/bulk_imports/file_download_service_spec.rb index accaa31dd50..0d9fe96bb64 100644 --- a/spec/services/bulk_imports/file_download_service_spec.rb +++ b/spec/services/bulk_imports/file_download_service_spec.rb @@ -149,15 +149,26 @@ RSpec.describe BulkImports::FileDownloadService, feature_category: :importers do end context 'when chunk code is not 200' do - let(:chunk_code) { 500 } + let(:chunk_code) { 404 } it 'raises an error' do expect { subject.execute }.to raise_error( described_class::ServiceError, - 'File download error 500' + 'File download error 404' ) end + context 'when chunk code is retriable' do + let(:chunk_code) { 502 } + + it 'raises a retriable error' do + expect { subject.execute }.to raise_error( + BulkImports::NetworkError, + 'Error downloading file from /test. Error code: 502' + ) + end + end + context 'when chunk code is redirection' do let(:chunk_code) { 303 } diff --git a/spec/services/ci/runners/assign_runner_service_spec.rb b/spec/services/ci/runners/assign_runner_service_spec.rb index 00fbb5e2d26..eb0b7478ad3 100644 --- a/spec/services/ci/runners/assign_runner_service_spec.rb +++ b/spec/services/ci/runners/assign_runner_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ::Ci::Runners::AssignRunnerService, '#execute', feature_category: :runner_fleet do +RSpec.describe ::Ci::Runners::AssignRunnerService, '#execute', feature_category: :fleet_visibility do subject(:execute) { described_class.new(runner, new_project, user).execute } let_it_be(:owner_group) { create(:group) } diff --git a/spec/services/ci/runners/bulk_delete_runners_service_spec.rb b/spec/services/ci/runners/bulk_delete_runners_service_spec.rb index 5e697565972..b57cae00867 100644 --- a/spec/services/ci/runners/bulk_delete_runners_service_spec.rb +++ b/spec/services/ci/runners/bulk_delete_runners_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ::Ci::Runners::BulkDeleteRunnersService, '#execute', feature_category: :runner_fleet do +RSpec.describe ::Ci::Runners::BulkDeleteRunnersService, '#execute', feature_category: :fleet_visibility do subject(:execute) { described_class.new(**service_args).execute } let_it_be(:admin_user) { create(:user, :admin) } diff --git a/spec/services/ci/runners/create_runner_service_spec.rb b/spec/services/ci/runners/create_runner_service_spec.rb index db337b0b005..eaba7b9e4db 100644 --- a/spec/services/ci/runners/create_runner_service_spec.rb +++ b/spec/services/ci/runners/create_runner_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ::Ci::Runners::CreateRunnerService, "#execute", feature_category: :runner_fleet do +RSpec.describe ::Ci::Runners::CreateRunnerService, "#execute", feature_category: :fleet_visibility do subject(:execute) { described_class.new(user: current_user, params: params).execute } let(:runner) { execute.payload[:runner] } diff --git a/spec/services/ci/runners/process_runner_version_update_service_spec.rb b/spec/services/ci/runners/process_runner_version_update_service_spec.rb index f8b7aa281af..cc8df6579d4 100644 --- a/spec/services/ci/runners/process_runner_version_update_service_spec.rb +++ b/spec/services/ci/runners/process_runner_version_update_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::Runners::ProcessRunnerVersionUpdateService, feature_category: :runner_fleet do +RSpec.describe Ci::Runners::ProcessRunnerVersionUpdateService, feature_category: :fleet_visibility do subject(:service) { described_class.new(version) } let(:version) { '1.0.0' } diff --git a/spec/services/ci/runners/reconcile_existing_runner_versions_service_spec.rb b/spec/services/ci/runners/reconcile_existing_runner_versions_service_spec.rb index 8d7e97e5ea8..88f0a930599 100644 --- a/spec/services/ci/runners/reconcile_existing_runner_versions_service_spec.rb +++ b/spec/services/ci/runners/reconcile_existing_runner_versions_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ::Ci::Runners::ReconcileExistingRunnerVersionsService, '#execute', feature_category: :runner_fleet do +RSpec.describe ::Ci::Runners::ReconcileExistingRunnerVersionsService, '#execute', feature_category: :fleet_visibility do include RunnerReleasesHelper subject(:execute) { described_class.new.execute } diff --git a/spec/services/ci/runners/register_runner_service_spec.rb b/spec/services/ci/runners/register_runner_service_spec.rb index 4b997855657..aabf30d975a 100644 --- a/spec/services/ci/runners/register_runner_service_spec.rb +++ b/spec/services/ci/runners/register_runner_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ::Ci::Runners::RegisterRunnerService, '#execute', feature_category: :runner_fleet do +RSpec.describe ::Ci::Runners::RegisterRunnerService, '#execute', feature_category: :fleet_visibility do let(:registration_token) { 'abcdefg123456' } let(:token) {} let(:args) { {} } diff --git a/spec/services/ci/runners/reset_registration_token_service_spec.rb b/spec/services/ci/runners/reset_registration_token_service_spec.rb index c8115236034..68faa9fa387 100644 --- a/spec/services/ci/runners/reset_registration_token_service_spec.rb +++ b/spec/services/ci/runners/reset_registration_token_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ::Ci::Runners::ResetRegistrationTokenService, '#execute', feature_category: :runner_fleet do +RSpec.describe ::Ci::Runners::ResetRegistrationTokenService, '#execute', feature_category: :fleet_visibility do subject(:execute) { described_class.new(scope, current_user).execute } let_it_be(:user) { build(:user) } diff --git a/spec/services/ci/runners/set_runner_associated_projects_service_spec.rb b/spec/services/ci/runners/set_runner_associated_projects_service_spec.rb index 8d612174a0b..b617cb0a006 100644 --- a/spec/services/ci/runners/set_runner_associated_projects_service_spec.rb +++ b/spec/services/ci/runners/set_runner_associated_projects_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ::Ci::Runners::SetRunnerAssociatedProjectsService, '#execute', feature_category: :runner_fleet do +RSpec.describe ::Ci::Runners::SetRunnerAssociatedProjectsService, '#execute', feature_category: :fleet_visibility do subject(:execute) do described_class.new(runner: runner, current_user: user, project_ids: new_projects.map(&:id)).execute end diff --git a/spec/services/ci/runners/stale_managers_cleanup_service_spec.rb b/spec/services/ci/runners/stale_managers_cleanup_service_spec.rb index 0a20c12bc15..4931f24d5d8 100644 --- a/spec/services/ci/runners/stale_managers_cleanup_service_spec.rb +++ b/spec/services/ci/runners/stale_managers_cleanup_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::Runners::StaleManagersCleanupService, feature_category: :runner_fleet do +RSpec.describe Ci::Runners::StaleManagersCleanupService, feature_category: :fleet_visibility do let(:service) { described_class.new } let!(:runner_manager3) { create(:ci_runner_machine, created_at: 6.months.ago, contacted_at: Time.current) } diff --git a/spec/services/ci/runners/unassign_runner_service_spec.rb b/spec/services/ci/runners/unassign_runner_service_spec.rb index e91d4249473..99cf087cf78 100644 --- a/spec/services/ci/runners/unassign_runner_service_spec.rb +++ b/spec/services/ci/runners/unassign_runner_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ::Ci::Runners::UnassignRunnerService, '#execute', feature_category: :runner_fleet do +RSpec.describe ::Ci::Runners::UnassignRunnerService, '#execute', feature_category: :fleet_visibility do let_it_be(:project) { create(:project) } let_it_be(:runner) { create(:ci_runner, :project, projects: [project]) } diff --git a/spec/services/ci/runners/unregister_runner_manager_service_spec.rb b/spec/services/ci/runners/unregister_runner_manager_service_spec.rb index 8bfda8e2083..590df18469d 100644 --- a/spec/services/ci/runners/unregister_runner_manager_service_spec.rb +++ b/spec/services/ci/runners/unregister_runner_manager_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ::Ci::Runners::UnregisterRunnerManagerService, '#execute', feature_category: :runner_fleet do +RSpec.describe ::Ci::Runners::UnregisterRunnerManagerService, '#execute', feature_category: :fleet_visibility do subject(:execute) { described_class.new(runner, 'some_token', system_id: system_id).execute } context 'with runner registered with registration token' do diff --git a/spec/services/ci/runners/unregister_runner_service_spec.rb b/spec/services/ci/runners/unregister_runner_service_spec.rb index fb779e1a673..e73dcb2511e 100644 --- a/spec/services/ci/runners/unregister_runner_service_spec.rb +++ b/spec/services/ci/runners/unregister_runner_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe ::Ci::Runners::UnregisterRunnerService, '#execute', feature_category: :runner_fleet do +RSpec.describe ::Ci::Runners::UnregisterRunnerService, '#execute', feature_category: :fleet_visibility do subject(:execute) { described_class.new(runner, 'some_token').execute } let(:runner) { create(:ci_runner) } diff --git a/spec/services/ci/runners/update_runner_service_spec.rb b/spec/services/ci/runners/update_runner_service_spec.rb index 86875df70a2..9483d122c35 100644 --- a/spec/services/ci/runners/update_runner_service_spec.rb +++ b/spec/services/ci/runners/update_runner_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::Runners::UpdateRunnerService, '#execute', feature_category: :runner_fleet do +RSpec.describe Ci::Runners::UpdateRunnerService, '#execute', feature_category: :fleet_visibility do subject(:execute) { described_class.new(runner).execute(params) } let(:runner) { create(:ci_runner) } diff --git a/spec/services/ci/stuck_builds/drop_pending_service_spec.rb b/spec/services/ci/stuck_builds/drop_pending_service_spec.rb index 9da63930057..b3045d838a1 100644 --- a/spec/services/ci/stuck_builds/drop_pending_service_spec.rb +++ b/spec/services/ci/stuck_builds/drop_pending_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::StuckBuilds::DropPendingService, feature_category: :runner_fleet do +RSpec.describe Ci::StuckBuilds::DropPendingService, feature_category: :fleet_visibility do let_it_be(:runner) { create(:ci_runner) } let_it_be(:pipeline) { create(:ci_empty_pipeline) } let_it_be_with_reload(:job) do diff --git a/spec/services/ci/stuck_builds/drop_running_service_spec.rb b/spec/services/ci/stuck_builds/drop_running_service_spec.rb index c2f8a643f24..74b02240ea5 100644 --- a/spec/services/ci/stuck_builds/drop_running_service_spec.rb +++ b/spec/services/ci/stuck_builds/drop_running_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::StuckBuilds::DropRunningService, feature_category: :runner_fleet do +RSpec.describe Ci::StuckBuilds::DropRunningService, feature_category: :fleet_visibility do let!(:runner) { create :ci_runner } let!(:job) { create(:ci_build, runner: runner, created_at: created_at, updated_at: updated_at, status: status) } diff --git a/spec/services/ci/stuck_builds/drop_scheduled_service_spec.rb b/spec/services/ci/stuck_builds/drop_scheduled_service_spec.rb index 5560eaf9b40..5a95b55054f 100644 --- a/spec/services/ci/stuck_builds/drop_scheduled_service_spec.rb +++ b/spec/services/ci/stuck_builds/drop_scheduled_service_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::StuckBuilds::DropScheduledService, feature_category: :runner_fleet do +RSpec.describe Ci::StuckBuilds::DropScheduledService, feature_category: :fleet_visibility do let_it_be(:runner) { create :ci_runner } let!(:job) { create :ci_build, :scheduled, scheduled_at: scheduled_at, runner: runner } diff --git a/spec/support/rspec_order_todo.yml b/spec/support/rspec_order_todo.yml index 88bad8344c6..3d86f726865 100644 --- a/spec/support/rspec_order_todo.yml +++ b/spec/support/rspec_order_todo.yml @@ -2903,10 +2903,6 @@ - './ee/spec/views/layouts/header/_current_user_dropdown.html.haml_spec.rb' - './ee/spec/views/layouts/header/_ee_subscribable_banner.html.haml_spec.rb' - './ee/spec/views/layouts/header/_read_only_banner.html.haml_spec.rb' -- './ee/spec/views/layouts/nav/sidebar/_admin.html.haml_spec.rb' -- './ee/spec/views/layouts/nav/sidebar/_group.html.haml_spec.rb' -- './ee/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb' -- './ee/spec/views/layouts/nav/sidebar/_push_rules_link.html.haml_spec.rb' - './ee/spec/views/operations/environments.html.haml_spec.rb' - './ee/spec/views/operations/index.html.haml_spec.rb' - './ee/spec/views/profiles/preferences/show.html.haml_spec.rb' @@ -9353,10 +9349,6 @@ - './spec/views/layouts/header/_gitlab_version.html.haml_spec.rb' - './spec/views/layouts/header/_new_dropdown.haml_spec.rb' - './spec/views/layouts/_head.html.haml_spec.rb' -- './spec/views/layouts/nav/sidebar/_admin.html.haml_spec.rb' -- './spec/views/layouts/nav/sidebar/_group.html.haml_spec.rb' -- './spec/views/layouts/nav/sidebar/_profile.html.haml_spec.rb' -- './spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb' - './spec/views/layouts/profile.html.haml_spec.rb' - './spec/views/layouts/_published_experiments.html.haml_spec.rb' - './spec/views/layouts/signup_onboarding.html.haml_spec.rb' @@ -9424,7 +9416,6 @@ - './spec/views/shared/milestones/_issuables.html.haml_spec.rb' - './spec/views/shared/_milestones_sort_dropdown.html.haml_spec.rb' - './spec/views/shared/milestones/_top.html.haml_spec.rb' -- './spec/views/shared/nav/_sidebar.html.haml_spec.rb' - './spec/views/shared/projects/_inactive_project_deletion_alert.html.haml_spec.rb' - './spec/views/shared/projects/_list.html.haml_spec.rb' - './spec/views/shared/projects/_project.html.haml_spec.rb' diff --git a/spec/support/shared_examples/features/work_items_shared_examples.rb b/spec/support/shared_examples/features/work_items_shared_examples.rb index 30605c81312..3dfd7604914 100644 --- a/spec/support/shared_examples/features/work_items_shared_examples.rb +++ b/spec/support/shared_examples/features/work_items_shared_examples.rb @@ -495,30 +495,30 @@ end RSpec.shared_examples 'work items parent' do |type| let(:work_item_parent) { create(:work_item, type, project: project) } - def set_parent(parent_dropdown, parent_text) - parent_dropdown.click - + def set_parent(parent_text) find('[data-testid="listbox-search-input"] .gl-listbox-search-input', visible: true).send_keys "\"#{parent_text}\"" wait_for_requests - find('.gl-new-dropdown-item').click - wait_for_requests + find('.gl-new-dropdown-item', text: parent_text).click + wait_for_all_requests end - let(:parent_dropdown_selector) { 'work-item-parent-listbox' } - it 'searches and sets or removes parent for the work item' do + find_by_testid('edit-parent').click within_testid('work-item-parent-form') do - set_parent(find_by_testid(parent_dropdown_selector), work_item_parent.title) - - expect(find_by_testid(parent_dropdown_selector)).to have_text(work_item_parent.title) - - find_by_testid(parent_dropdown_selector).click - - click_button('Unassign') - - expect(find_by_testid(parent_dropdown_selector)).to have_text('None') + set_parent(work_item_parent.title) end + + expect(find_by_testid('work-item-parent-link')).to have_text(work_item_parent.title) + wait_for_requests + + page.refresh + find_by_testid('edit-parent').click + + click_button('Unassign') + wait_for_requests + + expect(find_by_testid('work-item-parent-none')).to have_text('None') end end diff --git a/spec/tasks/gitlab/doctor/secrets_rake_spec.rb b/spec/tasks/gitlab/doctor/secrets_rake_spec.rb index 91ef3c57d73..123b8745d65 100644 --- a/spec/tasks/gitlab/doctor/secrets_rake_spec.rb +++ b/spec/tasks/gitlab/doctor/secrets_rake_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'gitlab:doctor:reset_encrypted_tokens', :silence_stdout, feature_category: :runner_fleet do +RSpec.describe 'gitlab:doctor:reset_encrypted_tokens', :silence_stdout, feature_category: :fleet_visibility do let(:model_names) { 'Project,Group' } let(:token_names) { 'runners_token' } diff --git a/spec/tasks/gitlab/seed/runner_fleet_rake_spec.rb b/spec/tasks/gitlab/seed/runner_fleet_rake_spec.rb index b8503e2bc1b..ae4e5425d0c 100644 --- a/spec/tasks/gitlab/seed/runner_fleet_rake_spec.rb +++ b/spec/tasks/gitlab/seed/runner_fleet_rake_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'gitlab:seed:runner_fleet rake task', :silence_stdout, feature_category: :runner_fleet do +RSpec.describe 'gitlab:seed:runner_fleet rake task', :silence_stdout, feature_category: :fleet_visibility do let(:registration_prefix) { 'rf-' } let(:runner_count) { 10 } let(:job_count) { 20 } diff --git a/spec/views/layouts/fullscreen.html.haml_spec.rb b/spec/views/layouts/fullscreen.html.haml_spec.rb index 46c3b08b954..c763b53ac6c 100644 --- a/spec/views/layouts/fullscreen.html.haml_spec.rb +++ b/spec/views/layouts/fullscreen.html.haml_spec.rb @@ -27,38 +27,4 @@ RSpec.describe 'layouts/fullscreen' do it_behaves_like 'a layout which reflects the application theme setting' it_behaves_like 'a layout which reflects the preferred language' - - describe 'sidebar' do - context 'when nav is set' do - before do - allow(view).to receive(:nav).and_return("admin") - render - end - - it 'renders the sidebar' do - expect(rendered).to render_template("layouts/nav/sidebar/_admin") - expect(rendered).to have_selector("aside.nav-sidebar") - end - - it 'adds the proper classes' do - expect(rendered).to have_selector(".layout-page.gl-mt-0\\!") - end - end - - describe 'when nav is not set' do - before do - allow(view).to receive(:nav).and_return(nil) - render - end - - it 'does not render the sidebar' do - expect(rendered).not_to render_template("layouts/nav/sidebar/_admin") - expect(rendered).not_to have_selector("aside.nav-sidebar") - end - - it 'not add classes' do - expect(rendered).not_to have_selector(".layout-page.gl-mt-0\\!") - end - end - end end diff --git a/spec/views/layouts/nav/sidebar/_admin.html.haml_spec.rb b/spec/views/layouts/nav/sidebar/_admin.html.haml_spec.rb deleted file mode 100644 index 3097598aaca..00000000000 --- a/spec/views/layouts/nav/sidebar/_admin.html.haml_spec.rb +++ /dev/null @@ -1,161 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe 'layouts/nav/sidebar/_admin', feature_category: :navigation do - let(:user) { build(:admin) } - - before do - allow(user).to receive(:can_admin_all_resources?).and_return(true) - allow(view).to receive(:current_user).and_return(user) - end - - shared_examples 'page has active tab' do |title| - it "activates #{title} tab" do - render - - expect(rendered).to have_selector('.nav-sidebar .sidebar-top-level-items > li.active', count: 1) - expect(rendered).to have_css('.nav-sidebar .sidebar-top-level-items > li.active', text: title) - end - end - - shared_examples 'page has active sub tab' do |title| - it "activates #{title} sub tab" do - render - - expect(rendered).to have_css('.sidebar-sub-level-items > li.active', text: title) - end - end - - context 'on home page' do - before do - allow(controller).to receive(:controller_name).and_return('dashboard') - end - - it_behaves_like 'page has active tab', 'Overview' - end - - it_behaves_like 'has nav sidebar' - - context 'on projects' do - before do - allow(controller).to receive(:controller_name).and_return('admin/projects') - allow(controller).to receive(:controller_path).and_return('admin/projects') - end - - it_behaves_like 'page has active tab', 'Overview' - it_behaves_like 'page has active sub tab', 'Projects' - end - - context 'on groups' do - before do - allow(controller).to receive(:controller_name).and_return('groups') - end - - it_behaves_like 'page has active tab', 'Overview' - it_behaves_like 'page has active sub tab', 'Groups' - end - - context 'on users' do - before do - allow(controller).to receive(:controller_name).and_return('users') - end - - it_behaves_like 'page has active tab', 'Overview' - it_behaves_like 'page has active sub tab', 'Users' - end - - context 'on topics' do - before do - allow(controller).to receive(:controller_name).and_return('admin/topics') - end - - it_behaves_like 'page has active tab', 'Overview' - it_behaves_like 'page has active sub tab', 'Topics' - end - - context 'on runners' do - before do - allow(controller).to receive(:controller_name).and_return('runners') - end - - it_behaves_like 'page has active tab', 'CI/CD' - it_behaves_like 'page has active sub tab', 'Runners' - end - - context 'on jobs' do - before do - allow(controller).to receive(:controller_name).and_return('jobs') - end - - it_behaves_like 'page has active tab', 'CI/CD' - it_behaves_like 'page has active sub tab', 'Jobs' - end - - context 'on messages' do - before do - allow(controller).to receive(:controller_name).and_return('broadcast_messages') - end - - it_behaves_like 'page has active tab', 'Messages' - end - - context 'on analytics' do - before do - allow(controller).to receive(:controller_name).and_return('dev_ops_report') - end - - it_behaves_like 'page has active tab', 'Analytics' - end - - context 'on hooks' do - before do - allow(controller).to receive(:controller_name).and_return('hooks') - end - - it_behaves_like 'page has active tab', 'Hooks' - end - - context 'on background jobs' do - before do - allow(controller).to receive(:controller_name).and_return('background_jobs') - end - - it_behaves_like 'page has active tab', 'Monitoring' - it_behaves_like 'page has active sub tab', 'Background Jobs' - end - - context 'on settings' do - let(:gitlab_com?) { false } - - before do - allow(::Gitlab).to receive(:com?) { gitlab_com? } - - render - end - - it 'includes General link' do - expect(rendered).to have_link('General', href: general_admin_application_settings_path) - end - - context 'when GitLab.com' do - let(:gitlab_com?) { true } - - it 'does not include Integrations link' do - expect(rendered).not_to have_link('Integrations', href: integrations_admin_application_settings_path) - end - end - - context 'when not GitLab.com' do - it 'includes Integrations link' do - expect(rendered).to have_link('Integrations', href: integrations_admin_application_settings_path) - end - end - - context 'when GitLab FOSS' do - it 'does not include Templates link' do - expect(rendered).not_to have_link('Templates', href: '/admin/application_settings/templates') - end - end - end -end diff --git a/spec/views/layouts/nav/sidebar/_group.html.haml_spec.rb b/spec/views/layouts/nav/sidebar/_group.html.haml_spec.rb deleted file mode 100644 index 472a2f3cb34..00000000000 --- a/spec/views/layouts/nav/sidebar/_group.html.haml_spec.rb +++ /dev/null @@ -1,187 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe 'layouts/nav/sidebar/_group' do - let_it_be(:owner) { create(:user) } - let_it_be(:group) do - create(:group).tap do |g| - g.add_owner(owner) - end - end - - before do - assign(:group, group) - - allow(view).to receive(:current_user).and_return(owner) - end - - it_behaves_like 'has nav sidebar' - it_behaves_like 'sidebar includes snowplow attributes', 'render', 'groups_side_navigation', 'groups_side_navigation' - - describe 'Group context menu' do - it 'has a link to the group path' do - render - - expect(rendered).to have_link(group.name, href: group_path(group)) - end - end - - describe 'Group information' do - it 'has a link to the group activity path' do - render - - expect(rendered).to have_link('Group information', href: activity_group_path(group)) - end - - it 'has a link to the group labels path' do - render - - expect(rendered).to have_link('Labels', href: group_labels_path(group)) - end - - it 'has a link to the members page' do - render - - expect(rendered).to have_link('Members', href: group_group_members_path(group)) - end - end - - describe 'Issues' do - it 'has a default link to the issue list path' do - render - - expect(rendered).to have_link('Issues', href: issues_group_path(group)) - end - - it 'has a link to the issue list page' do - render - - expect(rendered).to have_link('List', href: issues_group_path(group)) - end - - it 'has a link to the boards page' do - render - - expect(rendered).to have_link('Board', href: group_boards_path(group)) - end - - it 'has a link to the milestones page' do - render - - expect(rendered).to have_link('Milestones', href: group_milestones_path(group)) - end - end - - describe 'Merge Requests' do - it 'has a link to the merge request list path' do - render - - expect(rendered).to have_link('Merge requests', href: merge_requests_group_path(group)) - end - - it 'shows pill with the number of merge requests' do - render - - expect(rendered).to have_css('span.badge.badge-pill.merge_counter.js-merge-counter') - end - end - - describe 'CI/CD' do - it 'has a default link to the runners list path' do - render - - expect(rendered).to have_link('CI/CD', href: group_runners_path(group)) - end - - it 'has a link to the runners list page' do - render - - expect(rendered).to have_link('Runners', href: group_runners_path(group)) - end - end - - describe 'Kubernetes menu', :request_store do - it 'has a link to the group cluster list path' do - render - - expect(rendered).to have_link('Kubernetes', href: group_clusters_path(group)) - end - end - - describe 'Packages and registries' do - it 'has a link to the package registry page' do - stub_config(packages: { enabled: true }) - - render - - expect(rendered).to have_link('Package Registry', href: group_packages_path(group)) - end - - it 'has a link to the container registry page' do - stub_container_registry_config(enabled: true) - - render - - expect(rendered).to have_link('Container Registry', href: group_container_registries_path(group)) - end - - it 'has a link to the dependency proxy page' do - stub_config(dependency_proxy: { enabled: true }) - - render - - expect(rendered).to have_link('Dependency Proxy', href: group_dependency_proxy_path(group)) - end - end - - describe 'Settings' do - it 'default link points to edit group page' do - render - - expect(rendered).to have_link('Settings', href: edit_group_path(group)) - end - - it 'has a link to the General settings page' do - render - - expect(rendered).to have_link('General', href: edit_group_path(group)) - end - - it 'has a link to the Integrations settings page' do - render - - expect(rendered).to have_link('Integrations', href: group_settings_integrations_path(group)) - end - - it 'has a link to the group Projects settings page' do - render - - expect(rendered).to have_link('Projects', href: projects_group_path(group)) - end - - it 'has a link to the Repository settings page' do - render - - expect(rendered).to have_link('Repository', href: group_settings_repository_path(group)) - end - - it 'has a link to the CI/CD settings page' do - render - - expect(rendered).to have_link('CI/CD', href: group_settings_ci_cd_path(group)) - end - - it 'has a link to the Applications settings page' do - render - - expect(rendered).to have_link('Applications', href: group_settings_applications_path(group)) - end - - it 'has a link to the Package and registry settings page' do - render - - expect(rendered).to have_link('Packages and registries', href: group_settings_packages_and_registries_path(group)) - end - end -end diff --git a/spec/views/layouts/nav/sidebar/_profile.html.haml_spec.rb b/spec/views/layouts/nav/sidebar/_profile.html.haml_spec.rb deleted file mode 100644 index f5a0a7a935c..00000000000 --- a/spec/views/layouts/nav/sidebar/_profile.html.haml_spec.rb +++ /dev/null @@ -1,30 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe 'layouts/nav/sidebar/_profile' do - let(:user) { create(:user) } - - before do - allow(view).to receive(:current_user).and_return(user) - end - - it_behaves_like 'has nav sidebar' - it_behaves_like 'sidebar includes snowplow attributes', 'render', 'user_side_navigation', 'user_side_navigation' - - it 'has a link to access tokens' do - render - - expect(rendered).to have_link(_('Access Tokens'), href: profile_personal_access_tokens_path) - end - - context 'when personal access tokens are disabled' do - it 'does not have a link to access tokens' do - allow(::Gitlab::CurrentSettings).to receive_messages(personal_access_tokens_disabled?: true) - - render - - expect(rendered).not_to have_link(_('Access Tokens'), href: profile_personal_access_tokens_path) - end - end -end diff --git a/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb b/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb deleted file mode 100644 index 34debcab5f7..00000000000 --- a/spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb +++ /dev/null @@ -1,958 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe 'layouts/nav/sidebar/_project', feature_category: :navigation do - let_it_be_with_reload(:project) { create(:project, :repository) } - - let(:user) { project.first_owner } - let(:current_ref) { 'master' } - - before do - assign(:project, project) - assign(:repository, project.repository) - - allow(view).to receive(:current_ref).and_return(current_ref) - allow(view).to receive(:can?).and_return(true) - allow(view).to receive(:current_user).and_return(user) - end - - it_behaves_like 'has nav sidebar' - - describe 'Project context' do - it 'has a link to the project path' do - render - - expect(rendered).to have_link(project.name, href: project_path(project), class: 'shortcuts-project') - expect(rendered).to have_selector("[aria-label=\"#{project.name}\"]") - end - end - - describe 'Project information' do - it 'has a link to the project activity path' do - render - - expect(rendered).to have_link('Project information', href: activity_project_path(project), class: %w[shortcuts-project-information]) - expect(rendered).to have_selector('[aria-label="Project information"]') - end - - describe 'Activity' do - it 'has a link to the project activity path' do - render - - expect(rendered).to have_link('Activity', href: activity_project_path(project), class: 'shortcuts-project-activity') - end - end - - describe 'Labels' do - let(:page) { Nokogiri::HTML.parse(rendered) } - - it 'has a link to the labels path' do - render - - expect(page.at_css('.shortcuts-project-information').parent.css('[aria-label="Labels"]')).not_to be_empty - expect(rendered).to have_link('Labels', href: project_labels_path(project)) - end - end - - describe 'Members' do - let(:page) { Nokogiri::HTML.parse(rendered) } - - it 'has a link to the members page' do - render - - expect(page.at_css('.shortcuts-project-information').parent.css('[aria-label="Members"]')).not_to be_empty - expect(rendered).to have_link('Members', href: project_project_members_path(project)) - end - end - end - - describe 'Repository' do - it 'has a link to the project tree path' do - render - - expect(rendered).to have_link('Repository', href: project_tree_path(project, current_ref), class: 'shortcuts-tree') - end - - describe 'Files' do - it 'has a link to the project tree path' do - render - - expect(rendered).to have_link('Files', href: project_tree_path(project, current_ref)) - end - end - - describe 'Commits' do - it 'has a link to the fully qualified project commits path' do - render - - expect(rendered).to have_link('Commits', href: project_commits_path(project, current_ref, ref_type: 'heads'), id: 'js-onboarding-commits-link') - end - end - - describe 'Branches' do - it 'has a link to the project branches path' do - render - - expect(rendered).to have_link('Branches', href: project_branches_path(project), id: 'js-onboarding-branches-link') - end - end - - describe 'Tags' do - it 'has a link to the project tags path' do - render - - expect(rendered).to have_link('Tags', href: project_tags_path(project)) - end - end - - describe 'Contributor statistics' do - it 'has a link to the project contributors path' do - render - - expect(rendered).to have_link('Contributor statistics', href: project_graph_path(project, current_ref, ref_type: 'heads')) - end - end - - describe 'Graph' do - it 'has a link to the project graph path' do - render - - expect(rendered).to have_link('Graph', href: project_network_path(project, current_ref)) - end - end - - describe 'Compare revisions' do - it 'has a link to the project compare path' do - render - - expect(rendered).to have_link('Compare revisions', href: project_compare_index_path(project, from: project.repository.root_ref, to: current_ref)) - end - end - end - - describe 'Issues' do - it 'has a link to the issue list path' do - render - - expect(rendered).to have_link('Issues', href: project_issues_path(project)) - end - - it 'shows pill with the number of open issues' do - render - - expect(rendered).to have_css('span.badge.badge-pill.issue_counter') - end - - describe 'Issue List' do - it 'has a link to the issue list path' do - render - - expect(rendered).to have_link('List', href: project_issues_path(project)) - end - end - - describe 'Issue Boards' do - it 'has a link to the issue boards path' do - render - - expect(rendered).to have_link('Boards', href: project_boards_path(project)) - end - end - - describe 'Service Desk' do - it 'has a link to the service desk path' do - render - - expect(rendered).to have_link('Service Desk', href: service_desk_project_issues_path(project)) - end - end - - describe 'Milestones' do - it 'has a link to the milestones path' do - render - - expect(rendered).to have_link('Milestones', href: project_milestones_path(project)) - end - end - end - - describe 'External Issue Tracker' do - let_it_be_with_refind(:project) { create(:project, has_external_issue_tracker: true) } - - context 'with custom external issue tracker' do - let(:external_issue_tracker_url) { 'http://test.com' } - - let!(:external_issue_tracker) do - create(:custom_issue_tracker_integration, active: external_issue_tracker_active, project: project, project_url: external_issue_tracker_url) - end - - context 'when external issue tracker is configured and active' do - let(:external_issue_tracker_active) { true } - - it 'has a link to the external issue tracker' do - render - - expect(rendered).to have_link(external_issue_tracker.title, href: external_issue_tracker_url) - end - end - - context 'when external issue tracker is not configured and active' do - let(:external_issue_tracker_active) { false } - - it 'does not have a link to the external issue tracker' do - render - - expect(rendered).not_to have_link(external_issue_tracker.title) - end - end - end - - context 'with Jira issue tracker' do - let_it_be(:jira) { create(:jira_integration, project: project, issues_enabled: false) } - - it 'has a link to the Jira issue tracker' do - render - - expect(rendered).to have_link('Jira', href: project.external_issue_tracker.issue_tracker_path) - end - end - end - - describe 'Merge Requests' do - it 'has a link to the merge request list path' do - render - - expect(rendered).to have_link('Merge requests', href: project_merge_requests_path(project), class: 'shortcuts-merge_requests') - end - - it 'shows pill with the number of merge requests' do - render - - expect(rendered).to have_css('span.badge.badge-pill.merge_counter.js-merge-counter') - end - end - - describe 'CI/CD' do - it 'has a link to pipelines page' do - render - - expect(rendered).to have_link('CI/CD', href: project_pipelines_path(project)) - end - - describe 'Artifacts' do - it 'has a link to the artifacts page' do - render - - expect(rendered).to have_link('Artifacts', href: project_artifacts_path(project)) - end - end - - describe 'Jobs' do - it 'has a link to the jobs page' do - render - - expect(rendered).to have_link('Jobs', href: project_jobs_path(project)) - end - end - - describe 'Pipeline Schedules' do - it 'has a link to the pipeline schedules page' do - render - - expect(rendered).to have_link('Schedules', href: pipeline_schedules_path(project)) - end - end - - describe 'Pipelines' do - it 'has a link to the pipelines page' do - render - - expect(rendered).to have_link('Pipelines', href: project_pipelines_path(project)) - end - end - - describe 'Pipeline Editor' do - context 'with a current_ref' do - it 'has a link to the pipeline editor' do - render - - expect(rendered).to have_link('Editor', href: project_ci_pipeline_editor_path(project, params: { branch_name: current_ref })) - end - end - - context 'with the default_branch' do - it 'has a link to the pipeline editor' do - render - - expect(rendered).to have_link('Editor', href: project_ci_pipeline_editor_path(project, params: { branch_name: project.default_branch })) - end - end - - context 'when user cannot access pipeline editor' do - it 'does not has a link to the pipeline editor' do - allow(view).to receive(:can_view_pipeline_editor?).and_return(false) - - render - - expect(rendered).not_to have_link('Editor', href: project_ci_pipeline_editor_path(project)) - end - end - end - end - - describe 'Security and Compliance' do - describe 'when user does not have permissions' do - before do - allow(view).to receive(:current_user).and_return(nil) - end - - it 'top level navigation link is not visible' do - render - - expect(rendered).not_to have_link('Security and Compliance') - end - end - - context 'when user has permissions' do - before do - allow(view).to receive(:current_user).and_return(user) - - render - end - - it 'top level navigation link is visible' do - expect(rendered).to have_link('Security and Compliance') - end - - it 'security configuration link is visible' do - expect(rendered).to have_link('Security configuration', href: project_security_configuration_path(project)) - end - end - end - - describe 'Deployments' do - let(:page) { Nokogiri::HTML.parse(rendered) } - - describe 'Feature flags' do - it 'has a link to the feature flags page' do - render - - expect(page.at_css('.shortcuts-deployments').parent.css('[aria-label="Feature flags"]')).not_to be_empty - expect(rendered).to have_link('Feature flags', href: project_feature_flags_path(project)) - end - - describe 'when the user does not have access' do - let(:user) { nil } - - it 'does not have a link to the feature flags page' do - render - - expect(rendered).not_to have_link('Feature flags') - end - end - end - - describe 'Environments' do - it 'has a link to the environments page' do - render - - expect(page.at_css('.shortcuts-deployments').parent.css('[aria-label="Environments"]')).not_to be_empty - expect(rendered).to have_link('Environments', href: project_environments_path(project)) - end - - describe 'when the user does not have access' do - let(:user) { nil } - - it 'does not have a link to the environments page' do - render - - expect(rendered).not_to have_link('Environments') - end - end - end - - describe 'Releases' do - it 'has a link to the project releases path' do - render - - expect(rendered).to have_link('Releases', href: project_releases_path(project), class: 'shortcuts-deployments-releases') - end - end - end - - describe 'Monitor' do - it 'top level navigation link is visible for user with permissions' do - render - - expect(rendered).to have_link('Monitor') - end - - describe 'Error Tracking' do - it 'has a link to the error tracking page' do - render - - expect(rendered).to have_link('Error Tracking', href: project_error_tracking_index_path(project)) - end - - describe 'when the user does not have access' do - let(:user) { nil } - - it 'does not have a link to the error tracking page' do - render - - expect(rendered).not_to have_link('Error Tracking') - end - end - end - - describe 'Alert Management' do - it 'has a link to the alert management page' do - render - - expect(rendered).to have_link('Alerts', href: project_alert_management_index_path(project)) - end - - describe 'when the user does not have access' do - let(:user) { nil } - - it 'does not have a link to the alert management page' do - render - - expect(rendered).not_to have_link('Alerts') - end - end - end - - describe 'Incidents' do - it 'has a link to the incidents page' do - render - - expect(rendered).to have_link('Incidents', href: project_incidents_path(project)) - end - - describe 'when the user does not have access' do - let(:user) { nil } - - it 'does not have a link to the incidents page' do - render - - expect(rendered).not_to have_link('Incidents') - end - end - end - end - - describe 'Infrastructure' do - describe 'Terraform' do - it 'has a link to the terraform page' do - render - - expect(rendered).to have_link('Terraform states', href: project_terraform_index_path(project)) - end - - describe 'when the user does not have access' do - let(:user) { nil } - - it 'does not have a link to the terraform page' do - render - - expect(rendered).not_to have_link('Terraform states') - end - end - end - - describe 'Kubernetes clusters' do - it 'has a link to the kubernetes page' do - render - - expect(rendered).to have_link('Kubernetes clusters', href: project_clusters_path(project)) - end - - describe 'when the user does not have access' do - let(:user) { nil } - - it 'does not have a link to the kubernetes page' do - render - - expect(rendered).not_to have_link('Kubernetes clusters') - end - end - end - - describe 'Google Cloud' do - it 'has a link to the google cloud page' do - render - expect(rendered).to have_link('Google Cloud', href: project_google_cloud_configuration_path(project)) - end - - describe 'when the user does not have access' do - let(:user) { nil } - - it 'does not have a link to the google cloud page' do - render - - expect(rendered).not_to have_link('Google Cloud') - end - end - end - end - - describe 'Packages and Registries' do - let(:registry_enabled) { true } - let(:packages_enabled) { true } - - before do - stub_container_registry_config(enabled: registry_enabled) - stub_config(packages: { enabled: packages_enabled }) - end - - it 'top level navigation link is visible and points to package registry page' do - render - - expect(rendered).to have_link('Packages and registries', href: project_packages_path(project)) - end - - describe 'Packages Registry' do - it 'shows link to package registry page' do - render - - expect(rendered).to have_link('Package Registry', href: project_packages_path(project)) - end - - context 'when packages config setting is not enabled' do - let(:packages_enabled) { false } - - it 'does not show link to package registry page' do - render - - expect(rendered).not_to have_link('Package Registry', href: project_packages_path(project)) - end - end - end - - describe 'Container Registry' do - it 'shows link to container registry page' do - render - - expect(rendered).to have_link('Container Registry', href: project_container_registry_index_path(project)) - end - - context 'when container config setting is not enabled' do - let(:registry_enabled) { false } - - it 'does not show link to package registry page' do - render - - expect(rendered).not_to have_link('Container Registry', href: project_container_registry_index_path(project)) - end - end - end - - describe 'Terraform modules' do - it 'shows link to terraform modules page' do - render - - expect(rendered).to have_link('Terraform modules', href: project_infrastructure_registry_index_path(project)) - end - - context 'when package registry config is disabled' do - it 'does not show link to package registry page' do - stub_config(packages: { enabled: false }) - - render - - expect(rendered).not_to have_link('Terraform modules', href: project_infrastructure_registry_index_path(project)) - end - end - end - end - - describe 'Analytics' do - it 'top level navigation link is visible points to the value stream page' do - render - - expect(rendered).to have_link('Analytics', href: project_cycle_analytics_path(project)) - end - - describe 'CI/CD' do - it 'has a link to the CI/CD analytics page' do - render - - expect(rendered).to have_link('CI/CD', href: charts_project_pipelines_path(project)) - end - - context 'when user does not have access' do - let(:user) { nil } - - it 'does not have a link to the CI/CD analytics page' do - render - - expect(rendered).not_to have_link('CI/CD', href: charts_project_pipelines_path(project)) - end - end - end - - describe 'Repository' do - it 'has a link to the repository analytics page' do - render - - expect(rendered).to have_link('Repository', href: charts_project_graph_path(project, 'master')) - end - - context 'when user does not have access' do - let(:user) { nil } - - it 'does not have a link to the repository analytics page' do - render - - expect(rendered).not_to have_link('Repository', href: charts_project_graph_path(project, 'master')) - end - end - end - - describe 'Value stream' do - it 'has a link to the value stream page' do - render - - expect(rendered).to have_link('Value stream', href: project_cycle_analytics_path(project)) - end - - context 'when user does not have access' do - let(:user) { nil } - - it 'does not have a link to the value stream page' do - render - - expect(rendered).not_to have_link('Value stream', href: project_cycle_analytics_path(project)) - end - end - end - end - - describe 'Confluence' do - let!(:service) { create(:confluence_integration, project: project, active: active) } - - before do - render - end - - context 'when the Confluence integration is active' do - let(:active) { true } - - it 'shows the Confluence link' do - expect(rendered).to have_link('Confluence', href: project_wikis_confluence_path(project)) - end - - it 'does not show the GitLab wiki link' do - expect(rendered).not_to have_link('Wiki') - end - end - - context 'when it is disabled' do - let(:active) { false } - - it 'does not show the Confluence link' do - expect(rendered).not_to have_link('Confluence') - end - - it 'shows the GitLab wiki link' do - expect(rendered).to have_link('Wiki', href: wiki_path(project.wiki)) - end - end - end - - describe 'Wiki' do - describe 'when wiki is enabled' do - it 'shows the wiki tab with the wiki internal link' do - render - - expect(rendered).to have_link('Wiki', href: wiki_path(project.wiki)) - end - end - - describe 'when wiki is disabled' do - let(:user) { nil } - - it 'does not show the wiki link' do - render - - expect(rendered).not_to have_link('Wiki') - end - end - end - - describe 'External Wiki' do - let(:properties) { { 'external_wiki_url' => 'https://gitlab.com' } } - let(:service_status) { true } - - before do - project.create_external_wiki_integration(active: service_status, properties: properties) - project.reload - end - - context 'when it is active' do - it 'shows the external wiki tab with the external wiki service link' do - render - - expect(rendered).to have_link('External wiki', href: properties['external_wiki_url']) - end - end - - context 'when it is disabled' do - let(:service_status) { false } - - it 'does not show the external wiki link' do - render - - expect(rendered).not_to have_link('External wiki') - end - end - end - - describe 'Snippets' do - before do - render - end - - context 'when user can access snippets' do - it 'shows Snippets link' do - expect(rendered).to have_link('Snippets', href: project_snippets_path(project)) - end - end - - context 'when user cannot access snippets' do - let(:user) { nil } - - it 'does not show Snippets link' do - expect(rendered).not_to have_link('Snippets') - end - end - end - - describe 'Settings' do - describe 'General' do - it 'has a link to the General settings' do - render - - expect(rendered).to have_link('General', href: edit_project_path(project)) - end - end - - describe 'Integrations' do - it 'has a link to the Integrations settings' do - render - - expect(rendered).to have_link('Integrations', href: project_settings_integrations_path(project)) - end - end - - describe 'WebHooks' do - it 'has a link to the WebHooks settings' do - render - - expect(rendered).to have_link('Webhooks', href: project_hooks_path(project)) - end - end - - describe 'Access Tokens' do - context 'self-managed instance' do - before do - allow(Gitlab).to receive(:com?).and_return(false) - end - - it 'has a link to the Access Tokens settings' do - render - - expect(rendered).to have_link('Access Tokens', href: project_settings_access_tokens_path(project)) - end - end - - context 'gitlab.com', :with_license do - before do - allow(Gitlab).to receive(:com?).and_return(true) - end - - it 'has a link to the Access Tokens settings' do - render - - expect(rendered).to have_link('Access Tokens', href: project_settings_access_tokens_path(project)) - end - end - end - - describe 'Repository' do - it 'has a link to the Repository settings' do - render - - expect(rendered).to have_link('Repository', href: project_settings_repository_path(project)) - end - end - - describe 'CI/CD' do - context 'when project is archived' do - before do - project.update!(archived: true) - end - - it 'does not have a link to the CI/CD settings' do - render - - expect(rendered).not_to have_link('CI/CD', href: project_settings_ci_cd_path(project)) - end - end - - context 'when project is not archived' do - it 'has a link to the CI/CD settings' do - render - - expect(rendered).to have_link('CI/CD', href: project_settings_ci_cd_path(project)) - end - end - end - - describe 'Monitor' do - context 'when project is archived' do - before do - project.update!(archived: true) - end - - it 'does not have a link to the Monitor settings' do - render - - expect(rendered).not_to have_link('Monitor', href: project_settings_operations_path(project)) - end - end - - context 'when project is not archived active' do - it 'has a link to the Monitor settings' do - render - - expect(rendered).to have_link('Monitor', href: project_settings_operations_path(project)) - end - end - end - - describe 'Pages' do - before do - stub_config(pages: { enabled: pages_enabled }) - end - - context 'when pages are enabled' do - let(:pages_enabled) { true } - - it 'has a link to the Pages settings' do - render - - expect(rendered).to have_link('Pages', href: project_pages_path(project)) - end - end - - context 'when pages are not enabled' do - let(:pages_enabled) { false } - - it 'does not have a link to the Pages settings' do - render - - expect(rendered).not_to have_link('Pages', href: project_pages_path(project)) - end - end - end - - describe 'Packages and registries' do - let(:packages_enabled) { false } - - before do - stub_container_registry_config(enabled: registry_enabled) - stub_config(packages: { enabled: packages_enabled }) - end - - context 'when registry is enabled' do - let(:registry_enabled) { true } - - it 'has a link to the Package and registry settings' do - render - - expect(rendered).to have_link('Packages and registries', href: project_settings_packages_and_registries_path(project)) - end - end - - context 'when registry is not enabled' do - let(:registry_enabled) { false } - - it 'does not have a link to the Package and registry settings' do - render - - expect(rendered).not_to have_link('Packages and registries', href: project_settings_packages_and_registries_path(project)) - end - end - - context 'when packages config is enabled' do - let(:registry_enabled) { false } - let(:packages_enabled) { true } - - it 'has a link to the Package and registry settings' do - render - - expect(rendered).to have_link('Packages and registries', href: project_settings_packages_and_registries_path(project)) - end - end - end - - describe 'Usage Quotas' do - it 'has a link to Usage Quotas' do - render - - expect(rendered).to have_link('Usage Quotas', href: project_usage_quotas_path(project)) - end - end - end - - describe 'Hidden menus' do - it 'has a link to the Activity page' do - render - - expect(rendered).to have_link('Activity', href: activity_project_path(project), class: 'shortcuts-project-activity', visible: false) - end - - it 'has a link to the Graph page' do - render - - expect(rendered).to have_link('Graph', href: project_network_path(project, current_ref), class: 'shortcuts-network', visible: false) - end - - it 'has a link to the New Issue page' do - render - - expect(rendered).to have_link('Create a new issue', href: new_project_issue_path(project), class: 'shortcuts-new-issue', visible: false) - end - - it 'has a link to the Jobs page' do - render - - expect(rendered).to have_link('Jobs', href: project_jobs_path(project), class: 'shortcuts-builds', visible: false) - end - - it 'has a link to the Commits page' do - render - - expect(rendered).to have_link('Commits', href: project_commits_path(project), class: 'shortcuts-commits', visible: false) - end - - it 'has a link to the Issue Boards page' do - render - - expect(rendered).to have_link('Issue Boards', href: project_boards_path(project), class: 'shortcuts-issue-boards', visible: false) - end - end - - it_behaves_like 'sidebar includes snowplow attributes', 'render', 'projects_side_navigation', 'projects_side_navigation' - - describe 'Collapsed menu items' do - it 'does not render the collapsed top menu as a link' do - render - - expect(rendered).not_to have_selector('.sidebar-sub-level-items > li.fly-out-top-item > a') - end - end -end diff --git a/spec/views/projects/pages/_pages_settings.html.haml_spec.rb b/spec/views/projects/pages/_pages_settings.html.haml_spec.rb index e790305da5d..ba276bc6070 100644 --- a/spec/views/projects/pages/_pages_settings.html.haml_spec.rb +++ b/spec/views/projects/pages/_pages_settings.html.haml_spec.rb @@ -42,7 +42,7 @@ RSpec.describe 'projects/pages/_pages_settings', feature_category: :pages do render - expect(rendered).to have_content('Use multiple versions') + expect(rendered).to have_content('Use multiple deployments') end end end diff --git a/spec/views/shared/nav/_sidebar.html.haml_spec.rb b/spec/views/shared/nav/_sidebar.html.haml_spec.rb deleted file mode 100644 index 0eb945f5624..00000000000 --- a/spec/views/shared/nav/_sidebar.html.haml_spec.rb +++ /dev/null @@ -1,43 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe 'shared/nav/_sidebar.html.haml' do - let_it_be(:project) { create(:project) } - - let(:context) { Sidebars::Projects::Context.new(current_user: nil, container: project) } - let(:sidebar) { Sidebars::Projects::Panel.new(context) } - - before do - assign(:project, project) - assign(:sidebar, sidebar) - - allow(sidebar).to receive(:renderable_menus).and_return([]) - end - - context 'when sidebar has a scope menu' do - it 'renders the scope menu' do - render - - expect(rendered).to render_template('shared/nav/_scope_menu') - end - end - - context 'when sidebar does not have a scope menu' do - let(:scope_menu_view_path) { 'shared/nav/' } - let(:scope_menu_view_name) { 'scope_menu.html.haml' } - let(:scope_menu_partial) { "#{scope_menu_view_path}_#{scope_menu_view_name}" } - let(:content) { 'Custom test content' } - - context 'when sidebar has a custom scope menu partial defined' do - it 'renders the custom partial' do - allow(view).to receive(:scope_menu).and_return(nil) - stub_template(scope_menu_partial => content) - - render - - expect(rendered).to have_text(content) - end - end - end -end diff --git a/spec/views/shared/runners/_runner_details.html.haml_spec.rb b/spec/views/shared/runners/_runner_details.html.haml_spec.rb index a597c719d87..0612d157ff4 100644 --- a/spec/views/shared/runners/_runner_details.html.haml_spec.rb +++ b/spec/views/shared/runners/_runner_details.html.haml_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe 'shared/runners/_runner_details.html.haml', feature_category: :runner_fleet do +RSpec.describe 'shared/runners/_runner_details.html.haml', feature_category: :fleet_visibility do include PageLayoutHelper let_it_be(:runner) do diff --git a/spec/workers/ci/runners/process_runner_version_update_worker_spec.rb b/spec/workers/ci/runners/process_runner_version_update_worker_spec.rb index 30b451f2112..64e2e8cd037 100644 --- a/spec/workers/ci/runners/process_runner_version_update_worker_spec.rb +++ b/spec/workers/ci/runners/process_runner_version_update_worker_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::Runners::ProcessRunnerVersionUpdateWorker, feature_category: :runner_fleet do +RSpec.describe Ci::Runners::ProcessRunnerVersionUpdateWorker, feature_category: :fleet_visibility do subject(:worker) { described_class.new } describe '#perform' do diff --git a/spec/workers/ci/runners/reconcile_existing_runner_versions_cron_worker_spec.rb b/spec/workers/ci/runners/reconcile_existing_runner_versions_cron_worker_spec.rb index 34b1cb33e6b..7157a3e7beb 100644 --- a/spec/workers/ci/runners/reconcile_existing_runner_versions_cron_worker_spec.rb +++ b/spec/workers/ci/runners/reconcile_existing_runner_versions_cron_worker_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::Runners::ReconcileExistingRunnerVersionsCronWorker, feature_category: :runner_fleet do +RSpec.describe Ci::Runners::ReconcileExistingRunnerVersionsCronWorker, feature_category: :fleet_visibility do subject(:worker) { described_class.new } describe '#perform' do diff --git a/spec/workers/ci/runners/stale_machines_cleanup_cron_worker_spec.rb b/spec/workers/ci/runners/stale_machines_cleanup_cron_worker_spec.rb index 79d1fadfd2b..4c5ea621191 100644 --- a/spec/workers/ci/runners/stale_machines_cleanup_cron_worker_spec.rb +++ b/spec/workers/ci/runners/stale_machines_cleanup_cron_worker_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Ci::Runners::StaleMachinesCleanupCronWorker, feature_category: :runner_fleet do +RSpec.describe Ci::Runners::StaleMachinesCleanupCronWorker, feature_category: :fleet_visibility do let(:worker) { described_class.new } describe '#perform', :freeze_time do