Running with gitlab-runner 12.3.0 (a8a019e0)
  on docker-auto-scale-com 8a6210b8
section_start:1571128561:prepare_executor
Using Docker executor with image registry.gitlab.com/gitlab-org/gitlab-build-images:ruby-2.6.3-golang-1.11-git-2.22-chrome-73.0-node-12.x-yarn-1.16-postgresql-9.6-graphicsmagick-1.3.33 ...
Starting service postgres:9.6 ...
Pulling docker image postgres:9.6 ...
Using docker image sha256:61c59b9a763f02dd11635b20ef117812dad973b95a68bd125f3a1767f9159cf9 for postgres:9.6 ...
Starting service redis:alpine ...
Pulling docker image redis:alpine ...
Using docker image sha256:f9d774eafe0d9aa813860e94490efffec6041d63a786133749974c15c055663e for redis:alpine ...
Waiting for services to be up and running...
Authenticating with credentials from job payload (GitLab Registry)
Pulling docker image registry.gitlab.com/gitlab-org/gitlab-build-images:ruby-2.6.3-golang-1.11-git-2.22-chrome-73.0-node-12.x-yarn-1.16-postgresql-9.6-graphicsmagick-1.3.33 ...
Using docker image sha256:3689b07c936dec3fdafc5ec40ed80a6cfdba089394a505d60f2a6926b0b982a3 for registry.gitlab.com/gitlab-org/gitlab-build-images:ruby-2.6.3-golang-1.11-git-2.22-chrome-73.0-node-12.x-yarn-1.16-postgresql-9.6-graphicsmagick-1.3.33 ...
section_end:1571128582:prepare_executor
section_start:1571128582:prepare_script
Running on runner-8a6210b8-project-278964-concurrent-0 via runner-8a6210b8-gsrm-1571120258-efe5d780...
section_end:1571128587:prepare_script
section_start:1571128589:get_sources
Fetching changes with git depth set to 50...
Reinitialized existing Git repository in /builds/gitlab-org/gitlab/.git/
From https://gitlab.com/gitlab-org/gitlab
 * [new ref]             refs/pipelines/88859459 -> refs/pipelines/88859459
 * [new branch]          master                  -> origin/master
Checking out f5bf17c9 as master...

Skipping Git submodules setup
section_end:1571128613:get_sources
section_start:1571128613:restore_cache
Checking cache for debian-stretch-ruby-2.6.3-node-12.x-2...
Downloading cache.zip from https://storage.googleapis.com/gitlab-com-runners-cache/project/278964/debian-stretch-ruby-2.6.3-node-12.x-2 
Successfully extracted cache
section_end:1571128662:restore_cache
section_start:1571128662:download_artifacts
Downloading artifacts for compile-assets (321109103)...
Downloading artifacts from coordinator... ok        id=321109103 responseStatus=200 OK token=XMSy3Ehb
Downloading artifacts for setup-test-env (321109105)...
Downloading artifacts from coordinator... ok        id=321109105 responseStatus=200 OK token=wfkozyzh
WARNING: tmp/tests/gitlab-shell/.gitlab_shell_secret: chmod tmp/tests/gitlab-shell/.gitlab_shell_secret: no such file or directory (suppressing repeats) 
Downloading artifacts for retrieve-tests-metadata (321109113)...
Downloading artifacts from coordinator... ok        id=321109113 responseStatus=200 OK token=rMBaZ9wv
section_end:1571128771:download_artifacts
section_start:1571128771:build_script
Authenticating with credentials from job payload (GitLab Registry)
$ date
Tue Oct 15 08:39:42 UTC 2019
$ export GOPATH=$CI_PROJECT_DIR/.go
$ mkdir -p $GOPATH
$ source scripts/utils.sh
$ source scripts/prepare_build.sh
Bundler version 1.17.2
Warning: the running version of Bundler (1.17.2) is older than the version that created the lockfile (1.17.3). We suggest you upgrade to the latest version of Bundler by running `gem install bundler`.
The Gemfile's dependencies are satisfied
Successfully installed knapsack-1.18.0
1 gem installed
CREATE ROLE
GRANT
Dropped database 'gitlabhq_test'
Created database 'gitlabhq_test'
-- enable_extension("pg_trgm")
   -> 0.0293s
-- enable_extension("plpgsql")
   -> 0.0028s
-- create_table("abuse_reports", {:id=>:serial, :force=>:cascade})
   -> 0.0041s
-- create_table("alerts_service_data", {:force=>:cascade})
   -> 0.0060s
-- create_table("allowed_email_domains", {:force=>:cascade})
   -> 0.0043s
-- create_table("analytics_cycle_analytics_group_stages", {:force=>:cascade})
   -> 0.0138s
-- create_table("analytics_cycle_analytics_project_stages", {:force=>:cascade})
   -> 0.0131s
-- create_table("analytics_language_trend_repository_languages", {:id=>false, :force=>:cascade})
   -> 0.0072s
-- create_table("analytics_repository_file_commits", {:force=>:cascade})
   -> 0.0061s
-- create_table("analytics_repository_files", {:force=>:cascade})
   -> 0.0046s
-- create_table("appearances", {:id=>:serial, :force=>:cascade})
   -> 0.0034s
-- create_table("application_setting_terms", {:id=>:serial, :force=>:cascade})
   -> 0.0024s
-- create_table("application_settings", {:id=>:serial, :force=>:cascade})
   -> 0.0960s
-- create_table("approval_merge_request_rule_sources", {:force=>:cascade})
   -> 0.0062s
-- create_table("approval_merge_request_rules", {:force=>:cascade})
   -> 0.0154s
-- create_table("approval_merge_request_rules_approved_approvers", {:force=>:cascade})
   -> 0.0061s
-- create_table("approval_merge_request_rules_groups", {:force=>:cascade})
   -> 0.0061s
-- create_table("approval_merge_request_rules_users", {:force=>:cascade})
   -> 0.0061s
-- create_table("approval_project_rules", {:force=>:cascade})
   -> 0.0099s
-- create_table("approval_project_rules_groups", {:force=>:cascade})
   -> 0.0061s
-- create_table("approval_project_rules_users", {:force=>:cascade})
   -> 0.0061s
-- create_table("approvals", {:id=>:serial, :force=>:cascade})
   -> 0.0062s
-- create_table("approver_groups", {:id=>:serial, :force=>:cascade})
   -> 0.0067s
-- create_table("approvers", {:id=>:serial, :force=>:cascade})
   -> 0.0064s
-- create_table("audit_events", {:id=>:serial, :force=>:cascade})
   -> 0.0068s
-- create_table("award_emoji", {:id=>:serial, :force=>:cascade})
   -> 0.0066s
-- create_table("badges", {:id=>:serial, :force=>:cascade})
   -> 0.0068s
-- create_table("board_assignees", {:id=>:serial, :force=>:cascade})
   -> 0.0061s
-- create_table("board_group_recent_visits", {:force=>:cascade})
   -> 0.0102s
-- create_table("board_labels", {:id=>:serial, :force=>:cascade})
   -> 0.0059s
-- create_table("board_project_recent_visits", {:force=>:cascade})
   -> 0.0102s
-- create_table("boards", {:id=>:serial, :force=>:cascade})
   -> 0.0090s
-- create_table("broadcast_messages", {:id=>:serial, :force=>:cascade})
   -> 0.0049s
-- create_table("chat_names", {:id=>:serial, :force=>:cascade})
   -> 0.0071s
-- create_table("chat_teams", {:id=>:serial, :force=>:cascade})
   -> 0.0046s
-- create_table("ci_build_needs", {:id=>:serial, :force=>:cascade})
   -> 0.0045s
-- create_table("ci_build_trace_chunks", {:force=>:cascade})
   -> 0.0045s
-- create_table("ci_build_trace_section_names", {:id=>:serial, :force=>:cascade})
   -> 0.0045s
-- create_table("ci_build_trace_sections", {:id=>:serial, :force=>:cascade})
   -> 0.0084s
-- create_table("ci_builds", {:id=>:serial, :force=>:cascade})
   -> 0.0552s
-- create_table("ci_builds_metadata", {:id=>:serial, :force=>:cascade})
   -> 0.0093s
-- create_table("ci_builds_runner_session", {:force=>:cascade})
   -> 0.0046s
-- create_table("ci_group_variables", {:id=>:serial, :force=>:cascade})
   -> 0.0062s
-- create_table("ci_job_artifacts", {:id=>:serial, :force=>:cascade})
   -> 0.0899s
-- create_table("ci_job_variables", {:force=>:cascade})
   -> 0.0077s
-- create_table("ci_pipeline_chat_data", {:force=>:cascade})
   -> 0.0069s
-- create_table("ci_pipeline_schedule_variables", {:id=>:serial, :force=>:cascade})
   -> 0.0056s
-- create_table("ci_pipeline_schedules", {:id=>:serial, :force=>:cascade})
   -> 0.0099s
-- create_table("ci_pipeline_variables", {:id=>:serial, :force=>:cascade})
   -> 0.0055s
-- create_table("ci_pipelines", {:id=>:serial, :force=>:cascade})
   -> 0.0316s
-- create_table("ci_runner_namespaces", {:id=>:serial, :force=>:cascade})
   -> 0.0064s
-- create_table("ci_runner_projects", {:id=>:serial, :force=>:cascade})
   -> 0.0064s
-- create_table("ci_runners", {:id=>:serial, :force=>:cascade})
   -> 0.0180s
-- create_table("ci_sources_pipelines", {:id=>:serial, :force=>:cascade})
   -> 0.0126s
-- create_table("ci_stages", {:id=>:serial, :force=>:cascade})
   -> 0.0113s
-- create_table("ci_trigger_requests", {:id=>:serial, :force=>:cascade})
   -> 0.0069s
-- create_table("ci_triggers", {:id=>:serial, :force=>:cascade})
   -> 0.0069s
-- create_table("ci_variables", {:id=>:serial, :force=>:cascade})
   -> 0.0069s
-- create_table("cluster_groups", {:id=>:serial, :force=>:cascade})
   -> 0.0066s
-- create_table("cluster_platforms_kubernetes", {:id=>:serial, :force=>:cascade})
   -> 0.0051s
-- create_table("cluster_projects", {:id=>:serial, :force=>:cascade})
   -> 0.0065s
-- create_table("cluster_providers_gcp", {:id=>:serial, :force=>:cascade})
   -> 0.0084s
-- create_table("clusters", {:id=>:serial, :force=>:cascade})
   -> 0.0112s
-- create_table("clusters_applications_cert_managers", {:id=>:serial, :force=>:cascade})
   -> 0.0050s
-- create_table("clusters_applications_helm", {:id=>:serial, :force=>:cascade})
   -> 0.0049s
-- create_table("clusters_applications_ingress", {:id=>:serial, :force=>:cascade})
   -> 0.0052s
-- create_table("clusters_applications_jupyter", {:id=>:serial, :force=>:cascade})
   -> 0.0073s
-- create_table("clusters_applications_knative", {:id=>:serial, :force=>:cascade})
   -> 0.0050s
-- create_table("clusters_applications_prometheus", {:id=>:serial, :force=>:cascade})
   -> 0.0049s
-- create_table("clusters_applications_runners", {:id=>:serial, :force=>:cascade})
   -> 0.0079s
-- create_table("clusters_kubernetes_namespaces", {:force=>:cascade})
   -> 0.0158s
-- create_table("container_repositories", {:id=>:serial, :force=>:cascade})
   -> 0.0068s
-- create_table("conversational_development_index_metrics", {:id=>:serial, :force=>:cascade})
   -> 0.0074s
-- create_table("dependency_proxy_blobs", {:id=>:serial, :force=>:cascade})
   -> 0.0049s
-- create_table("dependency_proxy_group_settings", {:id=>:serial, :force=>:cascade})
   -> 0.0048s
-- create_table("deploy_keys_projects", {:id=>:serial, :force=>:cascade})
   -> 0.0046s
-- create_table("deploy_tokens", {:id=>:serial, :force=>:cascade})
   -> 0.0112s
-- create_table("deployments", {:id=>:serial, :force=>:cascade})
   -> 0.0243s
-- create_table("design_management_designs", {:force=>:cascade})
   -> 0.0068s
-- create_table("design_management_designs_versions", {:id=>false, :force=>:cascade})
   -> 0.0098s
-- create_table("design_management_versions", {:force=>:cascade})
   -> 0.0146s
-- create_table("draft_notes", {:force=>:cascade})
   -> 0.0099s
-- create_table("elasticsearch_indexed_namespaces", {:id=>false, :force=>:cascade})
   -> 0.0036s
-- create_table("elasticsearch_indexed_projects", {:id=>false, :force=>:cascade})
   -> 0.0033s
-- create_table("emails", {:id=>:serial, :force=>:cascade})
   -> 0.0089s
-- create_table("environments", {:id=>:serial, :force=>:cascade})
   -> 0.0113s
-- create_table("epic_issues", {:id=>:serial, :force=>:cascade})
   -> 0.0061s
-- create_table("epic_metrics", {:id=>:serial, :force=>:cascade})
   -> 0.0043s
-- create_table("epics", {:id=>:serial, :force=>:cascade})
   -> 0.0217s
-- create_table("events", {:id=>:serial, :force=>:cascade})
   -> 0.0167s
-- create_table("external_pull_requests", {:force=>:cascade})
   -> 0.0052s
-- create_table("feature_gates", {:id=>:serial, :force=>:cascade})
   -> 0.0049s
-- create_table("features", {:id=>:serial, :force=>:cascade})
   -> 0.0046s
-- create_table("fork_network_members", {:id=>:serial, :force=>:cascade})
   -> 0.0081s
-- create_table("fork_networks", {:id=>:serial, :force=>:cascade})
   -> 0.0046s
-- create_table("forked_project_links", {:id=>:serial, :force=>:cascade})
   -> 0.0041s
-- create_table("geo_cache_invalidation_events", {:force=>:cascade})
   -> 0.0035s
-- create_table("geo_container_repository_updated_events", {:force=>:cascade})
   -> 0.0041s
-- create_table("geo_event_log", {:force=>:cascade})
   -> 0.0288s
-- create_table("geo_hashed_storage_attachments_events", {:force=>:cascade})
   -> 0.0046s
-- create_table("geo_hashed_storage_migrated_events", {:force=>:cascade})
   -> 0.0048s
-- create_table("geo_job_artifact_deleted_events", {:force=>:cascade})
   -> 0.0045s
-- create_table("geo_lfs_object_deleted_events", {:force=>:cascade})
   -> 0.0046s
-- create_table("geo_node_namespace_links", {:id=>:serial, :force=>:cascade})
   -> 0.0082s
-- create_table("geo_node_statuses", {:id=>:serial, :force=>:cascade})
   -> 0.0061s
-- create_table("geo_nodes", {:id=>:serial, :force=>:cascade})
   -> 0.0127s
-- create_table("geo_repositories_changed_events", {:force=>:cascade})
   -> 0.0041s
-- create_table("geo_repository_created_events", {:force=>:cascade})
   -> 0.0048s
-- create_table("geo_repository_deleted_events", {:force=>:cascade})
   -> 0.0046s
-- create_table("geo_repository_renamed_events", {:force=>:cascade})
   -> 0.0048s
-- create_table("geo_repository_updated_events", {:force=>:cascade})
   -> 0.0074s
-- create_table("geo_reset_checksum_events", {:force=>:cascade})
   -> 0.0041s
-- create_table("geo_upload_deleted_events", {:force=>:cascade})
   -> 0.0047s
-- create_table("gitlab_subscriptions", {:force=>:cascade})
   -> 0.0077s
-- create_table("gpg_key_subkeys", {:id=>:serial, :force=>:cascade})
   -> 0.0085s
-- create_table("gpg_keys", {:id=>:serial, :force=>:cascade})
   -> 0.0085s
-- create_table("gpg_signatures", {:id=>:serial, :force=>:cascade})
   -> 0.0138s
-- create_table("grafana_integrations", {:force=>:cascade})
   -> 0.0048s
-- create_table("group_custom_attributes", {:id=>:serial, :force=>:cascade})
   -> 0.0069s
-- create_table("historical_data", {:id=>:serial, :force=>:cascade})
   -> 0.0022s
-- create_table("identities", {:id=>:serial, :force=>:cascade})
   -> 0.0093s
-- create_table("import_export_uploads", {:id=>:serial, :force=>:cascade})
   -> 0.0069s
-- create_table("index_statuses", {:id=>:serial, :force=>:cascade})
   -> 0.0050s
-- create_table("insights", {:id=>:serial, :force=>:cascade})
   -> 0.0063s
-- create_table("internal_ids", {:force=>:cascade})
   -> 0.0113s
-- create_table("ip_restrictions", {:force=>:cascade})
   -> 0.0051s
-- create_table("issue_assignees", {:id=>false, :force=>:cascade})
   -> 0.0073s
-- create_table("issue_links", {:id=>:serial, :force=>:cascade})
   -> 0.0089s
-- create_table("issue_metrics", {:id=>:serial, :force=>:cascade})
   -> 0.0069s
-- create_table("issue_tracker_data", {:force=>:cascade})
   -> 0.0054s
-- create_table("issues", {:id=>:serial, :force=>:cascade})
   -> 0.0452s
-- create_table("issues_prometheus_alert_events", {:id=>false, :force=>:cascade})
   -> 0.0057s
-- create_table("jira_connect_installations", {:force=>:cascade})
   -> 0.0052s
-- create_table("jira_connect_subscriptions", {:force=>:cascade})
   -> 0.0086s
-- create_table("jira_tracker_data", {:force=>:cascade})
   -> 0.0050s
-- create_table("keys", {:id=>:serial, :force=>:cascade})
   -> 0.0092s
-- create_table("label_links", {:id=>:serial, :force=>:cascade})
   -> 0.0067s
-- create_table("label_priorities", {:id=>:serial, :force=>:cascade})
   -> 0.0085s
-- create_table("labels", {:id=>:serial, :force=>:cascade})
   -> 0.0135s
-- create_table("ldap_group_links", {:id=>:serial, :force=>:cascade})
   -> 0.0027s
-- create_table("lfs_file_locks", {:id=>:serial, :force=>:cascade})
   -> 0.0067s
-- create_table("lfs_objects", {:id=>:serial, :force=>:cascade})
   -> 0.0068s
-- create_table("lfs_objects_projects", {:id=>:serial, :force=>:cascade})
   -> 0.0062s
-- create_table("licenses", {:id=>:serial, :force=>:cascade})
   -> 0.0025s
-- create_table("list_user_preferences", {:force=>:cascade})
   -> 0.0087s
-- create_table("lists", {:id=>:serial, :force=>:cascade})
   -> 0.0139s
-- create_table("members", {:id=>:serial, :force=>:cascade})
   -> 0.0181s
-- create_table("merge_request_assignees", {:force=>:cascade})
   -> 0.0082s
-- create_table("merge_request_blocks", {:force=>:cascade})
   -> 0.0063s
-- create_table("merge_request_diff_commits", {:id=>false, :force=>:cascade})
   -> 0.0061s
-- create_table("merge_request_diff_files", {:id=>false, :force=>:cascade})
   -> 0.0043s
-- create_table("merge_request_diffs", {:id=>:serial, :force=>:cascade})
   -> 0.0073s
-- create_table("merge_request_metrics", {:id=>:serial, :force=>:cascade})
   -> 0.0193s
-- create_table("merge_requests", {:id=>:serial, :force=>:cascade})
   -> 0.0500s
-- create_table("merge_requests_closing_issues", {:id=>:serial, :force=>:cascade})
   -> 0.0067s
-- create_table("merge_trains", {:force=>:cascade})
   -> 0.0111s
-- create_table("milestone_releases", {:id=>false, :force=>:cascade})
   -> 0.0052s
-- create_table("milestones", {:id=>:serial, :force=>:cascade})
   -> 0.0154s
-- create_table("namespace_aggregation_schedules", {:primary_key=>"namespace_id", :id=>:integer, :default=>nil, :force=>:cascade})
   -> 0.0035s
-- create_table("namespace_root_storage_statistics", {:primary_key=>"namespace_id", :id=>:integer, :default=>nil, :force=>:cascade})
   -> 0.0062s
-- create_table("namespace_statistics", {:id=>:serial, :force=>:cascade})
   -> 0.0049s
-- create_table("namespaces", {:id=>:serial, :force=>:cascade})
   -> 0.0464s
-- create_table("note_diff_files", {:id=>:serial, :force=>:cascade})
   -> 0.0051s
-- create_table("notes", {:id=>:serial, :force=>:cascade})
   -> 0.0253s
-- create_table("notification_settings", {:id=>:serial, :force=>:cascade})
   -> 0.0105s
-- create_table("oauth_access_grants", {:id=>:serial, :force=>:cascade})
   -> 0.0050s
-- create_table("oauth_access_tokens", {:id=>:serial, :force=>:cascade})
   -> 0.0112s
-- create_table("oauth_applications", {:id=>:serial, :force=>:cascade})
   -> 0.0079s
-- create_table("oauth_openid_requests", {:id=>:serial, :force=>:cascade})
   -> 0.0048s
-- create_table("operations_feature_flag_scopes", {:force=>:cascade})
   -> 0.0061s
-- create_table("operations_feature_flags", {:force=>:cascade})
   -> 0.0050s
-- create_table("operations_feature_flags_clients", {:force=>:cascade})
   -> 0.0068s
-- create_table("packages_maven_metadata", {:force=>:cascade})
   -> 0.0050s
-- create_table("packages_package_files", {:force=>:cascade})
   -> 0.0050s
-- create_table("packages_package_metadata", {:force=>:cascade})
   -> 0.0047s
-- create_table("packages_package_tags", {:force=>:cascade})
   -> 0.0042s
-- create_table("packages_packages", {:force=>:cascade})
   -> 0.0070s
-- create_table("pages_domain_acme_orders", {:force=>:cascade})
   -> 0.0072s
-- create_table("pages_domains", {:id=>:serial, :force=>:cascade})
   -> 0.0190s
-- create_table("path_locks", {:id=>:serial, :force=>:cascade})
   -> 0.0088s
-- create_table("personal_access_tokens", {:id=>:serial, :force=>:cascade})
   -> 0.0084s
-- create_table("plans", {:id=>:serial, :force=>:cascade})
   -> 0.0053s
-- create_table("pool_repositories", {:force=>:cascade})
   -> 0.0089s
-- create_table("programming_languages", {:id=>:serial, :force=>:cascade})
   -> 0.0048s
-- create_table("project_alerting_settings", {:primary_key=>"project_id", :id=>:integer, :default=>nil, :force=>:cascade})
   -> 0.0019s
-- create_table("project_aliases", {:force=>:cascade})
   -> 0.0068s
-- create_table("project_authorizations", {:id=>false, :force=>:cascade})
   -> 0.0054s
-- create_table("project_auto_devops", {:id=>:serial, :force=>:cascade})
   -> 0.0047s
-- create_table("project_ci_cd_settings", {:id=>:serial, :force=>:cascade})
   -> 0.0052s
-- create_table("project_custom_attributes", {:id=>:serial, :force=>:cascade})
   -> 0.0068s
-- create_table("project_daily_statistics", {:force=>:cascade})
   -> 0.0051s
-- create_table("project_deploy_tokens", {:id=>:serial, :force=>:cascade})
   -> 0.0063s
-- create_table("project_error_tracking_settings", {:primary_key=>"project_id", :id=>:integer, :default=>nil, :force=>:cascade})
   -> 0.0027s
-- create_table("project_feature_usages", {:primary_key=>"project_id", :id=>:integer, :default=>nil, :force=>:cascade})
   -> 0.0084s
-- create_table("project_features", {:id=>:serial, :force=>:cascade})
   -> 0.0067s
-- create_table("project_group_links", {:id=>:serial, :force=>:cascade})
   -> 0.0067s
-- create_table("project_import_data", {:id=>:serial, :force=>:cascade})
   -> 0.0048s
-- create_table("project_incident_management_settings", {:primary_key=>"project_id", :id=>:serial, :force=>:cascade})
   -> 0.0034s
-- create_table("project_metrics_settings", {:primary_key=>"project_id", :id=>:integer, :default=>nil, :force=>:cascade})
   -> 0.0019s
-- create_table("project_mirror_data", {:id=>:serial, :force=>:cascade})
   -> 0.0161s
-- create_table("project_pages_metadata", {:id=>false, :force=>:cascade})
   -> 0.0057s
-- create_table("project_repositories", {:force=>:cascade})
   -> 0.0087s
-- create_table("project_repository_states", {:id=>:serial, :force=>:cascade})
   -> 0.0152s
-- create_table("project_statistics", {:id=>:serial, :force=>:cascade})
   -> 0.0091s
-- create_table("project_tracing_settings", {:force=>:cascade})
   -> 0.0048s
-- create_table("projects", {:id=>:serial, :force=>:cascade})
   -> 0.0707s
-- create_table("prometheus_alert_events", {:force=>:cascade})
   -> 0.0070s
-- create_table("prometheus_alerts", {:id=>:serial, :force=>:cascade})
   -> 0.0086s
-- create_table("prometheus_metrics", {:id=>:serial, :force=>:cascade})
   -> 0.0117s
-- create_table("protected_branch_merge_access_levels", {:id=>:serial, :force=>:cascade})
   -> 0.0089s
-- create_table("protected_branch_push_access_levels", {:id=>:serial, :force=>:cascade})
   -> 0.0088s
-- create_table("protected_branch_unprotect_access_levels", {:id=>:serial, :force=>:cascade})
   -> 0.0089s
-- create_table("protected_branches", {:id=>:serial, :force=>:cascade})
   -> 0.0075s
-- create_table("protected_environment_deploy_access_levels", {:id=>:serial, :force=>:cascade})
   -> 0.0089s
-- create_table("protected_environments", {:id=>:serial, :force=>:cascade})
   -> 0.0067s
-- create_table("protected_tag_create_access_levels", {:id=>:serial, :force=>:cascade})
   -> 0.0089s
-- create_table("protected_tags", {:id=>:serial, :force=>:cascade})
   -> 0.0070s
-- create_table("push_event_payloads", {:id=>false, :force=>:cascade})
   -> 0.0040s
-- create_table("push_rules", {:id=>:serial, :force=>:cascade})
   -> 0.0096s
-- create_table("redirect_routes", {:id=>:serial, :force=>:cascade})
   -> 0.0089s
-- create_table("release_links", {:force=>:cascade})
   -> 0.0071s
-- create_table("releases", {:id=>:serial, :force=>:cascade})
   -> 0.0073s
-- create_table("remote_mirrors", {:id=>:serial, :force=>:cascade})
   -> 0.0081s
-- create_table("repository_languages", {:id=>false, :force=>:cascade})
   -> 0.0033s
-- create_table("resource_label_events", {:force=>:cascade})
   -> 0.0129s
-- create_table("reviews", {:force=>:cascade})
   -> 0.0082s
-- create_table("routes", {:id=>:serial, :force=>:cascade})
   -> 0.0089s
-- create_table("saml_providers", {:id=>:serial, :force=>:cascade})
   -> 0.0057s
-- create_table("scim_oauth_access_tokens", {:id=>:serial, :force=>:cascade})
   -> 0.0048s
-- create_table("sent_notifications", {:id=>:serial, :force=>:cascade})
   -> 0.0048s
-- create_table("services", {:id=>:serial, :force=>:cascade})
   -> 0.0157s
-- create_table("shards", {:id=>:serial, :force=>:cascade})
   -> 0.0050s
-- create_table("slack_integrations", {:id=>:serial, :force=>:cascade})
   -> 0.0099s
-- create_table("smartcard_identities", {:force=>:cascade})
   -> 0.0071s
-- create_table("snippets", {:id=>:serial, :force=>:cascade})
   -> 0.0185s
-- create_table("software_license_policies", {:id=>:serial, :force=>:cascade})
   -> 0.0074s
-- create_table("software_licenses", {:id=>:serial, :force=>:cascade})
   -> 0.0069s
-- create_table("spam_logs", {:id=>:serial, :force=>:cascade})
   -> 0.0037s
-- create_table("subscriptions", {:id=>:serial, :force=>:cascade})
   -> 0.0071s
-- create_table("suggestions", {:force=>:cascade})
   -> 0.0067s
-- create_table("system_note_metadata", {:id=>:serial, :force=>:cascade})
   -> 0.0047s
-- create_table("taggings", {:id=>:serial, :force=>:cascade})
   -> 0.0112s
-- create_table("tags", {:id=>:serial, :force=>:cascade})
   -> 0.0073s
-- create_table("term_agreements", {:id=>:serial, :force=>:cascade})
   -> 0.0089s
-- create_table("timelogs", {:id=>:serial, :force=>:cascade})
   -> 0.0085s
-- create_table("todos", {:id=>:serial, :force=>:cascade})
   -> 0.0218s
-- create_table("trending_projects", {:id=>:serial, :force=>:cascade})
   -> 0.0043s
