From b76ae638462ab0f673e5915986070518dd3f9ad3 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Thu, 19 Aug 2021 09:08:42 +0000 Subject: Add latest changes from gitlab-org/gitlab@14-2-stable-ee --- spec/lib/api/ci/helpers/runner_helpers_spec.rb | 71 ++++ spec/lib/api/ci/helpers/runner_spec.rb | 69 +++ .../packages/dependency_proxy_helpers_spec.rb | 62 ++- spec/lib/api/helpers/runner_helpers_spec.rb | 71 ---- spec/lib/api/helpers/runner_spec.rb | 69 --- spec/lib/api/helpers_spec.rb | 36 ++ spec/lib/backup/database_backup_error_spec.rb | 30 ++ spec/lib/backup/file_backup_error_spec.rb | 35 ++ spec/lib/backup/gitaly_backup_spec.rb | 10 +- spec/lib/backup/manager_spec.rb | 81 +++- spec/lib/backup/repository_backup_error_spec.rb | 42 ++ .../references/alert_reference_filter_spec.rb | 29 ++ .../references/commit_reference_filter_spec.rb | 30 ++ .../references/milestone_reference_filter_spec.rb | 5 + .../references/project_reference_filter_spec.rb | 30 ++ .../filter/table_of_contents_tag_filter_spec.rb | 38 +- spec/lib/banzai/pipeline/full_pipeline_spec.rb | 46 +- spec/lib/banzai/pipeline/wiki_pipeline_spec.rb | 19 +- .../collector/sentry_auth_parser_spec.rb | 32 ++ spec/lib/extracts_path_spec.rb | 16 - spec/lib/feature/gitaly_spec.rb | 2 +- spec/lib/feature_spec.rb | 4 +- .../gitlab/usage_metric_generator_spec.rb | 38 +- .../cycle_analytics/records_fetcher_spec.rb | 50 --- spec/lib/gitlab/auth/auth_finders_spec.rb | 12 - spec/lib/gitlab/auth/result_spec.rb | 79 ++++ spec/lib/gitlab/auth_spec.rb | 196 +++++---- ...backfill_draft_status_on_merge_requests_spec.rb | 9 +- .../backfill_integrations_type_new_spec.rb | 56 +++ .../backfill_snippet_repositories_spec.rb | 2 +- ...opy_ci_builds_columns_to_security_scans_spec.rb | 51 +++ ...culate_vulnerabilities_occurrences_uuid_spec.rb | 11 +- spec/lib/gitlab/background_migration_spec.rb | 66 +-- .../bitbucket_server_import/importer_spec.rb | 3 +- spec/lib/gitlab/checks/changes_access_spec.rb | 201 ++++++++- .../gitlab/checks/matching_merge_request_spec.rb | 3 +- .../lib/gitlab/checks/single_change_access_spec.rb | 47 +++ spec/lib/gitlab/ci/ansi2html_spec.rb | 4 + spec/lib/gitlab/ci/build/auto_retry_spec.rb | 20 +- spec/lib/gitlab/ci/config/entry/bridge_spec.rb | 3 - .../ci/config/entry/include/rules/rule_spec.rb | 90 ++++ .../gitlab/ci/config/entry/include/rules_spec.rb | 98 +++++ spec/lib/gitlab/ci/config/entry/include_spec.rb | 40 +- .../ci/config/entry/inherit/variables_spec.rb | 15 - spec/lib/gitlab/ci/config/entry/job_spec.rb | 15 - spec/lib/gitlab/ci/config/entry/jobs_spec.rb | 2 - .../lib/gitlab/ci/config/entry/processable_spec.rb | 71 ---- spec/lib/gitlab/ci/config/entry/root_spec.rb | 5 - spec/lib/gitlab/ci/config/entry/rules_spec.rb | 72 +++- spec/lib/gitlab/ci/config/external/mapper_spec.rb | 50 ++- spec/lib/gitlab/ci/config/external/rules_spec.rb | 35 ++ .../ci/config/normalizer/matrix_strategy_spec.rb | 16 - spec/lib/gitlab/ci/config/normalizer_spec.rb | 10 +- spec/lib/gitlab/ci/config_spec.rb | 88 +++- spec/lib/gitlab/ci/lint_spec.rb | 11 +- spec/lib/gitlab/ci/parsers/security/common_spec.rb | 350 +++++++++++++++ spec/lib/gitlab/ci/parsers/security/sast_spec.rb | 57 +++ .../ci/parsers/security/secret_detection_spec.rb | 54 +++ .../security/validators/schema_validator_spec.rb | 40 ++ spec/lib/gitlab/ci/pipeline/chain/command_spec.rb | 25 -- .../ci/pipeline/chain/limit/deployments_spec.rb | 2 +- spec/lib/gitlab/ci/pipeline/chain/sequence_spec.rb | 17 +- .../ci/reports/security/aggregated_report_spec.rb | 45 ++ .../gitlab/ci/reports/security/finding_key_spec.rb | 41 ++ .../ci/reports/security/finding_signature_spec.rb | 59 +++ .../ci/reports/security/locations/sast_spec.rb | 21 + .../security/locations/secret_detection_spec.rb | 21 + spec/lib/gitlab/ci/reports/security/report_spec.rb | 224 ++++++++++ .../lib/gitlab/ci/reports/security/reports_spec.rb | 113 +++++ .../vulnerability_reports_comparer_spec.rb | 163 +++++++ .../5_minute_production_app_ci_yaml_spec.rb | 2 +- .../AWS/deploy_ecs_gitlab_ci_yaml_spec.rb | 2 +- .../ci/templates/Jobs/build_gitlab_ci_yaml_spec.rb | 4 +- .../Jobs/code_quality_gitlab_ci_yaml_spec.rb | 4 +- .../templates/Jobs/deploy_gitlab_ci_yaml_spec.rb | 4 +- .../ci/templates/Jobs/test_gitlab_ci_yaml_spec.rb | 4 +- .../Terraform/base_gitlab_ci_yaml_spec.rb | 6 +- .../Terraform/base_latest_gitlab_ci_yaml_spec.rb | 26 ++ ...load_performance_testing_gitlab_ci_yaml_spec.rb | 4 +- .../templates/auto_devops_gitlab_ci_yaml_spec.rb | 4 +- .../ci/templates/flutter_gitlab_ci_yaml_spec.rb | 2 +- ...ged_cluster_applications_gitlab_ci_yaml_spec.rb | 2 +- spec/lib/gitlab/ci/templates/npm_spec.rb | 2 +- .../ci/templates/terraform_gitlab_ci_yaml_spec.rb | 46 ++ .../terraform_latest_gitlab_ci_yaml_spec.rb | 8 +- spec/lib/gitlab/ci/yaml_processor_spec.rb | 116 +---- .../external_database_checker_spec.rb | 6 +- spec/lib/gitlab/conflict/file_spec.rb | 35 ++ .../content_security_policy/config_loader_spec.rb | 52 ++- spec/lib/gitlab/data_builder/deployment_spec.rb | 1 + spec/lib/gitlab/data_builder/pipeline_spec.rb | 85 +++- .../database/async_indexes/index_creator_spec.rb | 50 +++ .../async_indexes/migration_helpers_spec.rb | 176 ++++++++ .../async_indexes/postgres_async_index_spec.rb | 17 + spec/lib/gitlab/database/async_indexes_spec.rb | 23 + spec/lib/gitlab/database/connection_spec.rb | 467 +++++++++++++++++++++ .../load_balancing/connection_proxy_spec.rb | 30 +- .../database/load_balancing/host_list_spec.rb | 84 +--- .../gitlab/database/load_balancing/host_spec.rb | 15 +- .../database/load_balancing/load_balancer_spec.rb | 247 +++-------- .../load_balancing/rack_middleware_spec.rb | 9 +- .../load_balancing/service_discovery_spec.rb | 67 +-- .../database/load_balancing/sticking_spec.rb | 16 +- spec/lib/gitlab/database/load_balancing_spec.rb | 150 +++---- spec/lib/gitlab/database/migration_helpers_spec.rb | 108 +++-- .../background_migration_helpers_spec.rb | 97 +++++ .../database/migrations/instrumentation_spec.rb | 47 ++- .../migrations/observers/query_details_spec.rb | 11 +- .../migrations/observers/query_log_spec.rb | 12 +- .../migrations/observers/query_statistics_spec.rb | 8 +- .../observers/total_database_size_change_spec.rb | 8 +- .../database/multi_threaded_migration_spec.rb | 43 -- .../detached_partition_dropper_spec.rb | 181 ++++++++ .../database/partitioning/monthly_strategy_spec.rb | 20 - .../partitioning/partition_manager_spec.rb | 143 ++++++- .../partitioning/partition_monitoring_spec.rb | 12 +- .../gitlab/database/postgres_foreign_key_spec.rb | 41 ++ spec/lib/gitlab/database/postgres_index_spec.rb | 31 ++ spec/lib/gitlab/database/reindexing_spec.rb | 29 +- .../database/schema_migrations/context_spec.rb | 61 ++- .../gitlab/database/transaction/context_spec.rb | 144 +++++++ .../gitlab/database/transaction/observer_spec.rb | 57 +++ .../with_lock_retries_outside_transaction_spec.rb | 10 +- spec/lib/gitlab/database/with_lock_retries_spec.rb | 11 +- spec/lib/gitlab/database_spec.rb | 416 +----------------- .../email/handler/create_note_handler_spec.rb | 54 +++ .../in_product_marketing/admin_verify_spec.rb | 45 ++ .../in_product_marketing/team_short_spec.rb | 47 +++ .../message/in_product_marketing/team_spec.rb | 40 ++ .../in_product_marketing/trial_short_spec.rb | 45 ++ .../message/in_product_marketing/trial_spec.rb | 20 + spec/lib/gitlab/email/reply_parser_spec.rb | 16 + spec/lib/gitlab/encoding_helper_spec.rb | 18 + .../stack_trace_highlight_decorator_spec.rb | 2 +- .../lib/gitlab/etag_caching/router/restful_spec.rb | 8 +- .../experimentation/controller_concern_spec.rb | 16 +- spec/lib/gitlab/experimentation_spec.rb | 16 - spec/lib/gitlab/fake_application_settings_spec.rb | 16 +- .../form_builders/gitlab_ui_form_builder_spec.rb | 88 ++++ spec/lib/gitlab/git/commit_spec.rb | 12 +- spec/lib/gitlab/git/commit_stats_spec.rb | 30 ++ spec/lib/gitlab/git/conflict/file_spec.rb | 16 +- spec/lib/gitlab/git/remote_mirror_spec.rb | 25 +- spec/lib/gitlab/git/repository_spec.rb | 202 +++------ spec/lib/gitlab/git/tag_spec.rb | 83 +++- spec/lib/gitlab/git/tree_spec.rb | 86 ++-- spec/lib/gitlab/git_access_snippet_spec.rb | 19 +- .../gitlab/gitaly_client/commit_service_spec.rb | 113 ++++- .../gitaly_client/conflict_files_stitcher_spec.rb | 25 +- .../gitlab/gitaly_client/conflicts_service_spec.rb | 25 +- spec/lib/gitlab/gitaly_client/ref_service_spec.rb | 11 + .../gitlab/gitaly_client/remote_service_spec.rb | 62 +-- .../gitaly_client/repository_service_spec.rb | 153 ++++--- .../gitlab/github_import/bulk_importing_spec.rb | 76 +++- .../importer/diff_note_importer_spec.rb | 8 +- .../github_import/importer/issue_importer_spec.rb | 2 +- .../importer/label_links_importer_spec.rb | 4 +- .../importer/lfs_objects_importer_spec.rb | 26 +- .../github_import/importer/note_importer_spec.rb | 8 +- .../importer/pull_requests_importer_spec.rb | 28 +- .../pull_requests_reviews_importer_spec.rb | 120 ++---- .../importer/repository_importer_spec.rb | 59 +-- spec/lib/gitlab/github_import/logger_spec.rb | 41 ++ .../gitlab/github_import/object_counter_spec.rb | 18 +- .../github_import/parallel_scheduling_spec.rb | 146 +++++-- spec/lib/gitlab/github_import/user_finder_spec.rb | 29 +- .../grape_logging/loggers/perf_logger_spec.rb | 23 +- .../graphql/calls_gitaly/field_extension_spec.rb | 2 +- .../gitlab/graphql/copy_field_description_spec.rb | 2 +- spec/lib/gitlab/graphql/markdown_field_spec.rb | 2 +- spec/lib/gitlab/graphql/mount_mutation_spec.rb | 4 +- .../lib/gitlab/graphql/negatable_arguments_spec.rb | 6 +- .../gitlab/graphql/pagination/connections_spec.rb | 2 +- .../gitlab/graphql/present/field_extension_spec.rb | 16 +- spec/lib/gitlab/graphql/queries_spec.rb | 24 +- spec/lib/gitlab/highlight_spec.rb | 7 - spec/lib/gitlab/http_spec.rb | 62 ++- spec/lib/gitlab/import/database_helpers_spec.rb | 2 +- .../gitlab/import/import_failure_service_spec.rb | 136 ++++++ spec/lib/gitlab/import/logger_spec.rb | 39 ++ spec/lib/gitlab/import_export/all_models.yml | 6 +- .../import_export/fast_hash_serializer_spec.rb | 2 +- .../group/legacy_tree_restorer_spec.rb | 2 +- .../import_export/group/tree_restorer_spec.rb | 2 +- .../import_export/import_test_coverage_spec.rb | 2 +- .../json/streaming_serializer_spec.rb | 35 ++ .../gitlab/import_export/members_mapper_spec.rb | 5 +- .../import_export/project/tree_saver_spec.rb | 2 +- .../instrumentation/redis_interceptor_spec.rb | 31 ++ spec/lib/gitlab/instrumentation_helper_spec.rb | 8 +- .../gitlab/jira_import/issue_serializer_spec.rb | 13 + spec/lib/gitlab/json_cache_spec.rb | 6 +- spec/lib/gitlab/kas_spec.rb | 32 ++ .../gitlab/kubernetes/default_namespace_spec.rb | 30 +- .../kubernetes/kubeconfig/entry/cluster_spec.rb | 23 + .../kubernetes/kubeconfig/entry/context_spec.rb | 23 + .../kubernetes/kubeconfig/entry/user_spec.rb | 14 + .../gitlab/kubernetes/kubeconfig/template_spec.rb | 84 ++++ .../markdown_cache/active_record/extension_spec.rb | 62 +++ .../metrics/samplers/database_sampler_spec.rb | 4 +- .../metrics/subscribers/action_cable_spec.rb | 2 +- .../metrics/subscribers/active_record_spec.rb | 7 +- spec/lib/gitlab/middleware/multipart_spec.rb | 3 +- spec/lib/gitlab/object_hierarchy_spec.rb | 4 +- spec/lib/gitlab/pagination/keyset/order_spec.rb | 87 +++- .../active_support_subscriber_spec.rb | 2 +- spec/lib/gitlab/repository_set_cache_spec.rb | 6 - spec/lib/gitlab/search_results_spec.rb | 4 + spec/lib/gitlab/setup_helper/workhorse_spec.rb | 24 ++ spec/lib/gitlab/sidekiq_cluster/cli_spec.rb | 23 +- .../gitlab/sidekiq_config/worker_router_spec.rb | 7 + spec/lib/gitlab/sidekiq_config/worker_spec.rb | 8 +- spec/lib/gitlab/sidekiq_config_spec.rb | 2 +- .../sidekiq_logging/structured_logger_spec.rb | 57 +-- .../sidekiq_middleware/server_metrics_spec.rb | 1 - spec/lib/gitlab/sql/cte_spec.rb | 8 +- spec/lib/gitlab/sql/glob_spec.rb | 4 +- spec/lib/gitlab/sql/recursive_cte_spec.rb | 12 +- spec/lib/gitlab/subscription_portal_spec.rb | 2 +- spec/lib/gitlab/usage/docs/helper_spec.rb | 79 ---- spec/lib/gitlab/usage/docs/renderer_spec.rb | 24 -- spec/lib/gitlab/usage/docs/value_formatter_spec.rb | 26 -- spec/lib/gitlab/usage/metric_definition_spec.rb | 12 +- spec/lib/gitlab/usage/metric_spec.rb | 51 ++- .../collected_data_categories_metric_spec.rb | 2 +- .../instrumentations/database_metric_spec.rb | 68 ++- .../instrumentations/generic_metric_spec.rb | 72 ++++ .../metrics/instrumentations/redis_metric_spec.rb | 23 + .../metrics/names_suggestions/generator_spec.rb | 8 + .../ci_template_unique_counter_spec.rb | 2 +- .../usage_data_counters/hll_redis_counter_spec.rb | 4 +- .../usage_data_counters/redis_counter_spec.rb | 10 +- spec/lib/gitlab/usage_data_metrics_spec.rb | 44 +- spec/lib/gitlab/usage_data_non_sql_metrics_spec.rb | 8 + spec/lib/gitlab/usage_data_queries_spec.rb | 8 + spec/lib/gitlab/usage_data_spec.rb | 25 +- spec/lib/gitlab/utils/usage_data_spec.rb | 16 +- .../lib/gitlab/web_ide/config/entry/global_spec.rb | 1 - .../gitlab/web_ide/config/entry/terminal_spec.rb | 1 - spec/lib/gitlab/x509/tag_spec.rb | 20 +- spec/lib/peek/views/active_record_spec.rb | 57 ++- spec/lib/sidebars/groups/menus/ci_cd_menu_spec.rb | 40 ++ .../groups/menus/group_information_menu_spec.rb | 64 +++ spec/lib/sidebars/groups/menus/issues_menu_spec.rb | 54 +++ .../sidebars/groups/menus/kubernetes_menu_spec.rb | 32 ++ .../groups/menus/merge_requests_menu_spec.rb | 36 ++ .../groups/menus/packages_registries_menu_spec.rb | 163 +++++++ .../sidebars/groups/menus/settings_menu_spec.rb | 97 +++++ spec/lib/sidebars/menu_spec.rb | 8 + .../menus/packages_registries_menu_spec.rb | 22 +- 250 files changed, 7948 insertions(+), 2747 deletions(-) create mode 100644 spec/lib/api/ci/helpers/runner_helpers_spec.rb create mode 100644 spec/lib/api/ci/helpers/runner_spec.rb delete mode 100644 spec/lib/api/helpers/runner_helpers_spec.rb delete mode 100644 spec/lib/api/helpers/runner_spec.rb create mode 100644 spec/lib/backup/database_backup_error_spec.rb create mode 100644 spec/lib/backup/file_backup_error_spec.rb create mode 100644 spec/lib/backup/repository_backup_error_spec.rb create mode 100644 spec/lib/error_tracking/collector/sentry_auth_parser_spec.rb create mode 100644 spec/lib/gitlab/auth/result_spec.rb create mode 100644 spec/lib/gitlab/background_migration/backfill_integrations_type_new_spec.rb create mode 100644 spec/lib/gitlab/background_migration/copy_ci_builds_columns_to_security_scans_spec.rb create mode 100644 spec/lib/gitlab/ci/config/entry/include/rules/rule_spec.rb create mode 100644 spec/lib/gitlab/ci/config/entry/include/rules_spec.rb create mode 100644 spec/lib/gitlab/ci/config/external/rules_spec.rb create mode 100644 spec/lib/gitlab/ci/parsers/security/common_spec.rb create mode 100644 spec/lib/gitlab/ci/parsers/security/sast_spec.rb create mode 100644 spec/lib/gitlab/ci/parsers/security/secret_detection_spec.rb create mode 100644 spec/lib/gitlab/ci/parsers/security/validators/schema_validator_spec.rb create mode 100644 spec/lib/gitlab/ci/reports/security/aggregated_report_spec.rb create mode 100644 spec/lib/gitlab/ci/reports/security/finding_key_spec.rb create mode 100644 spec/lib/gitlab/ci/reports/security/finding_signature_spec.rb create mode 100644 spec/lib/gitlab/ci/reports/security/locations/sast_spec.rb create mode 100644 spec/lib/gitlab/ci/reports/security/locations/secret_detection_spec.rb create mode 100644 spec/lib/gitlab/ci/reports/security/report_spec.rb create mode 100644 spec/lib/gitlab/ci/reports/security/reports_spec.rb create mode 100644 spec/lib/gitlab/ci/reports/security/vulnerability_reports_comparer_spec.rb create mode 100644 spec/lib/gitlab/ci/templates/Terraform/base_latest_gitlab_ci_yaml_spec.rb create mode 100644 spec/lib/gitlab/ci/templates/terraform_gitlab_ci_yaml_spec.rb create mode 100644 spec/lib/gitlab/database/async_indexes/index_creator_spec.rb create mode 100644 spec/lib/gitlab/database/async_indexes/migration_helpers_spec.rb create mode 100644 spec/lib/gitlab/database/async_indexes/postgres_async_index_spec.rb create mode 100644 spec/lib/gitlab/database/async_indexes_spec.rb create mode 100644 spec/lib/gitlab/database/connection_spec.rb delete mode 100644 spec/lib/gitlab/database/multi_threaded_migration_spec.rb create mode 100644 spec/lib/gitlab/database/partitioning/detached_partition_dropper_spec.rb create mode 100644 spec/lib/gitlab/database/postgres_foreign_key_spec.rb create mode 100644 spec/lib/gitlab/database/transaction/context_spec.rb create mode 100644 spec/lib/gitlab/database/transaction/observer_spec.rb create mode 100644 spec/lib/gitlab/email/message/in_product_marketing/admin_verify_spec.rb create mode 100644 spec/lib/gitlab/email/message/in_product_marketing/team_short_spec.rb create mode 100644 spec/lib/gitlab/email/message/in_product_marketing/trial_short_spec.rb create mode 100644 spec/lib/gitlab/form_builders/gitlab_ui_form_builder_spec.rb create mode 100644 spec/lib/gitlab/git/commit_stats_spec.rb create mode 100644 spec/lib/gitlab/github_import/logger_spec.rb create mode 100644 spec/lib/gitlab/import/import_failure_service_spec.rb create mode 100644 spec/lib/gitlab/import/logger_spec.rb create mode 100644 spec/lib/gitlab/kubernetes/kubeconfig/entry/cluster_spec.rb create mode 100644 spec/lib/gitlab/kubernetes/kubeconfig/entry/context_spec.rb create mode 100644 spec/lib/gitlab/kubernetes/kubeconfig/entry/user_spec.rb create mode 100644 spec/lib/gitlab/kubernetes/kubeconfig/template_spec.rb delete mode 100644 spec/lib/gitlab/usage/docs/helper_spec.rb delete mode 100644 spec/lib/gitlab/usage/docs/renderer_spec.rb delete mode 100644 spec/lib/gitlab/usage/docs/value_formatter_spec.rb create mode 100644 spec/lib/gitlab/usage/metrics/instrumentations/generic_metric_spec.rb create mode 100644 spec/lib/gitlab/usage/metrics/instrumentations/redis_metric_spec.rb create mode 100644 spec/lib/sidebars/groups/menus/ci_cd_menu_spec.rb create mode 100644 spec/lib/sidebars/groups/menus/group_information_menu_spec.rb create mode 100644 spec/lib/sidebars/groups/menus/issues_menu_spec.rb create mode 100644 spec/lib/sidebars/groups/menus/kubernetes_menu_spec.rb create mode 100644 spec/lib/sidebars/groups/menus/merge_requests_menu_spec.rb create mode 100644 spec/lib/sidebars/groups/menus/packages_registries_menu_spec.rb create mode 100644 spec/lib/sidebars/groups/menus/settings_menu_spec.rb (limited to 'spec/lib') diff --git a/spec/lib/api/ci/helpers/runner_helpers_spec.rb b/spec/lib/api/ci/helpers/runner_helpers_spec.rb new file mode 100644 index 00000000000..c6638bea59e --- /dev/null +++ b/spec/lib/api/ci/helpers/runner_helpers_spec.rb @@ -0,0 +1,71 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe API::Ci::Helpers::Runner do + let(:ip_address) { '1.2.3.4' } + let(:runner_class) do + Class.new do + include API::Helpers + include API::Ci::Helpers::Runner + + attr_accessor :params + + def initialize(params) + @params = params + end + + def ip_address + '1.2.3.4' + end + end + end + + let(:runner_helper) { runner_class.new(runner_params) } + + describe '#get_runner_details_from_request' do + context 'when no runner info is present' do + let(:runner_params) { {} } + + it 'returns the runner IP' do + expect(runner_helper.get_runner_details_from_request).to eq({ ip_address: ip_address }) + end + end + + context 'when runner info is present' do + let(:name) { 'runner' } + let(:version) { '1.2.3' } + let(:revision) { '10.0' } + let(:platform) { 'test' } + let(:architecture) { 'arm' } + let(:config) { { 'gpus' => 'all' } } + let(:runner_params) do + { + 'info' => + { + 'name' => name, + 'version' => version, + 'revision' => revision, + 'platform' => platform, + 'architecture' => architecture, + 'config' => config, + 'ignored' => 1 + } + } + end + + subject(:details) { runner_helper.get_runner_details_from_request } + + it 'extracts the runner details', :aggregate_failures do + expect(details.keys).to match_array(%w(name version revision platform architecture config ip_address)) + expect(details['name']).to eq(name) + expect(details['version']).to eq(version) + expect(details['revision']).to eq(revision) + expect(details['platform']).to eq(platform) + expect(details['architecture']).to eq(architecture) + expect(details['config']).to eq(config) + expect(details['ip_address']).to eq(ip_address) + end + end + end +end diff --git a/spec/lib/api/ci/helpers/runner_spec.rb b/spec/lib/api/ci/helpers/runner_spec.rb new file mode 100644 index 00000000000..99f2db544a5 --- /dev/null +++ b/spec/lib/api/ci/helpers/runner_spec.rb @@ -0,0 +1,69 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe API::Ci::Helpers::Runner do + let(:helper) { Class.new { include API::Ci::Helpers::Runner }.new } + + before do + allow(helper).to receive(:env).and_return({}) + end + + describe '#current_job' do + let(:build) { create(:ci_build, :running) } + + it 'handles sticking of a build when a build ID is specified' do + allow(helper).to receive(:params).and_return(id: build.id) + + expect(Gitlab::Database::LoadBalancing::RackMiddleware) + .to receive(:stick_or_unstick) + .with({}, :build, build.id) + + helper.current_job + end + + it 'does not handle sticking if no build ID was specified' do + allow(helper).to receive(:params).and_return({}) + + expect(Gitlab::Database::LoadBalancing::RackMiddleware) + .not_to receive(:stick_or_unstick) + + helper.current_job + end + + it 'returns the build if one could be found' do + allow(helper).to receive(:params).and_return(id: build.id) + + expect(helper.current_job).to eq(build) + end + end + + describe '#current_runner' do + let(:runner) { create(:ci_runner, token: 'foo') } + + it 'handles sticking of a runner if a token is specified' do + allow(helper).to receive(:params).and_return(token: runner.token) + + expect(Gitlab::Database::LoadBalancing::RackMiddleware) + .to receive(:stick_or_unstick) + .with({}, :runner, runner.token) + + helper.current_runner + end + + it 'does not handle sticking if no token was specified' do + allow(helper).to receive(:params).and_return({}) + + expect(Gitlab::Database::LoadBalancing::RackMiddleware) + .not_to receive(:stick_or_unstick) + + helper.current_runner + end + + it 'returns the runner if one could be found' do + allow(helper).to receive(:params).and_return(token: runner.token) + + expect(helper.current_runner).to eq(runner) + end + end +end diff --git a/spec/lib/api/helpers/packages/dependency_proxy_helpers_spec.rb b/spec/lib/api/helpers/packages/dependency_proxy_helpers_spec.rb index 99b52236771..ae0c0f53acd 100644 --- a/spec/lib/api/helpers/packages/dependency_proxy_helpers_spec.rb +++ b/spec/lib/api/helpers/packages/dependency_proxy_helpers_spec.rb @@ -5,7 +5,7 @@ require 'spec_helper' RSpec.describe API::Helpers::Packages::DependencyProxyHelpers do let_it_be(:helper) { Class.new.include(described_class).new } - describe 'redirect_registry_request' do + describe '#redirect_registry_request' do using RSpec::Parameterized::TableSyntax let(:options) { {} } @@ -13,7 +13,7 @@ RSpec.describe API::Helpers::Packages::DependencyProxyHelpers do subject { helper.redirect_registry_request(forward_to_registry, package_type, options) { helper.fallback } } before do - allow(helper).to receive(:options).and_return(for: API::NpmInstancePackages) + allow(helper).to receive(:options).and_return(for: described_class) end shared_examples 'executing fallback' do @@ -34,38 +34,66 @@ RSpec.describe API::Helpers::Packages::DependencyProxyHelpers do subject - expect_snowplow_event(category: 'API::NpmInstancePackages', action: 'npm_request_forward') + expect_snowplow_event(category: described_class.to_s, action: "#{package_type}_request_forward") end end - context 'with npm packages' do - let(:package_type) { :npm } + %i[npm pypi].each do |forwardable_package_type| + context "with #{forwardable_package_type} packages" do + include_context 'dependency proxy helpers context' - where(:application_setting, :forward_to_registry, :example_name) do - true | true | 'executing redirect' - true | false | 'executing fallback' - false | true | 'executing fallback' - false | false | 'executing fallback' - end + let(:package_type) { forwardable_package_type } - with_them do - before do - stub_application_setting(npm_package_requests_forwarding: application_setting) + where(:application_setting, :forward_to_registry, :example_name) do + true | true | 'executing redirect' + true | false | 'executing fallback' + false | true | 'executing fallback' + false | false | 'executing fallback' end - it_behaves_like params[:example_name] + with_them do + before do + allow_fetch_application_setting(attribute: "#{forwardable_package_type}_package_requests_forwarding", return_value: application_setting) + end + + it_behaves_like params[:example_name] + end end end - context 'with non-forwardable packages' do + context 'with non-forwardable package type' do let(:forward_to_registry) { true } before do stub_application_setting(npm_package_requests_forwarding: true) + stub_application_setting(pypi_package_requests_forwarding: true) end - Packages::Package.package_types.keys.without('npm').each do |pkg_type| + Packages::Package.package_types.keys.without('npm', 'pypi').each do |pkg_type| context "#{pkg_type}" do + let(:package_type) { pkg_type.to_sym } + + it 'raises an error' do + expect { subject }.to raise_error(ArgumentError, "Can't find application setting for package_type #{package_type}") + end + end + end + end + + describe '#registry_url' do + subject { helper.registry_url(package_type, package_name: 'test') } + + where(:package_type, :expected_result) do + :npm | 'https://registry.npmjs.org/test' + :pypi | 'https://pypi.org/simple/test/' + end + + with_them do + it { is_expected.to eq(expected_result) } + end + + Packages::Package.package_types.keys.without('npm', 'pypi').each do |pkg_type| + context "with non-forwardable package type #{pkg_type}" do let(:package_type) { pkg_type } it 'raises an error' do diff --git a/spec/lib/api/helpers/runner_helpers_spec.rb b/spec/lib/api/helpers/runner_helpers_spec.rb deleted file mode 100644 index 65b35845aab..00000000000 --- a/spec/lib/api/helpers/runner_helpers_spec.rb +++ /dev/null @@ -1,71 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe API::Helpers::Runner do - let(:ip_address) { '1.2.3.4' } - let(:runner_class) do - Class.new do - include API::Helpers - include API::Helpers::Runner - - attr_accessor :params - - def initialize(params) - @params = params - end - - def ip_address - '1.2.3.4' - end - end - end - - let(:runner_helper) { runner_class.new(runner_params) } - - describe '#get_runner_details_from_request' do - context 'when no runner info is present' do - let(:runner_params) { {} } - - it 'returns the runner IP' do - expect(runner_helper.get_runner_details_from_request).to eq({ ip_address: ip_address }) - end - end - - context 'when runner info is present' do - let(:name) { 'runner' } - let(:version) { '1.2.3' } - let(:revision) { '10.0' } - let(:platform) { 'test' } - let(:architecture) { 'arm' } - let(:config) { { 'gpus' => 'all' } } - let(:runner_params) do - { - 'info' => - { - 'name' => name, - 'version' => version, - 'revision' => revision, - 'platform' => platform, - 'architecture' => architecture, - 'config' => config, - 'ignored' => 1 - } - } - end - - subject(:details) { runner_helper.get_runner_details_from_request } - - it 'extracts the runner details', :aggregate_failures do - expect(details.keys).to match_array(%w(name version revision platform architecture config ip_address)) - expect(details['name']).to eq(name) - expect(details['version']).to eq(version) - expect(details['revision']).to eq(revision) - expect(details['platform']).to eq(platform) - expect(details['architecture']).to eq(architecture) - expect(details['config']).to eq(config) - expect(details['ip_address']).to eq(ip_address) - end - end - end -end diff --git a/spec/lib/api/helpers/runner_spec.rb b/spec/lib/api/helpers/runner_spec.rb deleted file mode 100644 index e55c20b7ab6..00000000000 --- a/spec/lib/api/helpers/runner_spec.rb +++ /dev/null @@ -1,69 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe API::Helpers::Runner do - let(:helper) { Class.new { include API::Helpers::Runner }.new } - - before do - allow(helper).to receive(:env).and_return({}) - end - - describe '#current_job' do - let(:build) { create(:ci_build, :running) } - - it 'handles sticking of a build when a build ID is specified' do - allow(helper).to receive(:params).and_return(id: build.id) - - expect(Gitlab::Database::LoadBalancing::RackMiddleware) - .to receive(:stick_or_unstick) - .with({}, :build, build.id) - - helper.current_job - end - - it 'does not handle sticking if no build ID was specified' do - allow(helper).to receive(:params).and_return({}) - - expect(Gitlab::Database::LoadBalancing::RackMiddleware) - .not_to receive(:stick_or_unstick) - - helper.current_job - end - - it 'returns the build if one could be found' do - allow(helper).to receive(:params).and_return(id: build.id) - - expect(helper.current_job).to eq(build) - end - end - - describe '#current_runner' do - let(:runner) { create(:ci_runner, token: 'foo') } - - it 'handles sticking of a runner if a token is specified' do - allow(helper).to receive(:params).and_return(token: runner.token) - - expect(Gitlab::Database::LoadBalancing::RackMiddleware) - .to receive(:stick_or_unstick) - .with({}, :runner, runner.token) - - helper.current_runner - end - - it 'does not handle sticking if no token was specified' do - allow(helper).to receive(:params).and_return({}) - - expect(Gitlab::Database::LoadBalancing::RackMiddleware) - .not_to receive(:stick_or_unstick) - - helper.current_runner - end - - it 'returns the runner if one could be found' do - allow(helper).to receive(:params).and_return(token: runner.token) - - expect(helper.current_runner).to eq(runner) - end - end -end diff --git a/spec/lib/api/helpers_spec.rb b/spec/lib/api/helpers_spec.rb index 6e48ee4c315..587fe60860a 100644 --- a/spec/lib/api/helpers_spec.rb +++ b/spec/lib/api/helpers_spec.rb @@ -581,4 +581,40 @@ RSpec.describe API::Helpers do end end end + + describe '#order_by_similarity?' do + where(:params, :allow_unauthorized, :current_user_set, :expected) do + {} | false | false | false + {} | true | false | false + {} | false | true | false + {} | true | true | false + { order_by: 'similarity' } | false | false | false + { order_by: 'similarity' } | true | false | false + { order_by: 'similarity' } | true | true | false + { order_by: 'similarity' } | false | true | false + { search: 'test' } | false | false | false + { search: 'test' } | true | false | false + { search: 'test' } | true | true | false + { search: 'test' } | false | true | false + { order_by: 'similarity', search: 'test' } | false | false | false + { order_by: 'similarity', search: 'test' } | true | false | true + { order_by: 'similarity', search: 'test' } | true | true | true + { order_by: 'similarity', search: 'test' } | false | true | true + end + + with_them do + let_it_be(:user) { create(:user) } + + before do + u = current_user_set ? user : nil + subject.instance_variable_set(:@current_user, u) + + allow(subject).to receive(:params).and_return(params) + end + + it 'returns the expected result' do + expect(subject.order_by_similarity?(allow_unauthorized: allow_unauthorized)).to eq(expected) + end + end + end end diff --git a/spec/lib/backup/database_backup_error_spec.rb b/spec/lib/backup/database_backup_error_spec.rb new file mode 100644 index 00000000000..ef627900050 --- /dev/null +++ b/spec/lib/backup/database_backup_error_spec.rb @@ -0,0 +1,30 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Backup::DatabaseBackupError do + let(:config) do + { + host: 'localhost', + port: 5432, + database: 'gitlabhq_test' + } + end + + let(:db_file_name) { File.join(Gitlab.config.backup.path, 'db', 'database.sql.gz') } + + subject { described_class.new(config, db_file_name) } + + it { is_expected.to respond_to :config } + it { is_expected.to respond_to :db_file_name } + + it 'expects exception message to include database file' do + expect(subject.message).to include("#{db_file_name}") + end + + it 'expects exception message to include database paths being back-up' do + expect(subject.message).to include("#{config[:host]}") + expect(subject.message).to include("#{config[:port]}") + expect(subject.message).to include("#{config[:database]}") + end +end diff --git a/spec/lib/backup/file_backup_error_spec.rb b/spec/lib/backup/file_backup_error_spec.rb new file mode 100644 index 00000000000..bb174bbe4a0 --- /dev/null +++ b/spec/lib/backup/file_backup_error_spec.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Backup::FileBackupError do + let_it_be(:lfs) { create(:lfs_object) } + let_it_be(:upload) { create(:upload) } + + let(:backup_tarball) { '/tmp/backup/uploads' } + + shared_examples 'includes backup path' do + it { is_expected.to respond_to :app_files_dir } + it { is_expected.to respond_to :backup_tarball } + + it 'expects exception message to include file backup path location' do + expect(subject.message).to include("#{subject.backup_tarball}") + end + + it 'expects exception message to include file being back-up' do + expect(subject.message).to include("#{subject.app_files_dir}") + end + end + + context 'with lfs file' do + subject { described_class.new(lfs, backup_tarball) } + + it_behaves_like 'includes backup path' + end + + context 'with uploads file' do + subject { described_class.new(upload, backup_tarball) } + + it_behaves_like 'includes backup path' + end +end diff --git a/spec/lib/backup/gitaly_backup_spec.rb b/spec/lib/backup/gitaly_backup_spec.rb index cdb35c0ce01..a48a1752eff 100644 --- a/spec/lib/backup/gitaly_backup_spec.rb +++ b/spec/lib/backup/gitaly_backup_spec.rb @@ -32,7 +32,7 @@ RSpec.describe Backup::GitalyBackup do project_snippet = create(:project_snippet, :repository, project: project) personal_snippet = create(:personal_snippet, :repository, author: project.owner) - expect(Process).to receive(:spawn).with(anything, 'create', '-path', anything, { in: anything, out: progress }).and_call_original + expect(Open3).to receive(:popen2).with(ENV, anything, 'create', '-path', anything).and_call_original subject.start(:create) subject.enqueue(project, Gitlab::GlRepository::PROJECT) @@ -53,7 +53,7 @@ RSpec.describe Backup::GitalyBackup do let(:parallel) { 3 } it 'passes parallel option through' do - expect(Process).to receive(:spawn).with(anything, 'create', '-path', anything, '-parallel', '3', { in: anything, out: progress }).and_call_original + expect(Open3).to receive(:popen2).with(ENV, anything, 'create', '-path', anything, '-parallel', '3').and_call_original subject.start(:create) subject.wait @@ -64,7 +64,7 @@ RSpec.describe Backup::GitalyBackup do let(:parallel_storage) { 3 } it 'passes parallel option through' do - expect(Process).to receive(:spawn).with(anything, 'create', '-path', anything, '-parallel-storage', '3', { in: anything, out: progress }).and_call_original + expect(Open3).to receive(:popen2).with(ENV, anything, 'create', '-path', anything, '-parallel-storage', '3').and_call_original subject.start(:create) subject.wait @@ -109,7 +109,7 @@ RSpec.describe Backup::GitalyBackup do copy_bundle_to_backup_path('personal_snippet_repo.bundle', personal_snippet.disk_path + '.bundle') copy_bundle_to_backup_path('project_snippet_repo.bundle', project_snippet.disk_path + '.bundle') - expect(Process).to receive(:spawn).with(anything, 'restore', '-path', anything, { in: anything, out: progress }).and_call_original + expect(Open3).to receive(:popen2).with(ENV, anything, 'restore', '-path', anything).and_call_original subject.start(:restore) subject.enqueue(project, Gitlab::GlRepository::PROJECT) @@ -132,7 +132,7 @@ RSpec.describe Backup::GitalyBackup do let(:parallel) { 3 } it 'does not pass parallel option through' do - expect(Process).to receive(:spawn).with(anything, 'restore', '-path', anything, { in: anything, out: progress }).and_call_original + expect(Open3).to receive(:popen2).with(ENV, anything, 'restore', '-path', anything).and_call_original subject.start(:restore) subject.wait diff --git a/spec/lib/backup/manager_spec.rb b/spec/lib/backup/manager_spec.rb index feaca6164eb..2cc1bf41d18 100644 --- a/spec/lib/backup/manager_spec.rb +++ b/spec/lib/backup/manager_spec.rb @@ -12,20 +12,13 @@ RSpec.describe Backup::Manager do before do allow(progress).to receive(:puts) allow(progress).to receive(:print) - - @old_progress = $progress # rubocop:disable Style/GlobalVars - $progress = progress # rubocop:disable Style/GlobalVars - end - - after do - $progress = @old_progress # rubocop:disable Style/GlobalVars end describe '#pack' do - let(:backup_contents) { ['backup_contents'] } + let(:expected_backup_contents) { %w(repositories db uploads.tar.gz builds.tar.gz artifacts.tar.gz pages.tar.gz lfs.tar.gz backup_information.yml) } + let(:tar_file) { '1546300800_2019_01_01_12.3_gitlab_backup.tar' } let(:tar_system_options) { { out: [tar_file, 'w', Gitlab.config.backup.archive_permissions] } } - let(:tar_cmdline) { ['tar', '-cf', '-', *backup_contents, tar_system_options] } - + let(:tar_cmdline) { ['tar', '-cf', '-', *expected_backup_contents, tar_system_options] } let(:backup_information) do { backup_created_at: Time.zone.parse('2019-01-01'), @@ -36,20 +29,20 @@ RSpec.describe Backup::Manager do before do allow(ActiveRecord::Base.connection).to receive(:reconnect!) allow(Kernel).to receive(:system).and_return(true) + allow(YAML).to receive(:load_file).and_return(backup_information) + + ::Backup::Manager::FOLDERS_TO_BACKUP.each do |folder| + allow(Dir).to receive(:exist?).with(File.join(Gitlab.config.backup.path, folder)).and_return(true) + end - allow(subject).to receive(:backup_contents).and_return(backup_contents) allow(subject).to receive(:backup_information).and_return(backup_information) allow(subject).to receive(:upload) end - context 'when BACKUP is not set' do - let(:tar_file) { '1546300800_2019_01_01_12.3_gitlab_backup.tar' } - - it 'uses the default tar file name' do - subject.pack + it 'executes tar' do + subject.pack - expect(Kernel).to have_received(:system).with(*tar_cmdline) - end + expect(Kernel).to have_received(:system).with(*tar_cmdline) end context 'when BACKUP is set' do @@ -62,6 +55,58 @@ RSpec.describe Backup::Manager do expect(Kernel).to have_received(:system).with(*tar_cmdline) end end + + context 'when skipped is set in backup_information.yml' do + let(:expected_backup_contents) { %w{db uploads.tar.gz builds.tar.gz artifacts.tar.gz pages.tar.gz lfs.tar.gz backup_information.yml} } + let(:backup_information) do + { + backup_created_at: Time.zone.parse('2019-01-01'), + gitlab_version: '12.3', + skipped: ['repositories'] + } + end + + it 'executes tar' do + subject.pack + + expect(Kernel).to have_received(:system).with(*tar_cmdline) + end + end + + context 'when a directory does not exist' do + let(:expected_backup_contents) { %w{db uploads.tar.gz builds.tar.gz artifacts.tar.gz pages.tar.gz lfs.tar.gz backup_information.yml} } + + before do + expect(Dir).to receive(:exist?).with(File.join(Gitlab.config.backup.path, 'repositories')).and_return(false) + end + + it 'executes tar' do + subject.pack + + expect(Kernel).to have_received(:system).with(*tar_cmdline) + end + end + end + + describe '#remove_tmp' do + let(:path) { File.join(Gitlab.config.backup.path, 'tmp') } + + before do + allow(FileUtils).to receive(:rm_rf).and_return(true) + end + + it 'removes backups/tmp dir' do + subject.remove_tmp + + expect(FileUtils).to have_received(:rm_rf).with(path) + end + + it 'prints running task with a done confirmation' do + subject.remove_tmp + + expect(progress).to have_received(:print).with('Deleting backups/tmp ... ') + expect(progress).to have_received(:puts).with('done') + end end describe '#remove_old' do diff --git a/spec/lib/backup/repository_backup_error_spec.rb b/spec/lib/backup/repository_backup_error_spec.rb new file mode 100644 index 00000000000..44c75c1cf77 --- /dev/null +++ b/spec/lib/backup/repository_backup_error_spec.rb @@ -0,0 +1,42 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Backup::RepositoryBackupError do + let_it_be(:snippet) { create(:snippet, content: 'foo', file_name: 'foo') } + let_it_be(:project) { create(:project, :repository) } + let_it_be(:wiki) { ProjectWiki.new(project, nil ) } + + let(:backup_repos_path) { '/tmp/backup/repositories' } + + shared_examples 'includes backup path' do + it { is_expected.to respond_to :container } + it { is_expected.to respond_to :backup_repos_path } + + it 'expects exception message to include repo backup path location' do + expect(subject.message).to include("#{subject.backup_repos_path}") + end + + it 'expects exception message to include container being back-up' do + expect(subject.message).to include("#{subject.container.disk_path}") + end + end + + context 'with snippet repository' do + subject { described_class.new(snippet, backup_repos_path) } + + it_behaves_like 'includes backup path' + end + + context 'with project repository' do + subject { described_class.new(project, backup_repos_path) } + + it_behaves_like 'includes backup path' + end + + context 'with wiki repository' do + subject { described_class.new(wiki, backup_repos_path) } + + it_behaves_like 'includes backup path' + end +end diff --git a/spec/lib/banzai/filter/references/alert_reference_filter_spec.rb b/spec/lib/banzai/filter/references/alert_reference_filter_spec.rb index 7c6b0cac24b..cba41166be4 100644 --- a/spec/lib/banzai/filter/references/alert_reference_filter_spec.rb +++ b/spec/lib/banzai/filter/references/alert_reference_filter_spec.rb @@ -220,4 +220,33 @@ RSpec.describe Banzai::Filter::References::AlertReferenceFilter do expect(reference_filter(act, project: nil, group: group).to_html).to eq exp end end + + context 'checking N+1' do + let(:namespace) { create(:namespace) } + let(:project2) { create(:project, :public, namespace: namespace) } + let(:alert2) { create(:alert_management_alert, project: project2) } + let(:alert_reference) { alert.to_reference } + let(:alert2_reference) { alert2.to_reference(full: true) } + + it 'does not have N+1 per multiple references per project', :use_sql_query_cache do + markdown = "#{alert_reference}" + max_count = ActiveRecord::QueryRecorder.new(skip_cached: false) do + reference_filter(markdown) + end.count + + expect(max_count).to eq 1 + + markdown = "#{alert_reference} ^alert#2 ^alert#3 ^alert#4 #{alert2_reference}" + + # Since we're not batching alert queries across projects, + # we have to account for that. + # 1 for both projects, 1 for alerts in each project == 3 + # TODO: https://gitlab.com/gitlab-org/gitlab/-/issues/330359 + max_count += 2 + + expect do + reference_filter(markdown) + end.not_to exceed_all_query_limit(max_count) + end + end end diff --git a/spec/lib/banzai/filter/references/commit_reference_filter_spec.rb b/spec/lib/banzai/filter/references/commit_reference_filter_spec.rb index bee8e42d12e..6bcea41a603 100644 --- a/spec/lib/banzai/filter/references/commit_reference_filter_spec.rb +++ b/spec/lib/banzai/filter/references/commit_reference_filter_spec.rb @@ -269,4 +269,34 @@ RSpec.describe Banzai::Filter::References::CommitReferenceFilter do expect(reference_filter(act, context).css('a').first.text).to eql("#{project.full_path}@#{commit.short_id}") end end + + context 'checking N+1' do + let(:namespace2) { create(:namespace) } + let(:namespace3) { create(:namespace) } + let(:project2) { create(:project, :public, :repository, namespace: namespace2) } + let(:project3) { create(:project, :public, :repository, namespace: namespace3) } + let(:commit2) { project2.commit } + let(:commit3) { project3.commit } + let(:commit_reference) { commit.to_reference } + let(:commit2_reference) { commit2.to_reference(full: true) } + let(:commit3_reference) { commit3.to_reference(full: true) } + + it 'does not have N+1 per multiple references per project', :use_sql_query_cache do + markdown = "#{commit_reference}" + max_count = ActiveRecord::QueryRecorder.new(skip_cached: false) do + reference_filter(markdown) + end.count + + markdown = "#{commit_reference} 8b95f2f1 8b95f2f2 8b95f2f3 #{commit2_reference} #{commit3_reference}" + + # Commits are not DB entries, they are on the project itself. + # So adding commits from two more projects to the markdown should + # only increase by 1 query + max_count += 1 + + expect do + reference_filter(markdown) + end.not_to exceed_all_query_limit(max_count) + end + end end diff --git a/spec/lib/banzai/filter/references/milestone_reference_filter_spec.rb b/spec/lib/banzai/filter/references/milestone_reference_filter_spec.rb index f8a00716680..cdf6110dd6c 100644 --- a/spec/lib/banzai/filter/references/milestone_reference_filter_spec.rb +++ b/spec/lib/banzai/filter/references/milestone_reference_filter_spec.rb @@ -92,6 +92,11 @@ RSpec.describe Banzai::Filter::References::MilestoneReferenceFilter do expect(doc.to_html).to match(%r(\(#{milestone.reference_link_text}\.\))) end + it 'links with adjacent html tags' do + doc = reference_filter("Milestone