-- create_table("u2f_registrations", {:id=>:serial, :force=>:cascade})
   -> 0.0075s
-- create_table("uploads", {:id=>:serial, :force=>:cascade})
   -> 0.0111s
-- create_table("user_agent_details", {:id=>:serial, :force=>:cascade})
   -> 0.0055s
-- create_table("user_callouts", {:id=>:serial, :force=>:cascade})
   -> 0.0065s
-- create_table("user_custom_attributes", {:id=>:serial, :force=>:cascade})
   -> 0.0070s
-- create_table("user_interacted_projects", {:id=>false, :force=>:cascade})
   -> 0.0054s
-- create_table("user_preferences", {:id=>:serial, :force=>:cascade})
   -> 0.0069s
-- create_table("user_statuses", {:primary_key=>"user_id", :id=>:serial, :force=>:cascade})
   -> 0.0052s
-- create_table("user_synced_attributes_metadata", {:id=>:serial, :force=>:cascade})
   -> 0.0058s
-- create_table("users", {:id=>:serial, :force=>:cascade})
   -> 0.0699s
-- create_table("users_ops_dashboard_projects", {:force=>:cascade})
   -> 0.0065s
-- create_table("users_star_projects", {:id=>:serial, :force=>:cascade})
   -> 0.0062s
-- create_table("vulnerabilities", {:force=>:cascade})
   -> 0.0230s
-- create_table("vulnerability_feedback", {:id=>:serial, :force=>:cascade})
   -> 0.0156s
-- create_table("vulnerability_identifiers", {:force=>:cascade})
   -> 0.0051s
-- create_table("vulnerability_occurrence_identifiers", {:force=>:cascade})
   -> 0.0063s
-- create_table("vulnerability_occurrence_pipelines", {:force=>:cascade})
   -> 0.0064s
-- create_table("vulnerability_occurrences", {:force=>:cascade})
   -> 0.0135s
-- create_table("vulnerability_scanners", {:force=>:cascade})
   -> 0.0048s
-- create_table("web_hook_logs", {:id=>:serial, :force=>:cascade})
   -> 0.0072s
-- create_table("web_hooks", {:id=>:serial, :force=>:cascade})
   -> 0.0123s
-- add_foreign_key("alerts_service_data", "services", {:on_delete=>:cascade})
   -> 0.0024s
-- add_foreign_key("allowed_email_domains", "namespaces", {:column=>"group_id", :on_delete=>:cascade})
   -> 0.0023s
-- add_foreign_key("analytics_cycle_analytics_group_stages", "labels", {:column=>"end_event_label_id", :on_delete=>:cascade})
   -> 0.0019s