#{reference}

.") + expect(doc.to_html).to match(%r(

#{milestone.reference_link_text}

)) + end + it 'ignores invalid milestone names' do exp = act = "Milestone #{Milestone.reference_prefix}#{milestone.name.reverse}" diff --git a/spec/lib/banzai/filter/references/project_reference_filter_spec.rb b/spec/lib/banzai/filter/references/project_reference_filter_spec.rb index 63a5a9184c1..d88e262883f 100644 --- a/spec/lib/banzai/filter/references/project_reference_filter_spec.rb +++ b/spec/lib/banzai/filter/references/project_reference_filter_spec.rb @@ -97,4 +97,34 @@ RSpec.describe Banzai::Filter::References::ProjectReferenceFilter do expect(filter.send(:projects)).to eq([project.full_path]) end end + + context 'checking N+1' do + let_it_be(:normal_project) { create(:project, :public) } + let_it_be(:group) { create(:group) } + let_it_be(:group_project) { create(:project, group: group) } + let_it_be(:nested_group) { create(:group, :nested) } + let_it_be(:nested_project) { create(:project, group: nested_group) } + let_it_be(:normal_project_reference) { get_reference(normal_project) } + let_it_be(:group_project_reference) { get_reference(group_project) } + let_it_be(:nested_project_reference) { get_reference(nested_project) } + + it 'does not have N+1 per multiple project references', :use_sql_query_cache do + markdown = "#{normal_project_reference}" + + # warm up first + reference_filter(markdown) + + max_count = ActiveRecord::QueryRecorder.new(skip_cached: false) do + reference_filter(markdown) + end.count + + expect(max_count).to eq 1 + + markdown = "#{normal_project_reference} #{invalidate_reference(normal_project_reference)} #{group_project_reference} #{nested_project_reference}" + + expect do + reference_filter(markdown) + end.not_to exceed_all_query_limit(max_count) + end + end end diff --git a/spec/lib/banzai/filter/table_of_contents_tag_filter_spec.rb b/spec/lib/banzai/filter/table_of_contents_tag_filter_spec.rb index 56f36af5066..082e5c92e53 100644 --- a/spec/lib/banzai/filter/table_of_contents_tag_filter_spec.rb +++ b/spec/lib/banzai/filter/table_of_contents_tag_filter_spec.rb @@ -6,18 +6,42 @@ RSpec.describe Banzai::Filter::TableOfContentsTagFilter do include FilterSpecHelper context 'table of contents' do - let(:html) { '