-- add_foreign_key("analytics_cycle_analytics_group_stages", "labels", {:column=>"start_event_label_id", :on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("analytics_cycle_analytics_group_stages", "namespaces", {:column=>"group_id", :on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("analytics_cycle_analytics_project_stages", "labels", {:column=>"end_event_label_id", :on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("analytics_cycle_analytics_project_stages", "labels", {:column=>"start_event_label_id", :on_delete=>:cascade})
   -> 0.0013s
-- add_foreign_key("analytics_cycle_analytics_project_stages", "projects", {:on_delete=>:cascade})
   -> 0.0028s
-- add_foreign_key("analytics_language_trend_repository_languages", "programming_languages", {:on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("analytics_language_trend_repository_languages", "projects", {:on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("analytics_repository_file_commits", "analytics_repository_files", {:on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("analytics_repository_file_commits", "projects", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("analytics_repository_files", "projects", {:on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("application_settings", "namespaces", {:column=>"custom_project_templates_group_id", :on_delete=>:nullify})
   -> 0.0036s
-- add_foreign_key("application_settings", "projects", {:column=>"file_template_project_id", :name=>"fk_ec757bd087", :on_delete=>:nullify})
   -> 0.0024s
-- add_foreign_key("application_settings", "projects", {:column=>"instance_administration_project_id", :on_delete=>:nullify})
   -> 0.0034s
-- add_foreign_key("application_settings", "users", {:column=>"usage_stats_set_by_user_id", :name=>"fk_964370041d", :on_delete=>:nullify})
   -> 0.0034s
-- add_foreign_key("approval_merge_request_rule_sources", "approval_merge_request_rules", {:on_delete=>:cascade})
   -> 0.0019s
-- add_foreign_key("approval_merge_request_rule_sources", "approval_project_rules", {:on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("approval_merge_request_rules", "merge_requests", {:on_delete=>:cascade})
   -> 0.0023s
-- add_foreign_key("approval_merge_request_rules_approved_approvers", "approval_merge_request_rules", {:on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("approval_merge_request_rules_approved_approvers", "users", {:on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("approval_merge_request_rules_groups", "approval_merge_request_rules", {:on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("approval_merge_request_rules_groups", "namespaces", {:column=>"group_id", :on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("approval_merge_request_rules_users", "approval_merge_request_rules", {:on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("approval_merge_request_rules_users", "users", {:on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("approval_project_rules", "projects", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("approval_project_rules_groups", "approval_project_rules", {:on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("approval_project_rules_groups", "namespaces", {:column=>"group_id", :on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("approval_project_rules_users", "approval_project_rules", {:on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("approval_project_rules_users", "users", {:on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("approvals", "merge_requests", {:name=>"fk_310d714958", :on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("approver_groups", "namespaces", {:column=>"group_id", :on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("badges", "namespaces", {:column=>"group_id", :on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("badges", "projects", {:on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("board_assignees", "boards", {:on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("board_assignees", "users", {:column=>"assignee_id", :on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("board_group_recent_visits", "boards", {:on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("board_group_recent_visits", "namespaces", {:column=>"group_id", :on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("board_group_recent_visits", "users", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("board_labels", "boards", {:on_delete=>:cascade})
   -> 0.0013s
-- add_foreign_key("board_labels", "labels", {:on_delete=>:cascade})
   -> 0.0013s
-- add_foreign_key("board_project_recent_visits", "boards", {:on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("board_project_recent_visits", "projects", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("board_project_recent_visits", "users", {:on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("boards", "namespaces", {:column=>"group_id", :name=>"fk_1e9a074a35", :on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("boards", "projects", {:name=>"fk_f15266b5f9", :on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("chat_teams", "namespaces", {:on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("ci_build_needs", "ci_builds", {:column=>"build_id", :on_delete=>:cascade})
   -> 0.0026s
-- add_foreign_key("ci_build_trace_chunks", "ci_builds", {:column=>"build_id", :on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("ci_build_trace_section_names", "projects", {:on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("ci_build_trace_sections", "ci_build_trace_section_names", {:column=>"section_name_id", :name=>"fk_264e112c66", :on_delete=>:cascade})
   -> 0.0013s
-- add_foreign_key("ci_build_trace_sections", "ci_builds", {:column=>"build_id", :name=>"fk_4ebe41f502", :on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("ci_build_trace_sections", "projects", {:on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("ci_builds", "ci_pipelines", {:column=>"auto_canceled_by_id", :name=>"fk_a2141b1522", :on_delete=>:nullify})
   -> 0.0021s
-- add_foreign_key("ci_builds", "ci_pipelines", {:column=>"commit_id", :name=>"fk_d3130c9a7f", :on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("ci_builds", "ci_pipelines", {:column=>"upstream_pipeline_id", :name=>"fk_87f4cefcda", :on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("ci_builds", "ci_stages", {:column=>"stage_id", :name=>"fk_3a9eaa254d", :on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("ci_builds", "projects", {:name=>"fk_befce0568a", :on_delete=>:cascade})
   -> 0.0019s
-- add_foreign_key("ci_builds_metadata", "ci_builds", {:column=>"build_id", :on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("ci_builds_metadata", "projects", {:on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("ci_builds_runner_session", "ci_builds", {:column=>"build_id", :on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("ci_group_variables", "namespaces", {:column=>"group_id", :name=>"fk_33ae4d58d8", :on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("ci_job_artifacts", "ci_builds", {:column=>"job_id", :on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("ci_job_artifacts", "projects", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("ci_job_variables", "ci_builds", {:column=>"job_id", :on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("ci_pipeline_chat_data", "chat_names", {:on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("ci_pipeline_chat_data", "ci_pipelines", {:column=>"pipeline_id", :on_delete=>:cascade})
   -> 0.0013s
-- add_foreign_key("ci_pipeline_schedule_variables", "ci_pipeline_schedules", {:column=>"pipeline_schedule_id", :name=>"fk_41c35fda51", :on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("ci_pipeline_schedules", "projects", {:name=>"fk_8ead60fcc4", :on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("ci_pipeline_schedules", "users", {:column=>"owner_id", :name=>"fk_9ea99f58d2", :on_delete=>:nullify})
   -> 0.0016s
-- add_foreign_key("ci_pipeline_variables", "ci_pipelines", {:column=>"pipeline_id", :name=>"fk_f29c5f4380", :on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("ci_pipelines", "ci_pipeline_schedules", {:column=>"pipeline_schedule_id", :name=>"fk_3d34ab2e06", :on_delete=>:nullify})
   -> 0.0013s
-- add_foreign_key("ci_pipelines", "ci_pipelines", {:column=>"auto_canceled_by_id", :name=>"fk_262d4c2d19", :on_delete=>:nullify})
   -> 0.0013s
-- add_foreign_key("ci_pipelines", "external_pull_requests", {:name=>"fk_190998ef09", :on_delete=>:nullify})
   -> 0.0016s
-- add_foreign_key("ci_pipelines", "merge_requests", {:name=>"fk_a23be95014", :on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("ci_pipelines", "projects", {:name=>"fk_86635dbd80", :on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("ci_runner_namespaces", "ci_runners", {:column=>"runner_id", :on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("ci_runner_namespaces", "namespaces", {:on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("ci_runner_projects", "projects", {:name=>"fk_4478a6f1e4", :on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("ci_sources_pipelines", "ci_builds", {:column=>"source_job_id", :name=>"fk_be5624bf37", :on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("ci_sources_pipelines", "ci_pipelines", {:column=>"pipeline_id", :name=>"fk_e1bad85861", :on_delete=>:cascade})
   -> 0.0013s
-- add_foreign_key("ci_sources_pipelines", "ci_pipelines", {:column=>"source_pipeline_id", :name=>"fk_d4e29af7d7", :on_delete=>:cascade})
   -> 0.0013s
-- add_foreign_key("ci_sources_pipelines", "projects", {:column=>"source_project_id", :name=>"fk_acd9737679", :on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("ci_sources_pipelines", "projects", {:name=>"fk_1e53c97c0a", :on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("ci_stages", "ci_pipelines", {:column=>"pipeline_id", :name=>"fk_fb57e6cc56", :on_delete=>:cascade})
   -> 0.0020s
-- add_foreign_key("ci_stages", "projects", {:name=>"fk_2360681d1d", :on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("ci_trigger_requests", "ci_triggers", {:column=>"trigger_id", :name=>"fk_b8ec8b7245", :on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("ci_triggers", "projects", {:name=>"fk_e3e63f966e", :on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("ci_triggers", "users", {:column=>"owner_id", :name=>"fk_e8e10d1964", :on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("ci_variables", "projects", {:name=>"fk_ada5eb64b3", :on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("cluster_groups", "clusters", {:on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("cluster_groups", "namespaces", {:column=>"group_id", :on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("cluster_platforms_kubernetes", "clusters", {:on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("cluster_projects", "clusters", {:on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("cluster_projects", "projects", {:on_delete=>:cascade})
   -> 0.0020s
-- add_foreign_key("cluster_providers_gcp", "clusters", {:on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("clusters", "projects", {:column=>"management_project_id", :name=>"fk_f05c5e5a42", :on_delete=>:nullify})
   -> 0.0016s
-- add_foreign_key("clusters", "users", {:on_delete=>:nullify})
   -> 0.0017s
-- add_foreign_key("clusters_applications_cert_managers", "clusters", {:on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("clusters_applications_helm", "clusters", {:on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("clusters_applications_ingress", "clusters", {:on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("clusters_applications_jupyter", "clusters", {:on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("clusters_applications_jupyter", "oauth_applications", {:on_delete=>:nullify})
   -> 0.0016s
-- add_foreign_key("clusters_applications_knative", "clusters", {:on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("clusters_applications_prometheus", "clusters", {:name=>"fk_557e773639", :on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("clusters_applications_runners", "ci_runners", {:column=>"runner_id", :name=>"fk_02de2ded36", :on_delete=>:nullify})
   -> 0.0014s
-- add_foreign_key("clusters_applications_runners", "clusters", {:on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("clusters_kubernetes_namespaces", "cluster_projects", {:on_delete=>:nullify})
   -> 0.0017s
-- add_foreign_key("clusters_kubernetes_namespaces", "clusters", {:on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("clusters_kubernetes_namespaces", "environments", {:on_delete=>:nullify})
   -> 0.0018s
-- add_foreign_key("clusters_kubernetes_namespaces", "projects", {:on_delete=>:nullify})
   -> 0.0019s
-- add_foreign_key("container_repositories", "projects")
   -> 0.0019s
-- add_foreign_key("dependency_proxy_blobs", "namespaces", {:column=>"group_id", :on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("dependency_proxy_group_settings", "namespaces", {:column=>"group_id", :on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("deploy_keys_projects", "projects", {:name=>"fk_58a901ca7e", :on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("deployments", "clusters", {:name=>"fk_289bba3222", :on_delete=>:nullify})
   -> 0.0020s
-- add_foreign_key("deployments", "projects", {:name=>"fk_b9a3851b82", :on_delete=>:cascade})
   -> 0.0019s
-- add_foreign_key("design_management_designs", "issues", {:on_delete=>:cascade})
   -> 0.0023s
-- add_foreign_key("design_management_designs", "projects", {:on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("design_management_designs_versions", "design_management_designs", {:column=>"design_id", :name=>"fk_03c671965c", :on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("design_management_designs_versions", "design_management_versions", {:column=>"version_id", :name=>"fk_f4d25ba00c", :on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("design_management_versions", "issues", {:on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("design_management_versions", "users", {:name=>"fk_ee16b939e5", :on_delete=>:nullify})
   -> 0.0019s
-- add_foreign_key("draft_notes", "merge_requests", {:on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("draft_notes", "users", {:column=>"author_id", :on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("elasticsearch_indexed_namespaces", "namespaces", {:on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("elasticsearch_indexed_projects", "projects", {:on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("environments", "projects", {:name=>"fk_d1c8c1da6a", :on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("epic_issues", "epics", {:on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("epic_issues", "issues", {:on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("epic_metrics", "epics", {:on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("epics", "epics", {:column=>"parent_id", :name=>"fk_25b99c1be3", :on_delete=>:cascade})
   -> 0.0013s
-- add_foreign_key("epics", "milestones", {:on_delete=>:nullify})
   -> 0.0017s
-- add_foreign_key("epics", "namespaces", {:column=>"group_id", :name=>"fk_f081aa4489", :on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("epics", "users", {:column=>"assignee_id", :name=>"fk_dccd3f98fc", :on_delete=>:nullify})
   -> 0.0017s
-- add_foreign_key("epics", "users", {:column=>"author_id", :name=>"fk_3654b61b03", :on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("epics", "users", {:column=>"closed_by_id", :name=>"fk_aa5798e761", :on_delete=>:nullify})
   -> 0.0016s
-- add_foreign_key("events", "namespaces", {:column=>"group_id", :name=>"fk_61fbf6ca48", :on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("events", "projects", {:on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("events", "users", {:column=>"author_id", :name=>"fk_edfd187b6f", :on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("external_pull_requests", "projects", {:on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("fork_network_members", "fork_networks", {:on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("fork_network_members", "projects", {:column=>"forked_from_project_id", :name=>"fk_b01280dae4", :on_delete=>:nullify})
   -> 0.0017s
-- add_foreign_key("fork_network_members", "projects", {:on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("fork_networks", "projects", {:column=>"root_project_id", :name=>"fk_e7b436b2b5", :on_delete=>:nullify})
   -> 0.0016s
-- add_foreign_key("forked_project_links", "projects", {:column=>"forked_to_project_id", :name=>"fk_434510edb0", :on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("geo_container_repository_updated_events", "container_repositories", {:name=>"fk_212c89c706", :on_delete=>:cascade})
   -> 0.0013s
-- add_foreign_key("geo_event_log", "geo_cache_invalidation_events", {:column=>"cache_invalidation_event_id", :name=>"fk_42c3b54bed", :on_delete=>:cascade})
   -> 0.0019s
-- add_foreign_key("geo_event_log", "geo_container_repository_updated_events", {:column=>"container_repository_updated_event_id", :name=>"fk_6ada82d42a", :on_delete=>:cascade})
   -> 0.0012s
-- add_foreign_key("geo_event_log", "geo_hashed_storage_migrated_events", {:column=>"hashed_storage_migrated_event_id", :name=>"fk_27548c6db3", :on_delete=>:cascade})
   -> 0.0013s
-- add_foreign_key("geo_event_log", "geo_job_artifact_deleted_events", {:column=>"job_artifact_deleted_event_id", :name=>"fk_176d3fbb5d", :on_delete=>:cascade})
   -> 0.0013s
-- add_foreign_key("geo_event_log", "geo_lfs_object_deleted_events", {:column=>"lfs_object_deleted_event_id", :name=>"fk_d5af95fcd9", :on_delete=>:cascade})
   -> 0.0013s
-- add_foreign_key("geo_event_log", "geo_repositories_changed_events", {:column=>"repositories_changed_event_id", :name=>"fk_4a99ebfd60", :on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("geo_event_log", "geo_repository_created_events", {:column=>"repository_created_event_id", :name=>"fk_9b9afb1916", :on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("geo_event_log", "geo_repository_deleted_events", {:column=>"repository_deleted_event_id", :name=>"fk_c4b1c1f66e", :on_delete=>:cascade})
   -> 0.0021s
-- add_foreign_key("geo_event_log", "geo_repository_renamed_events", {:column=>"repository_renamed_event_id", :name=>"fk_86c84214ec", :on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("geo_event_log", "geo_repository_updated_events", {:column=>"repository_updated_event_id", :name=>"fk_78a6492f68", :on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("geo_event_log", "geo_reset_checksum_events", {:column=>"reset_checksum_event_id", :name=>"fk_cff7185ad2", :on_delete=>:cascade})
   -> 0.0013s
-- add_foreign_key("geo_event_log", "geo_upload_deleted_events", {:column=>"upload_deleted_event_id", :name=>"fk_c1f241c70d", :on_delete=>:cascade})
   -> 0.0013s
-- add_foreign_key("geo_hashed_storage_attachments_events", "projects", {:on_delete=>:cascade})
   -> 0.0019s
-- add_foreign_key("geo_hashed_storage_migrated_events", "projects", {:on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("geo_node_namespace_links", "geo_nodes", {:on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("geo_node_namespace_links", "namespaces", {:on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("geo_node_statuses", "geo_nodes", {:on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("geo_repositories_changed_events", "geo_nodes", {:on_delete=>:cascade})
   -> 0.0012s
-- add_foreign_key("geo_repository_created_events", "projects", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("geo_repository_renamed_events", "projects", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("geo_repository_updated_events", "projects", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("geo_reset_checksum_events", "projects", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("gitlab_subscriptions", "namespaces", {:name=>"fk_e2595d00a1", :on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("gitlab_subscriptions", "plans", {:column=>"hosted_plan_id", :name=>"fk_bd0c4019c3", :on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("gpg_key_subkeys", "gpg_keys", {:on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("gpg_keys", "users", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("gpg_signatures", "gpg_key_subkeys", {:on_delete=>:nullify})
   -> 0.0015s
-- add_foreign_key("gpg_signatures", "gpg_keys", {:on_delete=>:nullify})
   -> 0.0013s
-- add_foreign_key("gpg_signatures", "projects", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("grafana_integrations", "projects", {:on_delete=>:cascade})
   -> 0.0019s
-- add_foreign_key("group_custom_attributes", "namespaces", {:column=>"group_id", :on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("identities", "saml_providers", {:name=>"fk_aade90f0fc", :on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("import_export_uploads", "projects", {:on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("index_statuses", "projects", {:name=>"fk_74b2492545", :on_delete=>:cascade})
   -> 0.0019s
-- add_foreign_key("insights", "namespaces", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("insights", "projects", {:on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("internal_ids", "namespaces", {:name=>"fk_162941d509", :on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("internal_ids", "projects", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("ip_restrictions", "namespaces", {:column=>"group_id", :on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("issue_assignees", "issues", {:name=>"fk_b7d881734a", :on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("issue_assignees", "users", {:name=>"fk_5e0c8d9154", :on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("issue_links", "issues", {:column=>"source_id", :name=>"fk_c900194ff2", :on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("issue_links", "issues", {:column=>"target_id", :name=>"fk_e71bb44f1f", :on_delete=>:cascade})
   -> 0.0013s
-- add_foreign_key("issue_metrics", "issues", {:on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("issue_tracker_data", "services", {:on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("issues", "issues", {:column=>"duplicated_to_id", :name=>"fk_9c4516d665", :on_delete=>:nullify})
   -> 0.0015s
-- add_foreign_key("issues", "issues", {:column=>"moved_to_id", :name=>"fk_a194299be1", :on_delete=>:nullify})
   -> 0.0014s
-- add_foreign_key("issues", "milestones", {:name=>"fk_96b1dd429c", :on_delete=>:nullify})
   -> 0.0015s
-- add_foreign_key("issues", "projects", {:name=>"fk_899c8f3231", :on_delete=>:cascade})
   -> 0.0019s
-- add_foreign_key("issues", "users", {:column=>"author_id", :name=>"fk_05f1e72feb", :on_delete=>:nullify})
   -> 0.0018s
-- add_foreign_key("issues", "users", {:column=>"closed_by_id", :name=>"fk_c63cbf6c25", :on_delete=>:nullify})
   -> 0.0016s
-- add_foreign_key("issues", "users", {:column=>"updated_by_id", :name=>"fk_ffed080f01", :on_delete=>:nullify})
   -> 0.0016s
-- add_foreign_key("issues_prometheus_alert_events", "issues", {:on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("issues_prometheus_alert_events", "prometheus_alert_events", {:on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("jira_connect_subscriptions", "jira_connect_installations", {:on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("jira_connect_subscriptions", "namespaces", {:on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("jira_tracker_data", "services", {:on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("label_links", "labels", {:name=>"fk_d97dd08678", :on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("label_priorities", "labels", {:on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("label_priorities", "projects", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("labels", "namespaces", {:column=>"group_id", :on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("labels", "projects", {:name=>"fk_7de4989a69", :on_delete=>:cascade})
   -> 0.0019s
-- add_foreign_key("lfs_file_locks", "projects", {:on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("lfs_file_locks", "users", {:on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("list_user_preferences", "lists", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("list_user_preferences", "users", {:on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("lists", "boards", {:name=>"fk_0d3f677137", :on_delete=>:cascade})
   -> 0.0013s
-- add_foreign_key("lists", "labels", {:name=>"fk_7a5553d60f", :on_delete=>:cascade})
   -> 0.0013s
-- add_foreign_key("lists", "milestones", {:on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("lists", "users", {:name=>"fk_d6cf4279f7", :on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("members", "users", {:name=>"fk_2e88fb7ce9", :on_delete=>:cascade})
   -> 0.0020s
-- add_foreign_key("merge_request_assignees", "merge_requests", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("merge_request_assignees", "users", {:on_delete=>:cascade})
   -> 0.0019s
-- add_foreign_key("merge_request_blocks", "merge_requests", {:column=>"blocked_merge_request_id", :on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("merge_request_blocks", "merge_requests", {:column=>"blocking_merge_request_id", :on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("merge_request_diff_commits", "merge_request_diffs", {:on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("merge_request_diff_files", "merge_request_diffs", {:on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("merge_request_diffs", "merge_requests", {:name=>"fk_8483f3258f", :on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("merge_request_metrics", "ci_pipelines", {:column=>"pipeline_id", :on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("merge_request_metrics", "merge_requests", {:on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("merge_request_metrics", "users", {:column=>"latest_closed_by_id", :name=>"fk_ae440388cc", :on_delete=>:nullify})
   -> 0.0017s
-- add_foreign_key("merge_request_metrics", "users", {:column=>"merged_by_id", :name=>"fk_7f28d925f3", :on_delete=>:nullify})
   -> 0.0017s
-- add_foreign_key("merge_requests", "ci_pipelines", {:column=>"head_pipeline_id", :name=>"fk_fd82eae0b9", :on_delete=>:nullify})
   -> 0.0016s
-- add_foreign_key("merge_requests", "merge_request_diffs", {:column=>"latest_merge_request_diff_id", :name=>"fk_06067f5644", :on_delete=>:nullify})
   -> 0.0021s
-- add_foreign_key("merge_requests", "milestones", {:name=>"fk_6a5165a692", :on_delete=>:nullify})
   -> 0.0015s
-- add_foreign_key("merge_requests", "projects", {:column=>"source_project_id", :name=>"fk_3308fe130c", :on_delete=>:nullify})
   -> 0.0020s
-- add_foreign_key("merge_requests", "projects", {:column=>"target_project_id", :name=>"fk_a6963e8447", :on_delete=>:cascade})
   -> 0.0019s
-- add_foreign_key("merge_requests", "users", {:column=>"assignee_id", :name=>"fk_6149611a04", :on_delete=>:nullify})
   -> 0.0018s
-- add_foreign_key("merge_requests", "users", {:column=>"author_id", :name=>"fk_e719a85f8a", :on_delete=>:nullify})
   -> 0.0017s
-- add_foreign_key("merge_requests", "users", {:column=>"merge_user_id", :name=>"fk_ad525e1f87", :on_delete=>:nullify})
   -> 0.0018s
-- add_foreign_key("merge_requests", "users", {:column=>"updated_by_id", :name=>"fk_641731faff", :on_delete=>:nullify})
   -> 0.0018s
-- add_foreign_key("merge_requests_closing_issues", "issues", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("merge_requests_closing_issues", "merge_requests", {:on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("merge_trains", "ci_pipelines", {:column=>"pipeline_id", :on_delete=>:nullify})
   -> 0.0016s
-- add_foreign_key("merge_trains", "merge_requests", {:on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("merge_trains", "projects", {:column=>"target_project_id", :on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("merge_trains", "users", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("milestone_releases", "milestones", {:on_delete=>:cascade})
   -> 0.0013s
-- add_foreign_key("milestone_releases", "releases", {:on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("milestones", "namespaces", {:column=>"group_id", :name=>"fk_95650a40d4", :on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("milestones", "projects", {:name=>"fk_9bd0a0c791", :on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("namespace_aggregation_schedules", "namespaces", {:on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("namespace_root_storage_statistics", "namespaces", {:on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("namespace_statistics", "namespaces", {:on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("namespaces", "namespaces", {:column=>"custom_project_templates_group_id", :name=>"fk_e7a0b20a6b", :on_delete=>:nullify})
   -> 0.0015s
-- add_foreign_key("namespaces", "plans", {:name=>"fk_fdd12e5b80", :on_delete=>:nullify})
   -> 0.0015s
-- add_foreign_key("namespaces", "projects", {:column=>"file_template_project_id", :name=>"fk_319256d87a", :on_delete=>:nullify})
   -> 0.0020s
-- add_foreign_key("note_diff_files", "notes", {:column=>"diff_note_id", :on_delete=>:cascade})
   -> 0.0019s
-- add_foreign_key("notes", "projects", {:name=>"fk_99e097b079", :on_delete=>:cascade})
   -> 0.0019s
-- add_foreign_key("notes", "reviews", {:name=>"fk_2e82291620", :on_delete=>:nullify})
   -> 0.0016s
-- add_foreign_key("notification_settings", "users", {:name=>"fk_0c95e91db7", :on_delete=>:cascade})
   -> 0.0020s
-- add_foreign_key("oauth_openid_requests", "oauth_access_grants", {:column=>"access_grant_id", :name=>"fk_oauth_openid_requests_oauth_access_grants_access_grant_id"})
   -> 0.0019s
-- add_foreign_key("operations_feature_flag_scopes", "operations_feature_flags", {:column=>"feature_flag_id", :on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("operations_feature_flags", "projects", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("operations_feature_flags_clients", "projects", {:on_delete=>:cascade})
   -> 0.0019s
-- add_foreign_key("packages_maven_metadata", "packages_packages", {:column=>"package_id", :name=>"fk_be88aed360", :on_delete=>:cascade})
   -> 0.0013s
-- add_foreign_key("packages_package_files", "packages_packages", {:column=>"package_id", :name=>"fk_86f0f182f8", :on_delete=>:cascade})
   -> 0.0012s
-- add_foreign_key("packages_package_metadata", "packages_packages", {:column=>"package_id", :on_delete=>:cascade})
   -> 0.0013s
-- add_foreign_key("packages_package_tags", "packages_packages", {:column=>"package_id", :on_delete=>:cascade})
   -> 0.0012s
-- add_foreign_key("packages_packages", "projects", {:on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("pages_domain_acme_orders", "pages_domains", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("pages_domains", "projects", {:name=>"fk_ea2f6dfc6f", :on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("path_locks", "projects", {:name=>"fk_5265c98f24", :on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("path_locks", "users")
   -> 0.0018s
-- add_foreign_key("personal_access_tokens", "users")
   -> 0.0018s
-- add_foreign_key("pool_repositories", "projects", {:column=>"source_project_id", :on_delete=>:nullify})
   -> 0.0018s
-- add_foreign_key("pool_repositories", "shards", {:on_delete=>:restrict})
   -> 0.0013s
-- add_foreign_key("project_alerting_settings", "projects", {:on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("project_aliases", "projects", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("project_authorizations", "projects", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("project_authorizations", "users", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("project_auto_devops", "projects", {:on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("project_ci_cd_settings", "projects", {:name=>"fk_24c15d2f2e", :on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("project_custom_attributes", "projects", {:on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("project_daily_statistics", "projects", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("project_deploy_tokens", "deploy_tokens", {:on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("project_deploy_tokens", "projects", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("project_error_tracking_settings", "projects", {:on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("project_feature_usages", "projects", {:on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("project_features", "projects", {:name=>"fk_18513d9b92", :on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("project_group_links", "projects", {:name=>"fk_daa8cee94c", :on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("project_import_data", "projects", {:name=>"fk_ffb9ee3a10", :on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("project_incident_management_settings", "projects", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("project_metrics_settings", "projects", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("project_mirror_data", "projects", {:name=>"fk_d1aad367d7", :on_delete=>:cascade})
   -> 0.0019s
-- add_foreign_key("project_pages_metadata", "projects", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("project_repositories", "projects", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("project_repositories", "shards", {:on_delete=>:restrict})
   -> 0.0013s
-- add_foreign_key("project_repository_states", "projects", {:on_delete=>:cascade})
   -> 0.0023s
-- add_foreign_key("project_statistics", "projects", {:on_delete=>:cascade})
   -> 0.0019s
-- add_foreign_key("project_tracing_settings", "projects", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("projects", "pool_repositories", {:name=>"fk_6e5c14658a", :on_delete=>:nullify})
   -> 0.0019s
-- add_foreign_key("prometheus_alert_events", "projects", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("prometheus_alert_events", "prometheus_alerts", {:on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("prometheus_alerts", "environments", {:on_delete=>:cascade})
   -> 0.0013s
-- add_foreign_key("prometheus_alerts", "projects", {:on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("prometheus_alerts", "prometheus_metrics", {:on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("prometheus_metrics", "projects", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("protected_branch_merge_access_levels", "namespaces", {:column=>"group_id", :name=>"fk_98f3d044fe", :on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("protected_branch_merge_access_levels", "protected_branches", {:name=>"fk_8a3072ccb3", :on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("protected_branch_merge_access_levels", "users")
   -> 0.0017s
-- add_foreign_key("protected_branch_push_access_levels", "namespaces", {:column=>"group_id", :name=>"fk_7111b68cdb", :on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("protected_branch_push_access_levels", "protected_branches", {:name=>"fk_9ffc86a3d9", :on_delete=>:cascade})
   -> 0.0012s
-- add_foreign_key("protected_branch_push_access_levels", "users")
   -> 0.0016s
-- add_foreign_key("protected_branch_unprotect_access_levels", "namespaces", {:column=>"group_id", :on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("protected_branch_unprotect_access_levels", "protected_branches", {:on_delete=>:cascade})
   -> 0.0012s
-- add_foreign_key("protected_branch_unprotect_access_levels", "users", {:on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("protected_branches", "projects", {:name=>"fk_7a9c6d93e7", :on_delete=>:cascade})
   -> 0.0019s
-- add_foreign_key("protected_environment_deploy_access_levels", "namespaces", {:column=>"group_id", :on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("protected_environment_deploy_access_levels", "protected_environments", {:on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("protected_environment_deploy_access_levels", "users", {:on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("protected_environments", "projects", {:on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("protected_tag_create_access_levels", "namespaces", {:column=>"group_id", :name=>"fk_b4eb82fe3c", :on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("protected_tag_create_access_levels", "protected_tags", {:name=>"fk_f7dfda8c51", :on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("protected_tag_create_access_levels", "users")
   -> 0.0016s
-- add_foreign_key("protected_tags", "projects", {:name=>"fk_8e4af87648", :on_delete=>:cascade})
   -> 0.0019s
-- add_foreign_key("push_event_payloads", "events", {:name=>"fk_36c74129da", :on_delete=>:cascade})
   -> 0.0013s
-- add_foreign_key("push_rules", "projects", {:name=>"fk_83b29894de", :on_delete=>:cascade})
   -> 0.0020s
-- add_foreign_key("release_links", "releases", {:on_delete=>:cascade})
   -> 0.0013s
-- add_foreign_key("releases", "projects", {:name=>"fk_47fe2a0596", :on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("releases", "users", {:column=>"author_id", :name=>"fk_8e4456f90f", :on_delete=>:nullify})
   -> 0.0016s
-- add_foreign_key("remote_mirrors", "projects", {:name=>"fk_43a9aa4ca8", :on_delete=>:cascade})
   -> 0.0019s
-- add_foreign_key("repository_languages", "projects", {:on_delete=>:cascade})
   -> 0.0019s
-- add_foreign_key("resource_label_events", "epics", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("resource_label_events", "issues", {:on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("resource_label_events", "labels", {:on_delete=>:nullify})
   -> 0.0014s
-- add_foreign_key("resource_label_events", "merge_requests", {:on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("resource_label_events", "users", {:on_delete=>:nullify})
   -> 0.0017s
-- add_foreign_key("reviews", "merge_requests", {:on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("reviews", "projects", {:on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("reviews", "users", {:column=>"author_id", :on_delete=>:nullify})
   -> 0.0017s
-- add_foreign_key("saml_providers", "namespaces", {:column=>"group_id", :on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("scim_oauth_access_tokens", "namespaces", {:column=>"group_id", :on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("services", "projects", {:name=>"fk_71cce407f9", :on_delete=>:cascade})
   -> 0.0019s
-- add_foreign_key("slack_integrations", "services", {:on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("smartcard_identities", "users", {:on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("snippets", "projects", {:name=>"fk_be41fd4bb7", :on_delete=>:cascade})
   -> 0.0021s
-- add_foreign_key("software_license_policies", "projects", {:on_delete=>:cascade})
   -> 0.0020s
-- add_foreign_key("software_license_policies", "software_licenses", {:on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("subscriptions", "projects", {:on_delete=>:cascade})
   -> 0.0019s
-- add_foreign_key("suggestions", "notes", {:on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("system_note_metadata", "notes", {:name=>"fk_d83a918cb1", :on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("term_agreements", "application_setting_terms", {:column=>"term_id"})
   -> 0.0014s
-- add_foreign_key("term_agreements", "users", {:on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("timelogs", "issues", {:name=>"fk_timelogs_issues_issue_id", :on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("timelogs", "merge_requests", {:name=>"fk_timelogs_merge_requests_merge_request_id", :on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("todos", "namespaces", {:column=>"group_id", :on_delete=>:cascade})
   -> 0.0019s
-- add_foreign_key("todos", "notes", {:name=>"fk_91d1f47b13", :on_delete=>:cascade})
   -> 0.0014s
-- add_foreign_key("todos", "projects", {:name=>"fk_45054f9c45", :on_delete=>:cascade})
   -> 0.0019s
-- add_foreign_key("todos", "users", {:column=>"author_id", :name=>"fk_ccf0373936", :on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("todos", "users", {:name=>"fk_d94154aa95", :on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("trending_projects", "projects", {:on_delete=>:cascade})
   -> 0.0019s
-- add_foreign_key("u2f_registrations", "users")
   -> 0.0018s
-- add_foreign_key("user_callouts", "users", {:on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("user_custom_attributes", "users", {:on_delete=>:cascade})
   -> 0.0019s
-- add_foreign_key("user_interacted_projects", "projects", {:name=>"fk_722ceba4f7", :on_delete=>:cascade})
   -> 0.0019s
-- add_foreign_key("user_interacted_projects", "users", {:name=>"fk_0894651f08", :on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("user_preferences", "users", {:on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("user_statuses", "users", {:on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("user_synced_attributes_metadata", "users", {:on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("users", "application_setting_terms", {:column=>"accepted_term_id", :name=>"fk_789cd90b35", :on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("users", "namespaces", {:column=>"managing_group_id", :name=>"fk_a4b8fefe3e", :on_delete=>:nullify})
   -> 0.0022s
-- add_foreign_key("users_ops_dashboard_projects", "projects", {:on_delete=>:cascade})
   -> 0.0051s
-- add_foreign_key("users_ops_dashboard_projects", "users", {:on_delete=>:cascade})
   -> 0.0020s
-- add_foreign_key("users_star_projects", "projects", {:name=>"fk_22cd27ddfc", :on_delete=>:cascade})
   -> 0.0022s
-- add_foreign_key("vulnerabilities", "epics", {:name=>"fk_1d37cddf91", :on_delete=>:nullify})
   -> 0.0020s
-- add_foreign_key("vulnerabilities", "milestones", {:column=>"due_date_sourcing_milestone_id", :name=>"fk_7c5bb22a22", :on_delete=>:nullify})
   -> 0.0014s
-- add_foreign_key("vulnerabilities", "milestones", {:column=>"start_date_sourcing_milestone_id", :name=>"fk_88b4d546ef", :on_delete=>:nullify})
   -> 0.0013s
-- add_foreign_key("vulnerabilities", "milestones", {:name=>"fk_131d289c65", :on_delete=>:nullify})
   -> 0.0015s
-- add_foreign_key("vulnerabilities", "projects", {:name=>"fk_efb96ab1e2", :on_delete=>:cascade})
   -> 0.0021s
-- add_foreign_key("vulnerabilities", "users", {:column=>"author_id", :name=>"fk_b1de915a15", :on_delete=>:nullify})
   -> 0.0018s
-- add_foreign_key("vulnerabilities", "users", {:column=>"closed_by_id", :name=>"fk_cf5c60acbf", :on_delete=>:nullify})
   -> 0.0017s
-- add_foreign_key("vulnerabilities", "users", {:column=>"last_edited_by_id", :name=>"fk_1302949740", :on_delete=>:nullify})
   -> 0.0017s
-- add_foreign_key("vulnerabilities", "users", {:column=>"updated_by_id", :name=>"fk_7ac31eacb9", :on_delete=>:nullify})
   -> 0.0025s
-- add_foreign_key("vulnerability_feedback", "ci_pipelines", {:column=>"pipeline_id", :on_delete=>:nullify})
   -> 0.0018s
-- add_foreign_key("vulnerability_feedback", "issues", {:on_delete=>:nullify})
   -> 0.0015s
-- add_foreign_key("vulnerability_feedback", "merge_requests", {:name=>"fk_563ff1912e", :on_delete=>:nullify})
   -> 0.0016s
-- add_foreign_key("vulnerability_feedback", "projects", {:on_delete=>:cascade})
   -> 0.0020s
-- add_foreign_key("vulnerability_feedback", "users", {:column=>"author_id", :on_delete=>:cascade})
   -> 0.0017s
-- add_foreign_key("vulnerability_feedback", "users", {:column=>"comment_author_id", :name=>"fk_94f7c8a81e", :on_delete=>:nullify})
   -> 0.0016s
-- add_foreign_key("vulnerability_identifiers", "projects", {:on_delete=>:cascade})
   -> 0.0020s
-- add_foreign_key("vulnerability_occurrence_identifiers", "vulnerability_identifiers", {:column=>"identifier_id", :on_delete=>:cascade})
   -> 0.0018s
-- add_foreign_key("vulnerability_occurrence_identifiers", "vulnerability_occurrences", {:column=>"occurrence_id", :on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("vulnerability_occurrence_pipelines", "ci_pipelines", {:column=>"pipeline_id", :on_delete=>:cascade})
   -> 0.0015s
-- add_foreign_key("vulnerability_occurrence_pipelines", "vulnerability_occurrences", {:column=>"occurrence_id", :on_delete=>:cascade})
   -> 0.0013s
-- add_foreign_key("vulnerability_occurrences", "projects", {:on_delete=>:cascade})
   -> 0.0020s
-- add_foreign_key("vulnerability_occurrences", "vulnerabilities", {:name=>"fk_97ffe77653", :on_delete=>:nullify})
   -> 0.0015s
-- add_foreign_key("vulnerability_occurrences", "vulnerability_identifiers", {:column=>"primary_identifier_id", :on_delete=>:cascade})
   -> 0.0012s
-- add_foreign_key("vulnerability_occurrences", "vulnerability_scanners", {:column=>"scanner_id", :on_delete=>:cascade})
   -> 0.0013s
-- add_foreign_key("vulnerability_scanners", "projects", {:on_delete=>:cascade})
   -> 0.0019s
-- add_foreign_key("web_hook_logs", "web_hooks", {:on_delete=>:cascade})
   -> 0.0016s
-- add_foreign_key("web_hooks", "projects", {:name=>"fk_0c8ca6d9d1", :on_delete=>:cascade})
   -> 0.0020s
$ date
Tue Oct 15 08:40:16 UTC 2019
$ source scripts/rspec_helpers.sh
$ rspec_paralellized_job "--tag ~quarantine --tag ~geo"
KNAPSACK_TEST_FILE_PATTERN: spec/{bin,config,db,dependencies,factories,finders,frontend,graphql,haml_lint,helpers,initializers,javascripts,lib,migrations,models,policies,presenters,rack_servers,routing,rubocop,serializers,services,sidekiq,tasks,uploaders,validators,views,workers,elastic_integration}{,/**/}*_spec.rb
Checking gitaly-ruby bundle...
Warning: the running version of Bundler (1.17.2) is older than the version that created the lockfile (1.17.3). We suggest you upgrade to the latest version of Bundler by running `gem install bundler`.
The Gemfile's dependencies are satisfied
Trying to connect to gitaly: ...... OK

Report specs:
spec/services/merge_requests/update_service_spec.rb
spec/services/projects/import_service_spec.rb
spec/models/concerns/resolvable_discussion_spec.rb
spec/lib/gitlab/sidekiq_daemon/memory_killer_spec.rb
spec/models/commit_spec.rb
spec/lib/gitlab/search_results_spec.rb
spec/models/namespace_spec.rb
spec/finders/notes_finder_spec.rb
spec/models/environment_status_spec.rb
spec/serializers/pipeline_entity_spec.rb
spec/migrations/migrate_auto_dev_ops_domain_to_cluster_domain_spec.rb
spec/services/issuable/clone/content_rewriter_spec.rb
spec/presenters/ci/pipeline_presenter_spec.rb
spec/models/snippet_spec.rb
spec/finders/projects/serverless/functions_finder_spec.rb
spec/models/prometheus_metric_spec.rb
spec/lib/gitlab/data_builder/note_spec.rb
spec/lib/gitlab/data_builder/push_spec.rb
spec/services/clusters/applications/upgrade_service_spec.rb
spec/presenters/ci/build_presenter_spec.rb
spec/services/issuable/clone/attributes_rewriter_spec.rb
spec/models/cycle_analytics/group_level_spec.rb
spec/models/commit_collection_spec.rb
spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb
spec/workers/invalid_gpg_signature_update_worker_spec.rb
spec/finders/cluster_ancestors_finder_spec.rb
spec/services/award_emojis/destroy_service_spec.rb
spec/models/project_services/gitlab_issue_tracker_service_spec.rb
spec/workers/namespaceless_project_destroy_worker_spec.rb
spec/lib/gitlab/diff/highlight_spec.rb
spec/services/discussions/resolve_service_spec.rb
spec/helpers/search_helper_spec.rb
spec/lib/gitlab/markdown_cache/active_record/extension_spec.rb
spec/lib/banzai/reference_parser/commit_range_parser_spec.rb
spec/services/projects/open_issues_count_service_spec.rb
spec/services/wiki_pages/update_service_spec.rb
spec/lib/gitlab/cycle_analytics/base_event_fetcher_spec.rb
spec/services/issues/import_csv_service_spec.rb
spec/presenters/issue_presenter_spec.rb
spec/services/projects/hashed_storage/migrate_repository_service_spec.rb
spec/workers/ci/archive_traces_cron_worker_spec.rb
spec/graphql/features/authorization_spec.rb
spec/models/project_import_state_spec.rb
spec/services/lfs/locks_finder_service_spec.rb
spec/helpers/gitlab_routing_helper_spec.rb
spec/lib/gitlab/kubernetes/helm/init_command_spec.rb
spec/lib/gitlab/exclusive_lease_spec.rb
spec/services/members/create_service_spec.rb
spec/lib/gitlab/sanitizers/exif_spec.rb
spec/models/concerns/project_features_compatibility_spec.rb
spec/models/label_note_spec.rb
spec/lib/gitlab/kubernetes/default_namespace_spec.rb
spec/helpers/award_emoji_helper_spec.rb
spec/workers/repository_import_worker_spec.rb
spec/views/projects/diffs/_stats.html.haml_spec.rb
spec/initializers/secret_token_spec.rb
spec/models/project_services/issue_tracker_service_spec.rb
spec/models/user_agent_detail_spec.rb
spec/services/boards/list_service_spec.rb
spec/services/wiki_pages/destroy_service_spec.rb
spec/lib/gitlab/visibility_level_checker_spec.rb
spec/services/merge_requests/migrate_external_diffs_service_spec.rb
spec/models/hooks/web_hook_log_spec.rb
spec/lib/gitlab/background_migration/add_merge_request_diff_commits_count_spec.rb
spec/workers/concerns/gitlab/github_import/stage_methods_spec.rb
spec/serializers/paginated_diff_entity_spec.rb
spec/migrations/migrate_managed_clusters_with_no_token_to_unmanaged_spec.rb
spec/lib/gitlab/ci/status/build/preparing_spec.rb
spec/uploaders/namespace_file_uploader_spec.rb
spec/lib/gitlab/ci/build/prerequisite/factory_spec.rb
spec/workers/concerns/project_import_options_spec.rb
spec/lib/gitlab/legacy_github_import/wiki_formatter_spec.rb
spec/lib/gitlab/metrics/instrumentation_spec.rb
spec/lib/gitlab/graphql/loaders/pipeline_for_sha_loader_spec.rb
spec/services/prometheus/adapter_service_spec.rb
spec/models/blob_viewer/base_spec.rb
spec/views/projects/pipeline_schedules/_pipeline_schedule.html.haml_spec.rb
spec/lib/gitlab/cycle_analytics/production_event_fetcher_spec.rb
spec/lib/gitlab/ci/status/build/erased_spec.rb
spec/lib/gitlab/checks/project_created_spec.rb
spec/migrations/set_issue_id_for_all_versions_spec.rb
spec/migrations/enqueue_reset_merge_status_spec.rb
spec/workers/mail_scheduler/issue_due_worker_spec.rb
spec/workers/hashed_storage/migrator_worker_spec.rb
spec/services/projects/container_repository/cleanup_tags_service_spec.rb
spec/migrations/remove_empty_extern_uid_auth0_identities_spec.rb
spec/workers/import_issues_csv_worker_spec.rb
spec/models/project_services/pivotaltracker_service_spec.rb
spec/helpers/boards_helper_spec.rb
spec/lib/gitlab/phabricator_import/project_creator_spec.rb
spec/migrations/assure_commits_count_for_merge_request_diff_spec.rb
spec/services/projects/container_repository/delete_tags_service_spec.rb
spec/lib/gitlab/graphql/representation/tree_entry_spec.rb
spec/services/protected_branches/destroy_service_spec.rb
spec/lib/gitlab/import/database_helpers_spec.rb
spec/lib/gitlab/ci/pipeline/chain/skip_spec.rb
spec/validators/public_url_validator_spec.rb
spec/rubocop/cop/graphql/authorize_types_spec.rb
spec/lib/gitlab/ci/status/pipeline/blocked_spec.rb
spec/lib/gitlab/graphql/representation/submodule_tree_entry_spec.rb
spec/lib/gitlab/sidekiq_middleware/memory_killer_spec.rb
spec/lib/omni_auth/strategies/jwt_spec.rb
spec/helpers/commits_helper_spec.rb
spec/services/projects/forks_count_service_spec.rb
spec/services/protected_tags/create_service_spec.rb
spec/lib/gitlab/ci/config/entry/job_spec.rb
spec/lib/gitlab/legacy_github_import/user_formatter_spec.rb
spec/workers/gitlab/github_import/stage/import_pull_requests_worker_spec.rb
spec/tasks/gitlab/task_helpers_spec.rb
spec/lib/gitlab/fake_application_settings_spec.rb
spec/lib/banzai/filter/external_link_filter_spec.rb
spec/initializers/zz_metrics_spec.rb
spec/rubocop/cop/gitlab/rails_logger_spec.rb
spec/db/development/import_common_metrics_spec.rb
spec/finders/user_finder_spec.rb
spec/lib/gitlab/http_connection_adapter_spec.rb
spec/views/dashboard/projects/_blank_state_admin_welcome.haml_spec.rb
spec/lib/mattermost/team_spec.rb
spec/lib/gitlab/favicon_spec.rb
spec/services/deploy_keys/create_service_spec.rb
spec/lib/gitlab/sql/pattern_spec.rb
spec/db/production/import_common_metrics_spec.rb
spec/workers/every_sidekiq_worker_spec.rb
spec/models/concerns/feature_gate_spec.rb
spec/lib/gitlab/ci/config/entry/reports_spec.rb
spec/serializers/move_to_project_serializer_spec.rb
spec/lib/gitlab/redis/shared_state_spec.rb
spec/lib/gitlab/sidekiq_daemon/monitor_spec.rb
spec/lib/gitlab/usage_data_counters/snippet_counter_spec.rb
spec/models/shard_spec.rb
spec/lib/gitlab/dependency_linker/godeps_json_linker_spec.rb
spec/lib/gitlab/ci/reports/test_suite_comparer_spec.rb
spec/finders/license_template_finder_spec.rb
spec/lib/banzai/filter/inline_diff_filter_spec.rb
spec/lib/gitlab/ci/config/entry/cache_spec.rb
spec/lib/gitlab/email/hook/smime_signature_interceptor_spec.rb
spec/models/merge_request/metrics_spec.rb
spec/lib/gitlab/kubernetes_spec.rb
spec/helpers/tab_helper_spec.rb
spec/lib/gitlab/sidekiq_status_spec.rb
spec/lib/gitlab/usage_data_counters/productivity_analytics_counter_spec.rb
spec/lib/gitlab/usage_data_counters/merge_request_counter_spec.rb
spec/lib/gitlab/git/changes_spec.rb
spec/lib/prometheus/pid_provider_spec.rb
spec/lib/gitlab/ci/pipeline/expression/lexeme/string_spec.rb
spec/lib/gitlab/dependency_linker_spec.rb
spec/models/clusters/project_spec.rb
spec/rubocop/cop/avoid_break_from_strong_memoize_spec.rb
spec/lib/gitlab/sherlock/collection_spec.rb
spec/lib/gitlab/ci/config/entry/hidden_spec.rb
spec/lib/gitlab/diff/suggestion_diff_spec.rb
spec/models/project_services/chat_message/note_message_spec.rb
spec/lib/gitlab/ci/build/artifacts/adapters/raw_stream_spec.rb
spec/rubocop/cop/qa/element_with_pattern_spec.rb
spec/lib/gitlab/analytics/cycle_analytics/stage_events/stage_event_spec.rb
spec/lib/gitlab/git/raw_diff_change_spec.rb
spec/lib/gitlab/github_import/page_counter_spec.rb
spec/lib/gitlab/ci/status/group/common_spec.rb
spec/lib/gitlab/analytics/cycle_analytics/stage_events/issue_stage_end_spec.rb
spec/lib/gitlab/github_import/bulk_importing_spec.rb
spec/lib/rspec_flaky/flaky_examples_collection_spec.rb
spec/lib/gitlab/ci/config/entry/paths_spec.rb
spec/lib/gitlab/diff/inline_diff_spec.rb
Knapsack report generator started!
Run options:
  include {:focus=>true}
  exclude {:quarantine=>true, :geo=>true}

All examples were filtered out; ignoring {:focus=>true}

==> Setting up GitLab Shell...
    GitLab Shell set up in 0.169309262 seconds...

==> Setting up Gitaly...
    Gitaly set up in 0.000128791 seconds...

MergeRequests::UpdateService
  execute
    valid params
      matches base expectations
      executes hooks with update action
      sends email to user2 about assign of new merge request and email to user3 about merge request unassignment
      creates system note about merge_request reassign
      creates a resource label event
      creates system note about title change
      creates system note about description change
      creates system note about branch change
      creates system note about discussion lock
      when not including source branch removal options
        maintains the original options
    merge
      without pipeline
        merges the MR
      with finished pipeline
        merges the MR
      with active pipeline
        should receive execute(#<MergeRequest id:13 group13/project13!1>) 1 time
      with a non-authorised user
        does not merge the MR
      MR can not be merged when note sha != MR sha
        should eq "opened"
    todos
      when the title change
        marks pending todos as done
        does not create any new todos
      when the description change
        marks pending todos as done
        creates only 1 new todo
      when is reassigned
        marks previous assignee pending todos as done
        creates a pending todo for new assignee
      when the milestone is removed
        sends notifications for subscribers of changed milestone
        behaves like system notes for milestones
          group milestones
            creates a system note
          project milestones
            creates a system note
      when the milestone is changed
        marks pending todos as done
        sends notifications for subscribers of changed milestone
        behaves like system notes for milestones
          group milestones
            creates a system note
          project milestones
            creates a system note
      when the labels change
        marks pending todos as done
        updates updated_at
      when the assignee changes
        updates open merge request counter for assignees when merge request is reassigned
      when the target branch change
        marks pending todos as done
      when auto merge is enabled and target branch changed
        marks pending todos as done
    when the merge request is relabeled
      sends notifications for subscribers of newly added labels
      when issue has the `label` label
        does not send notifications for existing labels
        does not send notifications for removed labels
    updating mentions
      when mentioning a different user
        in title
          emails only the newly-mentioned user
        in description
          emails only the newly-mentioned user
      when mentioning a user and a group with access to
        when group is public
          behaves like updating attribute with allowed mentions
            emails group members
          behaves like updating attribute with allowed mentions
            emails group members
        when the group is private
          behaves like updating attribute with allowed mentions
            emails group members
          behaves like updating attribute with allowed mentions
            emails group members
      when mentioning a user and a group without access to
        when the group is private
          behaves like updating attribute with not allowed mentions
            emails mentioned user
          behaves like updating attribute with not allowed mentions
            emails mentioned user
    when MergeRequest has tasks
      should eq true
      behaves like updating a single task
        when a task is marked as completed
          creates system note about task status change
        when a task is marked as incomplete
          creates system note about task status change
        when the task position has been modified
          raises an exception
        when the content changes but not task line number
          creates system note about task status change
      when tasks are marked as completed
        creates system note about task status change
      when tasks are marked as incomplete
        creates system note about task status change
    while saving references to issues that the updated merge request closes
      creates a `MergeRequestsClosingIssues` record for each issue
      removes `MergeRequestsClosingIssues` records when issues are not closed anymore
    updating asssignee_ids
      does not update assignee when assignee_id is invalid
      unassigns assignee when user id is 0
      saves assignee when user id is valid
      does not update assignee_id when user cannot read issue
      when issuable feature is private
        does not update with unauthorized assignee when project is Internal
        does not update with unauthorized assignee when project is Public
    changing state
      to reopened
        executes hooks only once
      to closed
        executes hooks only once
    setting `allow_collaboration`
      does not allow a maintainer of the target project to set `allow_collaboration`
      is allowed by a user that can push to the source and can update the merge request

Projects::ImportService
  #async?
    returns true for an asynchronous importer
    returns false for a regular importer
    returns false when the importer does not define #async?
    returns false when the importer does not exist
  #execute
    with unknown url
      succeeds if repository is created successfully
      fails if repository creation fails
      when repository creation succeeds
        does not download lfs files
    with known url
      with a Github repository
        succeeds if repository import was scheduled
        fails if repository import was not scheduled
        when repository import scheduled
          does not download lfs objects
      with a non Github repository
        succeeds if repository import is successful
        fails if repository import fails
        when lfs import fails
          logs the error
        when repository import scheduled
          downloads lfs objects if lfs_enabled is enabled for project
          does not download lfs objects if lfs_enabled is not enabled for project
    with valid importer
      succeeds if importer succeeds
      fails if importer fails
      when importer
        has a custom repository importer it does not download lfs objects
        does not have a custom repository importer downloads lfs objects
        when lfs import fails
          logs the error
    with blocked import_URL
      fails with localhost
      fails with port 25

Discussion ResolvableDiscussion
  #resolvable?
    when potentially resolvable
      when all notes are unresolvable
        returns false
      when some notes are unresolvable and some notes are resolvable
        returns true
      when all notes are resolvable
        returns true
    when not potentially resolvable
      returns false
  #resolved?
    when not resolvable
      returns false
    when resolvable
      when all resolvable notes are resolved
        returns true
      when some resolvable notes are not resolved
        returns false
  #to_be_resolved?
    when not resolvable
      returns false
    when resolvable
      when all resolvable notes are resolved
        returns false
      when some resolvable notes are not resolved
        returns true
  #can_resolve?
    when not resolvable
      returns false
    when resolvable
      when not signed in
        returns false
      when signed in
        when the signed in user is the noteable author
          returns true
        when the signed in user can push to the project
          returns true
        when the signed in user is a random user
          returns false
  #resolve!
    when not resolvable
      returns nil
      doesn't set resolved_at
      doesn't set resolved_by
      doesn't mark as resolved
    when resolvable
      when all resolvable notes are resolved
        doesn't change resolved_at on the resolved notes
        doesn't change resolved_by on the resolved notes
        doesn't change the resolved state on the resolved notes
        doesn't change resolved_at
        doesn't change resolved_by
        doesn't change resolved state
      when some resolvable notes are resolved
        doesn't change resolved_at on the resolved note
        doesn't change resolved_by on the resolved note
        doesn't change the resolved state on the resolved note
        sets resolved_at on the unresolved note
        sets resolved_by on the unresolved note
        marks the unresolved note as resolved
        sets resolved_at
        sets resolved_by
        marks as resolved
      when no resolvable notes are resolved
        sets resolved_at on the unresolved notes
        sets resolved_by on the unresolved notes
        marks the unresolved notes as resolved
        sets resolved_at
        sets resolved_by
        marks as resolved
  #unresolve!
    when not resolvable
      returns nil
    when resolvable
      when all resolvable notes are resolved
        unsets resolved_at on the resolved notes
        unsets resolved_by on the resolved notes
        unmarks the resolved notes as resolved
        unsets resolved_at
        unsets resolved_by
        unmarks as resolved
      when some resolvable notes are resolved
        unsets resolved_at on the resolved note
        unsets resolved_by on the resolved note
        unmarks the resolved note as resolved
  #first_note_to_resolve
    returns the first note that still needs to be resolved
  #last_resolved_note
    returns the last note that was resolved

Gitlab::SidekiqDaemon::MemoryKiller
  #start_working
    not invoke restart_sidekiq when rss in range
    invoke restart_sidekiq when rss not in range
    when structured logging is used
      logs start message once
      logs StandardError message twice
WARNING: Using the `raise_error` matcher without providing a specific error or message risks false positives, since `raise_error` will match when Ruby raises a `NoMethodError`, `NameError` or `ArgumentError`, potentially allowing the expectation to pass without even executing the method you are intending to call. Actual error raised was #<Exception: My Exception>. Instead consider providing a specific error class or message. This message can be suppressed by setting: `RSpec::Expectations.configuration.on_potential_false_positives = :nothing`. Called from /builds/gitlab-org/gitlab/spec/lib/gitlab/sidekiq_daemon/memory_killer_spec.rb:65:in `block (4 levels) in <top (required)>'.
      logs exception message once and raise execption and log stop message
      logs stop message once
  #stop_working
    changed enable? to false
  #rss_within_range?
    return true when everything is within limit
    return false when rss exceeds hard_limit_rss
    return false when rss exceed hard_limit_rss after a while
    return true when rss below soft_limit_rss after a while within GRACE_BALLOON_SECONDS
    return false when rss exceed soft_limit_rss longer than GRACE_BALLOON_SECONDS
  #restart_sidekiq
    send signal
  #signal_and_wait
    send signal and return when all jobs finished
    send signal and wait till deadline if any job not finished
  #signal_pgroup
    send signal to this proces if it is not group leader
    send signal to whole process group as group leader
  #log_rss_out_of_range
    invoke sidekiq logger warn
  #out_of_range_description
    when rss > hard_limit
      tells reason
    when rss <= hard_limit
      tells reason
  #rss_increase_by_jobs
    adds up individual rss_increase_by_job
    return 0 if no job
  #rss_increase_by_job
    return 0 if memory_growth_kb return 0
    return time factored growth value when it does not exceed max growth limit for whilited job
    return max growth limit when time factored growth value exceed max growth limit for whilited job
  #get_job_options
    return default if key is not defined
    return default if get StandardError when retrieve sidekiq_options
    return right value if sidekiq_options has the key

Commit
  modules
    should includes the Mentionable module
    should includes the Participable module
    should includes the Referable module
    should includes the StaticModel module
    should includes the Presentable module
  .lazy
    when the commits are found
      batches requests for commits
      maintains ordering
      does not attempt to replace methods via BatchLoader
    when not found
      returns nil as commit
  #author
    looks up the author in a case-insensitive way
    caches the author
    using eager loading
      executes only two SQL queries
      preloads the authors for Commits matching a user's primary Email
      preloads the authors for Commits using a User's alternative Email
      preloads the authors for Commits using a User's private commit Email
      preloads the authors for Commits using a User's outdated private commit Email
      sets the author to Nil if an author could not be found for a Commit
      does not execute SQL queries once the authors are preloaded
  #to_reference
    returns a String reference to the object
    supports a cross-project reference
  .reference_valid?
    ref: "1234567", result: true
      should eq true
    ref: "123456", result: false
      should eq false
    ref: "1", result: false
      should eq false
    ref: "0000000000000000000000000000000000000000", result: true
      should eq true
    ref: "c1acaa58bbcbc3eafe538cb8274ba387047b69f8", result: true
      should eq true
    ref: "H1acaa58bbcbc3eafe538cb8274ba387047b69f8", result: false
      should eq false
    ref: nil, result: false
      should eq false
  #reference_link_text
    returns a String reference to the object
    supports a cross-project reference
  #title
    returns no_commit_message when safe_message is blank
    truncates a message without a newline at natural break to 80 characters
    truncates a message with a newline before 80 characters at the newline
    does not truncates a message with a newline after 80 but less 100 characters
  #full_title
    returns no_commit_message when safe_message is blank
    returns entire message if there is no newline
    returns first line of message if there is a newLine
  description
    returns no_commit_message when safe_message is blank
    returns description of commit message if title less than 100 characters
    returns full commit message if commit title more than 100 characters
  delegation
    should respond to #message
    should respond to #authored_date
    should respond to #committed_date
    should respond to #committer_email
    should respond to #author_email
    should respond to #parents
    should respond to #date
    should respond to #diffs
    should respond to #id
  #closes_issues
    detects issues that this commit is marked as closing
  behaves like a mentionable
    generates a descriptive back-reference
    extracts references from its reference property
    creates cross-reference notes
    when there are cached markdown fields
      sends in cached markdown fields when appropriate
  #hook_attrs
    should be a kind of Hash
    should include "adds bar folder and branch-test text file to check Repository merged_to_root_ref method"
    should eq "2016-09-27T14:37:46Z"
    should contain exactly "bar/branch-test.txt"
    should eq []
    should eq []
  #cherry_pick_message
    of a regular commit
      should include "\n\n(cherry picked from commit 88790590ed1337ab189bccaa355f068481c90bec)"
    of a merge commit
      that is found
        should include "\n(cherry picked from commit 91257535bb6d962d8855971c6614c1e8dc0101fc)\n\n467dc98f Add new 'videos' directory\n88790590 Upload new video file"
      that is existing but not found
        does not include details of the merged commits
  #reverts_commit?
    should be falsy
    commit has no description
      should be falsy
    another_commit's description does not revert commit
      should be falsy
    another_commit's description reverts commit
      should be truthy
    another_commit's description reverts merged merge request
      should be truthy
  #participants
    includes the commit author
    includes the committer
    includes the authors of the commit notes
  #uri_type with Gitaly enabled
    behaves like #uri_type
      returns the URI type at the given path
      returns nil if the path doesn't exists
      is nil if the path is nil or empty
  #uri_type with Rugged enabled
    calls out to the Rugged implementation
    behaves like #uri_type
      returns the URI type at the given path
      returns nil if the path doesn't exists
      is nil if the path is nil or empty
  .from_hash
    returns a Commit
    wraps a Gitlab::Git::Commit
    stores the correct commit fields
  #work_in_progress?
    detects the 'squash! ' prefix
    detects the 'fixup! ' prefix
    detects the 'wip: ' prefix
    detects the 'WIP: ' prefix
    detects the '[WIP] ' prefix
    detects WIP for a commit just saying 'wip'
    doesn't detect WIP for a commit that begins with 'FIXUP! '
    doesn't detect WIP for words starting with WIP
  .valid_hash?
    checks hash contents
    checks hash length
  #merge_requests
    returns merge_requests that introduced that commit

Gitlab::SearchResults
  does not list issues on private projects
  does not list merge requests on projects with limited access
  as a user with access
    includes merge requests from source and target projects
    #objects
      returns without_counts collection by default
      returns with counts collection when requested
    #formatted_count
      scope: "projects", count_method: :limited_projects_count, expected: "99+"
        returns the expected formatted count
      scope: "issues", count_method: :limited_issues_count, expected: "99+"
        returns the expected formatted count
      scope: "merge_requests", count_method: :limited_merge_requests_count, expected: "99+"
        returns the expected formatted count
      scope: "milestones", count_method: :limited_milestones_count, expected: "99+"
        returns the expected formatted count
      scope: "users", count_method: :limited_users_count, expected: "99+"
        returns the expected formatted count
      scope: "unknown", count_method: nil, expected: nil
        returns the expected formatted count
    #formatted_limited_count
      count: 23, expected: "23"
        returns the expected formatted limited count
      count: 99, expected: "99"
        returns the expected formatted limited count
      count: 100, expected: "99+"
        returns the expected formatted limited count
      count: 1234, expected: "99+"
        returns the expected formatted limited count
    when count_limit is lower than total amount
      #limited_projects_count
        returns the limited amount of projects
      #limited_merge_requests_count
        returns the limited amount of merge requests
      #limited_milestones_count
        returns the limited amount of milestones
      #limited_issues_count
        runs single SQL query to get the limited amount of issues
    when count_limit is higher than total amount
      #limited_issues_count
        runs multiple queries to get the limited amount of issues
    #merge_requests
      includes project filter by default
      skips project filter if default project context is used
    #issues
      includes project filter by default
      skips project filter if default project context is used
    #users
      does not call the UsersFinder when the current_user is not allowed to read users list
      calls the UsersFinder
  confidential issues
    does not list confidential issues for non project members
    does not list confidential issues for project members with guest role
    lists confidential issues for author
    lists confidential issues for assignee
    lists confidential issues for project members
    lists all issues for admin
  milestones
    returns correct set of milestones

Namespace
  associations
    should have many projects
    should have many project_statistics
    should belong to parent required:
    should have many children
    should have one root_storage_statistics
    should have one aggregation_schedule
  validations
    should validate that :name cannot be empty/falsy
    should validate that the length of :name is at most 255
    should validate that the length of :description is at most 255
    should validate that :path cannot be empty/falsy
    should validate that the length of :path is at most 255
    should validate that :owner cannot be empty/falsy
    does not allow too deep nesting
    reserved path validation
      nested group
        should not be valid
        rejects nested paths
      is case insensitive
        should not be valid
      top-level group
        should be valid
  delegate
    should delegate #owner_name to the #owner object passing arguments [{:allow_nil=>true}] as #name
    should delegate #avatar_url to the #owner object passing arguments [{:allow_nil=>true}]
  Respond to
    should respond to #human_name
    should respond to #to_param
    should respond to #has_parent?
  inclusions
    should includes the Gitlab::VisibilityLevel module
  #visibility_level_field
    should eq :visibility_level
  #to_param
    should eq "namespace331"
  #human_name
    should eq "John Doe827"
  #first_project_with_container_registry_tags
    returns the project
    returns no project
  .search
    returns namespaces with a matching name
    returns namespaces with a partially matching name
    returns namespaces with a matching name regardless of the casing
    returns namespaces with a matching path
    returns namespaces with a partially matching path
    returns namespaces with a matching path regardless of the casing
  .with_statistics
    sums all project storage counters in the namespace
    correctly handles namespaces without projects
  .find_by_pages_host
    finds namespace by GitLab Pages host and is case-insensitive
  #ancestors_upto
    returns all ancestors when no namespace is given
    includes ancestors upto but excluding the given ancestor
  #move_dir
    legacy storage
      raises error when directory exists
      moves dir if path changed
      behaves like namespace restrictions
        when any project has container images
          raises an error about not movable project
      when #write_projects_repository_config raises an error
        in test environment
          raises an exception
        in production environment
          does not cancel later callbacks
      with subgroups
        renaming child
          correctly moves the repository, uploads and pages
        renaming parent
          correctly moves the repository, uploads and pages
        moving from one parent to another
          correctly moves the repository, uploads and pages
        moving from having a parent to root
          correctly moves the repository, uploads and pages
        moving from root to having a parent
          correctly moves the repository, uploads and pages
    hashed storage
      repository directory remains unchanged if path changed
      behaves like namespace restrictions
        when any project has container images
          raises an error about not movable project
    for each project inside the namespace
      updates project full path in .git/config
      updates the project storage location
  #rm_dir callback
    legacy storage
      renames its dirs when deleted
      schedules the namespace for deletion
      in sub-groups
        renames its dirs when deleted
        schedules the namespace for deletion
    hashed storage
      has no repositories base directories to remove
  .find_by_path_or_name
    should eq #<Namespace id: 972, name: "John Doe882", path: "woW", owner_id: 875, created_at: "2019-10-15 08:45:0...nil, subgroup_creation_level: 1, emails_disabled: nil, max_pages_size: nil, max_artifacts_size: nil>
    should eq #<Namespace id: 974, name: "John Doe884", path: "woW", owner_id: 877, created_at: "2019-10-15 08:45:0...nil, subgroup_creation_level: 1, emails_disabled: nil, max_pages_size: nil, max_artifacts_size: nil>
    should eq nil
  .clean_path
    cleans the path and makes sure it's available
  #self_and_hierarchy
    returns the correct tree
  #ancestors
    returns the correct ancestors
  #self_and_ancestors
    returns the correct ancestors
  #descendants
    returns the correct descendants
  #self_and_descendants
    returns the correct descendants
  #users_with_descendants
    returns member users on every nest level without duplication
  #user_ids_for_project_authorizations
    returns the user IDs for which to refresh authorizations
  #all_projects
    should contain exactly #<Project id:345 group115/group116/project302> and #<Project id:344 group115/project301>
    should contain exactly #<Project id:347 group117/group118/project304>
  #all_pipelines
    should contain exactly #<Ci::Pipeline id: 3, ref: "master", sha: "97de212e80737a608d939f648d959671fb0a0142", before_sha: nil...nil, iid: 1, merge_request_id: nil, source_sha: nil, target_sha: nil, external_pull_request_id: nil> and #<Ci::Pipeline id: 4, ref: "master", sha: "97de212e80737a608d939f648d959671fb0a0142", before_sha: nil...nil, iid: 1, merge_request_id: nil, source_sha: nil, target_sha: nil, external_pull_request_id: nil>
  #share_with_group_lock with subgroups
    when creating a subgroup
      under a parent with "Share with group lock" enabled
        enables "Share with group lock" on the subgroup
      under a parent with "Share with group lock" disabled
        does not enable "Share with group lock" on the subgroup
    when enabling the parent group "Share with group lock"
      the subgroup "Share with group lock" becomes enabled
    when disabling the parent group "Share with group lock" (which was already enabled)
      and the subgroup "Share with group lock" is enabled
        the subgroup "Share with group lock" does not change
      but the subgroup "Share with group lock" is disabled
        the subgroup "Share with group lock" does not change
    when a group is transferred into a root group
      when the root group "Share with group lock" is enabled
        when the subgroup "Share with group lock" is enabled
          the subgroup "Share with group lock" does not change
        when the subgroup "Share with group lock" is disabled
          the subgroup "Share with group lock" becomes enabled
      when the root group "Share with group lock" is disabled
        when the subgroup "Share with group lock" is enabled
          the subgroup "Share with group lock" does not change
        when the subgroup "Share with group lock" is disabled
          the subgroup "Share with group lock" does not change
  #find_fork_of?
    knows if there is a direct fork in the namespace
    knows when there is as fork-of-fork in the namespace
    with request store enabled
      only queries once
  #root_ancestor
    returns the top most ancestor
  #full_path_before_last_save
    when the group has no parent
      returns the path before last save
    when a parent is assigned to a group with no previous parent
      returns the path before last save
    when a parent is removed from the group
      returns the parent full path
    when changing parents
      returns the previous parent full path
  #auto_devops_enabled
    with users
      when auto devops is explicitly enabled
        should eq true
      when auto devops is explicitly disabled
        should eq false
  #user?
    when type is a user
      should be truthy
    when type is a group
      should be falsy
  #aggregation_scheduled?
    with an aggregation scheduled association
      should be truthy
    without an aggregation scheduled association
      should be falsy
  #emails_disabled?
    when not a subgroup
      returns false
      returns true
    when a subgroup
      returns false
      when ancestor emails are disabled
        returns true
  #pages_virtual_domain
    when there are pages deployed for the project
      but pages metadata is not migrated
        migrates pages metadata and returns the virual domain
      and pages metadata is migrated
        returns the virual domain
  #has_parent?
    returns true when the group has a parent
    returns true when the group has an unsaved parent
    returns false when the group has no parent
  #closest_setting
    when setting is of non-boolean type
      root_setting: 100, child_setting: 200, result: 200
        behaves like fetching closest setting
          returns closest non-nil value
      root_setting: 100, child_setting: nil, result: 100
        behaves like fetching closest setting
          returns closest non-nil value
      root_setting: nil, child_setting: nil, result: nil
        behaves like fetching closest setting
          returns closest non-nil value
    when setting is of boolean type
      root_setting: true, child_setting: false, result: false
        behaves like fetching closest setting
          returns closest non-nil value
      root_setting: true, child_setting: nil, result: true
        behaves like fetching closest setting
          returns closest non-nil value
      root_setting: nil, child_setting: nil, result: nil
        behaves like fetching closest setting
          returns closest non-nil value

NotesFinder
  #execute
    finds notes on merge requests
    finds notes on snippets
    excludes notes on commits the author can't download
    succeeds when no notes found
    when notes filter is present
      returns only user notes when using only_comments filter
      returns only system notes when using only_activity filters
      gets all notes
    on restricted projects
      publicly excludes notes on merge requests
      publicly excludes notes on issues
      publicly excludes notes on snippets
    for target type
      finds only notes for the selected type
    for target
      finds all notes
      finds notes on merge requests
      finds notes on snippets
      finds notes on personal snippets
      raises an exception for an invalid target_type
      filters out old notes
      confidential issue notes
        returns notes if user can see the issue
        raises an error if user can not see the issue
        raises an error for project members with guest role
    for explicit target
      returns the expected notes
      returns the expected notes when last_fetched_at is given
      fails when nil is provided
  .search
    returns notes with matching content
    returns notes with matching content regardless of the casing
    returns commit notes user can access
    confidential issues
      returns notes with matching content if user can see the issue
      does not return notes with matching content if user can not see the issue
      does not return notes with matching content for project members with guest role
      does not return notes with matching content for unauthenticated users
    inlines SQL filters on subqueries for performance
      project_id check
      search filter
  #target
    for a issue target
      returns the issue
    for a merge request target
      returns the merge_request
    for a snippet target
      returns the snippet
    for a commit target
      returns the commit
    target_iid
      finds issues by iid
      finds merge requests by iid
      returns nil if both target_id and target_iid are not given
      prioritizes target_id over target_iid

EnvironmentStatus
  should delegate #id to the #environment object
  should delegate #name to the #environment object
  should delegate #deployed_at to the #deployment object
  should delegate #status to the #deployment object
  #project
    should eq #<Project id:414 namespace487/project367>
  #merge_request
    should eq #<MergeRequest id:173 namespace490/project370!1>
  #deployment
    should eq #<Deployment id: 7, iid: 1, project_id: 420, environment_id: 7, ref: "pages-deploy", tag: false, sha:...-15 08:45:29", on_stop: nil, status: "success", finished_at: "2019-10-15 08:45:29", cluster_id: nil>
  #changes
    contains only added and modified public pages
  .for_merge_request
    is based on merge_request.diff_head_sha
  .after_merge_request
    is based on merge_request.merge_commit_sha
  .build_environments_status
    when environment is created on a forked project
      returns environment status
    when environment is created on a target project
      returns environment status
      when the build stops an environment
        does not return environment status
      when user does not have a permission to see the environment
        does not return environment status
      when multiple deployments with the same SHA in different environments
        returns deployments related to the head pipeline
      when multiple deployments in the same pipeline for the same environments
        returns unique entries
      when environment is stopped
        does not return environment status

PipelineEntity
  #as_json
    when pipeline is empty
      contains required fields
      excludes coverage data when disabled
      contains details
      contains flags
    when pipeline is retryable
      does not serialize stage builds
      user has ability to retry pipeline
        contains retry path
      user does not have ability to retry pipeline
        does not contain retry path
    when pipeline is cancelable
      does not serialize stage builds
      user has ability to cancel pipeline
        contains cancel path
      user does not have ability to cancel pipeline
        does not contain cancel path
    when pipeline ref is empty
      does not generate branch path
    when pipeline has a failure reason set
      has a correct failure reason
    when pipeline is detached merge request pipeline
      makes detached flag true
      does not expose source sha and target sha
      when user is a developer
        has merge request information
      when user is an external user
        has no merge request information
    when pipeline is merge request pipeline
      makes detached flag false
      makes atached flag true
      exposes source sha and target sha
      exposes merge request event type

MigrateAutoDevOpsDomainToClusterDomain
NOTICE:  trigger "trigger_36edafd19664" for relation "epics" does not exist, skipping
NOTICE:  trigger "trigger_dd1443fbd36e" for relation "application_settings" does not exist, skipping
NOTICE:  trigger "trigger_806273a4d8be" for relation "application_settings" does not exist, skipping
  with ProjectAutoDevOps with no domain
== 20190204115450 MigrateAutoDevOpsDomainToClusterDomain: migrating ===========
-- execute("UPDATE clusters\nSET domain = project_auto_devops.domain\nFROM cluster_projects, project_auto_devops\nWHERE\n  cluster_projects.cluster_id = clusters.id\n  AND project_auto_devops.project_id = cluster_projects.project_id\n  AND project_auto_devops.domain != ''\n")
   -> 0.0011s
== 20190204115450 MigrateAutoDevOpsDomainToClusterDomain: migrated (0.0012s) ==

    does not update cluster project
  with ProjectAutoDevOps with domain
== 20190204115450 MigrateAutoDevOpsDomainToClusterDomain: migrating ===========
-- execute("UPDATE clusters\nSET domain = project_auto_devops.domain\nFROM cluster_projects, project_auto_devops\nWHERE\n  cluster_projects.cluster_id = clusters.id\n  AND project_auto_devops.project_id = cluster_projects.project_id\n  AND project_auto_devops.domain != ''\n")
   -> 0.0012s
== 20190204115450 MigrateAutoDevOpsDomainToClusterDomain: migrated (0.0013s) ==

    updates all cluster projects
  when only some ProjectAutoDevOps have domain set
== 20190204115450 MigrateAutoDevOpsDomainToClusterDomain: migrating ===========
-- execute("UPDATE clusters\nSET domain = project_auto_devops.domain\nFROM cluster_projects, project_auto_devops\nWHERE\n  cluster_projects.cluster_id = clusters.id\n  AND project_auto_devops.project_id = cluster_projects.project_id\n  AND project_auto_devops.domain != ''\n")
   -> 0.0011s
== 20190204115450 MigrateAutoDevOpsDomainToClusterDomain: migrated (0.0012s) ==

    only updates specific cluster projects
NOTICE:  table "design_management_designs" does not exist, skipping
NOTICE:  table "design_management_designs_versions" does not exist, skipping
NOTICE:  table "design_management_versions" does not exist, skipping
NOTICE:  table "geo_container_repository_updated_events" does not exist, skipping
NOTICE:  trigger "trigger_806273a4d8be" for relation "application_settings" does not exist, skipping
NOTICE:  trigger "trigger_dd1443fbd36e" for relation "application_settings" does not exist, skipping
NOTICE:  trigger "trigger_84853438aac0" for relation "epics" does not exist, skipping

Issuable::Clone::ContentRewriter
  rewriting award emojis
    copies the award emojis
  rewriting description
    when description is a simple text
      does not rewrite the description
    when description contains a local reference
      rewrites the local reference correctly
    when description contains a cross reference
      rewrites the cross reference correctly
    when description contains a user reference
      works with a user reference
    when description contains uploads
      rewrites uploads in the description
  rewriting notes
    simple notes
      rewrites existing notes in valid order
      copies all the issue notes
      does not change the note attributes
      copies the award emojis
      copies system_note_metadata for system note
    notes with reference
      rewrites the references correctly
    notes with upload
      rewrites note content correctly
    discussion notes
      rewrites discussion correctly

Ci::PipelinePresenter
  inherits from Gitlab::View::Presenter::Delegated
  #initialize
    takes a pipeline and optional params
    exposes pipeline
    forwards missing methods to pipeline
  #status_title
    when pipeline is auto-canceled
      shows that the pipeline is auto-canceled
    when pipeline is not auto-canceled
      does not have a status title
  #failure_reason
    when pipeline has failure reason
      represents a failure reason sentence
    when pipeline does not have failure reason
      returns nil
  #name
    when pipeline is detached merge request pipeline
      should eq "Detached merge request pipeline"
    when pipeline is merge request pipeline
      should eq "Merged result pipeline"
    when pipeline is merge train pipeline
      should eq "Merge train pipeline"
    when pipeline is branch pipeline
      should eq "Pipeline"
  #ref_text
    when pipeline is detached merge request pipeline
      returns a correct ref text
    when pipeline is merge request pipeline
      returns a correct ref text
    when pipeline is branch pipeline
      when ref exists in the repository
        returns a correct ref text
        when ref contains malicious script
          does not include the malicious script
      when ref exists in the repository
        returns a correct ref text
        when ref contains malicious script
          does not include the malicious script
  #all_related_merge_request_text
    with zero related merge requests (branch pipeline)
      should eq "No related merge requests found."
    with one related merge request
      should eq "1 related merge request: <a class=\"mr-iid\" href=\"/namespace588/project468/merge_requests/1\">!1 My title 410</a>"
    with two related merge requests
      should eq "2 related merge requests: <a class=\"mr-iid\" href=\"/namespace589/project469/merge_requests/2\">!2 ...412</a>, <a class=\"mr-iid\" href=\"/namespace589/project469/merge_requests/1\">!1 My title 411</a>"
  #all_related_merge_requests
    memoizes the returned relation
  #link_to_merge_request
    returns a correct link
    when pipeline is branch pipeline
      returns nothing
  #link_to_merge_request_source_branch
    returns a correct link
    when pipeline is branch pipeline
      returns nothing
  #link_to_merge_request_target_branch
    returns a correct link
    when pipeline is branch pipeline
      returns nothing

Snippet
  modules
    should includes the Gitlab::VisibilityLevel module
    should includes the Participable module
    should includes the Referable module
    should includes the Sortable module
    should includes the Awardable module
  associations
    should belong to author class_name => User required:
    should belong to project required:
    should have many notes dependent => destroy
    should have many award_emoji dependent => destroy
  validation
    should validate that :author cannot be empty/falsy
    should validate that :title cannot be empty/falsy
    should validate that the length of :title is at most 255
    should validate that the length of :file_name is at most 255
    should validate that :content cannot be empty/falsy
    should validate that :visibility_level is either ‹0›, ‹10›, or ‹20›
  #to_reference
    when snippet belongs to a project
      returns a String reference to the object
      supports a cross-project reference
    when snippet does not belong to a project
      returns a String reference to the object
      still returns shortest reference when project arg present
  #file_name
    file_name is nil
      returns an empty string
    file_name is not nil
      returns the file_name
  #content_html_invalidated?
    invalidates the HTML cache of content when the filename changes
  .search
    returns snippets with a matching title
    returns snippets with a partially matching title
    returns snippets with a matching title regardless of the casing
    returns snippets with a matching file name
    returns snippets with a partially matching file name
    returns snippets with a matching file name regardless of the casing
  .search_code
    returns snippets with matching content
    returns snippets with partially matching content
    returns snippets with matching content regardless of the casing
  .with_optional_visibility
    when a visibility level is provided
      returns snippets with the given visibility
    when a visibility level is not provided
      returns all snippets
  .only_global_snippets
    returns snippets not associated with any projects
  .only_include_projects_visible_to
    when a user is provided
      returns snippets visible to the user
    when a user is not provided
      returns snippets visible to anonymous users
  only_include_projects_with_snippets_enabled
    includes snippets for projects with snippets enabled
    when the include_private option is enabled
      includes snippets for projects with snippets set to private
    when the include_private option is not enabled
      does not include snippets for projects that have snippets set to private
  .only_include_authorized_projects
    only includes snippets for projects the user is authorized to see
  .for_project_with_user
    when a user is provided
      returns an empty collection if the user can not view the snippets
      returns the snippets if the user is a member of the project
      returns public snippets for a public project the user is not a member of
    when a user is not provided
      returns an empty collection for a private project
      returns public snippets for a public project
  .visible_to_or_authored_by
    returns snippets visible to the user
  #participants
    includes the snippet author
    includes the note authors
  #check_for_spam
    when public and spammable attributes changed
      returns true
    when private
      returns false
      returns true when switching to public
    when spammable attributes have not changed
      returns false
  #blob
    returns a blob representing the snippet data
  #embeddable?
    project snippet
      only returns true when both project and snippet are public
      only returns true when both project and snippet are public
      only returns true when both project and snippet are public
      only returns true when both project and snippet are public
      only returns true when both project and snippet are public
      only returns true when both project and snippet are public
      only returns true when both project and snippet are public
      only returns true when both project and snippet are public
      only returns true when both project and snippet are public
    personal snippet
      only returns true when snippet is public
      only returns true when snippet is public
      only returns true when snippet is public

Projects::Serverless::FunctionsFinder
  #installed
    when reactive_caching is still fetching data
    when reactive_caching has finished
      when knative is not installed
        returns false
      reactive_caching is finished and knative is installed
        returns true
  retrieve data from knative
    does not have knative installed
      should be empty
    has knative installed
      there are no functions
      there are functions
      has a function
      has metrics
    has prometheus
      is available
      has query data

PrometheusMetric
  should belong to project required:
  should validate that :title cannot be empty/falsy
  should validate that :query cannot be empty/falsy
  should validate that :group cannot be empty/falsy
  behaves like having unique enum values
    has unique values in "group"
  common metrics
    common: false, with_project: true, result: true
      should eq true
    common: false, with_project: false, result: false
      should eq false
    common: true, with_project: true, result: false
      should eq false
    common: true, with_project: false, result: true
      should eq true
  #query_series
    legend: "Some other legend", type: NilClass
      should be a kind of NilClass
    legend: "Status Code", type: Array
      should be a kind of Array
  #group_title
    behaves like group_title
      returns text Response metrics (NGINX Ingress VTS) for group nginx_ingress_vts
    behaves like group_title
      returns text Response metrics (NGINX Ingress) for group nginx_ingress
    behaves like group_title
      returns text Response metrics (HA Proxy) for group ha_proxy
    behaves like group_title
      returns text Response metrics (AWS ELB) for group aws_elb
    behaves like group_title
      returns text Response metrics (NGINX) for group nginx
    behaves like group_title
      returns text System metrics (Kubernetes) for group kubernetes
    behaves like group_title
      returns text Business metrics (Custom) for group business
    behaves like group_title
      returns text Response metrics (Custom) for group response
    behaves like group_title
      returns text System metrics (Custom) for group system
  #priority
    group: :nginx_ingress_vts, priority: 10
      should eq 10
    group: :nginx_ingress, priority: 10
      should eq 10
    group: :ha_proxy, priority: 10
      should eq 10
    group: :aws_elb, priority: 10
      should eq 10
    group: :nginx, priority: 10
      should eq 10
    group: :kubernetes, priority: 5
      should eq 5
    group: :business, priority: 0
      should eq 0
    group: :response, priority: -5
      should eq -5
    group: :system, priority: -10
      should eq -10
  #required_metrics
    group: :nginx_ingress_vts, required_metrics: ["nginx_upstream_responses_total", "nginx_upstream_response_msecs_avg"]
      should eq ["nginx_upstream_responses_total", "nginx_upstream_response_msecs_avg"]
    group: :nginx_ingress, required_metrics: ["nginx_ingress_controller_requests", "nginx_ingress_controller_ingress_upstream_latency_seconds_sum"]
      should eq ["nginx_ingress_controller_requests", "nginx_ingress_controller_ingress_upstream_latency_seconds_sum"]
    group: :ha_proxy, required_metrics: ["haproxy_frontend_http_requests_total", "haproxy_frontend_http_responses_total"]
      should eq ["haproxy_frontend_http_requests_total", "haproxy_frontend_http_responses_total"]
    group: :aws_elb, required_metrics: ["aws_elb_request_count_sum", "aws_elb_latency_average", "aws_elb_httpcode_backend_5_xx_sum"]
      should eq ["aws_elb_request_count_sum", "aws_elb_latency_average", "aws_elb_httpcode_backend_5_xx_sum"]
    group: :nginx, required_metrics: ["nginx_server_requests", "nginx_server_requestMsec"]
      should eq ["nginx_server_requests", "nginx_server_requestMsec"]
    group: :kubernetes, required_metrics: ["container_memory_usage_bytes", "container_cpu_usage_seconds_total"]
      should eq ["container_memory_usage_bytes", "container_cpu_usage_seconds_total"]
    group: :business, required_metrics: []
      should eq []
    group: :response, required_metrics: []
      should eq []
    group: :system, required_metrics: []
      should eq []
  #to_query_metric
    converts to queryable metric object
    queryable metric object has title
    queryable metric object has y_label
    queryable metric has no required_metric
    queryable metric has weight 0
    queryable metrics has query description
  #to_metric_hash
    returns a hash suitable for inclusion on a metrics dashboard

Gitlab::DataBuilder::Note
  When asking for a note on commit
    returns the note and commit-specific data
    contains project data
    contains deprecated repository data
  When asking for a note on commit diff
    returns the note and commit-specific data
    contains project data
    contains deprecated repository data
  When asking for a note on issue
    returns the note and issue-specific data
    contains project data
    contains deprecated repository data
    with confidential issue
      sets event_type to confidential_note
  When asking for a note on merge request
    returns the note and merge request data
    contains project data
    contains deprecated repository data
  When asking for a note on merge request diff
    returns the note and merge request diff data
    contains project data
    contains deprecated repository data
  When asking for a note on project snippet
    returns the note and project snippet data
    contains project data
    contains deprecated repository data

Gitlab::DataBuilder::Push
  .build
    with changed files
      returns commit hook data
    without changed files
      returns commit hook data without include deltas
  .build_sample
    should be a kind of Hash
    should eq "1b12f15a11fc6e62177bef08f47bc7b5ce50b141"
    should eq "b83d6e391c22777fca1ed3012fce84f633d7fed0"
    should eq "refs/heads/master"
    should eq 3
    should eq 3
    should eq ["bar/branch-test.txt"]
    should eq []
    should eq []
    contains project data
    contains deprecated repository data
  .build
    should be a kind of Hash
    should eq "0000000000000000000000000000000000000000"
    should eq "5937ac0a7beb003549fc5fd26fc247adbce4a52e"
    should eq "8a2a6eb295bb170b34c24c76c49ed0e9b2eaf34b"
    should eq "refs/tags/v1.1.0"
    should eq nil
    should eq "John Doe1513"
    should eq "user1514"
    should eq "public-email@example.com"
    should eq "https://www.gravatar.com/avatar/ce363bd60431af7693b4133dce3b84c7?s=80&d=identicon"
    should eq 749
    should be a kind of Hash
    should be empty
    should be zero
    contains project data
    contains deprecated repository data
    does not raise an error when given nil commits

Clusters::Applications::UpgradeService
  #execute
    when there are no errors
      make the application updating
      schedule async installation status check
    when kubernetes cluster communication fails
      logs into kubernetes.log and Sentry
      make the application errored
    a non kubernetes error happens
      logs into kubernetes.log and Sentry
      make the application errored

Ci::BuildPresenter
  inherits from Gitlab::View::Presenter::Delegated
  #initialize
    takes a build and optional params
    exposes build
    forwards missing methods to build
  #erased_by_user?
    takes a build and optional params
  #erased_by_name
    when build is not erased
      returns nil
    when build is erased
      returns the name of the eraser
  #status_title
    when build is auto-canceled
      shows that the build is auto-canceled
    when build failed
      returns the reason of failure
    when build has failed && retried
      does not include retried title
    when build has failed and is allowed to
      returns the reason of failure
    For any other build
      returns the status
  quack like a Ci::Build permission-wise
    user is not allowed
      returns false
    user is allowed
      returns true
  #trigger_variables
    when variable is stored in ci_pipeline_variables
      when pipeline is triggered by trigger API
        returns variables
      when pipeline is not triggered by trigger API
        does not return variables
    when variable is stored in ci_trigger_requests.variables
      returns variables
  #tooltip_message
    When build has failed
      returns the reason of failure
    When build has failed and retried
      includes the reason of failure and the retried title
    When build has failed and is allowed to
      includes the reason of failure
    For any other build (no retried)
      includes build name and status
    For any other build (retried)
      includes build name and status
  #execute_in
    when build is scheduled
      when schedule is not expired
        returns execution time
      when schedule is expired
        returns execution time
    when build is not delayed
      does not return execution time
  #callout_failure_message
    returns a verbose failure reason
  #recoverable?
    when is a script or missing dependency failure
      returns false
    when is any other failure type
      returns true

Issuable::Clone::AttributesRewriter
  setting labels
    sets labels present in the new project and group labels
    does not set any labels when not used on the original issue
    copies the resource label events
  setting milestones
    sets milestone to nil when old issue milestone is not in the new project
    copies the milestone when old issue milestone title is in the new project
    copies the milestone when old issue milestone is a group milestone

CycleAnalytics::GroupLevel
  #permissions
    returns true for all stages
  #stats
2019-10-15T08:47:28.059Z 91 TID-gohcudbg3 WARN: {:class=>"ArchiveTraceWorker", :message=>"The job does not have live trace but going to be archived.", :job_id=>65}
    returns medians for each stage for a specific group
  #summary
2019-10-15T08:47:30.736Z 91 TID-gohcudbg3 WARN: {:class=>"ArchiveTraceWorker", :message=>"The job does not have live trace but going to be archived.", :job_id=>67}
    returns medians for each stage for a specific group

CommitCollection
  #each
    yields every commit
  .committers
    returns a relation of users when users are found
    returns empty array when committers cannot be found
    excludes authors of merge commits
  #without_merge_commits
    returns all commits except merge commits
  #with_latest_pipeline
    sets the latest pipeline for every commit so no additional queries are necessary
  enrichment methods
    #unenriched
      returns all commits that are not backed by gitaly data
    #fully_enriched?
      returns true when all commits are backed by gitaly data
      returns false when any commits are not backed by gitaly data
      returns true when the collection is empty
    #enrich!
      replaces commits in the collection with those backed by gitaly data
      maintains the original order of the commits
      fetches data if there are unenriched commits
      does not fetch data if all commits are enriched
      returns the original commit if the commit could not be lazy loaded
  #respond_to_missing?
    returns true when the underlying Array responds to the message
    returns false when the underlying Array does not respond to the message
  #method_missing
    delegates undefined methods to the underlying Array

layouts/nav/sidebar/_project
  behaves like has nav sidebar
    has collapsed nav sidebar on mobile
  issue boards
    has board tab
  packages tab
    highlights sidebar item and flyout
    highlights container registry tab
  releases entry
    renders releases link
  wiki entry tab
    when wiki is enabled
      shows the wiki tab with the wiki internal link
    when wiki is disabled
      does not show the wiki tab
  external wiki entry tab
    when it is active
      shows the external wiki tab with the external wiki service link
    when it is disabled
      does not show the external wiki tab
  ci/cd settings tab
    when project is archived
      does not show the ci/cd settings tab
    when project is active
      shows the ci/cd settings tab
  operations settings tab
    when project is archived
      does not show the operations settings tab
    when project is active
      shows the operations settings tab

InvalidGpgSignatureUpdateWorker
  when GpgKey is found
    calls NotificationService.new.run
  when GpgKey is not found
    does not raise errors
    does not call NotificationService.new.run

ClusterAncestorsFinder#execute
  for a project
    returns the project clusters followed by group clusters
    nested groups
      returns the project clusters followed by group clusters ordered ascending the hierarchy
  user cannot read clusters for clusterable
    returns nothing
  for a group
    returns the list of group clusters
    nested groups
      returns the list of group clusters ordered ascending the hierarchy
  for an instance
    returns the list of instance clusters

AwardEmojis::DestroyService
  #execute
    when user is not authorized
      behaves like a service that does not authorize the user
        does not remove the emoji
        returns an error state
        returns a nil award
        returns the error
    when the user is authorized
      when user has not awarded an emoji to the awardable
        behaves like a service that does not authorize the user
          does not remove the emoji
          returns an error state
          returns a nil award
          returns the error
      when user has awarded an emoji to the awardable
        removes the emoji
        returns a success status
        returns no errors
        returns the destroyed award

GitlabIssueTrackerService
  Associations
    should belong to project required:
    should have one service_hook
  Validations
    when service is active
      should validate that :issues_url cannot be empty/falsy
      behaves like issue tracker service URL attribute
        should allow :issues_url to be ‹"https://example.com"›
        should not allow :issues_url to be ‹"example.com"›
        should not allow :issues_url to be ‹"ftp://example.com"›
        should not allow :issues_url to be ‹"herp-and-derp"›
    when service is inactive
      should not validate that :issues_url cannot be empty/falsy
  project and issue urls
    with absolute urls
      gives the correct path
    with relative urls
      gives the correct path
  overriding properties
    when data are stored in properties
      behaves like issue tracker fields
        when data are stored in the properties
          #update
            removes title and description from properties
            stores title & description in services table
          reading fields
            returns correct values
    when data are stored in separated fields
      behaves like issue tracker fields
        when data are stored in the properties
          #update
            removes title and description from properties
            stores title & description in services table
          reading fields
            returns correct values
    when data are stored in both properties and separated fields
      behaves like issue tracker fields
        when data are stored in the properties
          #update
            removes title and description from properties
            stores title & description in services table
          reading fields
            returns correct values
    when no title & description are set
      returns default values

NamespacelessProjectDestroyWorker
  #perform
    project has namespace
      does not do anything
    project has no namespace
      project not a fork of another project
        truncates the project's team
        deletes the project
        does not call unlink_fork
        does not do anything in Project#remove_pages method
      project forked from another
        closes open merge requests
        destroys fork network members
    project has non-existing namespace
      deletes the project

Gitlab::Diff::Highlight
  #highlight
    with a diff file
      returns Gitlab::Diff::Line elements
      does not modify "match" lines
      highlights and marks unchanged lines
      highlights and marks removed lines
      highlights and marks added lines
      when no diff_refs
        when no inline diffs
          behaves like without inline diffs
            returns html escaped diff text
    with diff lines
      returns Gitlab::Diff::Line elements
      does not modify "match" lines
      marks unchanged lines
      marks removed lines
      marks added lines
      when the inline diff marker has an invalid range
        keeps the original rich line
        reports to Sentry if configured
      when no inline diffs
        behaves like without inline diffs
          returns html escaped diff text

Discussions::ResolveService
  #execute
    doesn't resolve discussions the user can't resolve
    resolves the discussion
    executes the notification service
    adds a system note to the discussion
    can resolve multiple discussions at once

SearchHelper
  search_autocomplete_opts
    with no current user
      returns nil
    with a standard user
      includes Help sections
      includes default sections
      does not include admin sections
      does not allow regular expression in search term
      includes the user's groups
      includes nested group
      includes the user's projects
      includes the required project attrs
      includes the required group attrs
      does not include the public group
      with a current project
        includes project-specific sections
    with an admin user
      includes admin sections
  search_entries_info
    raises an error for unrecognized scopes
    scope: "blobs", label: "code result"
      uses the correct singular label
      uses the correct plural label
    scope: "commits", label: "commit"
      uses the correct singular label
      uses the correct plural label
    scope: "issues", label: "issue"
      uses the correct singular label
      uses the correct plural label
    scope: "merge_requests", label: "merge request"
      uses the correct singular label
      uses the correct plural label
    scope: "milestones", label: "milestone"
      uses the correct singular label
      uses the correct plural label
    scope: "notes", label: "comment"
      uses the correct singular label
      uses the correct plural label
    scope: "projects", label: "project"
      uses the correct singular label
      uses the correct plural label
    scope: "snippet_blobs", label: "snippet result"
      uses the correct singular label
      uses the correct plural label
    scope: "snippet_titles", label: "snippet"
      uses the correct singular label
      uses the correct plural label
    scope: "users", label: "user"
      uses the correct singular label
      uses the correct plural label
    scope: "wiki_blobs", label: "wiki result"
      uses the correct singular label
      uses the correct plural label
  search_entries_empty_message
    returns the formatted entry message
  search_filter_input_options
    project
      includes id with type
      includes project-id
      includes project endpoints
      includes autocomplete=off flag
    group
      does not includes project-id
      includes group endpoints
    dashboard
      does not include group-id and project-id
      includes dashboard endpoints
  search_history_storage_prefix
    project
      returns project full_path
    group
      returns group full_path
    dashboard
      returns dashboard
  search_filter_link
    renders a search filter link for the current scope
    renders a search filter link for another scope
    merges in the current search params and given params
    assigns given data attributes on the list container

Gitlab::MarkdownCache::ActiveRecord::Extension
  an unchanged markdown field
    should eq "`Foo`"
    should eq "<p data-sourcepos=\"1:1-1:5\" dir=\"auto\"><code>Foo</code></p>"
    should not be truthy
    should eq 1179648
  a changed markdown field
    should eq "<p data-sourcepos=\"1:1-1:5\" dir=\"auto\"><code>Bar</code></p>"
    should eq 1179648
  when a markdown field is set repeatedly to an empty string
    should receive refresh_markdown_cache(*(any args)) 1 time
  when a markdown field is set repeatedly to a string which renders as empty html
    should receive refresh_markdown_cache(*(any args)) 1 time
  a non-markdown field changed
    should eq "closed"
    should eq "`Foo`"
    should eq "<p data-sourcepos=\"1:1-1:5\" dir=\"auto\"><code>Foo</code></p>"
    should eq 1179648
  version is out of date
    should eq "<p data-sourcepos=\"1:1-1:5\" dir=\"auto\"><code>Bar</code></p>"
    should eq 1179648
  when an invalidating field is changed
    invalidates the cache when project changes
    invalidates the cache when author changes
  .attributes
    excludes cache attributes that is blacklisted by default
  #cached_html_up_to_date?
    returns false if markdown has been changed but html has not
    returns true if markdown has not been changed but html has
    returns true if markdown and html have both been changed
    returns false if the markdown field is set but the html is not
  #refresh_markdown_cache!
    skips saving if not persisted
    saves the changes

Banzai::ReferenceParser::CommitRangeParser
  #nodes_visible_to_user
    when the link has a data-issue attribute
      behaves like referenced feature visibility
        when feature is disabled
          does not create reference
        when feature is enabled only for team members
          does not create reference for non member
          creates reference for member
        when feature is enabled
          creates reference
  #referenced_by
    when the link has a data-project attribute
      when the link as a data-commit-range attribute
        returns an Array of commit ranges
        returns an empty Array when the commit range could not be found
      when the link does not have a data-commit-range attribute
        returns an empty Array
    when the link does not have a data-project attribute
      returns an empty Array
  #commit_range_ids_per_project
    returns a Hash containing range IDs per project
    does not add a project when the data-commit-range attribute is empty
  #find_ranges
    returns an Array of range objects
    skips ranges that could not be found
  #find_object
    when the range has valid commits
      returns the commit range
    when the range does not have any valid commits
      returns nil
    group context
      returns nil

Projects::OpenIssuesCountService
  behaves like a counter caching service
    #count
      caches the count
    #refresh_cache
      refreshes the cache
    #delete_cache
      removes the cache
    #uncached_count
      does not cache the count
  #count
    when user is nil
      does not include confidential issues in the issue count
    when user is provided
      when user can read confidential issues
        returns the right count with confidential issues
        uses total_open_issues_count cache key
      when user cannot read confidential issues
        does not include confidential issues
        uses public_open_issues_count cache key
    #refresh_cache
      when cache is empty
        refreshes cache keys correctly
      when cache is outdated
        refreshes cache keys correctly

WikiPages::UpdateService
  #execute
    updates the wiki page
    executes webhooks
    counts edit events
    when the options are bad
      does not count an edit event
      reports the error

Gitlab::CycleAnalytics::BaseEventFetcher
  limits the rows to the max number

Issues::ImportCsvService
  #execute
    invalid file
      returns invalid file error
    comma delimited file
      imports CSV without errors
    tab delimited file with error row
      imports CSV with some error rows
    semicolon delimited file with CRLF
      imports CSV with a blank row

IssuePresenter
  #web_url
    returns correct path
  #subscribed?
    returns not subscribed
    returns subscribed
  #issue_path
    returns correct path

Projects::HashedStorage::MigrateRepositoryService
  #execute
    works even when project validation fails
    repository lock
      tries to lock the repository
      fails when a git operation is in progress
    when repository doesnt exist on disk
      skips the disk change but increase the version
    when succeeds
      renames project and wiki repositories
      updates project to be hashed and not read-only
      move operation is called for both repositories
      writes project full path to .git/config
    when one move fails
      rollsback repositories to original name
      when rollback fails
        does not try to move nil repository over existing

Ci::ArchiveTracesCronWorker
  when a job succeeded
    executes service
    behaves like archives trace
      should be exist
    when the job finished recently
      behaves like does not archive trace
        should be nil
    when a trace had already been archived
      continues to archive live traces
    when an unexpected exception happened during archiving
      puts a log
  when a job was cancelled
    behaves like archives trace
      should be exist
  when a job is running
    behaves like does not archive trace
      should be nil

Gitlab::Graphql::Authorization
  Field authorizations
    with a single permission
      returns the protected field when user has permission
      returns nil when user is not authorized
    with a collection of permissions
      returns the protected field when user has all permissions
      returns nil when user only has one of the permissions
      returns nil when user only has none of the permissions
  Field authorizations when field is a built in type
    with a single permission
      returns the protected field when user has permission
      returns nil when user is not authorized
    with a collection of permissions
      returns the protected field when user has all permissions
      returns nil when user only has one of the permissions
      returns nil when user only has none of the permissions
  Type authorizations
    with a single permission
      returns the protected field when user has permission
      returns nil when user is not authorized
    with a collection of permissions
      returns the protected field when user has all permissions
      returns nil when user only has one of the permissions
      returns nil when user only has none of the permissions
  type and field authorizations together
    returns the protected field when user has all permissions
    returns nil when user only has one of the permissions
    returns nil when user only has none of the permissions
  type authorizations when applied to a relay connection
    returns only the elements visible to the user
    returns nil when user is not authorized
    limiting connections with multiple objects
      only checks permissions for the first object
  type authorizations when applied to a basic connection
    returns the protected field when user has permission
    returns nil when user is not authorized
  Authorizations on active record relations
    renders the issues the user has access to
    does not check access on fields that will not be rendered

ProjectImportState
  associations
    should belong to project required:
  validations
    should validate that :project cannot be empty/falsy
  Project import job
    imports a project
  #human_status_name
    when import_state exists
      returns the humanized status name
  import state transitions
    state transition: [:started] => [:finished]
      resets last_error
      performs housekeeping when an import of a fresh project is completed
      does not perform housekeeping when project repository does not exist
      does not perform housekeeping when project does not have a valid import type
  #remove_jid
    without an JID
      does nothing
    with an JID
      unsets the JID

Lfs::LocksFinderService
  #execute
    find by id
      with results
        returns the record
      without results
        returns an empty list
    find by path
      with results
        returns the record
      without results
        returns an empty list
    find all
      with results
        returns all the records
      without results
        returns an empty list
    when an error is raised
      doesn't succeed

GitlabRoutingHelper
  Project URL helpers
    #project_member_path
      should eq "/namespace967/project846/-/project_members/1175"
    #request_access_project_members_path
      should eq "/namespace968/project847/-/project_members/request_access"
    #leave_project_members_path
      should eq "/namespace969/project848/-/project_members/leave"
    #approve_access_request_project_member_path
      should eq "/namespace970/project849/-/project_members/1177/approve_access_request"
    #resend_invite_project_member_path
      should eq "/namespace971/project850/-/project_members/1179/resend_invite"
  Group URL helpers
    #group_members_url
      should eq "http://test.host/groups/group209/-/group_members"
    #group_member_path
      should eq "/groups/group210/-/group_members/1180"
    #request_access_group_members_path
      should eq "/groups/group211/-/group_members/request_access"
    #leave_group_members_path
      should eq "/groups/group212/-/group_members/leave"
    #approve_access_request_group_member_path
      should eq "/groups/group213/-/group_members/1181/approve_access_request"
    #resend_invite_group_member_path
      should eq "/groups/group214/-/group_members/1182/resend_invite"
  #preview_markdown_path
    returns group preview markdown path for a group parent
    returns project preview markdown path for a project parent
    returns snippet preview markdown path for a personal snippet
    returns project preview markdown path for a project snippet
  #edit_milestone_path
    returns group milestone edit path when given entity parent is a Group
    returns project milestone edit path when given entity parent is not a Group

Gitlab::Kubernetes::Helm::InitCommand
  behaves like helm commands
    #generate_script
      returns appropriate command
  on a rbac-enabled cluster
    behaves like helm commands
      #generate_script
        returns appropriate command
  #rbac?
    rbac is enabled
      should be truthy
    rbac is not enabled
      should be falsey
  #config_map_resource
    returns a KubeClient resource with config map content for the application
  #pod_resource
    rbac is enabled
      generates a pod that uses the tiller serviceAccountName
    rbac is not enabled
      generates a pod that uses the default serviceAccountName
  #service_account_resource
    rbac is enabled
      generates a Kubeclient resource for the tiller ServiceAccount
    rbac is not enabled
      generates nothing
  #cluster_role_binding_resource
    rbac is enabled
      generates a Kubeclient resource for the ClusterRoleBinding for tiller
    rbac is not enabled
      generates nothing

Gitlab::ExclusiveLease
  #try_obtain
    cannot obtain twice before the lease has expired
    can obtain after the lease has expired
  #renew
    returns true when we have the existing lease
    returns false when we dont have a lease
  #exists?
    returns true for an existing lease
    returns false for a lease that does not exist
  .get_uuid
    gets the uuid if lease with the key associated exists
    returns false if the lease does not exist
  .cancel
    can cancel a lease
  #ttl
    returns the TTL of the Redis key
    returns nil when the lease does not exist
  .reset_all!
    removes all existing lease keys from redis

Members::CreateService
  adds user to members
  adds no user to members
  limits the number of users to 100
  does not add an invalid member
  does not add a member with an existing invite

Gitlab::Sanitizers::Exif
  #batch_clean
    filters only jpg/tiff images
    with image uploads
      processes all uploads if range ID is not set
      processes only uploads in the selected range
      processes only uploads for the selected uploader
      processes only uploads created since specified date
      pauses if sleep_time is set
  #clean
    no dry run
      removes exif from the image
      ignores image without exif
      raises an error if the exiftool fails with an error
    dry run
      doesn't change the image
  #extra_tags
    returns a list of keys for exif file
    returns an empty list for file with only whitelisted and ignored tags

ProjectFeaturesCompatibility
  converts fields from 'true' to ProjectFeature::ENABLED
  converts fields from 'false' to ProjectFeature::DISABLED
  converts fields from true to ProjectFeature::ENABLED
  converts fields from false to ProjectFeature::DISABLED
  accepts private as ProjectFeature::PRIVATE

LabelNote
  when resource is issue
    behaves like label note created from events
      .from_events
        returns system note with expected attributes
        updates markdown cache if reference is not set yet
        updates markdown cache if label was deleted
        returns html note
        returns text note for added labels
        returns text note for removed labels
        returns text note for added and removed labels
        returns text note for cross-project label
        returns text note for cross-group label
  when resource is merge request
    behaves like label note created from events
      .from_events
        returns system note with expected attributes
        updates markdown cache if reference is not set yet
        updates markdown cache if label was deleted
        returns html note
        returns text note for added labels
        returns text note for removed labels
        returns text note for added and removed labels
        returns text note for cross-project label
        returns text note for cross-group label

Gitlab::Kubernetes::DefaultNamespace
  #from_environment_name
    generates a slug and passes it to #from_environment_slug
  #from_environment_slug
    namespace per environment is enabled
      platform namespace is specified
        should eq "platform-namespace-environment22"
        cluster is unmanaged
          should eq "platform-namespace"
      platform namespace is blank
        constructs a namespace from the project and environment
    namespace per environment is disabled
      platform namespace is specified
        should eq "platform-namespace"
      platform namespace is blank
        constructs a namespace from the project and environment

AwardEmojiHelper
  .toggle_award_url
    note on personal snippet
      returns correct url
    note on project item
      returns correct url
    personal snippet
      returns correct url
    merge request
      returns correct url
    issue
      returns correct url

RepositoryImportWorker
  modules
    includes ProjectImportOptions
  #perform
    when worker was reset without cleanup
      imports the project successfully
    when the import was successful
      imports a project
    when the import has failed
      hide the credentials that were used in the import URL
      updates the error on Import/Export
    when using an asynchronous importer
      does not mark the import process as finished

projects/diffs/_stats.html.haml
  when the commit contains several changes
    uses plural for additions
    uses plural for deletions
  when the commit contains no addition and no deletions
    uses plural for additions
    uses plural for deletions
  when the commit contains exactly one addition and one deletion
    uses singular for additions
    uses singular for deletions

create_tokens
  setting secret keys
    when none of the secrets exist
      generates different hashes for secret_key_base, otp_key_base, and db_key_base
      generates an RSA key for openid_connect_signing_key
      warns about the secrets to add to secrets.yml
      writes the secrets to secrets.yml
      does not write a .secret file
    when the other secrets all exist
      when secret_key_base exists in the environment and secrets.yml
        does not issue a warning
        uses the environment variable
        does not update secrets.yml
      when secret_key_base and otp_key_base exist
        does not write any files
        sets the keys to the values from the environment and secrets.yml
        deletes the .secret file
      when secret_key_base and otp_key_base do not exist
        uses the file secret
        keeps the other secrets as they were
        warns about the missing secrets
        deletes the .secret file
    when db_key_base is blank but exists in secrets.yml
      warns about updating db_key_base
      warns about the blank value existing in secrets.yml and exits
      does not update secrets.yml

IssueTrackerService
  Validations
    only one issue tracker per project
      when service is changed manually by user
        executes the validation
      when service is changed internally
        does not execute the validation

UserAgentDetail
  .submittable?
    is submittable when not already submitted
    is not submittable when already submitted
  .valid?
    is valid with a subject
    is invalid without a subject

Boards::ListService
  #execute
    when board parent is a project
      behaves like boards list service
        returns parent boards
        when parent does not have a board
          creates a new parent board
          delegates the parent board creation to Boards::CreateService
        when parent has a board
          does not create a new board
    when board parent is a group
      behaves like boards list service
        returns parent boards
        when parent does not have a board
          creates a new parent board
          delegates the parent board creation to Boards::CreateService
        when parent has a board
          does not create a new board

WikiPages::DestroyService
  #execute
    executes webhooks
    increments the delete count
    does not increment the delete count if the deletion failed

Gitlab::VisibilityLevelChecker
  #level_restricted?
    when visibility level is allowed
      returns false with nil for visibility level
    when visibility level is restricted
      returns true and visibility name
      overridden visibility
        when restricted
          returns true and visibility name
        when misspelled
          returns false with nil for visibility level
        when import_data is missing
          returns false with nil for visibility level

MergeRequests::MigrateExternalDiffsService
  .enqueue!
    enqueues nothing if external diffs are disabled
    enqueues eligible in-database diffs if external diffs are enabled
  #execute
    migrates an in-database diff to the external store

WebHookLog
  should belong to web_hook required:
  should serialize :request_headers class_name => Hash
  should serialize :request_data class_name => Hash
  should serialize :response_headers class_name => Hash
  should validate that :web_hook cannot be empty/falsy
  .recent
    does not return web hook logs that are too old
    returns the web hook logs in descending order
  #success?
    2xx
      should be truthy
    not 2xx
      should be falsey
    internal erorr
      should be falsey

Gitlab::BackgroundMigration::AddMergeRequestDiffCommitsCount
NOTICE:  trigger "trigger_36edafd19664" for relation "epics" does not exist, skipping
NOTICE:  trigger "trigger_dd1443fbd36e" for relation "application_settings" does not exist, skipping
NOTICE:  trigger "trigger_806273a4d8be" for relation "application_settings" does not exist, skipping
NOTICE:  trigger "trigger_f1016db1483e" for relation "users" does not exist, skipping
  #perform
    migrates diffs that have no commits
    skips diffs that have commits_count already set
    migrates multiple diffs to the correct values
NOTICE:  trigger "trigger_7dc952250ffd" for relation "users" does not exist, skipping
NOTICE:  table "design_management_designs" does not exist, skipping
NOTICE:  table "design_management_designs_versions" does not exist, skipping
NOTICE:  table "design_management_versions" does not exist, skipping
NOTICE:  table "geo_container_repository_updated_events" does not exist, skipping
NOTICE:  trigger "trigger_806273a4d8be" for relation "application_settings" does not exist, skipping
NOTICE:  trigger "trigger_dd1443fbd36e" for relation "application_settings" does not exist, skipping
NOTICE:  trigger "trigger_84853438aac0" for relation "epics" does not exist, skipping

Gitlab::GithubImport::StageMethods
  #perform
    returns if no project could be found
    imports the data when the project exists
  #try_import
    imports the project
    reschedules the worker if RateLimitError was raised
  #find_project
    returns a Project for an existing ID
    returns nil for a project that failed importing
    returns nil for a non-existing project ID

PaginatedDiffEntity
  exposes diff_files
  exposes pagination data

MigrateManagedClustersWithNoTokenToUnmanaged
NOTICE:  trigger "trigger_36edafd19664" for relation "epics" does not exist, skipping
NOTICE:  trigger "trigger_dd1443fbd36e" for relation "application_settings" does not exist, skipping
NOTICE:  trigger "trigger_806273a4d8be" for relation "application_settings" does not exist, skipping
== 20190613231640 MigrateManagedClustersWithNoTokenToUnmanaged: migrating =====
== 20190613231640 MigrateManagedClustersWithNoTokenToUnmanaged: migrated (0.0343s) 

  marks the cluster as unmanaged
  cluster is not project type
== 20190613231640 MigrateManagedClustersWithNoTokenToUnmanaged: migrating =====
== 20190613231640 MigrateManagedClustersWithNoTokenToUnmanaged: migrated (0.0034s) 

    does not update the cluster
  kubernetes namespace has a service account token
== 20190613231640 MigrateManagedClustersWithNoTokenToUnmanaged: migrating =====
== 20190613231640 MigrateManagedClustersWithNoTokenToUnmanaged: migrated (0.0033s) 

    does not update the cluster
  cluster was created after the cutoff
== 20190613231640 MigrateManagedClustersWithNoTokenToUnmanaged: migrating =====
== 20190613231640 MigrateManagedClustersWithNoTokenToUnmanaged: migrated (0.0034s) 

    does not update the cluster
NOTICE:  trigger "trigger_806273a4d8be" for relation "application_settings" does not exist, skipping
NOTICE:  trigger "trigger_dd1443fbd36e" for relation "application_settings" does not exist, skipping
NOTICE:  trigger "trigger_84853438aac0" for relation "epics" does not exist, skipping

Gitlab::Ci::Status::Build::Preparing
  #illustration
    should include :image, :size, :title, and :content
  .matches?
    when build is preparing
      is a correct match
    when build is not preparing
      does not match

NamespaceFileUploader
  behaves like builds correct paths
    #store_dir
      behaves like matches the method pattern
        should match /uploads\/-\/system\/namespace\/\d+/
    #cache_dir
      behaves like matches the method pattern
        example at ./spec/support/shared_examples/uploaders/gitlab_uploader_shared_examples.rb:8 (PENDING: No pattern provided, skipping.)
    #work_dir
      behaves like matches the method pattern
        example at ./spec/support/shared_examples/uploaders/gitlab_uploader_shared_examples.rb:8 (PENDING: No pattern provided, skipping.)
    #upload_path
      behaves like matches the method pattern
        should match /\h+\/\S+/
    #relative_path
      is relative (PENDING: Path not set, skipping.)
    .absolute_path
      behaves like matches the method pattern
        should match /\/builds\/gitlab-org\/gitlab\/tmp\/tests\/public\/uploads\/-\/system\/namespace\/\d+\/(?-mix:\h+\/\S+)/
    .base_dir
      behaves like matches the method pattern
        example at ./spec/support/shared_examples/uploaders/gitlab_uploader_shared_examples.rb:8 (PENDING: No pattern provided, skipping.)
  object_store is REMOTE
    behaves like builds correct paths
      #store_dir
        behaves like matches the method pattern
          should match /namespace\/\d+\/\h+/
      #cache_dir
        behaves like matches the method pattern
          example at ./spec/support/shared_examples/uploaders/gitlab_uploader_shared_examples.rb:8 (PENDING: No pattern provided, skipping.)
      #work_dir
        behaves like matches the method pattern
          example at ./spec/support/shared_examples/uploaders/gitlab_uploader_shared_examples.rb:8 (PENDING: No pattern provided, skipping.)
      #upload_path
        behaves like matches the method pattern
          should match /\h+\/\S+/
      #relative_path
        is relative (PENDING: Path not set, skipping.)
      .absolute_path
        behaves like matches the method pattern
          example at ./spec/support/shared_examples/uploaders/gitlab_uploader_shared_examples.rb:8 (PENDING: No pattern provided, skipping.)
      .base_dir
        behaves like matches the method pattern
          example at ./spec/support/shared_examples/uploaders/gitlab_uploader_shared_examples.rb:8 (PENDING: No pattern provided, skipping.)
  .base_dir
    returns local storage base_dir without store param
    returns local storage base_dir when store param is Store::LOCAL
    returns remote base_dir when store param is Store::REMOTE
  #workhorse_local_upload_path
    returns the correct path in uploads directory
  #migrate!
    behaves like migrates
      returns corresponding file type
      does nothing when migrating to the current store
      migrate to the specified store
      removes the original file after the migration
      can access to the original file during migration
      when migrate! is not occupied by another process
        executes migrate!
        executes use_file
      when migrate! is occupied by another process
        does not execute migrate!
        does not execute use_file
      migration is unsuccessful
        when the store is not supported
          does not update the object_store
          does not delete the original file
        upon a fog failure
          does not update the object_store
          does not delete the original file
        upon a database failure
          does not update the object_store
          does not delete the original file
    behaves like migrates
      returns corresponding file type
      does nothing when migrating to the current store
      migrate to the specified store
      removes the original file after the migration
      can access to the original file during migration
      when migrate! is not occupied by another process
        executes migrate!
        executes use_file
      when migrate! is occupied by another process
        does not execute migrate!
        does not execute use_file
      migration is unsuccessful
        when the store is not supported
          does not update the object_store
          does not delete the original file
        upon a fog failure
          does not update the object_store
          does not delete the original file
        upon a database failure
          does not update the object_store
          does not delete the original file
  copy_to
    files are stored locally
      generates a new secret
      creates new upload correctly
      copies the file
      copies the file to the correct location
    files are stored remotely
      generates a new secret
      creates new upload correctly
      copies the file
      copies the file to the correct location

Gitlab::Ci::Build::Prerequisite::Factory
  .for_build
    prerequisite is unmet
      should eq [#<InstanceDouble(Gitlab::Ci::Build::Prerequisite::KubernetesNamespace) (anonymous)>]
    prerequisite is met
      should be empty

ProjectImportOptions
  sets default retry limit
  sets default status expiration
  .sidekiq_retries_exhausted
2019-10-15T08:49:54.855Z 91 TID-gohcudbg3 WARN: Failed  with [1074, nil, nil]: 
    marks fork as failed
2019-10-15T08:49:55.047Z 91 TID-gohcudbg3 WARN: Failed  with [1075, nil, nil]: 
    logs the appropriate error message for forked projects
2019-10-15T08:49:55.226Z 91 TID-gohcudbg3 WARN: Failed  with [1076, nil, nil]: 
    logs the appropriate error message for forked projects
    when project does not have import_state
      raises an error

Gitlab::LegacyGithubImport::WikiFormatter
  #disk_path
    appends .wiki to disk path
  #full_path
    appends .wiki to project path
  #import_url
    returns URL of the wiki repository

Gitlab::Metrics::Instrumentation
  .series
    returns a String
  .configure
    yields self
  .instrument_method
    with metrics enabled
      instruments the Class
      defines a proxy method
      calls the instrumented method with the correct arguments
      tracks the call duration upon calling the method
      does not track method calls below a given duration threshold
      generates a method with the correct arity when using methods without arguments
      when a module is instrumented multiple times
        calls the instrumented method with the correct arguments
    with metrics disabled
      does not instrument the method
  .instrument_instance_method
    with metrics enabled
      instruments instances of the Class
      defines a proxy method
      calls the instrumented method with the correct arguments
      tracks the call duration upon calling the method
      does not track method calls below a given duration threshold
    with metrics disabled
      does not instrument the method
  .instrument_class_hierarchy
    recursively instruments a class hierarchy
    does not instrument the root module
  .instrument_methods
    instruments all public class methods
    instruments all protected class methods
    instruments all private instance methods
    only instruments methods directly defined in the module
    can take a block to determine if a method should be instrumented
  .instrument_instance_methods
    instruments all public instance methods
    instruments all protected instance methods
    instruments all private instance methods
    only instruments methods directly defined in the module
    can take a block to determine if a method should be instrumented

Gitlab::Graphql::Loaders::PipelineForShaLoader
  #find_last
    batch-resolves latest pipeline

Prometheus::AdapterService
  #prometheus_adapter
    prometheus service can execute queries
      return prometheus service as prometheus adapter
    prometheus service can't execute queries
      with cluster with prometheus not available
        returns nil
      with cluster with prometheus available
        returns application handling all environments
      with cluster without prometheus installed
        returns nil

BlobViewer::Base
  .can_render?
    when the extension is supported
      when the binaryness matches
        returns true
      when the binaryness does not match
        returns false
    when the file type is supported
      when the binaryness matches
        returns true
      when the binaryness does not match
        returns false
    when the extension and file type are not supported
      returns false
  #collapsed?
    when the blob size is larger than the collapse limit
      returns true
    when the blob size is smaller than the collapse limit
      returns false
  #too_large?
    when the blob size is larger than the size limit
      returns true
    when the blob size is smaller than the size limit
      returns false
  #render_error
    when the blob is expanded
      when the blob size is larger than the size limit
        returns :too_large
      when the blob size is smaller than the size limit
        returns nil
    when not expanded
      when the blob size is larger than the collapse limit
        returns :collapsed
      when the blob size is smaller than the collapse limit
        returns nil

projects/pipeline_schedules/_pipeline_schedule
  taking ownership of schedule
    when non-owner is signed in
      non-owner can take ownership of pipeline
    when owner is signed in
      owner cannot take ownership of pipeline

Gitlab::CycleAnalytics::ProductionEventFetcher
  behaves like default query config
    has the stage attribute
    has the projection attributes

Gitlab::Ci::Status::Build::Erased
  #illustration
    should include :image, :size, and :title
  .matches?
    when build is erased
      is a correct match
    when build is not erased
      does not match

Gitlab::Checks::ProjectCreated
  .fetch_message
    with a project created message queue
      returns project created message
      deletes the project created message from redis
    with no project created message queue
      returns nil
  #add_message
    queues a project created message
    handles anonymous push

SetIssueIdForAllVersions
NOTICE:  trigger "trigger_36edafd19664" for relation "epics" does not exist, skipping
NOTICE:  trigger "trigger_dd1443fbd36e" for relation "application_settings" does not exist, skipping
NOTICE:  trigger "trigger_806273a4d8be" for relation "application_settings" does not exist, skipping
== 20190715043954 SetIssueIdForAllVersions: migrating =========================
-- execute("UPDATE design_management_versions as versions SET issue_id = (\n      SELECT design_management_designs.issue_id\n        FROM design_management_designs\n        INNER JOIN design_management_designs_versions ON design_management_designs.id = design_management_designs_versions.design_id\n        WHERE design_management_designs_versions.version_id = versions.id\n        LIMIT 1\n    )")
   -> 0.0014s
== 20190715043954 SetIssueIdForAllVersions: migrated (0.0018s) ================

  correctly sets issue_id
NOTICE:  trigger "trigger_806273a4d8be" for relation "application_settings" does not exist, skipping
NOTICE:  trigger "trigger_dd1443fbd36e" for relation "application_settings" does not exist, skipping
NOTICE:  trigger "trigger_84853438aac0" for relation "epics" does not exist, skipping

EnqueueResetMergeStatus
NOTICE:  trigger "trigger_36edafd19664" for relation "epics" does not exist, skipping
NOTICE:  trigger "trigger_dd1443fbd36e" for relation "application_settings" does not exist, skipping
NOTICE:  trigger "trigger_806273a4d8be" for relation "application_settings" does not exist, skipping
== 20190528180441 EnqueueResetMergeStatus: migrating ==========================
-- Scheduling `ResetMergeStatus` jobs
== 20190528180441 EnqueueResetMergeStatus: migrated (0.0529s) =================

  correctly schedules background migrations
NOTICE:  table "geo_container_repository_updated_events" does not exist, skipping
NOTICE:  trigger "trigger_806273a4d8be" for relation "application_settings" does not exist, skipping
NOTICE:  trigger "trigger_dd1443fbd36e" for relation "application_settings" does not exist, skipping
NOTICE:  trigger "trigger_84853438aac0" for relation "epics" does not exist, skipping

MailScheduler::IssueDueWorker
  #perform
    sends emails for open issues due tomorrow in the project specified

HashedStorage::MigratorWorker
  #perform
    delegates to MigratorService
2019-10-15T08:50:18.502Z 91 TID-gohcudbg3 INFO: Skipped attachments move from '/builds/gitlab-org/gitlab/tmp/tests/public/uploads/namespace1097/project976' to '/builds/gitlab-org/gitlab/tmp/tests/public/uploads/@hashed/33/0e/330e14d4ae80612334d94c488d29eb469626b476864abdeb5c1bd261db461c50', source path doesn't exist or is not a directory (PROJECT_ID=1099)
2019-10-15T08:50:18.577Z 91 TID-gohcudbg3 INFO: Skipped attachments move from '/builds/gitlab-org/gitlab/tmp/tests/public/uploads/namespace1098/project977' to '/builds/gitlab-org/gitlab/tmp/tests/public/uploads/@hashed/ab/98/ab9828ca390581b72629069049793ba3c99bb8e5e9e7b97a55c71957e04df9a3', source path doesn't exist or is not a directory (PROJECT_ID=1100)
    migrates projects in the specified range

Projects::ContainerRepository::CleanupTagsService
  #execute
    when no params are specified
      does not remove anything
    when regex matching everything is specified
      does remove B* and C
    when regex matching specific tags is used
      does remove C and D
    when removing a tagged image that is used by another tag
      does not remove the tag
    when removing keeping only 3
      does remove C as it is oldest
    when removing older than 1 day
      does remove B* and C as they are older than 1 day
    when combining all parameters
      does remove B* and C

RemoveEmptyExternUidAuth0Identities
NOTICE:  trigger "trigger_36edafd19664" for relation "epics" does not exist, skipping
NOTICE:  trigger "trigger_dd1443fbd36e" for relation "application_settings" does not exist, skipping
NOTICE:  trigger "trigger_806273a4d8be" for relation "application_settings" does not exist, skipping
NOTICE:  trigger "trigger_f1016db1483e" for relation "users" does not exist, skipping
== 20180220150310 RemoveEmptyExternUidAuth0Identities: migrating ==============
== 20180220150310 RemoveEmptyExternUidAuth0Identities: migrated (0.0092s) =====

  leaves the correct auth0 identity
== 20180220150310 RemoveEmptyExternUidAuth0Identities: migrating ==============
== 20180220150310 RemoveEmptyExternUidAuth0Identities: migrated (0.0103s) =====

  leaves the correct github identity
NOTICE:  trigger "trigger_7dc952250ffd" for relation "users" does not exist, skipping
NOTICE:  table "design_management_designs" does not exist, skipping
NOTICE:  table "design_management_designs_versions" does not exist, skipping
NOTICE:  table "design_management_versions" does not exist, skipping
NOTICE:  table "geo_container_repository_updated_events" does not exist, skipping
NOTICE:  trigger "trigger_806273a4d8be" for relation "application_settings" does not exist, skipping
NOTICE:  trigger "trigger_dd1443fbd36e" for relation "application_settings" does not exist, skipping
NOTICE:  trigger "trigger_84853438aac0" for relation "epics" does not exist, skipping

ImportIssuesCsvWorker
  #perform
    calls #execute on Issues::ImportCsvService and destroys upload

PivotaltrackerService
  Associations
    should belong to project required:
    should have one service_hook
  Validations
    when service is active
      should validate that :token cannot be empty/falsy
    when service is inactive
      should not validate that :token cannot be empty/falsy
  Execute
    posts correct message
    when allowed branches is specified
      posts message if branch is in the list
      does not post message if branch is not in the list

BoardsHelper
  #build_issue_link_base
    project board
      returns correct path for project board
    group board
      returns correct path for base group
      returns correct path for subgroup
  #board_data
    returns a board_lists_path as lists_endpoint
  #current_board_json
    can serialise with a basic set of attributes

Gitlab::PhabricatorImport::ProjectCreator
  #execute
    creates a project correctly and schedule an import
    when import params are missing
      returns nil
    when import params are invalid
      returns an unpersisted project

AssureCommitsCountForMergeRequestDiff
NOTICE:  trigger "trigger_36edafd19664" for relation "epics" does not exist, skipping
NOTICE:  trigger "trigger_dd1443fbd36e" for relation "application_settings" does not exist, skipping
NOTICE:  trigger "trigger_806273a4d8be" for relation "application_settings" does not exist, skipping
  when there are still unmigrated commit_counts afterwards
== 20180425131009 AssureCommitsCountForMergeRequestDiff: migrating ============
DEPRECATION WARNING: Dangerous query method (method whose arguments are used as raw SQL) called with non-attribute argument(s): "MIN(id)", "MAX(id)". Non-attribute arguments will be disallowed in Rails 6.0. This method should not be called with user-provided values, such as request parameters or model attributes. Known-safe values can be passed by wrapping them in Arel.sql(). (called from block in up at /builds/gitlab-org/gitlab/db/migrate/20180425131009_assure_commits_count_for_merge_request_diff.rb:18)
== 20180425131009 AssureCommitsCountForMergeRequestDiff: migrated (0.0145s) ===

    migrates commit_counts sequentially in batches
NOTICE:  table "design_management_designs" does not exist, skipping
NOTICE:  table "design_management_designs_versions" does not exist, skipping
NOTICE:  table "design_management_versions" does not exist, skipping
NOTICE:  table "geo_container_repository_updated_events" does not exist, skipping
NOTICE:  trigger "trigger_806273a4d8be" for relation "application_settings" does not exist, skipping
NOTICE:  trigger "trigger_dd1443fbd36e" for relation "application_settings" does not exist, skipping
NOTICE:  trigger "trigger_84853438aac0" for relation "epics" does not exist, skipping

Projects::ContainerRepository::DeleteTagsService
  #execute
    without permissions
      should include {:status => :error}
    with permissions
      when no params are specified
        does not remove anything
      with empty tags
        does not remove anything
      with dummy tags disabled
        deletes tags one by one
      with dummy tags enabled
        deletes the tags using a dummy image

Gitlab::Graphql::Representation::TreeEntry
  .decorate
    returns NilClass when given nil
    returns array of TreeEntry

ProtectedBranches::DestroyService
  #execute
    destroys a protected branch
    when a policy restricts rule deletion
      prevents deletion of the protected branch rule

Gitlab::Import::DatabaseHelpers
  .insert_and_return_id
    returns the ID returned by the query

Gitlab::Ci::Pipeline::Chain::Skip
  when pipeline has been skipped by a user
    breaks the chain
    skips the pipeline
  when pipeline has not been skipped
    does not break the chain
    does not skip a pipeline chain
  when [ci skip] should be ignored
    does not break the chain
  when pipeline should be skipped but not persisted
    breaks the chain
    does not skip pipeline

PublicUrlValidator
  #validate
    with no options
      allows http,https schemes by default
      checks that the url structure is valid
    with schemes
      allows urls with the defined schemes
      add error if the url scheme does not match the selected ones
  by default
    blocks urls pointing to localhost
    blocks urls pointing to the local network
  when local requests are allowed
    does not block urls pointing to localhost
    does not block urls pointing to the local network

RuboCop::Cop::Graphql::AuthorizeTypes
  when NOT in a type folder
    does not add an offense even though there is no authorize call
  when in a type folder
    adds an offense when there is no authorize call
    does not add an offense for classes that have an authorize call
    does not add an offense for classes that only have an authorize call
    does not add an offense for base types

Gitlab::Ci::Status::Pipeline::Blocked
  #text
    overrides status text
  #label
    overrides status label
  .matches?
    when pipeline is blocked
      is a correct match
    when pipeline is not blocked
      does not match

Gitlab::Graphql::Representation::SubmoduleTreeEntry
  .decorate
    returns array of SubmoduleTreeEntry

Gitlab::SidekiqMiddleware::MemoryKiller
  when MAX_RSS is set to 0
    does nothing
  when MAX_RSS is exceeded
    sends the TSTP, TERM and KILL signals at expected times
2019-10-15T08:51:13.650Z 91 TID-gohhnwj3f WARN: {:class=>"ProjectCacheWorker", :pid=>999, :signal=>nil, :message=>"Sidekiq worker PID-999 current RSS 10240 exceeds maximum RSS 5120 after finishing job ProjectCacheWorker JID-123"}
2019-10-15T08:51:13.650Z 91 TID-gohhnwj3f WARN: {:class=>"ProjectCacheWorker", :pid=>999, :signal=>nil, :message=>"Sidekiq worker PID-999 will stop fetching new jobs in 900 seconds, and will be shut down 30 seconds later"}
2019-10-15T08:51:13.650Z 91 TID-gohhnwj3f WARN: {:class=>"ProjectCacheWorker", :pid=>999, :signal=>"SIGTSTP", :message=>"waiting 900 seconds before sending Sidekiq worker PID-999 SIGTSTP (stop fetching new jobs)"}
2019-10-15T08:51:13.651Z 91 TID-gohhnwj3f WARN: {:class=>"ProjectCacheWorker", :pid=>999, :signal=>"SIGTSTP", :message=>"sending Sidekiq worker PID-999 SIGTSTP (stop fetching new jobs)"}
2019-10-15T08:51:13.651Z 91 TID-gohhnwj3f WARN: {:class=>"ProjectCacheWorker", :pid=>999, :signal=>"SIGTERM", :message=>"waiting 30 seconds before sending Sidekiq worker PID-999 SIGTERM (gracefully shut down)"}
2019-10-15T08:51:13.651Z 91 TID-gohhnwj3f WARN: {:class=>"ProjectCacheWorker", :pid=>999, :signal=>"SIGTERM", :message=>"sending Sidekiq worker PID-999 SIGTERM (gracefully shut down)"}
2019-10-15T08:51:13.652Z 91 TID-gohhnwj3f WARN: {:class=>"ProjectCacheWorker", :pid=>999, :signal=>"SIGKILL", :message=>"waiting 10 seconds before sending Sidekiq worker PGRP-999 SIGKILL (die)"}
2019-10-15T08:51:13.652Z 91 TID-gohhnwj3f WARN: {:class=>"ProjectCacheWorker", :pid=>999, :signal=>"SIGKILL", :message=>"sending Sidekiq worker PGRP-999 SIGKILL (die)"}
    sends TSTP and TERM to the pid, but KILL to the pgroup, when running as process leader
  when MAX_RSS is not exceeded
    does nothing

OmniAuth::Strategies::Jwt
  #decoded
    when the RS256 algorithm is used
      decodes the user information
    when the RS384 algorithm is used
      decodes the user information
    when the RS512 algorithm is used
      decodes the user information
    when the ES256 algorithm is used
      decodes the user information
    when the ES384 algorithm is used
      decodes the user information
    when the ES512 algorithm is used
      decodes the user information
    when the HS256 algorithm is used
      decodes the user information
    when the HS384 algorithm is used
      decodes the user information
    when the HS512 algorithm is used
      decodes the user information
    required claims is missing
      raises error
    when valid_within is specified but iat attribute is missing in response
      raises error
    when timestamp claim is too skewed from present
      raises error

CommitsHelper
  commit_author_link
    escapes the author email
    escapes the author name
  commit_committer_link
    escapes the committer email
    escapes the committer name
  #view_on_environment_button
    returns a link tag linking to the file in the environment

Projects::ForksCountService
  behaves like a counter caching service
    #count
      caches the count
    #refresh_cache
      refreshes the cache
    #delete_cache
      removes the cache
    #uncached_count
      does not cache the count
  #count
    returns the number of forks

ProtectedTags::CreateService
  #execute
    creates a new protected tag

Gitlab::Ci::Config::Entry::Job
  .nodes
    when filtering all the entry/node names
      should contain exactly :before_script, :script, :stage, :type, :after_script, :cache, :image, :services, :only, :except, :rules, :variables, :artifacts, :environment, :coverage, and :retry
  .matching?
    when config is not a hash
      should be falsey
    when config is a regular job
      should be truthy
    when config is a bridge job
      should be falsey
    when config is a hidden job
      should be falsey
  validations
    when entry config value is correct
      #valid?
        is valid
      when job name is empty
        reports error
      when delayed job
        when start_in is specified
          should be valid
      when has needs
        should be valid
        when has dependencies
          should be valid
    when entry value is not correct
      incorrect config value type
        #errors
          reports error about a config type
      when config is empty
        #valid
          is invalid
      when unknown keys detected
        #valid
          is not valid
      when script is not provided
        returns error about missing script entry
      when extends key is not a string
        returns error about wrong value type
      when parallel value is not correct
        when it is not a numeric value
          returns error about invalid type
        when it is lower than two
          returns error about value too low
        when it is bigger than 50
          returns error about value too high
        when it is not an integer
          returns error about wrong value
        when it uses both "when:" and "rules:"
          returns an error about when: being combined with rules
      when delayed job
        when start_in is specified
          returns error about invalid type
        when start_in is empty
          returns error about invalid type
        when start_in is not formatted as a duration
          returns error about invalid type
        when start_in is longer than one day
          returns error about exceeding the limit
      when only: is used with rules:
        returns error about mixing only: with rules:
        and only: is blank
          returns error about mixing only: with rules:
        and rules: is blank
          returns error about mixing only: with rules:
      when except: is used with rules:
        returns error about mixing except: with rules:
        and except: is blank
          returns error about mixing except: with rules:
        and rules: is blank
          returns error about mixing except: with rules:
      when only: and except: are both used with rules:
        returns errors about mixing both only: and except: with rules:
        when only: and except: as both blank
          returns errors about mixing both only: and except: with rules:
        when rules: is blank
          returns errors about mixing both only: and except: with rules:
      when start_in specified without delayed specification
        returns error about invalid type
      when has dependencies
        that are not a array of strings
          returns error about invalid type
      when has needs
        that are not a array of strings
          returns error about invalid type
        when have dependencies that are not subset of needs
          returns error about invalid data
        when stage: is missing
          returns error about invalid data
      when timeout value is not correct
        when it is higher than instance wide timeout
          returns error about value too high
        when it is not a duration
          returns error about wrong value
      when timeout value is correct
        returns correct timeout
  #relevant?
    is a relevant entry
  #compose!
    when job config overrides default config
      overrides default config
    when job config does not override default config
      uses config from default entry
  when composed
    #value
      when entry is correct
        returns correct value
  #manual_action?
    when job is a manual action
      is a manual action
    when job is not a manual action
      is not a manual action
  #delayed?
    when job is a delayed
      is a delayed
    when job is not a delayed
      is not a delayed
  #ignored?
    when job is a manual action
      when it is not specified if job is allowed to fail
        is an ignored job
      when job is allowed to fail
        is an ignored job
      when job is not allowed to fail
        is not an ignored job
    when job is not a manual action
      when it is not specified if job is allowed to fail
        is not an ignored job
      when job is allowed to fail
        is an ignored job
      when job is not allowed to fail
        is not an ignored job

Gitlab::LegacyGithubImport::UserFormatter
  #gitlab_id
    returns nil when GitHub user is not a GitLab user
    when GitHub user is a GitLab user
      return GitLab user id when user associated their account with GitHub
      returns GitLab user id when user primary email matches GitHub email
      returns GitLab user id when any of user linked emails matches GitHub email

Gitlab::GithubImport::Stage::ImportPullRequestsWorker
  #import
    imports all the pull requests

Gitlab::TaskHelpers
  #checkout_or_clone_version
    checkout the version and reset to it
    with a branch version
      checkout the version and reset to it with a branch name
    target_dir doesn't exist
      clones the repo
    target_dir exists
      doesn't clone the repository
  #clone_repo
    clones the repo in the target dir
  #checkout_version
    clones the repo in the target dir
  #run_command
    runs command and return the output
    returns empty string when command doesnt exist
  #run_command!
    runs command and return the output
    returns and exception when command exit with non zero code

Gitlab::FakeApplicationSettings
  wraps OpenStruct variables properly
  defines predicate methods
  does not define a predicate method
  does not override an existing predicate method
  behaves like application settings examples
    predicate method changes when value is updated
    restricted signup domains
      behaves like string of domains
        sets single domain
        sets multiple domains with spaces
        sets multiple domains with newlines and a space
        sets multiple domains with commas
        sets multiple domains with semicolon
        sets multiple domains with mixture of everything
        removes duplicates
        does not fail with garbage values
        does not raise error with nil
    blacklisted signup domains
      sets multiple domain with file
      behaves like string of domains
        sets single domain
        sets multiple domains with spaces
        sets multiple domains with newlines and a space
        sets multiple domains with commas
        sets multiple domains with semicolon
        sets multiple domains with mixture of everything
        removes duplicates
        does not fail with garbage values
        does not raise error with nil
    outbound_local_requests_whitelist
      clears outbound_local_requests_whitelist_arrays memoization
      behaves like string of domains
        sets single domain
        sets multiple domains with spaces
        sets multiple domains with newlines and a space
        sets multiple domains with commas
        sets multiple domains with semicolon
        sets multiple domains with mixture of everything
        removes duplicates
        does not fail with garbage values
        does not raise error with nil
    outbound_local_requests_whitelist_arrays
      separates the IPs and domains
    add_to_outbound_local_requests_whitelist
      adds entry to outbound_local_requests_whitelist
      clears outbound_local_requests_whitelist_arrays memoization
      does not raise error with nil
      does not raise error with nil
    usage ping settings
      when the usage ping is disabled in gitlab.yml
        does not allow the usage ping to be configured
        when the usage ping is disabled in the DB
          returns false for usage_ping_enabled
        when the usage ping is enabled in the DB
          returns false for usage_ping_enabled
      when the usage ping is enabled in gitlab.yml
        allows the usage ping to be configured
        when the usage ping is disabled in the DB
          returns false for usage_ping_enabled
        when the usage ping is enabled in the DB
          returns true for usage_ping_enabled
    #allowed_key_types
      includes all key types by default
      excludes disabled key types
    #key_restriction_for
      returns the restriction value for recognised types
      allows types to be passed as a string
      returns forbidden for unrecognised type
    #allow_signup?
      returns true
      returns false if signup is disabled
      returns false if password authentication is disabled for the web interface
    #pick_repository_storage
      uses Array#sample to pick a random storage
    #user_default_internal_regex_enabled?
      user_default_external: false, user_default_internal_regex: nil, result: false
        should eq false
      user_default_external: false, user_default_internal_regex: "", result: false
        should eq false
      user_default_external: false, user_default_internal_regex: "^(?:(?!\\.ext@).)*$\\r?\\n?", result: false
        should eq false
      user_default_external: true, user_default_internal_regex: "", result: false
        should eq false
      user_default_external: true, user_default_internal_regex: nil, result: false
        should eq false
      user_default_external: true, user_default_internal_regex: "^(?:(?!\\.ext@).)*$\\r?\\n?", result: true
        should eq true
    #archive_builds_older_than
      when the archive_builds_in_seconds is set
        should be within 60 of 2019-10-15 07:51:18 UTC
      when the archive_builds_in_seconds is set
        should be nil
    #commit_email_hostname
      when the value is provided
        returns the provided value
      when the value is not provided
        returns the default from the class

Banzai::Filter::ExternalLinkFilter
  ignores elements without an href attribute
  ignores non-HTTP(S) links
  skips internal links
  for root links on document
    behaves like an external link with rel attribute
      adds rel="nofollow" to external links
      adds rel="noreferrer" to external links
      adds rel="noopener" to external links
  for nested links on document
    behaves like an external link with rel attribute
      adds rel="nofollow" to external links
      adds rel="noreferrer" to external links
      adds rel="noopener" to external links
  for invalid urls
    adds rel and target attributes to broken hrefs
    adds rel and target to improperly formatted mailtos
    adds rel and target to improperly formatted autolinks
  for links with a username
    with a valid username
      behaves like an external link with rel attribute
        adds rel="nofollow" to external links
        adds rel="noreferrer" to external links
        adds rel="noopener" to external links
    with an impersonated username
      behaves like an external link with rel attribute
        adds rel="nofollow" to external links
        adds rel="noreferrer" to external links
        adds rel="noopener" to external links
  for non-lowercase scheme links
    skips internal links
    skips relative links
    with http
      behaves like an external link with rel attribute
        adds rel="nofollow" to external links
        adds rel="noreferrer" to external links
        adds rel="noopener" to external links
    with https
      behaves like an external link with rel attribute
        adds rel="nofollow" to external links
        adds rel="noreferrer" to external links
        adds rel="noopener" to external links
  for protocol-relative links
    behaves like an external link with rel attribute
      adds rel="nofollow" to external links
      adds rel="noreferrer" to external links
      adds rel="noopener" to external links
  links with RTLO character
    escapes RTLO in link text
    does not mangle the link text
    behaves like an external link with rel attribute
      adds rel="nofollow" to external links
      adds rel="noreferrer" to external links
      adds rel="noopener" to external links
  for generated autolinks
    with an IDN character
      does not change the link text
      uses punycode for emails
      behaves like an external link with rel attribute
        adds rel="nofollow" to external links
        adds rel="noreferrer" to external links
        adds rel="noopener" to external links
    autolinked image
      adds a toolip with punycode
      behaves like an external link with rel attribute
        adds rel="nofollow" to external links
        adds rel="noreferrer" to external links
        adds rel="noopener" to external links
  for links that look malicious
    with an IDN character
      adds a toolip with punycode
    with RTLO character
      adds a toolip with punycode

instrument_classes
  can autoload and instrument all files

RuboCop::Cop::Gitlab::RailsLogger
  flags the use of Rails.logger.error with a constant receiver
  flags the use of Rails.logger.info with a constant receiver
  flags the use of Rails.logger.warn with a constant receiver
  does not flag the use of Rails.logger with a constant that is not Rails
  does not flag the use of logger with a send receiver

Import metrics on development seed
  imports all prometheus metrics

UserFinder
  #find_by_id
    when the user exists
      returns the user
    when the user exists (id as string)
      returns the user
    when the user does not exist
      returns nil
  #find_by_username
    when the user exists
      returns the user
    when the user does not exist
      returns nil
  #find_by_id_or_username
    when the user exists (id)
      returns the user
    when the user exists (id as string)
      returns the user
    when the user exists (username)
      returns the user
    when the user does not exist (username)
      returns nil
    when the user does not exist
      returns nil
  #find_by_id!
    when the user exists
      returns the user
    when the user exists (id as string)
      returns the user
    when the user does not exist
      raises ActiveRecord::RecordNotFound
  #find_by_username!
    when the user exists
      returns the user
    when the user does not exist
      raises ActiveRecord::RecordNotFound
  #find_by_id_or_username!
    when the user exists (id)
      returns the user
    when the user exists (id as string)
      returns the user
    when the user exists (username)
      returns the user
    when the user does not exist (username)
      raises ActiveRecord::RecordNotFound
    when the user does not exist
      raises ActiveRecord::RecordNotFound
  #find_by_ssh_key_id
    returns the user when passing the ssh key id
    returns the user when passing the ssh key id (string)
    returns nil when the id does not exist

Gitlab::HTTPConnectionAdapter
  #connection
    when local requests are not allowed
      sets up the connection
      raises error when it is a request to local address
      raises error when it is a request to localhost address
      when port different from URL scheme is used
        sets up the addr_port accordingly
    when DNS rebinding protection is disabled
      sets up the connection
    when http(s) environment variable is set
      sets up the connection
    when local requests are allowed
      sets up the connection
      sets up the connection when it is a local network
      sets up the connection when it is localhost

dashboard/projects/_blank_state_admin_welcome.html.haml
  links to new group path

Mattermost::Team
  #all
    for valid request
      returns teams
    for error message
      raises an error with message
  #create
    for a new team
      returns the new team
    for existing team
      raises an error with message
  #delete
    for an existing team
      returns team status
    for an unknown team
      raises an error with message

Gitlab::Favicon
  .main
    defaults to favicon.png
    has blue favicon for development
    has yellow favicon for canary
    uses the custom favicon if a favicon appearance is present
    asset host
      returns a relative url when the asset host is not configured
      returns a full url when the asset host is configured
  .status_overlay
    returns the overlay for the status
  .available_status_names
    returns the available status names

DeployKeys::CreateService
  creates a deploy key

Gitlab::SQL::Pattern
  .to_pattern
    when a query is shorter than 3 chars
      returns exact matching pattern
      and ignore_minimum_char_limit is true
        returns partial matching pattern
    when a query with a escape character is shorter than 3 chars
      returns sanitized exact matching pattern
      and ignore_minimum_char_limit is true
        returns sanitized partial matching pattern
    when a query is equal to 3 chars
      returns partial matching pattern
    when a query with a escape character is equal to 3 chars
      returns partial matching pattern
    when a query is longer than 3 chars
      returns partial matching pattern
    when a query with a escape character is longer than 3 chars
      returns sanitized partial matching pattern
  .select_fuzzy_words
    with a word equal to 3 chars
      returns array cotaining a word
    with a word shorter than 3 chars
      returns empty array
    with two words both equal to 3 chars
      returns array containing two words
    with two words divided by two spaces both equal to 3 chars
      returns array containing two words
    with two words equal to 3 chars and shorter than 3 chars
      returns array containing a word
    with a multi-word surrounded by double quote
      returns array containing a multi-word
    with a multi-word surrounded by double quote and two words
      returns array containing a multi-word and tow words
    with a multi-word surrounded by double quote missing a spece before the first double quote
      returns array containing two words with double quote
    with a multi-word surrounded by double quote missing a spece after the second double quote
      returns array containing two words with double quote
    with two multi-word surrounded by double quote and two words
      returns array containing two multi-words and tow words
  .fuzzy_arel_match
    with a word equal to 3 chars
      returns a single ILIKE condition
    with a word shorter than 3 chars
      returns a single equality condition
      uses LOWER instead of ILIKE when LOWER is enabled
    with two words both equal to 3 chars
      returns a joining LIKE condition using a AND
    with two words both shorter than 3 chars
      returns a single ILIKE condition
    with two words, one shorter 3 chars
      returns a single ILIKE condition using the longer word
    with a multi-word surrounded by double quote and two words
      returns a joining LIKE condition using a AND

Import metrics on production seed
  imports all prometheus metrics

Every Sidekiq worker
  does not use the default queue
  uses the cronjob queue when the worker runs as a cronjob
  has its queue in Gitlab::SidekiqConfig::QUEUE_CONFIG_PATHS
  has its queue or namespace in config/sidekiq_queues.yml

FeatureGate
  User
    #flipper_id
      when user is not persisted
        should be nil
      when user is persisted
        should eq "User:2161"

Gitlab::Ci::Config::Entry::Reports
  validates ALLOWED_KEYS
    expects junit to be an artifact file_type
    expects codequality to be an artifact file_type
    expects sast to be an artifact file_type
    expects dependency_scanning to be an artifact file_type
    expects container_scanning to be an artifact file_type
    expects dast to be an artifact file_type
    expects performance to be an artifact file_type
    expects license_management to be an artifact file_type
    expects metrics to be an artifact file_type
  validation
    when entry config value is correct
      keyword: :junit, file: "junit.xml"
        when value is an array
          behaves like a valid entry
            #value
              returns artifacts configuration
            #valid?
              is valid
        when value is not array
          behaves like a valid entry
            #value
              returns artifacts configuration
            #valid?
              is valid
      keyword: :codequality, file: "gl-code-quality-report.json"
        when value is an array
          behaves like a valid entry
            #value
              returns artifacts configuration
            #valid?
              is valid
        when value is not array
          behaves like a valid entry
            #value
              returns artifacts configuration
            #valid?
              is valid
      keyword: :sast, file: "gl-sast-report.json"
        when value is an array
          behaves like a valid entry
            #value
              returns artifacts configuration
            #valid?
              is valid
        when value is not array
          behaves like a valid entry
            #value
              returns artifacts configuration
            #valid?
              is valid
      keyword: :dependency_scanning, file: "gl-dependency-scanning-report.json"
        when value is an array
          behaves like a valid entry
            #value
              returns artifacts configuration
            #valid?
              is valid
        when value is not array
          behaves like a valid entry
            #value
              returns artifacts configuration
            #valid?
              is valid
      keyword: :container_scanning, file: "gl-container-scanning-report.json"
        when value is an array
          behaves like a valid entry
            #value
              returns artifacts configuration
            #valid?
              is valid
        when value is not array
          behaves like a valid entry
            #value
              returns artifacts configuration
            #valid?
              is valid
      keyword: :dast, file: "gl-dast-report.json"
        when value is an array
          behaves like a valid entry
            #value
              returns artifacts configuration
            #valid?
              is valid
        when value is not array
          behaves like a valid entry
            #value
              returns artifacts configuration
            #valid?
              is valid
      keyword: :license_management, file: "gl-license-management-report.json"
        when value is an array
          behaves like a valid entry
            #value
              returns artifacts configuration
            #valid?
              is valid
        when value is not array
          behaves like a valid entry
            #value
              returns artifacts configuration
            #valid?
              is valid
      keyword: :performance, file: "performance.json"
        when value is an array
          behaves like a valid entry
            #value
              returns artifacts configuration
            #valid?
              is valid
        when value is not array
          behaves like a valid entry
            #value
              returns artifacts configuration
            #valid?
              is valid
    when entry value is not correct
      #errors
        when there is an unknown key present
          reports error

MoveToProjectSerializer
  #represent
    includes the name and name with namespace

Gitlab::Redis::SharedState
  .params
    withstands mutation
    when url contains unix socket reference
      with old format
        returns path key instead
      with new format
        returns path key instead
    when url is host based
      with old format
        returns hash with host, port, db, and password
      with new format
        returns hash with host, port, db, and password
  .url
    withstands mutation
    when yml file with env variable
      reads redis url from env variable
  ._raw_config
    is frozen
    returns false when the file does not exist
    returns false when the filename can't be determined
  .with
    when running not on sidekiq workers
      instantiates a connection pool with size 5
    when running on sidekiq workers
      instantiates a connection pool with a size based on the concurrency of the worker
  #sentinels
    when sentinels are defined
      returns an array of hashes with host and port keys
    when sentinels are not defined
      returns nil
  #sentinels?
    when sentinels are defined
      returns true
    when sentinels are not defined
      returns false
  #raw_config_hash
    returns default redis url when no config file is present
    returns old-style single url config in a hash
  #fetch_config
    returns false when no config file is present
    returns false when config file is present but has invalid YAML

Gitlab::SidekiqDaemon::Monitor
  #within_job
    tracks thread
    when job is canceled
2019-10-15T08:51:25.577Z 91 TID-gohcudbg3 WARN: {:class=>"Gitlab::SidekiqDaemon::Monitor", :action=>"run", :queue=>"queue", :jid=>"2c02ba679ab69be34b595fbcfd90ae42", :canceled=>true}
      does not execute a block
2019-10-15T08:51:25.584Z 91 TID-gohcudbg3 WARN: {:class=>"Gitlab::SidekiqDaemon::Monitor", :action=>"run", :queue=>"queue", :jid=>"874b3527fe43b7c3ea8c2d1a0caaec1c", :canceled=>true}
      raises exception
  #start_working when notification channel not enabled
    return directly
  #start_working when notification channel enabled
    when structured logging is used
      logs start message
      logs stop message
      logs StandardError message
      logs and raises Exception message
    when StandardError is raised
      does retry connection
    when message is published
      and message is valid
        processes cancel
      and message is not valid json
        skips processing
  #stop
#<Thread:0x00005598627999b0@/builds/gitlab-org/gitlab/lib/gitlab/daemon.rb:37 run> terminated with exception (report_on_exception is true):
/builds/gitlab-org/gitlab/lib/gitlab/sidekiq_daemon/monitor.rb:188:in `nonzero?': Interrupt (Interrupt)
	from /builds/gitlab-org/gitlab/lib/gitlab/sidekiq_daemon/monitor.rb:188:in `notification_channel_enabled?'
	from /builds/gitlab-org/gitlab/lib/gitlab/sidekiq_daemon/monitor.rb:65:in `start_working'
	from /builds/gitlab-org/gitlab/lib/gitlab/daemon.rb:37:in `block (2 levels) in start'
    does stop the thread
  #process_job_cancel
    when jid is missing
      does not run thread
    when jid is provided
      when jid is not found
        does not log cancellation message
      when jid is found
#<Thread:0x00005598628b1b68@/builds/gitlab-org/gitlab/spec/lib/gitlab/sidekiq_daemon/monitor_spec.rb:220 run> terminated with exception (report_on_exception is true):
/builds/gitlab-org/gitlab/spec/lib/gitlab/sidekiq_daemon/monitor_spec.rb:220:in `sleep': Gitlab::SidekiqDaemon::Monitor::CancelledError (Gitlab::SidekiqDaemon::Monitor::CancelledError)
	from /builds/gitlab-org/gitlab/spec/lib/gitlab/sidekiq_daemon/monitor_spec.rb:220:in `block (6 levels) in <top (required)>'
        does log cancellation message
2019-10-15T08:51:25.669Z 91 TID-gohgacrsb WARN: {:class=>"Gitlab::SidekiqDaemon::Monitor", :action=>"cancel", :message=>"Canceling thread with CancelledError", :jid=>"my-jid", :thread_id=>47056488608820}
#<Thread:0x0000559862936868@/builds/gitlab-org/gitlab/spec/lib/gitlab/sidekiq_daemon/monitor_spec.rb:220 run> terminated with exception (report_on_exception is true):
/builds/gitlab-org/gitlab/spec/lib/gitlab/sidekiq_daemon/monitor_spec.rb:220:in `sleep': Gitlab::SidekiqDaemon::Monitor::CancelledError (Gitlab::SidekiqDaemon::Monitor::CancelledError)
	from /builds/gitlab-org/gitlab/spec/lib/gitlab/sidekiq_daemon/monitor_spec.rb:220:in `block (6 levels) in <top (required)>'
        does cancel the thread
  .cancel_job
    sets a redis key
    notifies all workers
  #notification_channel_enabled?
    return nil when SIDEKIQ_MONITOR_WORKER is not set
    return nil when SIDEKIQ_MONITOR_WORKER set to 0
    return 1 when SIDEKIQ_MONITOR_WORKER set to 1

Gitlab::UsageDataCounters::SnippetCounter
  behaves like a redis usage counter
    .count(create)
      increments the Snippet create counter by 1
    .read(create)
      returns the total number of create events
  behaves like a redis usage counter
    .count(update)
      increments the Snippet update counter by 1
    .read(update)
      returns the total number of update events
  behaves like a redis usage counter with totals
    totals
      can report all totals
    unknown events
      cannot increment
      cannot read

Shard
  .populate!
    creates shards based on the config file
  .by_name
    returns an existing shard
    creates a new shard
    retries if creation races

Gitlab::DependencyLinker::GodepsJsonLinker
  .support?
    supports Godeps.json
    does not support other files
  #link
    links the package name
    links GitHub repos
    links GitLab projects
    links Golang packages

Gitlab::Ci::Reports::TestSuiteComparer
  #new_failures
    when head sutie has a newly failed test case which does not exist in base
      returns the failed test case
    when head sutie still has a failed test case which failed in base
      does not return the failed test case
    when head sutie has a success test case which failed in base
      does not return the failed test case
  #existing_failures
    when head sutie has a newly failed test case which does not exist in base
      returns the failed test case
    when head sutie still has a failed test case which failed in base
      does not return the failed test case
    when head sutie has a success test case which failed in base
      does not return the failed test case
  #resolved_failures
    when head sutie has a newly failed test case which does not exist in base
      returns the failed test case
      returns the correct resolved count
    when head sutie still has a failed test case which failed in base
      does not return the failed test case
      returns the correct resolved count
    when head sutie has a success test case which failed in base
      does not return the resolved test case
      returns the correct resolved count
  #total_count
    returns the total test counts in head suite
  #failed_count
    when there are a new failure and an existing failure
      returns the correct count
    when there is a new failure
      returns the correct count
    when there is an existing failure
      returns the correct count
  #total_status
    when all test cases in head suite are success
      returns the total status in head suite
    when there is a failed test case in head suite
      returns the total status in head suite

LicenseTemplateFinder
  #execute
    popular: true
      only returns popular licenses
    popular: false
      only returns unpopular licenses
    popular: nil
      returns all licenses known by the Licensee gem
      correctly copies all attributes

Banzai::Filter::InlineDiffFilter
  adds inline diff span tags for deletions when using square brackets
  adds inline diff span tags for deletions when using curley braces
  does not add inline diff span tags when a closing tag is not provided
  adds inline span tags for additions when using square brackets
  adds inline span tags for additions  when using curley braces
  does not add inline diff span tags when a closing addition tag is not provided
  does not add inline diff span tags when the tags do not match
  prevents user-land html being injected
  preserves content inside pre tags
  preserves content inside code tags
  preserves content inside tt tags

Gitlab::Ci::Config::Entry::Cache
  validations
    when entry config value is correct
      #value
        returns hash value
      #valid?
        should be valid
      policy is pull-push
        should be valid
        should include {:policy => "pull-push"}
      policy is push
        should be valid
        should include {:policy => "push"}
      policy is pull
        should be valid
        should include {:policy => "pull"}
      when key is missing
        #value
          sets key with the default
    when entry value is not correct
      #errors
        when is not a hash
          reports errors with config value
        when policy is unknown
          reports error
        when descendants are invalid
          reports error with descendants
        when there is an unknown key present
          reports error with descendants

Gitlab::Email::Hook::SmimeSignatureInterceptor
  signs the email appropriately with SMIME

MergeRequest::Metrics
  associations
    should belong to merge_request required:
    should belong to latest_closed_by class_name => User required:
    should belong to merged_by class_name => User required:

Gitlab::Kubernetes
  #container_exec_url
    should eq "wss"
    should eq "example.com"
    should eq "/api/v1/namespaces/default/pods/pod1/exec"
    should eq "container=container1&stderr=true&stdin=true&stdout=true&tty=true&command=sh&command=-c&command=bash+%7C%7C+sh"
    with a HTTP API URL
      should eq "ws"
    with a path prefix in the API URL
      should eq "/prefix/api/v1/namespaces/default/pods/pod1/exec"
    with arguments that need urlencoding
      should eq "/api/v1/namespaces/default%20namespace/pods/pod%201/exec"
      should match /\Acontainer=container\+1&/
  #filter_by_label
    returns matching labels
  #filter_by_annotation
    returns matching labels
  #filter_by_project_environment
    returns matching env label
  #filter_by_legacy_label
    returns matching labels
  #to_kubeconfig
    should eq {"apiVersion"=>"v1", "clusters"=>[{"cluster"=>{"certificate-authority-data"=>"UEVN", "server"=>"https..."gitlab-deploy", "kind"=>"Config", "users"=>[{"name"=>"gitlab-deploy", "user"=>{"token"=>"TOKEN"}}]}
    when CA PEM is not provided
      should eq {"apiVersion"=>"v1", "clusters"=>[{"cluster"=>{"server"=>"https://kube.domain.com"}, "name"=>"gitlab-..."gitlab-deploy", "kind"=>"Config", "users"=>[{"name"=>"gitlab-deploy", "user"=>{"token"=>"TOKEN"}}]}
    when token is not provided
      should be nil
  #add_terminal_auth
    adds authentication parameters to a hash

TabHelper
  nav_link
    passes extra html options to the list element
    with the content of the li
      captures block output
    with controller param
      performs checks on the current controller
      with action param
        performs checks on both controller and action when both are present
      with namespace in path notation
        performs checks on both controller and namespace
        with action param
          performs checks on both namespace, controller and action when they are all present
    with action param
      performs checks on the current action
    with path param
      accepts a path shorthand
      with namespace
        accepts a path shorthand with namespace

Gitlab::SidekiqStatus
  .set
    stores the job ID
  .unset
    removes the job ID
  .all_completed?
    returns true if all jobs have been completed
    returns false if a job has not yet been completed
  .running?
    returns true if job is running
    returns false if job is not found
  .num_running
    returns 0 if all jobs have been completed
    returns 2 if two jobs are still running
  .num_completed
    returns 1 if all jobs have been completed
    returns 1 if a job has not yet been completed
  .key_for
    returns the key for a job ID
  completed
    returns the completed job
    returns only the jobs completed

Gitlab::UsageDataCounters::ProductivityAnalyticsCounter
  behaves like a redis usage counter
    .count(views)
      increments the ProductivityAnalytics views counter by 1
    .read(views)
      returns the total number of views events
  behaves like a redis usage counter with totals
    totals
      can report all totals
    unknown events
      cannot increment
      cannot read

Gitlab::UsageDataCounters::MergeRequestCounter
  behaves like a redis usage counter
    .count(create)
      increments the Merge Request create counter by 1
    .read(create)
      returns the total number of create events
  behaves like a redis usage counter with totals
    totals
      can report all totals
    unknown events
      cannot increment
      cannot read

Gitlab::Git::Changes
  #includes_branches?
    has changes for branches
      should be truthy
    has no changes for branches
      should be falsey
  #includes_tags?
    has changes for tags
      should be truthy
    has no changes for tags
      should be falsey
  #add_branch_change
    adds the branch change to the collection
    does not add the change as a tag change
  #add_tag_change
    adds the tag change to the collection
    does not add the change as a branch change

Prometheus::PidProvider
  .worker_id
    when running in Sidekiq server mode
      should eq "sidekiq"
    when running in Unicorn mode
      when unicorn master is specified in process name
        when running in Omnibus
          before the process was renamed
            should eq "unicorn_master"
          after the process was renamed
            should eq "unicorn_master"
        when in development env
          before the process was renamed
            should eq "unicorn_master"
          after the process was renamed
            should eq "unicorn_master"
      when unicorn worker id is specified in process name
        when running in Omnibus
          should eq "unicorn_1"
        when in development env
          should eq "unicorn_1"
      when no specified unicorn master or worker id in process name
        should eq "process_91"
    when running in Puma mode
      when cluster worker id is specified in process name
        should eq "puma_1"
      when no worker id is specified in process name
        should eq "puma_master"
    when running in unknown mode
      should eq "process_91"

Gitlab::Ci::Pipeline::Expression::Lexeme::String
  .build
    creates a new instance of the token
  .type
    is a value lexeme
  .scan
    when using double quotes
      correctly identifies string token
    when using single quotes
      correctly identifies string token
    when there are mixed quotes in the string
      is a greedy scanner for double quotes
      is a greedy scanner for single quotes
      allows to use single quotes inside double quotes
      allow to use double quotes inside single quotes
      allows to use an empty string inside single quotes
      allow to use an empty string inside double quotes
  #evaluate
    returns string value if it is present
    returns an empty string if it is empty

Gitlab::DependencyLinker
  .link
    links using GemfileLinker
    links using GemspecLinker
    links using PackageJsonLinker
    links using ComposerJsonLinker
    links using PodfileLinker
    links using PodspecLinker
    links using PodspecJsonLinker
    links using CartfileLinker
    links using GodepsJsonLinker
    links using RequirementsTxtLinker

Clusters::Project
  should belong to cluster required:
  should belong to project required:
  should have many kubernetes_namespaces

RuboCop::Cop::AvoidBreakFromStrongMemoize
  flags violation for break inside strong_memoize
  flags violation for break inside strong_memoize nested blocks
  doesn't flag violation for next inside strong_memoize
  doesn't flag violation for break inside blocks
  doesn't call add_offense twice for nested blocks
  doesn't check when block is empty

Gitlab::Sherlock::Collection
  #add
    adds a new transaction
    is aliased as <<
  #each
    iterates over every transaction
  #clear
    removes all transactions
  #empty?
    returns true for an empty collection
    returns false for a collection with a transaction
  #find_transaction
    returns the transaction for the given ID
    returns nil when no transaction could be found
  #newest_first
    returns transactions sorted from new to old

Gitlab::Ci::Config::Entry::Hidden
  .matching?
    when name starts with dot
      should be truthy
    when name does not start with dot
      should be falsey
  .new
    validations
      when entry config value is correct
        #value
          returns key value
        #valid?
          is valid
      when entry value is not correct
        when config is empty
          #valid
            is invalid
    #leaf?
      is a leaf
    #relevant?
      is not a relevant entry

Gitlab::Diff::SuggestionDiff
  #diff_lines
    returns diff lines with correct line numbers

ChatMessage::NoteMessage
  commit notes
    without markdown
      returns a message regarding notes on commits
    with markdown
      returns a message regarding notes on commits
  merge request notes
    without markdown
      returns a message regarding notes on a merge request
    with markdown
      returns a message regarding notes on a merge request
  issue notes
    without markdown
      returns a message regarding notes on an issue
    with markdown
      returns a message regarding notes on an issue
  project snippet notes
    without markdown
      returns a message regarding notes on a project snippet
    with markdown
      returns a message regarding notes on a project snippet

Gitlab::Ci::Build::Artifacts::Adapters::RawStream
  #initialize
    when stream is passed
      initialized
    when stream is not passed
      raises an error
  #each_blob
    when file is not empty
      iterates content
    when file is empty
      does not iterate content

RuboCop::Cop::QA::ElementWithPattern
  in a QA file
    registers an offense for elements with a pattern
    does not register an offense for element without a pattern
  outside of a migration spec file
    does not register an offense

Gitlab::Analytics::CycleAnalytics::StageEvents::StageEvent
  should respond to #name
  should respond to #identifier
  should respond to #object_type
  should respond to #timestamp_projection
  should respond to #apply_query_customization

Gitlab::Git::RawDiffChange
  bad input
    does not set most of the attrs
  adding a file
    initialize the proper attrs
  renaming a file
    initialize the proper attrs
  modifying a file
    initialize the proper attrs
  deleting a file
    initialize the proper attrs

Gitlab::GithubImport::PageCounter
  #initialize
    sets the initial page number to 1 when no value is cached
    sets the initial page number to the cached value when one is present
  #set
    overwrites the page number when the given number is greater than the current number
    does not overwrite the page number when the given number is lower than the current number

Gitlab::Ci::Status::Group::Common
  does not have action
  has details
  has no details_path

Gitlab::Analytics::CycleAnalytics::StageEvents::IssueStageEnd
  behaves like cycle analytics event
    should be a kind of String
    should be a kind of Symbol
    should include ApplicationRecord(abstract)
    should respond to #timestamp_projection
    #apply_query_customization
      expects an ActiveRecord::Relation object as argument and returns a modified version of it

Gitlab::GithubImport::BulkImporting
  #build_database_rows
    returns an Array containing the rows to insert
    does not import objects that have already been imported
  #bulk_insert
    bulk inserts rows into the database

RspecFlaky::FlakyExamplesCollection
  #initialize
    accepts no argument
    accepts a hash
    does not accept anything else
  #to_h
    calls #to_h on the values
  #-
    returns only examples that are not present in the given collection
    fails if the given collection does not respond to `#key?`

Gitlab::Ci::Config::Entry::Paths
  validations
    when entry config value is valid
      #value
        returns key value
      #valid?
        is valid
    when entry value is not valid
      #errors
        saves errors

Gitlab::Diff::InlineDiff
  .for_lines
    finds all inline diffs
    can handle unchanged empty lines
  #inline_diffs
    finds the inline diff

Gitlab::Ci::Reports::TestCase
  #initialize
    when both classname and name are given
      when test case is passed
        initializes an instance
      when test case is failed
        initializes an instance
    when classname is missing
      raises an error
    when name is missing
      raises an error

Gitlab::GithubImport::IssuableFinder
  #database_id
    returns nil when no cache is in place
    returns the ID of an issuable when the cache is in place
    raises TypeError when the object is not supported
  #cache_database_id
    caches the ID of a database row

Banzai::FilterArray
  #insert_after
    inserts an element after a provided element
    inserts an element at the end when the provided element does not exist
  #insert_before
    inserts an element before a provided element
    inserts an element at the beginning when the provided element does not exist

RuboCop::Cop::SidekiqOptionsQueue
  registers an offense when `sidekiq_options` is used with the `queue` option
  does not register an offense when `sidekiq_options` is used with another option

SessionsHelper
  #unconfirmed_email?
    returns true when the flash alert contains a devise failure unconfirmed message
    returns false when the flash alert does not contain a devise failure unconfirmed message

RequestAwareEntity
  includes URL helpers
  includes method for checking abilities
  fetches request from options

AwardEmoji
  should eq "AwardEmoji"
  should require graphql authorizations :read_emoji
  should have graphql fields :description, :unicode_version, :emoji, :name, :unicode, and :user

Group
  should expose permissions using Types::PermissionTypes::Group
  should eq "Group"
  should require graphql authorizations :read_group

TodosDestroyer::ConfidentialIssueWorker
  calls the Todos::Destroy::ConfidentialIssueService with issue_id parameter
  calls the Todos::Destroy::ConfidentialIssueService with project_id parameter

Gitlab::StringRegexMarker
  #mark
    with a single occurrence
      marks the match
    with multiple occurrences
      marks the matches

Gitlab::Metrics::Dashboard::Defaults
  should be const defined :DEFAULT_PANEL_TYPE
  should be const defined :DEFAULT_PANEL_WEIGHT

Types::Ci::PipelineType
  should eq "Pipeline"
  should expose permissions using Types::PermissionTypes::Ci::Pipeline

Bitbucket::Paginator
  items
    return items and raises StopIteration in the end

ProviderRepoSerializer
  represents ProviderRepoEntity entities

TodosDestroyer::GroupPrivateWorker
  calls the Todos::Destroy::GroupPrivateService with the params it was given

Gitlab::Git::GitmodulesParser
  parses a .gitmodules file correctly

PipelineBackgroundQueue
  sets a default object storage queue automatically
Knapsack report was generated. Preview:
{
  "spec/services/merge_requests/update_service_spec.rb": 77.94184827804565,
  "spec/services/projects/import_service_spec.rb": 58.774707555770874,
  "spec/models/concerns/resolvable_discussion_spec.rb": 30.25692343711853,
  "spec/lib/gitlab/sidekiq_daemon/memory_killer_spec.rb": 32.19275426864624,
  "spec/models/commit_spec.rb": 20.043416738510132,
  "spec/lib/gitlab/search_results_spec.rb": 18.289692163467407,
  "spec/models/namespace_spec.rb": 16.098291873931885,
  "spec/finders/notes_finder_spec.rb": 13.690574645996094,
  "spec/models/environment_status_spec.rb": 12.786731243133545,
  "spec/serializers/pipeline_entity_spec.rb": 7.6658241748809814,
  "spec/migrations/migrate_auto_dev_ops_domain_to_cluster_domain_spec.rb": 10.726818084716797,
  "spec/services/issuable/clone/content_rewriter_spec.rb": 10.592961311340332,
  "spec/presenters/ci/pipeline_presenter_spec.rb": 9.891790866851807,
  "spec/models/snippet_spec.rb": 8.102383136749268,
  "spec/finders/projects/serverless/functions_finder_spec.rb": 7.598154783248901,
  "spec/models/prometheus_metric_spec.rb": 6.841198205947876,
  "spec/lib/gitlab/data_builder/note_spec.rb": 7.086171627044678,
  "spec/lib/gitlab/data_builder/push_spec.rb": 6.445171117782593,
  "spec/services/clusters/applications/upgrade_service_spec.rb": 4.52116060256958,
  "spec/presenters/ci/build_presenter_spec.rb": 6.448850393295288,
  "spec/services/issuable/clone/attributes_rewriter_spec.rb": 3.4006738662719727,
  "spec/models/cycle_analytics/group_level_spec.rb": 5.1707916259765625,
  "spec/models/commit_collection_spec.rb": 4.449567556381226,
  "spec/views/layouts/nav/sidebar/_project.html.haml_spec.rb": 4.2165398597717285,
  "spec/workers/invalid_gpg_signature_update_worker_spec.rb": 3.939131259918213,
  "spec/finders/cluster_ancestors_finder_spec.rb": 4.174522161483765,
  "spec/services/award_emojis/destroy_service_spec.rb": 3.7469418048858643,
  "spec/models/project_services/gitlab_issue_tracker_service_spec.rb": 3.9154391288757324,
  "spec/workers/namespaceless_project_destroy_worker_spec.rb": 2.912449359893799,
  "spec/lib/gitlab/diff/highlight_spec.rb": 2.844543933868408,
  "spec/services/discussions/resolve_service_spec.rb": 3.10675311088562,
  "spec/helpers/search_helper_spec.rb": 2.582709550857544,
  "spec/lib/gitlab/markdown_cache/active_record/extension_spec.rb": 3.1782498359680176,
  "spec/lib/banzai/reference_parser/commit_range_parser_spec.rb": 3.2927207946777344,
  "spec/services/projects/open_issues_count_service_spec.rb": 2.5769307613372803,
  "spec/services/wiki_pages/update_service_spec.rb": 2.274021625518799,
  "spec/lib/gitlab/cycle_analytics/base_event_fetcher_spec.rb": 2.893266201019287,
  "spec/services/issues/import_csv_service_spec.rb": 2.4089863300323486,
  "spec/presenters/issue_presenter_spec.rb": 1.3254148960113525,
  "spec/services/projects/hashed_storage/migrate_repository_service_spec.rb": 2.408705472946167,
  "spec/workers/ci/archive_traces_cron_worker_spec.rb": 2.2962446212768555,
  "spec/graphql/features/authorization_spec.rb": 1.9741096496582031,
  "spec/models/project_import_state_spec.rb": 1.8169522285461426,
  "spec/services/lfs/locks_finder_service_spec.rb": 1.735490322113037,
  "spec/helpers/gitlab_routing_helper_spec.rb": 1.996032476425171,
  "spec/lib/gitlab/kubernetes/helm/init_command_spec.rb": 1.8242299556732178,
  "spec/lib/gitlab/exclusive_lease_spec.rb": 2.0349409580230713,
  "spec/services/members/create_service_spec.rb": 1.895646095275879,
  "spec/lib/gitlab/sanitizers/exif_spec.rb": 1.748408555984497,
  "spec/models/concerns/project_features_compatibility_spec.rb": 1.0265583992004395,
  "spec/models/label_note_spec.rb": 1.5928351879119873,
  "spec/lib/gitlab/kubernetes/default_namespace_spec.rb": 1.6287965774536133,
  "spec/helpers/award_emoji_helper_spec.rb": 1.1152317523956299,
  "spec/workers/repository_import_worker_spec.rb": 0.8946349620819092,
  "spec/views/projects/diffs/_stats.html.haml_spec.rb": 1.1188433170318604,
  "spec/initializers/secret_token_spec.rb": 2.017000436782837,
  "spec/models/project_services/issue_tracker_service_spec.rb": 1.2132830619812012,
  "spec/models/user_agent_detail_spec.rb": 0.5898599624633789,
  "spec/services/boards/list_service_spec.rb": 0.8129115104675293,
  "spec/services/wiki_pages/destroy_service_spec.rb": 1.1380693912506104,
  "spec/lib/gitlab/visibility_level_checker_spec.rb": 1.1146125793457031,
  "spec/services/merge_requests/migrate_external_diffs_service_spec.rb": 1.0659279823303223,
  "spec/models/hooks/web_hook_log_spec.rb": 0.9219198226928711,
  "spec/lib/gitlab/background_migration/add_merge_request_diff_commits_count_spec.rb": 0.9819326400756836,
  "spec/workers/concerns/gitlab/github_import/stage_methods_spec.rb": 1.1059789657592773,
  "spec/serializers/paginated_diff_entity_spec.rb": 1.3744475841522217,
  "spec/migrations/migrate_managed_clusters_with_no_token_to_unmanaged_spec.rb": 1.6455328464508057,
  "spec/lib/gitlab/ci/status/build/preparing_spec.rb": 0.9860763549804688,
  "spec/uploaders/namespace_file_uploader_spec.rb": 1.2549545764923096,
  "spec/lib/gitlab/ci/build/prerequisite/factory_spec.rb": 0.45867204666137695,
  "spec/workers/concerns/project_import_options_spec.rb": 0.7927916049957275,
  "spec/lib/gitlab/legacy_github_import/wiki_formatter_spec.rb": 0.5312566757202148,
  "spec/lib/gitlab/metrics/instrumentation_spec.rb": 0.9771943092346191,
  "spec/lib/gitlab/graphql/loaders/pipeline_for_sha_loader_spec.rb": 0.5155344009399414,
  "spec/services/prometheus/adapter_service_spec.rb": 1.177753210067749,
  "spec/models/blob_viewer/base_spec.rb": 0.6445975303649902,
  "spec/views/projects/pipeline_schedules/_pipeline_schedule.html.haml_spec.rb": 0.4640343189239502,
  "spec/lib/gitlab/cycle_analytics/production_event_fetcher_spec.rb": 0.307863712310791,
  "spec/lib/gitlab/ci/status/build/erased_spec.rb": 0.6280672550201416,
  "spec/lib/gitlab/checks/project_created_spec.rb": 0.8457474708557129,
  "spec/migrations/set_issue_id_for_all_versions_spec.rb": 0.4766066074371338,
  "spec/migrations/enqueue_reset_merge_status_spec.rb": 0.7332315444946289,
  "spec/workers/mail_scheduler/issue_due_worker_spec.rb": 1.182905673980713,
  "spec/workers/hashed_storage/migrator_worker_spec.rb": 0.5305290222167969,
  "spec/services/projects/container_repository/cleanup_tags_service_spec.rb": 0.7027640342712402,
  "spec/migrations/remove_empty_extern_uid_auth0_identities_spec.rb": 0.3868253231048584,
  "spec/workers/import_issues_csv_worker_spec.rb": 0.7073650360107422,
  "spec/models/project_services/pivotaltracker_service_spec.rb": 0.15301847457885742,
  "spec/helpers/boards_helper_spec.rb": 0.2944977283477783,
  "spec/lib/gitlab/phabricator_import/project_creator_spec.rb": 0.778599739074707,
  "spec/migrations/assure_commits_count_for_merge_request_diff_spec.rb": 0.3982410430908203,
  "spec/services/projects/container_repository/delete_tags_service_spec.rb": 0.4287707805633545,
  "spec/lib/gitlab/graphql/representation/tree_entry_spec.rb": 0.4042987823486328,
  "spec/services/protected_branches/destroy_service_spec.rb": 0.4136974811553955,
  "spec/lib/gitlab/import/database_helpers_spec.rb": 0.45586729049682617,
  "spec/lib/gitlab/ci/pipeline/chain/skip_spec.rb": 0.2491145133972168,
  "spec/validators/public_url_validator_spec.rb": 0.4600341320037842,
  "spec/rubocop/cop/graphql/authorize_types_spec.rb": 0.08158040046691895,
  "spec/lib/gitlab/ci/status/pipeline/blocked_spec.rb": 0.3463938236236572,
  "spec/lib/gitlab/graphql/representation/submodule_tree_entry_spec.rb": 0.19532537460327148,
  "spec/lib/gitlab/sidekiq_middleware/memory_killer_spec.rb": 0.016881465911865234,
  "spec/lib/omni_auth/strategies/jwt_spec.rb": 0.33389782905578613,
  "spec/helpers/commits_helper_spec.rb": 0.24155139923095703,
  "spec/services/projects/forks_count_service_spec.rb": 0.5500636100769043,
  "spec/services/protected_tags/create_service_spec.rb": 0.2358534336090088,
  "spec/lib/gitlab/ci/config/entry/job_spec.rb": 0.27992701530456543,
  "spec/lib/gitlab/legacy_github_import/user_formatter_spec.rb": 0.2707226276397705,
  "spec/workers/gitlab/github_import/stage/import_pull_requests_worker_spec.rb": 0.22690248489379883,
  "spec/tasks/gitlab/task_helpers_spec.rb": 0.14667201042175293,
  "spec/lib/gitlab/fake_application_settings_spec.rb": 0.13277268409729004,
  "spec/lib/banzai/filter/external_link_filter_spec.rb": 0.4002103805541992,
  "spec/initializers/zz_metrics_spec.rb": 0.15259742736816406,
  "spec/rubocop/cop/gitlab/rails_logger_spec.rb": 0.01888728141784668,
  "spec/db/development/import_common_metrics_spec.rb": 0.11392974853515625,
  "spec/finders/user_finder_spec.rb": 0.10589766502380371,
  "spec/lib/gitlab/http_connection_adapter_spec.rb": 0.15259671211242676,
  "spec/views/dashboard/projects/_blank_state_admin_welcome.haml_spec.rb": 0.09879422187805176,
  "spec/lib/mattermost/team_spec.rb": 0.11541438102722168,
  "spec/lib/gitlab/favicon_spec.rb": 0.11640310287475586,
  "spec/services/deploy_keys/create_service_spec.rb": 0.09103965759277344,
  "spec/lib/gitlab/sql/pattern_spec.rb": 0.04291057586669922,
  "spec/db/production/import_common_metrics_spec.rb": 0.0979623794555664,
  "spec/workers/every_sidekiq_worker_spec.rb": 0.06880712509155273,
  "spec/models/concerns/feature_gate_spec.rb": 0.06291437149047852,
  "spec/lib/gitlab/ci/config/entry/reports_spec.rb": 0.09242081642150879,
  "spec/serializers/move_to_project_serializer_spec.rb": 0.06205630302429199,
  "spec/lib/gitlab/redis/shared_state_spec.rb": 0.09433984756469727,
  "spec/lib/gitlab/sidekiq_daemon/monitor_spec.rb": 0.07279706001281738,
  "spec/lib/gitlab/usage_data_counters/snippet_counter_spec.rb": 0.05124831199645996,
  "spec/models/shard_spec.rb": 0.05440783500671387,
  "spec/lib/gitlab/dependency_linker/godeps_json_linker_spec.rb": 0.0526280403137207,
  "spec/lib/gitlab/ci/reports/test_suite_comparer_spec.rb": 0.035367488861083984,
  "spec/finders/license_template_finder_spec.rb": 0.041759490966796875,
  "spec/lib/banzai/filter/inline_diff_filter_spec.rb": 0.026629924774169922,
  "spec/lib/gitlab/ci/config/entry/cache_spec.rb": 0.03148484230041504,
  "spec/lib/gitlab/email/hook/smime_signature_interceptor_spec.rb": 0.038471221923828125,
  "spec/models/merge_request/metrics_spec.rb": 0.03846406936645508,
  "spec/lib/gitlab/kubernetes_spec.rb": 0.041229963302612305,
  "spec/helpers/tab_helper_spec.rb": 0.026092529296875,
  "spec/lib/gitlab/sidekiq_status_spec.rb": 0.03319430351257324,
  "spec/lib/gitlab/usage_data_counters/productivity_analytics_counter_spec.rb": 0.034058332443237305,
  "spec/lib/gitlab/usage_data_counters/merge_request_counter_spec.rb": 0.02884387969970703,
  "spec/lib/gitlab/git/changes_spec.rb": 0.015614032745361328,
  "spec/lib/prometheus/pid_provider_spec.rb": 0.2753169536590576,
  "spec/lib/gitlab/ci/pipeline/expression/lexeme/string_spec.rb": 0.042572021484375,
  "spec/lib/gitlab/dependency_linker_spec.rb": 0.026407241821289062,
  "spec/models/clusters/project_spec.rb": 0.02653336524963379,
  "spec/rubocop/cop/avoid_break_from_strong_memoize_spec.rb": 0.026099205017089844,
  "spec/lib/gitlab/sherlock/collection_spec.rb": 0.023197174072265625,
  "spec/lib/gitlab/ci/config/entry/hidden_spec.rb": 0.019429683685302734,
  "spec/lib/gitlab/diff/suggestion_diff_spec.rb": 0.02916717529296875,
  "spec/models/project_services/chat_message/note_message_spec.rb": 0.01892685890197754,
  "spec/lib/gitlab/ci/build/artifacts/adapters/raw_stream_spec.rb": 0.009765148162841797,
  "spec/rubocop/cop/qa/element_with_pattern_spec.rb": 0.016432523727416992,
  "spec/lib/gitlab/analytics/cycle_analytics/stage_events/stage_event_spec.rb": 0.010199785232543945,
  "spec/lib/gitlab/git/raw_diff_change_spec.rb": 0.011304378509521484,
  "spec/lib/gitlab/github_import/page_counter_spec.rb": 0.012576580047607422,
  "spec/lib/gitlab/ci/status/group/common_spec.rb": 0.009536981582641602,
  "spec/lib/gitlab/analytics/cycle_analytics/stage_events/issue_stage_end_spec.rb": 0.011367321014404297,
  "spec/lib/gitlab/github_import/bulk_importing_spec.rb": 0.00961756706237793,
  "spec/lib/rspec_flaky/flaky_examples_collection_spec.rb": 0.013273239135742188,
  "spec/lib/gitlab/ci/config/entry/paths_spec.rb": 0.008036613464355469,
  "spec/lib/gitlab/diff/inline_diff_spec.rb": 0.0072290897369384766,
  "spec/lib/gitlab/ci/reports/test_case_spec.rb": 0.009013175964355469,
  "spec/lib/gitlab/github_import/issuable_finder_spec.rb": 0.009921550750732422,
  "spec/lib/banzai/filter_array_spec.rb": 0.007055997848510742,
  "spec/rubocop/cop/sidekiq_options_queue_spec.rb": 0.006752729415893555,
  "spec/helpers/sessions_helper_spec.rb": 0.0056688785552978516,
  "spec/serializers/request_aware_entity_spec.rb": 0.00682520866394043,
  "spec/graphql/types/award_emojis/award_emoji_type_spec.rb": 0.0067365169525146484,
  "spec/graphql/types/group_type_spec.rb": 0.0063169002532958984,
  "spec/workers/todos_destroyer/confidential_issue_worker_spec.rb": 0.004883527755737305,
  "spec/lib/gitlab/string_regex_marker_spec.rb": 0.004384040832519531,
  "spec/lib/gitlab/metrics/dashboard/defaults_spec.rb": 0.004073619842529297,
  "spec/graphql/types/ci/pipeline_type_spec.rb": 0.004352569580078125,
  "spec/lib/bitbucket/paginator_spec.rb": 0.0030257701873779297,
  "spec/serializers/provider_repo_serializer_spec.rb": 0.0021924972534179688,
  "spec/workers/todos_destroyer/group_private_worker_spec.rb": 0.0035834312438964844,
  "spec/lib/gitlab/git/gitmodules_parser_spec.rb": 0.006211757659912109,
  "spec/workers/concerns/pipeline_background_queue_spec.rb": 0.0033838748931884766
}

Knapsack global time execution for tests: 08m 14s

Pending: (Failures listed here are expected and do not affect your suite's status)

  1) NamespaceFileUploader behaves like builds correct paths #cache_dir behaves like matches the method pattern 
     # No pattern provided, skipping.
     # ./spec/support/shared_examples/uploaders/gitlab_uploader_shared_examples.rb:8

  2) NamespaceFileUploader behaves like builds correct paths #work_dir behaves like matches the method pattern 
     # No pattern provided, skipping.
     # ./spec/support/shared_examples/uploaders/gitlab_uploader_shared_examples.rb:8

  3) NamespaceFileUploader behaves like builds correct paths #relative_path is relative
     # Path not set, skipping.
     # ./spec/support/shared_examples/uploaders/gitlab_uploader_shared_examples.rb:39

  4) NamespaceFileUploader behaves like builds correct paths .base_dir behaves like matches the method pattern 
     # No pattern provided, skipping.
     # ./spec/support/shared_examples/uploaders/gitlab_uploader_shared_examples.rb:8

  5) NamespaceFileUploader object_store is REMOTE behaves like builds correct paths #cache_dir behaves like matches the method pattern 
     # No pattern provided, skipping.
     # ./spec/support/shared_examples/uploaders/gitlab_uploader_shared_examples.rb:8

  6) NamespaceFileUploader object_store is REMOTE behaves like builds correct paths #work_dir behaves like matches the method pattern 
     # No pattern provided, skipping.
     # ./spec/support/shared_examples/uploaders/gitlab_uploader_shared_examples.rb:8

  7) NamespaceFileUploader object_store is REMOTE behaves like builds correct paths #relative_path is relative
     # Path not set, skipping.
     # ./spec/support/shared_examples/uploaders/gitlab_uploader_shared_examples.rb:39

  8) NamespaceFileUploader object_store is REMOTE behaves like builds correct paths .absolute_path behaves like matches the method pattern 
     # No pattern provided, skipping.
     # ./spec/support/shared_examples/uploaders/gitlab_uploader_shared_examples.rb:8

  9) NamespaceFileUploader object_store is REMOTE behaves like builds correct paths .base_dir behaves like matches the method pattern 
     # No pattern provided, skipping.
     # ./spec/support/shared_examples/uploaders/gitlab_uploader_shared_examples.rb:8

Finished in 10 minutes 49 seconds (files took 31.26 seconds to load)
2021 examples, 0 failures, 9 pending

Tue Oct 15 08:51:45 UTC 2019
section_end:1571129506:build_script
section_start:1571129506:after_script
Running after script...
$ date
Tue Oct 15 08:51:49 UTC 2019
section_end:1571129511:after_script
section_start:1571129511:archive_cache
Not uploading cache debian-stretch-ruby-2.6.3-node-12.x-2 due to policy
section_end:1571129516:archive_cache
section_start:1571129516:upload_artifacts_on_success
Uploading artifacts...
coverage/: found 5 matching files                  
knapsack/: found 6 matching files                  
rspec_flaky/: found 4 matching files               
rspec_profiling/: found 1 matching files           
WARNING: tmp/capybara/: no matching files          
tmp/memory_test/: found 2 matching files           
Uploading artifacts to coordinator... ok            id=321109334 responseStatus=201 Created token=cCHirG4d
Uploading artifacts...
junit_rspec.xml: found 1 matching files            
Uploading artifacts to coordinator... ok            id=321109334 responseStatus=201 Created token=cCHirG4d
section_end:1571129524:upload_artifacts_on_success
Job succeeded