[[TOC]]

' } + shared_examples 'table of contents tag' do + it 'replaces toc tag with ToC result' do + doc = filter(html, {}, { toc: "FOO" }) - it 'replaces [[TOC]] with ToC result' do - doc = filter(html, {}, { toc: "FOO" }) + expect(doc.to_html).to eq("FOO") + end - expect(doc.to_html).to eq("FOO") + it 'handles an empty ToC result' do + doc = filter(html) + + expect(doc.to_html).to eq '' + end + end + + context '[[_TOC_]] as tag' do + it_behaves_like 'table of contents tag' do + let(:html) { '

[[TOC]]

' } + end end - it 'handles an empty ToC result' do - doc = filter(html) + context '[[_toc_]] as tag' do + it_behaves_like 'table of contents tag' do + let(:html) { '

[[toc]]

' } + end + end + + context '[TOC] as tag' do + it_behaves_like 'table of contents tag' do + let(:html) { '

[TOC]

' } + end + end - expect(doc.to_html).to eq '' + context '[toc] as tag' do + it_behaves_like 'table of contents tag' do + let(:html) { '

[toc]

' } + end end end end diff --git a/spec/lib/banzai/pipeline/full_pipeline_spec.rb b/spec/lib/banzai/pipeline/full_pipeline_spec.rb index 989e06a992d..72661003361 100644 --- a/spec/lib/banzai/pipeline/full_pipeline_spec.rb +++ b/spec/lib/banzai/pipeline/full_pipeline_spec.rb @@ -102,33 +102,45 @@ RSpec.describe Banzai::Pipeline::FullPipeline do describe 'table of contents' do let(:project) { create(:project, :public) } - let(:markdown) do - <<-MARKDOWN.strip_heredoc - [[_TOC_]] + + shared_examples 'table of contents tag' do |tag, tag_html| + let(:markdown) do + <<-MARKDOWN.strip_heredoc + #{tag} # Header - MARKDOWN - end + MARKDOWN + end - let(:invalid_markdown) do - <<-MARKDOWN.strip_heredoc - test [[_TOC_]] + let(:invalid_markdown) do + <<-MARKDOWN.strip_heredoc + test #{tag} # Header - MARKDOWN - end + MARKDOWN + end - it 'inserts a table of contents' do - output = described_class.to_html(markdown, project: project) + it 'inserts a table of contents' do + output = described_class.to_html(markdown, project: project) - expect(output).to include("