From 0d6fa033121a9bef708b8f2de186c4034c61d4a3 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Thu, 6 Feb 2020 18:08:54 +0000 Subject: Add latest changes from gitlab-org/gitlab@master --- .gitlab/ci/qa.gitlab-ci.yml | 57 ++++- .rubocop.yml | 14 +- app/assets/javascripts/main.js | 4 + app/controllers/user_callouts_controller.rb | 5 +- app/graphql/types/permission_types/project.rb | 3 +- app/helpers/markup_helper.rb | 2 +- app/helpers/user_callouts_helper.rb | 9 +- app/models/ci/bridge.rb | 122 ++++++++++- app/models/concerns/prometheus_adapter.rb | 7 + app/models/environment.rb | 9 + app/models/project.rb | 1 + app/models/prometheus_alert.rb | 81 ++++++++ app/models/user.rb | 7 + app/models/user_callout.rb | 3 + app/views/clusters/clusters/_cluster.html.haml | 2 + app/views/layouts/_page.html.haml | 1 + .../shared/_check_recovery_settings.html.haml | 6 + .../unreleased/3142-add-cluster-loading-icon.yml | 5 + ...vl-remove-project-object-from-error-logging.yml | 5 + ...-remove-username-lookup-from-members-mapper.yml | 6 + ...0205143231_add_dissmised_at_to_user_callouts.rb | 9 + db/schema.rb | 3 +- .../geo/replication/troubleshooting.md | 2 +- doc/api/graphql/reference/gitlab_schema.graphql | 5 + doc/api/graphql/reference/gitlab_schema.json | 18 ++ doc/api/graphql/reference/index.md | 1 + doc/user/project/settings/import_export.md | 2 +- lib/gitlab/git/repository.rb | 10 +- lib/gitlab/gitaly_client/ref_service.rb | 34 --- lib/gitlab/import_export/members_mapper.rb | 2 +- lib/gitlab/runtime.rb | 22 +- locale/gitlab.pot | 6 + .../admin/applications_controller_spec.rb | 2 +- .../admin/clusters/applications_controller_spec.rb | 16 +- spec/controllers/admin/clusters_controller_spec.rb | 4 +- .../admin/gitaly_servers_controller_spec.rb | 2 +- spec/controllers/admin/hooks_controller_spec.rb | 2 +- .../admin/impersonations_controller_spec.rb | 6 +- spec/controllers/admin/projects_controller_spec.rb | 4 +- .../admin/requests_profiles_controller_spec.rb | 4 +- spec/controllers/admin/runners_controller_spec.rb | 18 +- spec/controllers/admin/services_controller_spec.rb | 6 +- spec/controllers/admin/sessions_controller_spec.rb | 2 +- .../controllers/admin/spam_logs_controller_spec.rb | 8 +- spec/controllers/admin/users_controller_spec.rb | 6 +- spec/controllers/boards/issues_controller_spec.rb | 36 ++-- spec/controllers/boards/lists_controller_spec.rb | 40 ++-- ...troller_with_cross_project_access_check_spec.rb | 18 +- .../concerns/enforces_admin_authentication_spec.rb | 8 +- .../concerns/project_unauthorized_spec.rb | 6 +- spec/controllers/concerns/routable_actions_spec.rb | 14 +- .../static_object_external_storage_spec.rb | 6 +- .../dashboard/groups_controller_spec.rb | 4 +- .../dashboard/milestones_controller_spec.rb | 6 +- .../dashboard/projects_controller_spec.rb | 2 +- .../controllers/dashboard/todos_controller_spec.rb | 14 +- .../google_api/authorizations_controller_spec.rb | 2 +- .../import/bitbucket_controller_spec.rb | 6 +- .../import/bitbucket_server_controller_spec.rb | 18 +- spec/controllers/import/github_controller_spec.rb | 4 +- spec/controllers/import/gitlab_controller_spec.rb | 6 +- .../import/gitlab_projects_controller_spec.rb | 6 +- .../import/phabricator_controller_spec.rb | 6 +- .../oauth/applications_controller_spec.rb | 8 +- .../oauth/authorizations_controller_spec.rb | 8 +- .../profiles/accounts_controller_spec.rb | 6 +- spec/controllers/snippets/notes_controller_spec.rb | 30 +-- spec/controllers/user_callouts_controller_spec.rb | 4 +- spec/factories/prometheus_alert.rb | 17 ++ .../user_creates_branch_and_merge_request_spec.rb | 2 +- .../merge_request/user_posts_diff_notes_spec.rb | 2 +- .../merge_request/user_resolves_conflicts_spec.rb | 4 +- spec/features/projects/graph_spec.rb | 2 +- .../lib/gitlab/import_export/complex/project.json | 4 +- .../import_export/group_exports/complex/group.json | 4 +- .../graphql/types/permission_types/project_spec.rb | 3 +- spec/helpers/markup_helper_spec.rb | 2 +- spec/lib/gitlab/git/repository_spec.rb | 99 +++------ .../import_export/group_tree_restorer_spec.rb | 8 +- .../import_export/project_tree_restorer_spec.rb | 4 +- spec/lib/gitlab/runtime_spec.rb | 128 +++--------- ...90924152703_migrate_issue_trackers_data_spec.rb | 16 +- ..._reschedule_migrate_issue_trackers_data_spec.rb | 2 +- ...oup_to_match_visibility_level_of_parent_spec.rb | 2 +- spec/models/ci/bridge_spec.rb | 231 ++++++++++++++++++++- spec/models/prometheus_alert_spec.rb | 103 +++++++++ spec/models/push_event_spec.rb | 4 +- spec/models/user_callout_spec.rb | 33 +++ spec/models/user_spec.rb | 34 +++ .../project_import_rate_limiter_shared_examples.rb | 2 +- spec/support/helpers/api_helpers.rb | 2 +- spec/support/helpers/rack_attack_spec_helpers.rb | 2 +- spec/tasks/gitlab/seed/group_seed_rake_spec.rb | 2 +- 93 files changed, 1068 insertions(+), 445 deletions(-) create mode 100644 app/models/prometheus_alert.rb create mode 100644 app/views/shared/_check_recovery_settings.html.haml create mode 100644 changelogs/unreleased/3142-add-cluster-loading-icon.yml create mode 100644 changelogs/unreleased/bvl-remove-project-object-from-error-logging.yml create mode 100644 changelogs/unreleased/georgekoltsov-remove-username-lookup-from-members-mapper.yml create mode 100644 db/migrate/20200205143231_add_dissmised_at_to_user_callouts.rb create mode 100644 spec/factories/prometheus_alert.rb create mode 100644 spec/models/prometheus_alert_spec.rb diff --git a/.gitlab/ci/qa.gitlab-ci.yml b/.gitlab/ci/qa.gitlab-ci.yml index 862d1249360..deb966fdbaf 100644 --- a/.gitlab/ci/qa.gitlab-ci.yml +++ b/.gitlab/ci/qa.gitlab-ci.yml @@ -6,6 +6,14 @@ .if-canonical-gitlab-merge-request: &if-canonical-gitlab-merge-request if: '$CI_SERVER_HOST == "gitlab.com" && $CI_PROJECT_NAMESPACE == "gitlab-org" && $CI_MERGE_REQUEST_IID' +# Make sure to update all the similar conditions in other CI config files if you modify these conditions +.if-not-ee: &if-not-ee + if: '$CI_PROJECT_NAME !~ /^gitlab(-ee)?$/' + +# Make sure to update all the similar conditions in other CI config files if you modify these conditions +.if-default-refs: &if-default-refs + if: '$CI_COMMIT_REF_NAME == "master" || $CI_COMMIT_REF_NAME =~ /^[\d-]+-stable(-ee)?$/ || $CI_COMMIT_REF_NAME =~ /^\d+-\d+-auto-deploy-\d+$/ || $CI_COMMIT_REF_NAME =~ /^security\// || $CI_MERGE_REQUEST_IID || $CI_COMMIT_TAG' + # Make sure to update all the similar patterns in other CI config files if you modify these patterns .code-patterns: &code-patterns - ".gitlab/ci/**/*" @@ -27,12 +35,43 @@ - ".dockerignore" - "qa/**/*" +# Make sure to update all the similar patterns in other CI config files if you modify these patterns +.code-qa-patterns: &code-qa-patterns + - ".gitlab/ci/**/*" + - ".{eslintignore,gitattributes,nvmrc,prettierrc,stylelintrc,yamllint}" + - ".{codeclimate,eslintrc,gitlab-ci,haml-lint,haml-lint_todo,rubocop,rubocop_todo,scss-lint}.yml" + - ".csscomb.json" + - "Dockerfile.assets" + - "*_VERSION" + - "Gemfile{,.lock}" + - "Rakefile" + - "{babel.config,jest.config}.js" + - "config.ru" + - "{package.json,yarn.lock}" + - "{,ee/}{app,bin,config,db,haml_lint,lib,locale,public,scripts,symbol,vendor}/**/*" + - "doc/api/graphql/reference/*" # Files in this folder are auto-generated + # QA changes + - ".dockerignore" + - "qa/**/*" + +.qa:rules:ee-and-foss: + rules: + - <<: *if-default-refs + changes: *code-qa-patterns + when: on_success + +.qa:rules:ee-only: + rules: + - <<: *if-not-ee + when: never + - <<: *if-default-refs + changes: *code-qa-patterns + when: on_success + .qa-job-base: extends: - .default-tags - .default-retry - - .default-only - - .only:changes-code-qa stage: test dependencies: [] cache: @@ -46,26 +85,32 @@ - bundle check qa:internal: - extends: .qa-job-base + extends: + - .qa-job-base + - .qa:rules:ee-and-foss script: - bundle exec rspec qa:internal-foss: extends: - .qa-job-base - - .only-ee-as-if-foss + - .qa:rules:ee-only + - .as-if-foss script: - bundle exec rspec qa:selectors: - extends: .qa-job-base + extends: + - .qa-job-base + - .qa:rules:ee-and-foss script: - bundle exec bin/qa Test::Sanity::Selectors qa:selectors-foss: extends: - qa:selectors - - .only-ee-as-if-foss + - .qa:rules:ee-only + - .as-if-foss .package-and-qa-base: image: ruby:2.6-alpine diff --git a/.rubocop.yml b/.rubocop.yml index e4d16d53193..d2cca0295ee 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -334,17 +334,15 @@ RSpec/UnspecifiedException: # Work in progress. See https://gitlab.com/gitlab-org/gitlab/issues/196163 RSpec/HaveGitlabHttpStatus: Enabled: true + Exclude: + - 'spec/support/matchers/have_gitlab_http_status.rb' Include: - - 'spec/support/shared_examples/**/*' - - 'ee/spec/support/shared_examples/**/*' + - 'spec/support/**/*' + - 'ee/spec/support/**/*' - 'spec/features/**/*' - 'ee/spec/features/**/*' - - 'spec/controllers/*.rb' - - 'ee/spec/controllers/*.rb' - - 'spec/controllers/projects/**/*.rb' - - 'ee/spec/controllers/projects/**/*.rb' - - 'spec/controllers/groups/**/*.rb' - - 'ee/spec/controllers/groups/**/*.rb' + - 'spec/controllers/**/*' + - 'ee/spec/controllers/**/*' - 'spec/requests/*.rb' - 'ee/spec/requests/*.rb' diff --git a/app/assets/javascripts/main.js b/app/assets/javascripts/main.js index 1e07469bd7a..8fb973b1c1f 100644 --- a/app/assets/javascripts/main.js +++ b/app/assets/javascripts/main.js @@ -36,6 +36,7 @@ import initSearchAutocomplete from './search_autocomplete'; import GlFieldErrors from './gl_field_errors'; import initUserPopovers from './user_popovers'; import initBroadcastNotifications from './broadcast_notification'; +import PersistentUserCallout from './persistent_user_callout'; import { initUserTracking } from './tracking'; import { __ } from './locale'; @@ -108,6 +109,9 @@ function deferredInitialisation() { initUserTracking(); initBroadcastNotifications(); + const recoverySettingsCallout = document.querySelector('.js-recovery-settings-callout'); + PersistentUserCallout.factory(recoverySettingsCallout); + if (document.querySelector('.search')) initSearchAutocomplete(); addSelectOnFocusBehaviour('.js-select-on-focus'); diff --git a/app/controllers/user_callouts_controller.rb b/app/controllers/user_callouts_controller.rb index ebf1dd8ca02..4ee75218db1 100644 --- a/app/controllers/user_callouts_controller.rb +++ b/app/controllers/user_callouts_controller.rb @@ -2,7 +2,10 @@ class UserCalloutsController < ApplicationController def create - if ensure_callout.persisted? + callout = ensure_callout + + if callout.persisted? + callout.update(dismissed_at: Time.now) respond_to do |format| format.json { head :ok } end diff --git a/app/graphql/types/permission_types/project.rb b/app/graphql/types/permission_types/project.rb index 094c72fa812..f773fce0c63 100644 --- a/app/graphql/types/permission_types/project.rb +++ b/app/graphql/types/permission_types/project.rb @@ -16,7 +16,8 @@ module Types :create_deployment, :push_to_delete_protected_branch, :admin_wiki, :admin_project, :update_pages, :admin_remote_mirror, :create_label, :update_wiki, :destroy_wiki, - :create_pages, :destroy_pages, :read_pages_content, :admin_operations + :create_pages, :destroy_pages, :read_pages_content, :admin_operations, + :read_merge_request permission_field :create_snippet diff --git a/app/helpers/markup_helper.rb b/app/helpers/markup_helper.rb index e42ea3861b8..a0228c6bd94 100644 --- a/app/helpers/markup_helper.rb +++ b/app/helpers/markup_helper.rb @@ -153,7 +153,7 @@ module MarkupHelper other_markup_unsafe(file_name, text, context) end rescue StandardError => e - Gitlab::ErrorTracking.track_exception(e, project_id: @project&.id, file_name: file_name, context: context) + Gitlab::ErrorTracking.track_exception(e, project_id: @project&.id, file_name: file_name) simple_format(text) end diff --git a/app/helpers/user_callouts_helper.rb b/app/helpers/user_callouts_helper.rb index b3eee25674b..ab691916706 100644 --- a/app/helpers/user_callouts_helper.rb +++ b/app/helpers/user_callouts_helper.rb @@ -22,6 +22,9 @@ module UserCalloutsHelper def render_dashboard_gold_trial(user) end + def render_account_recovery_regular_check + end + def show_suggest_popover? !user_dismissed?(SUGGEST_POPOVER_DISMISSED) end @@ -32,8 +35,10 @@ module UserCalloutsHelper private - def user_dismissed?(feature_name) - current_user&.callouts&.find_by(feature_name: UserCallout.feature_names[feature_name]) + def user_dismissed?(feature_name, ignore_dismissal_earlier_than = nil) + return false unless current_user + + current_user.dismissed_callout?(feature_name: feature_name, ignore_dismissal_earlier_than: ignore_dismissal_earlier_than) end end diff --git a/app/models/ci/bridge.rb b/app/models/ci/bridge.rb index e6d41dd2779..abd59741e89 100644 --- a/app/models/ci/bridge.rb +++ b/app/models/ci/bridge.rb @@ -4,19 +4,78 @@ module Ci class Bridge < Ci::Processable include Ci::Contextable include Ci::PipelineDelegator + include Ci::Metadatable include Importable include AfterCommitQueue include HasRef include Gitlab::Utils::StrongMemoize + InvalidBridgeTypeError = Class.new(StandardError) + belongs_to :project belongs_to :trigger_request + has_many :sourced_pipelines, class_name: "::Ci::Sources::Pipeline", + foreign_key: :source_job_id + validates :ref, presence: true + # rubocop:disable Cop/ActiveRecordSerialize + serialize :options + serialize :yaml_variables, ::Gitlab::Serializer::Ci::Variables + # rubocop:enable Cop/ActiveRecordSerialize + + state_machine :status do + event :manual do + transition all => :manual + end + + event :scheduled do + transition all => :scheduled + end + end + def self.retry(bridge, current_user) raise NotImplementedError end + def inherit_status_from_downstream!(pipeline) + case pipeline.status + when 'success' + self.success! + when 'failed', 'canceled', 'skipped' + self.drop! + else + false + end + end + + def downstream_pipeline_params + return child_params if triggers_child_pipeline? + return cross_project_params if downstream_project.present? + + {} + end + + def downstream_project + strong_memoize(:downstream_project) do + if downstream_project_path + ::Project.find_by_full_path(downstream_project_path) + elsif triggers_child_pipeline? + project + end + end + end + + def downstream_project_path + strong_memoize(:downstream_project_path) do + options&.dig(:trigger, :project) + end + end + + def triggers_child_pipeline? + yaml_for_downstream.present? + end + def tags [:bridge] end @@ -55,7 +114,68 @@ module Ci end def yaml_for_downstream - nil + strong_memoize(:yaml_for_downstream) do + includes = options&.dig(:trigger, :include) + YAML.dump('include' => includes) if includes + end + end + + def target_ref + branch = options&.dig(:trigger, :branch) + return unless branch + + scoped_variables.to_runner_variables.yield_self do |all_variables| + ::ExpandVariables.expand(branch, all_variables) + end + end + + def dependent? + strong_memoize(:dependent) do + options&.dig(:trigger, :strategy) == 'depend' + end + end + + def downstream_variables + variables = scoped_variables.concat(pipeline.persisted_variables) + + variables.to_runner_variables.yield_self do |all_variables| + yaml_variables.to_a.map do |hash| + { key: hash[:key], value: ::ExpandVariables.expand(hash[:value], all_variables) } + end + end + end + + private + + def cross_project_params + { + project: downstream_project, + source: :pipeline, + target_revision: { + ref: target_ref || downstream_project.default_branch + }, + execute_params: { ignore_skip_ci: true } + } + end + + def child_params + parent_pipeline = pipeline + + { + project: project, + source: :parent_pipeline, + target_revision: { + ref: parent_pipeline.ref, + checkout_sha: parent_pipeline.sha, + before: parent_pipeline.before_sha, + source_sha: parent_pipeline.source_sha, + target_sha: parent_pipeline.target_sha + }, + execute_params: { + ignore_skip_ci: true, + bridge: self + } + } end end end diff --git a/app/models/concerns/prometheus_adapter.rb b/app/models/concerns/prometheus_adapter.rb index 3deb7edba58..2c171eecbd5 100644 --- a/app/models/concerns/prometheus_adapter.rb +++ b/app/models/concerns/prometheus_adapter.rb @@ -58,5 +58,12 @@ module PrometheusAdapter def build_query_args(*args) args.map { |arg| arg.respond_to?(:id) ? arg.id : arg } end + + def clear_prometheus_reactive_cache!(query_name, *args) + query_class = query_klass_for(query_name) + query_args = build_query_args(*args) + + clear_reactive_cache!(query_class.name, *query_args) + end end end diff --git a/app/models/environment.rb b/app/models/environment.rb index 2d480345b5a..b29543ded32 100644 --- a/app/models/environment.rb +++ b/app/models/environment.rb @@ -11,6 +11,7 @@ class Environment < ApplicationRecord has_many :deployments, -> { visible }, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent has_many :successful_deployments, -> { success }, class_name: 'Deployment' + has_many :prometheus_alerts, inverse_of: :environment has_one :last_deployment, -> { success.order('deployments.id DESC') }, class_name: 'Deployment' has_one :last_deployable, through: :last_deployment, source: 'deployable', source_type: 'CommitStatus' @@ -105,6 +106,14 @@ class Environment < ApplicationRecord find_or_create_by(name: name) end + def clear_prometheus_reactive_cache!(query_name) + cluster_prometheus_adapter&.clear_prometheus_reactive_cache!(query_name, self) + end + + def cluster_prometheus_adapter + @cluster_prometheus_adapter ||= ::Gitlab::Prometheus::Adapter.new(project, deployment_platform&.cluster).cluster_prometheus_adapter + end + def predefined_variables Gitlab::Ci::Variables::Collection.new .append(key: 'CI_ENVIRONMENT_NAME', value: name) diff --git a/app/models/project.rb b/app/models/project.rb index 667618ae1bd..78c3114ce9c 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -244,6 +244,7 @@ class Project < ApplicationRecord has_many :management_clusters, class_name: 'Clusters::Cluster', foreign_key: :management_project_id, inverse_of: :management_project has_many :prometheus_metrics + has_many :prometheus_alerts, inverse_of: :project # Container repositories need to remove data from the container registry, # which is not managed by the DB. Hence we're still using dependent: :destroy diff --git a/app/models/prometheus_alert.rb b/app/models/prometheus_alert.rb new file mode 100644 index 00000000000..1014231102f --- /dev/null +++ b/app/models/prometheus_alert.rb @@ -0,0 +1,81 @@ +# frozen_string_literal: true + +class PrometheusAlert < ApplicationRecord + include Sortable + + OPERATORS_MAP = { + lt: "<", + eq: "==", + gt: ">" + }.freeze + + belongs_to :environment, validate: true, inverse_of: :prometheus_alerts + belongs_to :project, validate: true, inverse_of: :prometheus_alerts + belongs_to :prometheus_metric, validate: true, inverse_of: :prometheus_alerts + + has_many :prometheus_alert_events, inverse_of: :prometheus_alert + has_many :related_issues, through: :prometheus_alert_events + + after_save :clear_prometheus_adapter_cache! + after_destroy :clear_prometheus_adapter_cache! + + validates :environment, :project, :prometheus_metric, presence: true + validate :require_valid_environment_project! + validate :require_valid_metric_project! + + enum operator: { lt: 0, eq: 1, gt: 2 } + + delegate :title, :query, to: :prometheus_metric + + scope :for_metric, -> (metric) { where(prometheus_metric: metric) } + scope :for_project, -> (project) { where(project_id: project) } + scope :for_environment, -> (environment) { where(environment_id: environment) } + + def self.distinct_projects + sub_query = self.group(:project_id).select(1) + self.from(sub_query) + end + + def self.operator_to_enum(op) + OPERATORS_MAP.invert.fetch(op) + end + + def full_query + "#{query} #{computed_operator} #{threshold}" + end + + def computed_operator + OPERATORS_MAP.fetch(operator.to_sym) + end + + def to_param + { + "alert" => title, + "expr" => full_query, + "for" => "5m", + "labels" => { + "gitlab" => "hook", + "gitlab_alert_id" => prometheus_metric_id + } + } + end + + private + + def clear_prometheus_adapter_cache! + environment.clear_prometheus_reactive_cache!(:additional_metrics_environment) + end + + def require_valid_environment_project! + return if project == environment&.project + + errors.add(:environment, "invalid project") + end + + def require_valid_metric_project! + return if prometheus_metric&.common? + return if project == prometheus_metric&.project + + errors.add(:prometheus_metric, "invalid project") + end +end diff --git a/app/models/user.rb b/app/models/user.rb index 3512e663f4a..aa7e825d516 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1644,6 +1644,13 @@ class User < ApplicationRecord end # End of signup_flow experiment methods + def dismissed_callout?(feature_name:, ignore_dismissal_earlier_than: nil) + callouts = self.callouts.with_feature_name(feature_name) + callouts = callouts.with_dismissed_after(ignore_dismissal_earlier_than) if ignore_dismissal_earlier_than + + callouts.any? + end + # @deprecated alias_method :owned_or_masters_groups, :owned_or_maintainers_groups diff --git a/app/models/user_callout.rb b/app/models/user_callout.rb index 027ee44c6a9..82f82356cb4 100644 --- a/app/models/user_callout.rb +++ b/app/models/user_callout.rb @@ -12,4 +12,7 @@ class UserCallout < ApplicationRecord presence: true, uniqueness: { scope: :user_id }, inclusion: { in: UserCallout.feature_names.keys } + + scope :with_feature_name, -> (feature_name) { where(feature_name: UserCallout.feature_names[feature_name]) } + scope :with_dismissed_after, -> (dismissed_after) { where('dismissed_at > ?', dismissed_after) } end diff --git a/app/views/clusters/clusters/_cluster.html.haml b/app/views/clusters/clusters/_cluster.html.haml index 04afc38a056..9b6c0c20080 100644 --- a/app/views/clusters/clusters/_cluster.html.haml +++ b/app/views/clusters/clusters/_cluster.html.haml @@ -4,6 +4,8 @@ .table-mobile-header{ role: "rowheader" }= s_("ClusterIntegration|Kubernetes cluster") .table-mobile-content = cluster.item_link(clusterable, html_options: { data: { qa_selector: 'cluster', qa_cluster_name: cluster.name } }) + - if cluster.status_name == :creating + .spinner.ml-2.align-middle.has-tooltip{ title: s_("ClusterIntegration|Cluster being created") } - unless cluster.enabled? %span.badge.badge-danger Connection disabled .table-section.section-25 diff --git a/app/views/layouts/_page.html.haml b/app/views/layouts/_page.html.haml index 443a73f5cce..2b2ffd6abeb 100644 --- a/app/views/layouts/_page.html.haml +++ b/app/views/layouts/_page.html.haml @@ -11,6 +11,7 @@ = render "layouts/nav/classification_level_banner" = yield :flash_message = render "shared/ping_consent" + = render_account_recovery_regular_check - unless @hide_breadcrumbs = render "layouts/nav/breadcrumbs" .d-flex diff --git a/app/views/shared/_check_recovery_settings.html.haml b/app/views/shared/_check_recovery_settings.html.haml new file mode 100644 index 00000000000..e3de34a5ab9 --- /dev/null +++ b/app/views/shared/_check_recovery_settings.html.haml @@ -0,0 +1,6 @@ +.gl-alert.gl-alert-warning.js-recovery-settings-callout{ role: 'alert', data: { feature_id: "account_recovery_regular_check", dismiss_endpoint: user_callouts_path, defer_links: "true" } } + %button.js-close.gl-alert-dismiss.gl-cursor-pointer{ type: 'button', 'aria-label' => _('Dismiss') } + = sprite_icon('close', size: 16, css_class: 'gl-icon') + .gl-alert-body + - account_link_start = ''.html_safe % { url: profile_account_path } + = _("Please ensure your account's %{account_link_start}recovery settings%{account_link_end} are up to date.").html_safe % { account_link_start: account_link_start, account_link_end: ''.html_safe } diff --git a/changelogs/unreleased/3142-add-cluster-loading-icon.yml b/changelogs/unreleased/3142-add-cluster-loading-icon.yml new file mode 100644 index 00000000000..de1ca383dba --- /dev/null +++ b/changelogs/unreleased/3142-add-cluster-loading-icon.yml @@ -0,0 +1,5 @@ +--- +title: Add loading icon to clusters being created +merge_request: 24370 +author: +type: added diff --git a/changelogs/unreleased/bvl-remove-project-object-from-error-logging.yml b/changelogs/unreleased/bvl-remove-project-object-from-error-logging.yml new file mode 100644 index 00000000000..0d2a940c22e --- /dev/null +++ b/changelogs/unreleased/bvl-remove-project-object-from-error-logging.yml @@ -0,0 +1,5 @@ +--- +title: Don't leak entire objects into the error log when rendering markup fails +merge_request: 24599 +author: +type: fixed diff --git a/changelogs/unreleased/georgekoltsov-remove-username-lookup-from-members-mapper.yml b/changelogs/unreleased/georgekoltsov-remove-username-lookup-from-members-mapper.yml new file mode 100644 index 00000000000..de5d278dd70 --- /dev/null +++ b/changelogs/unreleased/georgekoltsov-remove-username-lookup-from-members-mapper.yml @@ -0,0 +1,6 @@ +--- +title: Remove username lookup when mapping users when importing projects using Project + Import/Export and rely on email only +merge_request: 24464 +author: +type: changed diff --git a/db/migrate/20200205143231_add_dissmised_at_to_user_callouts.rb b/db/migrate/20200205143231_add_dissmised_at_to_user_callouts.rb new file mode 100644 index 00000000000..f9942d442b5 --- /dev/null +++ b/db/migrate/20200205143231_add_dissmised_at_to_user_callouts.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class AddDissmisedAtToUserCallouts < ActiveRecord::Migration[5.2] + DOWNTIME = false + + def change + add_column :user_callouts, :dismissed_at, :datetime_with_timezone + end +end diff --git a/db/schema.rb b/db/schema.rb index 1050b265acb..79c00c10a2d 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2020_02_04_131054) do +ActiveRecord::Schema.define(version: 2020_02_05_143231) do # These are extensions that must be enabled in order to support this database enable_extension "pg_trgm" @@ -4101,6 +4101,7 @@ ActiveRecord::Schema.define(version: 2020_02_04_131054) do create_table "user_callouts", id: :serial, force: :cascade do |t| t.integer "feature_name", null: false t.integer "user_id", null: false + t.datetime_with_timezone "dismissed_at" t.index ["user_id", "feature_name"], name: "index_user_callouts_on_user_id_and_feature_name", unique: true t.index ["user_id"], name: "index_user_callouts_on_user_id" end diff --git a/doc/administration/geo/replication/troubleshooting.md b/doc/administration/geo/replication/troubleshooting.md index 1a4c37dc709..0e13508a3cd 100644 --- a/doc/administration/geo/replication/troubleshooting.md +++ b/doc/administration/geo/replication/troubleshooting.md @@ -727,7 +727,7 @@ For example: Geo database has an outdated FDW remote schema. It contains 229 of 236 expected tables. Please refer to Geo Troubleshooting. ``` -To resolve this, run the following command: +To resolve this, run the following command on the **secondary**: ```shell sudo gitlab-rake geo:db:refresh_foreign_tables diff --git a/doc/api/graphql/reference/gitlab_schema.graphql b/doc/api/graphql/reference/gitlab_schema.graphql index e04bb0fc13e..125009adc35 100644 --- a/doc/api/graphql/reference/gitlab_schema.graphql +++ b/doc/api/graphql/reference/gitlab_schema.graphql @@ -5831,6 +5831,11 @@ type ProjectPermissions { """ readDesign: Boolean! + """ + Indicates the user can perform `read_merge_request` on this resource + """ + readMergeRequest: Boolean! + """ Indicates the user can perform `read_pages_content` on this resource """ diff --git a/doc/api/graphql/reference/gitlab_schema.json b/doc/api/graphql/reference/gitlab_schema.json index 92e421eb53c..17a3d8eb2e2 100644 --- a/doc/api/graphql/reference/gitlab_schema.json +++ b/doc/api/graphql/reference/gitlab_schema.json @@ -2253,6 +2253,24 @@ "isDeprecated": false, "deprecationReason": null }, + { + "name": "readMergeRequest", + "description": "Indicates the user can perform `read_merge_request` on this resource", + "args": [ + + ], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, { "name": "readPagesContent", "description": "Indicates the user can perform `read_pages_content` on this resource", diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md index 00c610b9eb7..beffd29d884 100644 --- a/doc/api/graphql/reference/index.md +++ b/doc/api/graphql/reference/index.md @@ -867,6 +867,7 @@ Information about pagination in a connection. | `readCommitStatus` | Boolean! | Indicates the user can perform `read_commit_status` on this resource | | `readCycleAnalytics` | Boolean! | Indicates the user can perform `read_cycle_analytics` on this resource | | `readDesign` | Boolean! | Indicates the user can perform `read_design` on this resource | +| `readMergeRequest` | Boolean! | Indicates the user can perform `read_merge_request` on this resource | | `readPagesContent` | Boolean! | Indicates the user can perform `read_pages_content` on this resource | | `readProject` | Boolean! | Indicates the user can perform `read_project` on this resource | | `readProjectMember` | Boolean! | Indicates the user can perform `read_project_member` on this resource | diff --git a/doc/user/project/settings/import_export.md b/doc/user/project/settings/import_export.md index c4a4f4f14ee..249e1cd25e5 100644 --- a/doc/user/project/settings/import_export.md +++ b/doc/user/project/settings/import_export.md @@ -26,7 +26,7 @@ Note the following: and are deleted every 24 hours by a specific worker. - Group members are exported as project members, as long as the user has maintainer or admin access to the group where the exported project lives. An admin - in the import side is required to map the users, based on email or username. + in the import side is required to map the users, based on email. Otherwise, a supplementary comment is left to mention the original author and the MRs, notes, or issues will be owned by the importer. - Project members with owner access will be imported as maintainers. diff --git a/lib/gitlab/git/repository.rb b/lib/gitlab/git/repository.rb index 807cfb5f93f..840a70e3ae5 100644 --- a/lib/gitlab/git/repository.rb +++ b/lib/gitlab/git/repository.rb @@ -636,10 +636,9 @@ module Gitlab end # Delete the specified branch from the repository + # Note: No Git hooks are executed for this action def delete_branch(branch_name) - wrapped_gitaly_errors do - gitaly_ref_client.delete_branch(branch_name) - end + write_ref(branch_name, Gitlab::Git::BLANK_SHA) rescue CommandError => e raise DeleteBranchError, e end @@ -651,14 +650,13 @@ module Gitlab end # Create a new branch named **ref+ based on **stat_point+, HEAD by default + # Note: No Git hooks are executed for this action # # Examples: # create_branch("feature") # create_branch("other-feature", "master") def create_branch(ref, start_point = "HEAD") - wrapped_gitaly_errors do - gitaly_ref_client.create_branch(ref, start_point) - end + write_ref(ref, start_point) end # If `mirror_refmap` is present the remote is set as mirror with that mapping diff --git a/lib/gitlab/gitaly_client/ref_service.rb b/lib/gitlab/gitaly_client/ref_service.rb index d1f848fae26..63def4e29c9 100644 --- a/lib/gitlab/gitaly_client/ref_service.rb +++ b/lib/gitlab/gitaly_client/ref_service.rb @@ -151,40 +151,6 @@ module Gitlab Gitlab::Git::Branch.new(@repository, encode!(branch.name.dup), branch.target_commit.id, target_commit) end - def create_branch(ref, start_point) - request = Gitaly::CreateBranchRequest.new( - repository: @gitaly_repo, - name: encode_binary(ref), - start_point: encode_binary(start_point) - ) - - response = GitalyClient.call(@repository.storage, :ref_service, :create_branch, request, timeout: GitalyClient.medium_timeout) - - case response.status - when :OK - branch = response.branch - target_commit = Gitlab::Git::Commit.decorate(@repository, branch.target_commit) - Gitlab::Git::Branch.new(@repository, branch.name, branch.target_commit.id, target_commit) - when :ERR_INVALID - invalid_ref!("Invalid ref name") - when :ERR_EXISTS - invalid_ref!("Branch #{ref} already exists") - when :ERR_INVALID_START_POINT - invalid_ref!("Invalid reference #{start_point}") - else - raise "Unknown response status: #{response.status}" - end - end - - def delete_branch(branch_name) - request = Gitaly::DeleteBranchRequest.new( - repository: @gitaly_repo, - name: encode_binary(branch_name) - ) - - GitalyClient.call(@repository.storage, :ref_service, :delete_branch, request, timeout: GitalyClient.medium_timeout) - end - def delete_refs(refs: [], except_with_prefixes: []) request = Gitaly::DeleteRefsRequest.new( repository: @gitaly_repo, diff --git a/lib/gitlab/import_export/members_mapper.rb b/lib/gitlab/import_export/members_mapper.rb index 68d484d5087..2a70344374b 100644 --- a/lib/gitlab/import_export/members_mapper.rb +++ b/lib/gitlab/import_export/members_mapper.rb @@ -82,7 +82,7 @@ module Gitlab end def find_user_query(member) - user_arel[:email].eq(member['user']['email']).or(user_arel[:username].eq(member['user']['username'])) + user_arel[:email].eq(member['user']['email']) end def user_arel diff --git a/lib/gitlab/runtime.rb b/lib/gitlab/runtime.rb index 64ab020a30e..182c13980e6 100644 --- a/lib/gitlab/runtime.rb +++ b/lib/gitlab/runtime.rb @@ -8,15 +8,19 @@ module Gitlab AmbiguousProcessError = Class.new(IdentificationError) UnknownProcessError = Class.new(IdentificationError) + AVAILABLE_RUNTIMES = [ + :console, + :geo_log_cursor, + :puma, + :rake, + :sidekiq, + :test_suite, + :unicorn + ].freeze + class << self def identify - matches = [] - matches << :puma if puma? - matches << :unicorn if unicorn? - matches << :console if console? - matches << :sidekiq if sidekiq? - matches << :rake if rake? - matches << :test_suite if test_suite? + matches = AVAILABLE_RUNTIMES.select { |runtime| public_send("#{runtime}?") } # rubocop:disable GitlabSecurity/PublicSend if matches.one? matches.first @@ -56,6 +60,10 @@ module Gitlab !!defined?(::Rails::Console) end + def geo_log_cursor? + !!defined?(::GeoLogCursorOptionParser) + end + def web_server? puma? || unicorn? end diff --git a/locale/gitlab.pot b/locale/gitlab.pot index a24ea136053..a4127c54a6d 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -3974,6 +3974,9 @@ msgstr "" msgid "ClusterIntegration|Cloud Run" msgstr "" +msgid "ClusterIntegration|Cluster being created" +msgstr "" + msgid "ClusterIntegration|Cluster health" msgstr "" @@ -13858,6 +13861,9 @@ msgstr "" msgid "Please enable and migrate to hashed storage to avoid security issues and ensure data integrity. %{migrate_link}" msgstr "" +msgid "Please ensure your account's %{account_link_start}recovery settings%{account_link_end} are up to date." +msgstr "" + msgid "Please enter a non-negative number" msgstr "" diff --git a/spec/controllers/admin/applications_controller_spec.rb b/spec/controllers/admin/applications_controller_spec.rb index 63b28b2d993..163a2033b58 100644 --- a/spec/controllers/admin/applications_controller_spec.rb +++ b/spec/controllers/admin/applications_controller_spec.rb @@ -16,7 +16,7 @@ describe Admin::ApplicationsController do it 'renders the application form' do get :index - expect(response).to have_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end end diff --git a/spec/controllers/admin/clusters/applications_controller_spec.rb b/spec/controllers/admin/clusters/applications_controller_spec.rb index 9d6edcd80c0..44693505c4f 100644 --- a/spec/controllers/admin/clusters/applications_controller_spec.rb +++ b/spec/controllers/admin/clusters/applications_controller_spec.rb @@ -36,7 +36,7 @@ describe Admin::Clusters::ApplicationsController do expect(ClusterInstallAppWorker).to receive(:perform_async).with(application, anything).once expect { subject }.to change { current_application.count } - expect(response).to have_http_status(:no_content) + expect(response).to have_gitlab_http_status(:no_content) expect(cluster.application_helm).to be_scheduled end @@ -47,7 +47,7 @@ describe Admin::Clusters::ApplicationsController do it 'return 404' do expect { subject }.not_to change { current_application.count } - expect(response).to have_http_status(:not_found) + expect(response).to have_gitlab_http_status(:not_found) end end @@ -55,7 +55,7 @@ describe Admin::Clusters::ApplicationsController do let(:application) { 'unkwnown-app' } it 'return 404' do - is_expected.to have_http_status(:not_found) + is_expected.to have_gitlab_http_status(:not_found) end end @@ -65,7 +65,7 @@ describe Admin::Clusters::ApplicationsController do end it 'returns 400' do - is_expected.to have_http_status(:bad_request) + is_expected.to have_gitlab_http_status(:bad_request) end end end @@ -99,7 +99,7 @@ describe Admin::Clusters::ApplicationsController do it "schedules an application update" do expect(ClusterPatchAppWorker).to receive(:perform_async).with(application.name, anything).once - is_expected.to have_http_status(:no_content) + is_expected.to have_gitlab_http_status(:no_content) expect(cluster.application_cert_manager).to be_scheduled end @@ -110,13 +110,13 @@ describe Admin::Clusters::ApplicationsController do cluster.destroy! end - it { is_expected.to have_http_status(:not_found) } + it { is_expected.to have_gitlab_http_status(:not_found) } end context 'when application is unknown' do let(:application_name) { 'unkwnown-app' } - it { is_expected.to have_http_status(:not_found) } + it { is_expected.to have_gitlab_http_status(:not_found) } end context 'when application is already scheduled' do @@ -124,7 +124,7 @@ describe Admin::Clusters::ApplicationsController do application.make_scheduled! end - it { is_expected.to have_http_status(:bad_request) } + it { is_expected.to have_gitlab_http_status(:bad_request) } end end diff --git a/spec/controllers/admin/clusters_controller_spec.rb b/spec/controllers/admin/clusters_controller_spec.rb index f27519496df..1f5c33d8022 100644 --- a/spec/controllers/admin/clusters_controller_spec.rb +++ b/spec/controllers/admin/clusters_controller_spec.rb @@ -567,7 +567,7 @@ describe Admin::ClustersController do put_update(format: :json) cluster.reload - expect(response).to have_http_status(:no_content) + expect(response).to have_gitlab_http_status(:no_content) expect(cluster.enabled).to be_falsey expect(cluster.name).to eq('my-new-cluster-name') expect(cluster).not_to be_managed @@ -587,7 +587,7 @@ describe Admin::ClustersController do it 'rejects changes' do put_update(format: :json) - expect(response).to have_http_status(:bad_request) + expect(response).to have_gitlab_http_status(:bad_request) end end end diff --git a/spec/controllers/admin/gitaly_servers_controller_spec.rb b/spec/controllers/admin/gitaly_servers_controller_spec.rb index c75418a9ad4..db94ea06f59 100644 --- a/spec/controllers/admin/gitaly_servers_controller_spec.rb +++ b/spec/controllers/admin/gitaly_servers_controller_spec.rb @@ -11,7 +11,7 @@ describe Admin::GitalyServersController do it 'shows the gitaly servers page' do get :index - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end end end diff --git a/spec/controllers/admin/hooks_controller_spec.rb b/spec/controllers/admin/hooks_controller_spec.rb index 3c3a16ef9d5..9973ef93cd9 100644 --- a/spec/controllers/admin/hooks_controller_spec.rb +++ b/spec/controllers/admin/hooks_controller_spec.rb @@ -24,7 +24,7 @@ describe Admin::HooksController do post :create, params: { hook: hook_params } - expect(response).to have_gitlab_http_status(302) + expect(response).to have_gitlab_http_status(:found) expect(SystemHook.all.size).to eq(1) expect(SystemHook.first).to have_attributes(hook_params) end diff --git a/spec/controllers/admin/impersonations_controller_spec.rb b/spec/controllers/admin/impersonations_controller_spec.rb index b44797b23e5..fa3923bca8c 100644 --- a/spec/controllers/admin/impersonations_controller_spec.rb +++ b/spec/controllers/admin/impersonations_controller_spec.rb @@ -24,7 +24,7 @@ describe Admin::ImpersonationsController do it "responds with status 404" do delete :destroy - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end it "doesn't sign us in" do @@ -48,7 +48,7 @@ describe Admin::ImpersonationsController do it "responds with status 404" do delete :destroy - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end it "doesn't sign us in as the impersonator" do @@ -67,7 +67,7 @@ describe Admin::ImpersonationsController do it "responds with status 404" do delete :destroy - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end it "doesn't sign us in as the impersonator" do diff --git a/spec/controllers/admin/projects_controller_spec.rb b/spec/controllers/admin/projects_controller_spec.rb index 6b996798b74..2d783dab621 100644 --- a/spec/controllers/admin/projects_controller_spec.rb +++ b/spec/controllers/admin/projects_controller_spec.rb @@ -29,7 +29,7 @@ describe Admin::ProjectsController do get :index - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response.body).not_to match(pending_delete_project.name) expect(response.body).to match(project.name) end @@ -61,7 +61,7 @@ describe Admin::ProjectsController do it 'renders show page' do get :show, params: { namespace_id: project.namespace.path, id: project.path } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response.body).to match(project.name) end end diff --git a/spec/controllers/admin/requests_profiles_controller_spec.rb b/spec/controllers/admin/requests_profiles_controller_spec.rb index 853767199bc..13123c8e486 100644 --- a/spec/controllers/admin/requests_profiles_controller_spec.rb +++ b/spec/controllers/admin/requests_profiles_controller_spec.rb @@ -36,7 +36,7 @@ describe Admin::RequestsProfilesController do it 'renders the data' do subject - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response.body).to eq(sample_data) end end @@ -54,7 +54,7 @@ describe Admin::RequestsProfilesController do it 'renders the data' do subject - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response.body).to eq(sample_data) end end diff --git a/spec/controllers/admin/runners_controller_spec.rb b/spec/controllers/admin/runners_controller_spec.rb index a1d346d088d..7582006df36 100644 --- a/spec/controllers/admin/runners_controller_spec.rb +++ b/spec/controllers/admin/runners_controller_spec.rb @@ -15,7 +15,7 @@ describe Admin::RunnersController do it 'lists all runners' do get :index - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end it 'avoids N+1 queries', :request_store do @@ -29,7 +29,7 @@ describe Admin::RunnersController do # We also need to add 1 because it takes 2 queries to preload tags expect { get :index }.not_to exceed_query_limit(control_count + 6) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response.body).to have_content('tag1') expect(response.body).to have_content('tag2') end @@ -49,13 +49,13 @@ describe Admin::RunnersController do it 'shows a particular runner' do get :show, params: { id: runner.id } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end it 'shows 404 for unknown runner' do get :show, params: { id: 0 } - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end it 'avoids N+1 queries', :request_store do @@ -70,7 +70,7 @@ describe Admin::RunnersController do # needs_new_sso_session permission expect { get :show, params: { id: runner.id } }.not_to exceed_query_limit(control_count + 1) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end end @@ -84,7 +84,7 @@ describe Admin::RunnersController do runner.reload - expect(response).to have_gitlab_http_status(302) + expect(response).to have_gitlab_http_status(:found) expect(runner.description).to eq(new_desc) end end @@ -93,7 +93,7 @@ describe Admin::RunnersController do it 'destroys the runner' do delete :destroy, params: { id: runner.id } - expect(response).to have_gitlab_http_status(302) + expect(response).to have_gitlab_http_status(:found) expect(Ci::Runner.find_by(id: runner.id)).to be_nil end end @@ -108,7 +108,7 @@ describe Admin::RunnersController do runner.reload - expect(response).to have_gitlab_http_status(302) + expect(response).to have_gitlab_http_status(:found) expect(runner.active).to eq(true) end end @@ -123,7 +123,7 @@ describe Admin::RunnersController do runner.reload - expect(response).to have_gitlab_http_status(302) + expect(response).to have_gitlab_http_status(:found) expect(runner.active).to eq(false) end end diff --git a/spec/controllers/admin/services_controller_spec.rb b/spec/controllers/admin/services_controller_spec.rb index 1c518dab11e..44233776865 100644 --- a/spec/controllers/admin/services_controller_spec.rb +++ b/spec/controllers/admin/services_controller_spec.rb @@ -22,7 +22,7 @@ describe Admin::ServicesController do it 'successfully displays the template' do get :edit, params: { id: service.id } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end end end @@ -48,7 +48,7 @@ describe Admin::ServicesController do put :update, params: { id: service.id, service: { active: true } } - expect(response).to have_gitlab_http_status(302) + expect(response).to have_gitlab_http_status(:found) end it 'does not call the propagation worker when service is not active' do @@ -56,7 +56,7 @@ describe Admin::ServicesController do put :update, params: { id: service.id, service: { properties: {} } } - expect(response).to have_gitlab_http_status(302) + expect(response).to have_gitlab_http_status(:found) end end end diff --git a/spec/controllers/admin/sessions_controller_spec.rb b/spec/controllers/admin/sessions_controller_spec.rb index be996aee1d2..4bab6b51102 100644 --- a/spec/controllers/admin/sessions_controller_spec.rb +++ b/spec/controllers/admin/sessions_controller_spec.rb @@ -124,7 +124,7 @@ describe Admin::SessionsController, :do_not_mock_admin_mode do it 'shows error page' do post :destroy - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) expect(controller.current_user_mode.admin_mode?).to be(false) end end diff --git a/spec/controllers/admin/spam_logs_controller_spec.rb b/spec/controllers/admin/spam_logs_controller_spec.rb index 15fb57d5add..6716bb8b399 100644 --- a/spec/controllers/admin/spam_logs_controller_spec.rb +++ b/spec/controllers/admin/spam_logs_controller_spec.rb @@ -16,7 +16,7 @@ describe Admin::SpamLogsController do it 'lists all spam logs' do get :index - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end end @@ -24,14 +24,14 @@ describe Admin::SpamLogsController do it 'removes only the spam log when removing log' do expect { delete :destroy, params: { id: first_spam.id } }.to change { SpamLog.count }.by(-1) expect(User.find(user.id)).to be_truthy - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end it 'removes user and his spam logs when removing the user', :sidekiq_might_not_need_inline do delete :destroy, params: { id: first_spam.id, remove_user: true } expect(flash[:notice]).to eq "User #{user.username} was successfully removed." - expect(response).to have_gitlab_http_status(302) + expect(response).to have_gitlab_http_status(:found) expect(SpamLog.count).to eq(0) expect { User.find(user.id) }.to raise_error(ActiveRecord::RecordNotFound) end @@ -46,7 +46,7 @@ describe Admin::SpamLogsController do it 'submits the log as ham' do post :mark_as_ham, params: { id: first_spam.id } - expect(response).to have_gitlab_http_status(302) + expect(response).to have_gitlab_http_status(:found) expect(SpamLog.find(first_spam.id).submitted_as_ham).to be_truthy end end diff --git a/spec/controllers/admin/users_controller_spec.rb b/spec/controllers/admin/users_controller_spec.rb index ebdfbe14dec..2661f8c1519 100644 --- a/spec/controllers/admin/users_controller_spec.rb +++ b/spec/controllers/admin/users_controller_spec.rb @@ -47,7 +47,7 @@ describe Admin::UsersController do it 'deletes user and ghosts their contributions' do delete :destroy, params: { id: user.username }, format: :json - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(User.exists?(user.id)).to be_falsy expect(issue.reload.author).to be_ghost end @@ -55,7 +55,7 @@ describe Admin::UsersController do it 'deletes the user and their contributions when hard delete is specified' do delete :destroy, params: { id: user.username, hard_delete: true }, format: :json - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(User.exists?(user.id)).to be_falsy expect(Issue.exists?(issue.id)).to be_falsy end @@ -399,7 +399,7 @@ describe Admin::UsersController do it "shows error page" do post :impersonate, params: { id: user.username } - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end end diff --git a/spec/controllers/boards/issues_controller_spec.rb b/spec/controllers/boards/issues_controller_spec.rb index d54f7ad33cf..605fff60c31 100644 --- a/spec/controllers/boards/issues_controller_spec.rb +++ b/spec/controllers/boards/issues_controller_spec.rb @@ -28,7 +28,7 @@ describe Boards::IssuesController do it 'returns a not found 404 response' do list_issues user: user, board: 999, list: list2 - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end @@ -106,7 +106,7 @@ describe Boards::IssuesController do it 'returns a not found 404 response' do list_issues user: user, board: board, list: 999 - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end end @@ -132,7 +132,7 @@ describe Boards::IssuesController do it 'returns a forbidden 403 response' do list_issues user: unauth_user, board: board, list: list2 - expect(response).to have_gitlab_http_status(403) + expect(response).to have_gitlab_http_status(:forbidden) end end @@ -148,7 +148,7 @@ describe Boards::IssuesController do list_issues(user: user, board: group_board) - expect(response).to have_gitlab_http_status(403) + expect(response).to have_gitlab_http_status(:forbidden) end it 'is successful for project boards' do @@ -156,7 +156,7 @@ describe Boards::IssuesController do list_issues(user: user, board: project_board) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end end @@ -215,7 +215,7 @@ describe Boards::IssuesController do expect(response).to have_gitlab_http_status(expected_status) list_issues user: requesting_user, board: board, list: list2 - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response).to match_response_schema('entities/issue_boards') @@ -391,7 +391,7 @@ describe Boards::IssuesController do it 'returns a successful 200 response' do create_issue user: user, board: board, list: list1, title: 'New issue' - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end it 'returns the created issue' do @@ -406,7 +406,7 @@ describe Boards::IssuesController do it 'returns an unprocessable entity 422 response' do create_issue user: user, board: board, list: list1, title: nil - expect(response).to have_gitlab_http_status(422) + expect(response).to have_gitlab_http_status(:unprocessable_entity) end end @@ -416,7 +416,7 @@ describe Boards::IssuesController do create_issue user: user, board: board, list: list, title: 'New issue' - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end @@ -424,7 +424,7 @@ describe Boards::IssuesController do it 'returns a not found 404 response' do create_issue user: user, board: 999, list: list1, title: 'New issue' - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end @@ -432,7 +432,7 @@ describe Boards::IssuesController do it 'returns a not found 404 response' do create_issue user: user, board: board, list: 999, title: 'New issue' - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end end @@ -443,7 +443,7 @@ describe Boards::IssuesController do open_list = board.lists.create(list_type: :backlog) create_issue user: guest, board: board, list: open_list, title: 'New issue' - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end end @@ -451,7 +451,7 @@ describe Boards::IssuesController do it 'returns a forbidden 403 response' do create_issue user: guest, board: board, list: list1, title: 'New issue' - expect(response).to have_gitlab_http_status(403) + expect(response).to have_gitlab_http_status(:forbidden) end end end @@ -475,7 +475,7 @@ describe Boards::IssuesController do it 'returns a successful 200 response' do move user: user, board: board, issue: issue, from_list_id: list1.id, to_list_id: list2.id - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end it 'moves issue to the desired list' do @@ -489,19 +489,19 @@ describe Boards::IssuesController do it 'returns a unprocessable entity 422 response for invalid lists' do move user: user, board: board, issue: issue, from_list_id: nil, to_list_id: nil - expect(response).to have_gitlab_http_status(422) + expect(response).to have_gitlab_http_status(:unprocessable_entity) end it 'returns a not found 404 response for invalid board id' do move user: user, board: 999, issue: issue, from_list_id: list1.id, to_list_id: list2.id - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end it 'returns a not found 404 response for invalid issue id' do move user: user, board: board, issue: double(id: 999), from_list_id: list1.id, to_list_id: list2.id - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end @@ -515,7 +515,7 @@ describe Boards::IssuesController do it 'returns a forbidden 403 response' do move user: guest, board: board, issue: issue, from_list_id: list1.id, to_list_id: list2.id - expect(response).to have_gitlab_http_status(403) + expect(response).to have_gitlab_http_status(:forbidden) end end diff --git a/spec/controllers/boards/lists_controller_spec.rb b/spec/controllers/boards/lists_controller_spec.rb index bc46d02556b..3886388bcf4 100644 --- a/spec/controllers/boards/lists_controller_spec.rb +++ b/spec/controllers/boards/lists_controller_spec.rb @@ -21,7 +21,7 @@ describe Boards::ListsController do it 'returns a successful 200 response' do read_board_list user: user, board: board - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response.content_type).to eq 'application/json' end @@ -50,7 +50,7 @@ describe Boards::ListsController do it 'returns a forbidden 403 response' do read_board_list user: unauth_user, board: board - expect(response).to have_gitlab_http_status(403) + expect(response).to have_gitlab_http_status(:forbidden) end end @@ -73,7 +73,7 @@ describe Boards::ListsController do it 'returns a successful 200 response' do create_board_list user: user, board: board, label_id: label.id - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end it 'returns the created list' do @@ -88,7 +88,7 @@ describe Boards::ListsController do it 'returns a not found 404 response' do create_board_list user: user, board: board, label_id: nil - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end @@ -98,7 +98,7 @@ describe Boards::ListsController do create_board_list user: user, board: board, label_id: label.id - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end end @@ -109,7 +109,7 @@ describe Boards::ListsController do create_board_list user: guest, board: board, label_id: label.id - expect(response).to have_gitlab_http_status(403) + expect(response).to have_gitlab_http_status(:forbidden) end end @@ -134,7 +134,7 @@ describe Boards::ListsController do it 'returns a successful 200 response' do move user: user, board: board, list: planning, position: 1 - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end it 'moves the list to the desired position' do @@ -148,7 +148,7 @@ describe Boards::ListsController do it 'returns an unprocessable entity 422 response' do move user: user, board: board, list: planning, position: 6 - expect(response).to have_gitlab_http_status(422) + expect(response).to have_gitlab_http_status(:unprocessable_entity) end end @@ -156,7 +156,7 @@ describe Boards::ListsController do it 'returns a not found 404 response' do move user: user, board: board, list: 999, position: 1 - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end @@ -164,7 +164,7 @@ describe Boards::ListsController do it 'returns a 422 unprocessable entity response' do move user: guest, board: board, list: planning, position: 6 - expect(response).to have_gitlab_http_status(422) + expect(response).to have_gitlab_http_status(:unprocessable_entity) end end @@ -173,14 +173,14 @@ describe Boards::ListsController do save_setting user: user, board: board, list: planning, setting: { collapsed: true } expect(planning.preferences_for(user).collapsed).to eq(true) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end it 'saves not collapsed preference for user' do save_setting user: user, board: board, list: planning, setting: { collapsed: false } expect(planning.preferences_for(user).collapsed).to eq(false) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end end @@ -191,14 +191,14 @@ describe Boards::ListsController do save_setting user: user, board: board, list: closed, setting: { collapsed: true } expect(closed.preferences_for(user).collapsed).to eq(true) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end it 'saves not collapsed preference for user' do save_setting user: user, board: board, list: closed, setting: { collapsed: false } expect(closed.preferences_for(user).collapsed).to eq(false) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end end @@ -236,7 +236,7 @@ describe Boards::ListsController do it 'returns a successful 200 response' do remove_board_list user: user, board: board, list: planning - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end it 'removes list from board' do @@ -248,7 +248,7 @@ describe Boards::ListsController do it 'returns a not found 404 response' do remove_board_list user: user, board: board, list: 999 - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end @@ -256,7 +256,7 @@ describe Boards::ListsController do it 'returns a forbidden 403 response' do remove_board_list user: guest, board: board, list: planning - expect(response).to have_gitlab_http_status(403) + expect(response).to have_gitlab_http_status(:forbidden) end end @@ -278,7 +278,7 @@ describe Boards::ListsController do it 'returns a successful 200 response' do generate_default_lists user: user, board: board - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end it 'returns the defaults lists' do @@ -294,7 +294,7 @@ describe Boards::ListsController do generate_default_lists user: user, board: board - expect(response).to have_gitlab_http_status(422) + expect(response).to have_gitlab_http_status(:unprocessable_entity) end end @@ -302,7 +302,7 @@ describe Boards::ListsController do it 'returns a forbidden 403 response' do generate_default_lists user: guest, board: board - expect(response).to have_gitlab_http_status(403) + expect(response).to have_gitlab_http_status(:forbidden) end end diff --git a/spec/controllers/concerns/controller_with_cross_project_access_check_spec.rb b/spec/controllers/concerns/controller_with_cross_project_access_check_spec.rb index e47f1650b1f..85989ea3e92 100644 --- a/spec/controllers/concerns/controller_with_cross_project_access_check_spec.rb +++ b/spec/controllers/concerns/controller_with_cross_project_access_check_spec.rb @@ -51,7 +51,7 @@ describe ControllerWithCrossProjectAccessCheck do get :index - expect(response).to have_gitlab_http_status(403) + expect(response).to have_gitlab_http_status(:forbidden) expect(response.body).to match(/#{message}/) end @@ -60,7 +60,7 @@ describe ControllerWithCrossProjectAccessCheck do get :index - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end it 'is skipped when the `unless` condition returns true' do @@ -68,13 +68,13 @@ describe ControllerWithCrossProjectAccessCheck do get :index - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end it 'correctly renders an action that does not require cross project access' do get :show, params: { id: 'nothing' } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end end @@ -113,7 +113,7 @@ describe ControllerWithCrossProjectAccessCheck do it 'renders a success when the check is skipped' do get :index - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end it 'is executed when the `if` condition returns false' do @@ -121,7 +121,7 @@ describe ControllerWithCrossProjectAccessCheck do get :index - expect(response).to have_gitlab_http_status(403) + expect(response).to have_gitlab_http_status(:forbidden) end it 'is executed when the `unless` condition returns true' do @@ -129,19 +129,19 @@ describe ControllerWithCrossProjectAccessCheck do get :index - expect(response).to have_gitlab_http_status(403) + expect(response).to have_gitlab_http_status(:forbidden) end it 'does not skip the check on an action that is not skipped' do get :show, params: { id: 'hello' } - expect(response).to have_gitlab_http_status(403) + expect(response).to have_gitlab_http_status(:forbidden) end it 'does not skip the check on an action that was not defined to skip' do get :edit, params: { id: 'hello' } - expect(response).to have_gitlab_http_status(403) + expect(response).to have_gitlab_http_status(:forbidden) end end end diff --git a/spec/controllers/concerns/enforces_admin_authentication_spec.rb b/spec/controllers/concerns/enforces_admin_authentication_spec.rb index 019a21e8cf0..a8494543558 100644 --- a/spec/controllers/concerns/enforces_admin_authentication_spec.rb +++ b/spec/controllers/concerns/enforces_admin_authentication_spec.rb @@ -39,7 +39,7 @@ describe EnforcesAdminAuthentication, :do_not_mock_admin_mode do it 'renders ok' do get :index - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end end end @@ -48,7 +48,7 @@ describe EnforcesAdminAuthentication, :do_not_mock_admin_mode do it 'renders a 404' do get :index - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end it 'does not set admin mode' do @@ -75,7 +75,7 @@ describe EnforcesAdminAuthentication, :do_not_mock_admin_mode do let(:user) { create(:admin) } it 'allows direct access to page' do - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end it 'does not set admin mode' do @@ -85,7 +85,7 @@ describe EnforcesAdminAuthentication, :do_not_mock_admin_mode do context 'as a user' do it 'renders a 404' do - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end it 'does not set admin mode' do diff --git a/spec/controllers/concerns/project_unauthorized_spec.rb b/spec/controllers/concerns/project_unauthorized_spec.rb index 5834b1ef37f..9b40660811e 100644 --- a/spec/controllers/concerns/project_unauthorized_spec.rb +++ b/spec/controllers/concerns/project_unauthorized_spec.rb @@ -30,7 +30,7 @@ describe ProjectUnauthorized do get :show, params: { namespace_id: project.namespace.to_param, id: project.to_param } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end it 'renders a 403 when the service denies access to the project' do @@ -38,7 +38,7 @@ describe ProjectUnauthorized do get :show, params: { namespace_id: project.namespace.to_param, id: project.to_param } - expect(response).to have_gitlab_http_status(403) + expect(response).to have_gitlab_http_status(:forbidden) expect(response.body).to match("External authorization denied access to this project") end @@ -47,7 +47,7 @@ describe ProjectUnauthorized do get :show, params: { namespace_id: other_project.namespace.to_param, id: other_project.to_param } - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end end diff --git a/spec/controllers/concerns/routable_actions_spec.rb b/spec/controllers/concerns/routable_actions_spec.rb index a11f4d2a154..80c67022219 100644 --- a/spec/controllers/concerns/routable_actions_spec.rb +++ b/spec/controllers/concerns/routable_actions_spec.rb @@ -47,14 +47,14 @@ describe RoutableActions do it 'allows access' do get_routable(routable) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end end it 'prevents access when not authorized' do get_routable(routable) - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end @@ -75,14 +75,14 @@ describe RoutableActions do it 'allows access' do get_routable(routable) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end end it 'prevents access when not authorized' do get_routable(routable) - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end @@ -92,7 +92,7 @@ describe RoutableActions do it 'allows access when authorized' do get_routable(routable) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end it 'prevents access when unauthorized' do @@ -100,7 +100,7 @@ describe RoutableActions do get_routable(user) - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end end @@ -111,7 +111,7 @@ describe RoutableActions do get_routable(routable) - expect(response).to have_gitlab_http_status(302) + expect(response).to have_gitlab_http_status(:found) expect(response.location).to end_with('/users/sign_in') end end diff --git a/spec/controllers/concerns/static_object_external_storage_spec.rb b/spec/controllers/concerns/static_object_external_storage_spec.rb index ddd1a95427e..d3ece587ef7 100644 --- a/spec/controllers/concerns/static_object_external_storage_spec.rb +++ b/spec/controllers/concerns/static_object_external_storage_spec.rb @@ -27,7 +27,7 @@ describe StaticObjectExternalStorage do do_request - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end end @@ -75,7 +75,7 @@ describe StaticObjectExternalStorage do request.headers['X-Gitlab-External-Storage-Token'] = 'letmein' do_request - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end end @@ -84,7 +84,7 @@ describe StaticObjectExternalStorage do request.headers['X-Gitlab-External-Storage-Token'] = 'donotletmein' do_request - expect(response).to have_gitlab_http_status(403) + expect(response).to have_gitlab_http_status(:forbidden) end end end diff --git a/spec/controllers/dashboard/groups_controller_spec.rb b/spec/controllers/dashboard/groups_controller_spec.rb index 20a0951423b..b615bcc1e6b 100644 --- a/spec/controllers/dashboard/groups_controller_spec.rb +++ b/spec/controllers/dashboard/groups_controller_spec.rb @@ -40,7 +40,7 @@ describe Dashboard::GroupsController do it 'renders only groups the user is a member of when searching hierarchy correctly' do get :index, params: { filter: 'chef' }, format: :json - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) all_groups = [top_level_result, top_level_a, sub_level_result_a] expect(assigns(:groups)).to contain_exactly(*all_groups) end @@ -51,7 +51,7 @@ describe Dashboard::GroupsController do get :index - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end end end diff --git a/spec/controllers/dashboard/milestones_controller_spec.rb b/spec/controllers/dashboard/milestones_controller_spec.rb index 67939aa4e6a..f4b04ad6dee 100644 --- a/spec/controllers/dashboard/milestones_controller_spec.rb +++ b/spec/controllers/dashboard/milestones_controller_spec.rb @@ -40,7 +40,7 @@ describe Dashboard::MilestonesController do it 'shows milestone page' do view_milestone - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end end @@ -55,7 +55,7 @@ describe Dashboard::MilestonesController do it 'returns group and project milestones to which the user belongs' do get :index, format: :json - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response.size).to eq(2) expect(json_response.map { |i| i["name"] }).to match_array([group_milestone.name, project_milestone.name]) expect(json_response.map { |i| i["group_name"] }.compact).to match_array(group.name) @@ -64,7 +64,7 @@ describe Dashboard::MilestonesController do it 'returns closed group and project milestones to which the user belongs' do get :index, params: { state: 'closed' }, format: :json - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response.size).to eq(2) expect(json_response.map { |i| i["name"] }).to match_array([closed_group_milestone.name, closed_project_milestone.name]) expect(json_response.map { |i| i["group_name"] }.compact).to match_array(group.name) diff --git a/spec/controllers/dashboard/projects_controller_spec.rb b/spec/controllers/dashboard/projects_controller_spec.rb index 8b95c9f2496..d013093c376 100644 --- a/spec/controllers/dashboard/projects_controller_spec.rb +++ b/spec/controllers/dashboard/projects_controller_spec.rb @@ -23,7 +23,7 @@ describe Dashboard::ProjectsController do get :index - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end end diff --git a/spec/controllers/dashboard/todos_controller_spec.rb b/spec/controllers/dashboard/todos_controller_spec.rb index 4ce445fe41a..0823afe410d 100644 --- a/spec/controllers/dashboard/todos_controller_spec.rb +++ b/spec/controllers/dashboard/todos_controller_spec.rb @@ -20,19 +20,19 @@ describe Dashboard::TodosController do get :index, params: { project_id: unauthorized_project.id } - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end it 'renders 404 when given project does not exists' do get :index, params: { project_id: 999 } - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end it 'renders 200 when filtering for "any project" todos' do get :index, params: { project_id: '' } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end it 'renders 200 when user has access on given project' do @@ -40,7 +40,7 @@ describe Dashboard::TodosController do get :index, params: { project_id: authorized_project.id } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end end @@ -78,7 +78,7 @@ describe Dashboard::TodosController do get :index, params: { group_id: unauthorized_group.id } - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end @@ -130,7 +130,7 @@ describe Dashboard::TodosController do patch :restore, params: { id: todo.id } expect(todo.reload).to be_pending - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response).to eq({ "count" => 1, "done_count" => 0 }) end end @@ -144,7 +144,7 @@ describe Dashboard::TodosController do todos.each do |todo| expect(todo.reload).to be_pending end - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(json_response).to eq({ 'count' => 2, 'done_count' => 0 }) end end diff --git a/spec/controllers/google_api/authorizations_controller_spec.rb b/spec/controllers/google_api/authorizations_controller_spec.rb index 4d200140f16..58bda2bd4e8 100644 --- a/spec/controllers/google_api/authorizations_controller_spec.rb +++ b/spec/controllers/google_api/authorizations_controller_spec.rb @@ -23,7 +23,7 @@ describe GoogleApi::AuthorizationsController do subject expect(session[GoogleApi::CloudPlatform::Client.session_key_for_token]).to be_nil - expect(response).to have_http_status(:not_found) + expect(response).to have_gitlab_http_status(:not_found) end end diff --git a/spec/controllers/import/bitbucket_controller_spec.rb b/spec/controllers/import/bitbucket_controller_spec.rb index 74ffcc3aeef..ab4f6d5054c 100644 --- a/spec/controllers/import/bitbucket_controller_spec.rb +++ b/spec/controllers/import/bitbucket_controller_spec.rb @@ -123,7 +123,7 @@ describe Import::BitbucketController do post :create, format: :json - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end it 'returns 422 response when the project could not be imported' do @@ -133,7 +133,7 @@ describe Import::BitbucketController do post :create, format: :json - expect(response).to have_gitlab_http_status(422) + expect(response).to have_gitlab_http_status(:unprocessable_entity) end it_behaves_like 'project import rate limiter' @@ -330,7 +330,7 @@ describe Import::BitbucketController do post :create, params: { target_namespace: other_namespace.name }, format: :json - expect(response).to have_gitlab_http_status(422) + expect(response).to have_gitlab_http_status(:unprocessable_entity) end end end diff --git a/spec/controllers/import/bitbucket_server_controller_spec.rb b/spec/controllers/import/bitbucket_server_controller_spec.rb index a84f8368198..3a347368884 100644 --- a/spec/controllers/import/bitbucket_server_controller_spec.rb +++ b/spec/controllers/import/bitbucket_server_controller_spec.rb @@ -48,7 +48,7 @@ describe Import::BitbucketServerController do post :create, params: { project: project_key, repository: repo_slug }, format: :json - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end context 'with project key with tildes' do @@ -61,20 +61,20 @@ describe Import::BitbucketServerController do post :create, params: { project: project_key, repository: repo_slug, format: :json } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end end it 'returns an error when an invalid project key is used' do post :create, params: { project: 'some&project' } - expect(response).to have_gitlab_http_status(422) + expect(response).to have_gitlab_http_status(:unprocessable_entity) end it 'returns an error when an invalid repository slug is used' do post :create, params: { project: 'some-project', repository: 'try*this' } - expect(response).to have_gitlab_http_status(422) + expect(response).to have_gitlab_http_status(:unprocessable_entity) end it 'returns an error when the project cannot be found' do @@ -82,7 +82,7 @@ describe Import::BitbucketServerController do post :create, params: { project: project_key, repository: repo_slug }, format: :json - expect(response).to have_gitlab_http_status(422) + expect(response).to have_gitlab_http_status(:unprocessable_entity) end it 'returns an error when the project cannot be saved' do @@ -92,7 +92,7 @@ describe Import::BitbucketServerController do post :create, params: { project: project_key, repository: repo_slug }, format: :json - expect(response).to have_gitlab_http_status(422) + expect(response).to have_gitlab_http_status(:unprocessable_entity) end it "returns an error when the server can't be contacted" do @@ -100,7 +100,7 @@ describe Import::BitbucketServerController do post :create, params: { project: project_key, repository: repo_slug }, format: :json - expect(response).to have_gitlab_http_status(422) + expect(response).to have_gitlab_http_status(:unprocessable_entity) end it_behaves_like 'project import rate limiter' @@ -118,7 +118,7 @@ describe Import::BitbucketServerController do expect(session[:bitbucket_server_username]).to be_nil expect(session[:bitbucket_server_personal_access_token]).to be_nil - expect(response).to have_gitlab_http_status(302) + expect(response).to have_gitlab_http_status(:found) expect(response).to redirect_to(status_import_bitbucket_server_path) end @@ -128,7 +128,7 @@ describe Import::BitbucketServerController do expect(session[:bitbucket_server_url]).to eq(url) expect(session[:bitbucket_server_username]).to eq(username) expect(session[:bitbucket_server_personal_access_token]).to eq(token) - expect(response).to have_gitlab_http_status(302) + expect(response).to have_gitlab_http_status(:found) expect(response).to redirect_to(status_import_bitbucket_server_path) end end diff --git a/spec/controllers/import/github_controller_spec.rb b/spec/controllers/import/github_controller_spec.rb index 54fbe624cb7..40ea0bb3a44 100644 --- a/spec/controllers/import/github_controller_spec.rb +++ b/spec/controllers/import/github_controller_spec.rb @@ -22,7 +22,7 @@ describe Import::GithubController do get :new - expect(response).to have_http_status(302) + expect(response).to have_gitlab_http_status(:found) end it "prompts for an access token if GitHub not configured" do @@ -31,7 +31,7 @@ describe Import::GithubController do get :new - expect(response).to have_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end context 'when importing a CI/CD project' do diff --git a/spec/controllers/import/gitlab_controller_spec.rb b/spec/controllers/import/gitlab_controller_spec.rb index 495ea62456c..96a8eb99d5c 100644 --- a/spec/controllers/import/gitlab_controller_spec.rb +++ b/spec/controllers/import/gitlab_controller_spec.rb @@ -86,7 +86,7 @@ describe Import::GitlabController do post :create, format: :json - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end it 'returns 422 response when the project could not be imported' do @@ -96,7 +96,7 @@ describe Import::GitlabController do post :create, format: :json - expect(response).to have_gitlab_http_status(422) + expect(response).to have_gitlab_http_status(:unprocessable_entity) end context "when the repository owner is the GitLab.com user" do @@ -279,7 +279,7 @@ describe Import::GitlabController do post :create, params: { target_namespace: other_namespace.name }, format: :json - expect(response).to have_gitlab_http_status(422) + expect(response).to have_gitlab_http_status(:unprocessable_entity) end end diff --git a/spec/controllers/import/gitlab_projects_controller_spec.rb b/spec/controllers/import/gitlab_projects_controller_spec.rb index 285291c53fa..a9aaefda0f6 100644 --- a/spec/controllers/import/gitlab_projects_controller_spec.rb +++ b/spec/controllers/import/gitlab_projects_controller_spec.rb @@ -17,14 +17,14 @@ describe Import::GitlabProjectsController do post :create, params: { namespace_id: namespace.id, path: '/test', file: file } expect(flash[:alert]).to start_with('Project could not be imported') - expect(response).to have_gitlab_http_status(302) + expect(response).to have_gitlab_http_status(:found) end it 'redirects with an error when a relative path is used' do post :create, params: { namespace_id: namespace.id, path: '../test', file: file } expect(flash[:alert]).to start_with('Project could not be imported') - expect(response).to have_gitlab_http_status(302) + expect(response).to have_gitlab_http_status(:found) end end @@ -33,7 +33,7 @@ describe Import::GitlabProjectsController do post :create, params: { namespace_id: namespace.id, path: 'test', file: file } expect(flash[:notice]).to include('is being imported') - expect(response).to have_gitlab_http_status(302) + expect(response).to have_gitlab_http_status(:found) end end diff --git a/spec/controllers/import/phabricator_controller_spec.rb b/spec/controllers/import/phabricator_controller_spec.rb index 62a719cfb5b..d29a06efbb5 100644 --- a/spec/controllers/import/phabricator_controller_spec.rb +++ b/spec/controllers/import/phabricator_controller_spec.rb @@ -18,7 +18,7 @@ describe Import::PhabricatorController do stub_application_setting(import_sources: []) end - it { is_expected.to have_gitlab_http_status(404) } + it { is_expected.to have_gitlab_http_status(:not_found) } end context 'when the feature is disabled' do @@ -27,7 +27,7 @@ describe Import::PhabricatorController do stub_application_setting(import_sources: ['phabricator']) end - it { is_expected.to have_gitlab_http_status(404) } + it { is_expected.to have_gitlab_http_status(:not_found) } end context 'when the import is available' do @@ -36,7 +36,7 @@ describe Import::PhabricatorController do stub_application_setting(import_sources: ['phabricator']) end - it { is_expected.to have_gitlab_http_status(200) } + it { is_expected.to have_gitlab_http_status(:ok) } end end diff --git a/spec/controllers/oauth/applications_controller_spec.rb b/spec/controllers/oauth/applications_controller_spec.rb index 270a2fcc1d6..5f1f6af3999 100644 --- a/spec/controllers/oauth/applications_controller_spec.rb +++ b/spec/controllers/oauth/applications_controller_spec.rb @@ -14,7 +14,7 @@ describe Oauth::ApplicationsController do it 'shows list of applications' do get :index - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end it 'redirects back to profile page if OAuth applications are disabled' do @@ -22,7 +22,7 @@ describe Oauth::ApplicationsController do get :index - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end end @@ -30,7 +30,7 @@ describe Oauth::ApplicationsController do it 'creates an application' do post :create, params: oauth_params - expect(response).to have_gitlab_http_status(302) + expect(response).to have_gitlab_http_status(:found) expect(response).to redirect_to(oauth_application_path(Doorkeeper::Application.last)) end @@ -39,7 +39,7 @@ describe Oauth::ApplicationsController do post :create, params: oauth_params - expect(response).to have_gitlab_http_status(302) + expect(response).to have_gitlab_http_status(:found) expect(response).to redirect_to(profile_path) end diff --git a/spec/controllers/oauth/authorizations_controller_spec.rb b/spec/controllers/oauth/authorizations_controller_spec.rb index 41f7684051e..1b4bebd9707 100644 --- a/spec/controllers/oauth/authorizations_controller_spec.rb +++ b/spec/controllers/oauth/authorizations_controller_spec.rb @@ -23,7 +23,7 @@ describe Oauth::AuthorizationsController do it 'returns 200 code and renders error view' do get :new - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response).to render_template('doorkeeper/authorizations/error') end end @@ -34,7 +34,7 @@ describe Oauth::AuthorizationsController do it 'returns 200 code and renders view' do get :new, params: params - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response).to render_template('doorkeeper/authorizations/new') end @@ -45,7 +45,7 @@ describe Oauth::AuthorizationsController do get :new, params: params expect(request.session['user_return_to']).to be_nil - expect(response).to have_gitlab_http_status(302) + expect(response).to have_gitlab_http_status(:found) end context 'when there is already an access token for the application' do @@ -62,7 +62,7 @@ describe Oauth::AuthorizationsController do get :new, params: params expect(request.session['user_return_to']).to be_nil - expect(response).to have_gitlab_http_status(302) + expect(response).to have_gitlab_http_status(:found) end end end diff --git a/spec/controllers/profiles/accounts_controller_spec.rb b/spec/controllers/profiles/accounts_controller_spec.rb index f481b5078f2..518ea4e5c48 100644 --- a/spec/controllers/profiles/accounts_controller_spec.rb +++ b/spec/controllers/profiles/accounts_controller_spec.rb @@ -13,7 +13,7 @@ describe Profiles::AccountsController do it 'renders 404 if someone tries to unlink a non existent provider' do delete :unlink, params: { provider: 'github' } - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end [:saml, :cas3].each do |provider| @@ -25,7 +25,7 @@ describe Profiles::AccountsController do delete :unlink, params: { provider: provider.to_s } - expect(response).to have_gitlab_http_status(302) + expect(response).to have_gitlab_http_status(:found) expect(user.reload.identities).to include(identity) end end @@ -40,7 +40,7 @@ describe Profiles::AccountsController do delete :unlink, params: { provider: provider.to_s } - expect(response).to have_gitlab_http_status(302) + expect(response).to have_gitlab_http_status(:found) expect(user.reload.identities).not_to include(identity) end end diff --git a/spec/controllers/snippets/notes_controller_spec.rb b/spec/controllers/snippets/notes_controller_spec.rb index fd4b95ce226..b93df3555ab 100644 --- a/spec/controllers/snippets/notes_controller_spec.rb +++ b/spec/controllers/snippets/notes_controller_spec.rb @@ -22,7 +22,7 @@ describe Snippets::NotesController do end it "returns status 200" do - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end it "returns not empty array of notes" do @@ -39,7 +39,7 @@ describe Snippets::NotesController do it "returns status 404" do get :index, params: { snippet_id: internal_snippet } - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end @@ -51,7 +51,7 @@ describe Snippets::NotesController do it "returns status 200" do get :index, params: { snippet_id: internal_snippet } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end end end @@ -65,7 +65,7 @@ describe Snippets::NotesController do it "returns status 404" do get :index, params: { snippet_id: private_snippet } - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end @@ -77,7 +77,7 @@ describe Snippets::NotesController do it "returns status 404" do get :index, params: { snippet_id: private_snippet } - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end end @@ -91,7 +91,7 @@ describe Snippets::NotesController do it "returns status 200" do get :index, params: { snippet_id: private_snippet } - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end it "returns 1 note" do @@ -135,7 +135,7 @@ describe Snippets::NotesController do it 'returns status 302' do post :create, params: request_params - expect(response).to have_gitlab_http_status(302) + expect(response).to have_gitlab_http_status(:found) end it 'creates the note' do @@ -158,7 +158,7 @@ describe Snippets::NotesController do it 'returns status 302' do post :create, params: request_params - expect(response).to have_gitlab_http_status(302) + expect(response).to have_gitlab_http_status(:found) end it 'creates the note' do @@ -186,7 +186,7 @@ describe Snippets::NotesController do it 'returns status 404' do post :create, params: request_params - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end it 'does not create the note' do @@ -204,7 +204,7 @@ describe Snippets::NotesController do it 'returns status 302' do post :create, params: request_params - expect(response).to have_gitlab_http_status(302) + expect(response).to have_gitlab_http_status(:found) end it 'creates the note on the public snippet' do @@ -222,7 +222,7 @@ describe Snippets::NotesController do it 'returns status 302' do post :create, params: request_params - expect(response).to have_gitlab_http_status(302) + expect(response).to have_gitlab_http_status(:found) end it 'creates the note' do @@ -249,7 +249,7 @@ describe Snippets::NotesController do it "returns status 200" do delete :destroy, params: request_params - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end it "deletes the note" do @@ -277,7 +277,7 @@ describe Snippets::NotesController do it "returns status 404" do delete :destroy, params: request_params - expect(response).to have_gitlab_http_status(404) + expect(response).to have_gitlab_http_status(:not_found) end it "does not update the note" do @@ -299,7 +299,7 @@ describe Snippets::NotesController do it "toggles the award emoji" do expect { subject }.to change { note.award_emoji.count }.by(1) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end it "removes the already awarded emoji when it exists" do @@ -307,7 +307,7 @@ describe Snippets::NotesController do expect { subject }.to change { AwardEmoji.count }.by(-1) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) end end end diff --git a/spec/controllers/user_callouts_controller_spec.rb b/spec/controllers/user_callouts_controller_spec.rb index 07eaff2da09..babc93a83e5 100644 --- a/spec/controllers/user_callouts_controller_spec.rb +++ b/spec/controllers/user_callouts_controller_spec.rb @@ -13,7 +13,7 @@ describe UserCalloutsController do subject { post :create, params: { feature_name: feature_name }, format: :json } context 'with valid feature name' do - let(:feature_name) { UserCallout.feature_names.first.first } + let(:feature_name) { UserCallout.feature_names.keys.first } context 'when callout entry does not exist' do it 'creates a callout entry with dismissed state' do @@ -28,7 +28,7 @@ describe UserCalloutsController do end context 'when callout entry already exists' do - let!(:callout) { create(:user_callout, feature_name: UserCallout.feature_names.first.first, user: user) } + let!(:callout) { create(:user_callout, feature_name: UserCallout.feature_names.keys.first, user: user) } it 'returns success' do subject diff --git a/spec/factories/prometheus_alert.rb b/spec/factories/prometheus_alert.rb new file mode 100644 index 00000000000..a9fede9efca --- /dev/null +++ b/spec/factories/prometheus_alert.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +FactoryBot.define do + factory :prometheus_alert do + project + operator { :gt } + threshold { 1 } + + environment do |alert| + build(:environment, project: alert.project) + end + + prometheus_metric do |alert| + build(:prometheus_metric, project: alert.project) + end + end +end diff --git a/spec/features/issues/user_creates_branch_and_merge_request_spec.rb b/spec/features/issues/user_creates_branch_and_merge_request_spec.rb index 8322a6afa04..45da4f30e4f 100644 --- a/spec/features/issues/user_creates_branch_and_merge_request_spec.rb +++ b/spec/features/issues/user_creates_branch_and_merge_request_spec.rb @@ -187,7 +187,7 @@ describe 'User creates branch and merge request on issue page', :js do let(:branch_name) { "#{issue.iid}-foo" } before do - project.repository.create_branch(branch_name, 'master') + project.repository.create_branch(branch_name) visit project_issue_path(project, issue) end diff --git a/spec/features/merge_request/user_posts_diff_notes_spec.rb b/spec/features/merge_request/user_posts_diff_notes_spec.rb index a76e40da9e5..103d126891e 100644 --- a/spec/features/merge_request/user_posts_diff_notes_spec.rb +++ b/spec/features/merge_request/user_posts_diff_notes_spec.rb @@ -46,7 +46,7 @@ describe 'Merge request > User posts diff notes', :js do end context 'with an old line on the left and a new line on the right' do - it 'allows commenting on the left side' do + it 'allows commenting on the left side', quarantine: 'https://gitlab.com/gitlab-org/gitlab/issues/199050' do should_allow_commenting(find('[id="2f6fcd96b88b36ce98c38da085c795a27d92a3dd_9_9"]').find(:xpath, '..'), 'left') end diff --git a/spec/features/merge_request/user_resolves_conflicts_spec.rb b/spec/features/merge_request/user_resolves_conflicts_spec.rb index ce85e81868d..5fc65f020d3 100644 --- a/spec/features/merge_request/user_resolves_conflicts_spec.rb +++ b/spec/features/merge_request/user_resolves_conflicts_spec.rb @@ -169,8 +169,8 @@ describe 'Merge request > User resolves conflicts', :js do context "with malicious branch name" do let(:bad_branch_name) { "malicious-branch-{{toString.constructor('alert(/xss/)')()}}" } - let(:branch) { project.repository.create_branch(bad_branch_name, 'conflict-resolvable') } - let(:merge_request) { create_merge_request(branch.name) } + let!(:branch) { project.repository.create_branch(bad_branch_name, 'conflict-resolvable') } + let(:merge_request) { create_merge_request(bad_branch_name) } before do visit project_merge_request_path(project, merge_request) diff --git a/spec/features/projects/graph_spec.rb b/spec/features/projects/graph_spec.rb index 7b5c731c34b..562dbeb816a 100644 --- a/spec/features/projects/graph_spec.rb +++ b/spec/features/projects/graph_spec.rb @@ -60,7 +60,7 @@ describe 'Project Graph', :js do let(:branch_name) { '

evil

' } before do - project.repository.create_branch(branch_name, 'master') + project.repository.create_branch(branch_name) visit charts_project_graph_path(project, branch_name) end diff --git a/spec/fixtures/lib/gitlab/import_export/complex/project.json b/spec/fixtures/lib/gitlab/import_export/complex/project.json index 7d784fbd54f..4d6211a1251 100644 --- a/spec/fixtures/lib/gitlab/import_export/complex/project.json +++ b/spec/fixtures/lib/gitlab/import_export/complex/project.json @@ -2398,7 +2398,7 @@ "requested_at": null, "user": { "id": 16, - "email": "maritza_schoen@block.ca", + "email": "bernard_willms@gitlabexample.com", "username": "bernard_willms" } }, @@ -2418,7 +2418,7 @@ "requested_at": null, "user": { "id": 6, - "email": "shaina@koelpindenesik.com", + "email": "saul_will@gitlabexample.com", "username": "saul_will" } }, diff --git a/spec/fixtures/lib/gitlab/import_export/group_exports/complex/group.json b/spec/fixtures/lib/gitlab/import_export/group_exports/complex/group.json index edfc6333a24..6403b5fa080 100644 --- a/spec/fixtures/lib/gitlab/import_export/group_exports/complex/group.json +++ b/spec/fixtures/lib/gitlab/import_export/group_exports/complex/group.json @@ -348,7 +348,7 @@ "override": false, "user": { "id": 206, - "email": "margaret.bergnaum@reynolds.us", + "email": "gwendolyn_robel@gitlabexample.com", "username": "gwendolyn_robel" } }, @@ -394,7 +394,7 @@ "override": false, "user": { "id": 1624, - "email": "nakesha.herzog@powlowski.com", + "email": "adriene.mcclure@gitlabexample.com", "username": "adriene.mcclure" } }, diff --git a/spec/graphql/types/permission_types/project_spec.rb b/spec/graphql/types/permission_types/project_spec.rb index a3a9872ee1a..56c4c2de4df 100644 --- a/spec/graphql/types/permission_types/project_spec.rb +++ b/spec/graphql/types/permission_types/project_spec.rb @@ -12,7 +12,8 @@ describe Types::PermissionTypes::Project do :read_commit_status, :request_access, :create_pipeline, :create_pipeline_schedule, :create_merge_request_from, :create_wiki, :push_code, :create_deployment, :push_to_delete_protected_branch, :admin_wiki, :admin_project, :update_pages, :admin_remote_mirror, :create_label, - :update_wiki, :destroy_wiki, :create_pages, :destroy_pages, :read_pages_content + :update_wiki, :destroy_wiki, :create_pages, :destroy_pages, :read_pages_content, + :read_merge_request ] expected_permissions.each do |permission| diff --git a/spec/helpers/markup_helper_spec.rb b/spec/helpers/markup_helper_spec.rb index 89730a67977..d7cc8afe9c5 100644 --- a/spec/helpers/markup_helper_spec.rb +++ b/spec/helpers/markup_helper_spec.rb @@ -403,7 +403,7 @@ describe MarkupHelper do it 'logs the error' do expect(Gitlab::ErrorTracking).to receive(:track_exception).with( instance_of(StandardError), - project_id: project.id, file_name: 'foo.md', context: context + project_id: project.id, file_name: 'foo.md' ) subject diff --git a/spec/lib/gitlab/git/repository_spec.rb b/spec/lib/gitlab/git/repository_spec.rb index 07fef203691..a9d7beb0fea 100644 --- a/spec/lib/gitlab/git/repository_spec.rb +++ b/spec/lib/gitlab/git/repository_spec.rb @@ -310,8 +310,8 @@ describe Gitlab::Git::Repository, :seed_helper do with_them do before do - repository.create_branch('left-branch', 'master') - repository.create_branch('right-branch', 'master') + repository.create_branch('left-branch') + repository.create_branch('right-branch') left.times do new_commit_edit_new_file_on_branch(repository_rugged, 'encoding/CHANGELOG', 'left-branch', 'some more content for a', 'some stuff') @@ -350,8 +350,8 @@ describe Gitlab::Git::Repository, :seed_helper do with_them do before do - repository.create_branch('left-branch', 'master') - repository.create_branch('right-branch', 'master') + repository.create_branch('left-branch') + repository.create_branch('right-branch') left.times do new_commit_edit_new_file_on_branch(repository_rugged, 'encoding/CHANGELOG', 'left-branch', 'some more content for a', 'some stuff') @@ -420,55 +420,6 @@ describe Gitlab::Git::Repository, :seed_helper do end end - describe "#delete_branch" do - let(:repository) { mutable_repository } - - after do - ensure_seeds - end - - it "removes the branch from the repo" do - branch_name = "to-be-deleted-soon" - - repository.create_branch(branch_name) - expect(repository_rugged.branches[branch_name]).not_to be_nil - - repository.delete_branch(branch_name) - expect(repository_rugged.branches[branch_name]).to be_nil - end - - context "when branch does not exist" do - it "raises a DeleteBranchError exception" do - expect { repository.delete_branch("this-branch-does-not-exist") }.to raise_error(Gitlab::Git::Repository::DeleteBranchError) - end - end - end - - describe "#create_branch" do - let(:repository) { mutable_repository } - - after do - ensure_seeds - end - - it "creates a new branch" do - expect(repository.create_branch('new_branch', 'master')).not_to be_nil - end - - it "creates a new branch with the right name" do - expect(repository.create_branch('another_branch', 'master').name).to eq('another_branch') - end - - it "fails if we create an existing branch" do - repository.create_branch('duplicated_branch', 'master') - expect {repository.create_branch('duplicated_branch', 'master')}.to raise_error("Branch duplicated_branch already exists") - end - - it "fails if we create a branch from a non existing ref" do - expect {repository.create_branch('branch_based_in_wrong_ref', 'master_2_the_revenge')}.to raise_error("Invalid reference master_2_the_revenge") - end - end - describe '#delete_refs' do let(:repository) { mutable_repository } @@ -506,8 +457,8 @@ describe Gitlab::Git::Repository, :seed_helper do let(:utf8_branch) { 'branch-é' } before do - repository.create_branch(new_branch, 'master') - repository.create_branch(utf8_branch, 'master') + repository.create_branch(new_branch) + repository.create_branch(utf8_branch) end after do @@ -609,32 +560,30 @@ describe Gitlab::Git::Repository, :seed_helper do describe '#search_files_by_content' do let(:repository) { mutable_repository } let(:repository_rugged) { mutable_repository_rugged } + let(:ref) { 'search-files-by-content-branch' } + let(:content) { 'foobarbazmepmep' } before do - repository.create_branch('search-files-by-content-branch', 'master') - new_commit_edit_new_file_on_branch(repository_rugged, 'encoding/CHANGELOG', 'search-files-by-content-branch', 'committing something', 'search-files-by-content change') - new_commit_edit_new_file_on_branch(repository_rugged, 'anotherfile', 'search-files-by-content-branch', 'committing something', 'search-files-by-content change') + repository.create_branch(ref) + new_commit_edit_new_file_on_branch(repository_rugged, 'encoding/CHANGELOG', ref, 'committing something', content) + new_commit_edit_new_file_on_branch(repository_rugged, 'anotherfile', ref, 'committing something', content) end after do ensure_seeds end - shared_examples 'search files by content' do - it 'has 2 items' do - expect(search_results.size).to eq(2) - end + subject do + repository.search_files_by_content(content, ref) + end - it 'has the correct matching line' do - expect(search_results).to contain_exactly("search-files-by-content-branch:encoding/CHANGELOG\u00001\u0000search-files-by-content change\n", - "search-files-by-content-branch:anotherfile\u00001\u0000search-files-by-content change\n") - end + it 'has 2 items' do + expect(subject.size).to eq(2) end - it_should_behave_like 'search files by content' do - let(:search_results) do - repository.search_files_by_content('search-files-by-content', 'search-files-by-content-branch') - end + it 'has the correct matching line' do + expect(subject).to contain_exactly("#{ref}:encoding/CHANGELOG\u00001\u0000#{content}\n", + "#{ref}:anotherfile\u00001\u0000#{content}\n") end end @@ -1116,7 +1065,7 @@ describe Gitlab::Git::Repository, :seed_helper do before do create_remote_branch('joe', 'remote_branch', 'master') - repository.create_branch('local_branch', 'master') + repository.create_branch('local_branch') end after do @@ -1142,7 +1091,7 @@ describe Gitlab::Git::Repository, :seed_helper do before do create_remote_branch('joe', 'remote_branch', 'master') - repository.create_branch('local_branch', 'master') + repository.create_branch('local_branch') end after do @@ -1192,7 +1141,7 @@ describe Gitlab::Git::Repository, :seed_helper do context 'when no branch names are specified' do before do - repository.create_branch('identical', 'master') + repository.create_branch('identical') end after do @@ -1303,7 +1252,7 @@ describe Gitlab::Git::Repository, :seed_helper do let(:branch_name) { "ʕ•ᴥ•ʔ" } before do - repository.create_branch(branch_name, "master") + repository.create_branch(branch_name) end after do @@ -1447,7 +1396,7 @@ describe Gitlab::Git::Repository, :seed_helper do before do create_remote_branch('joe', 'remote_branch', 'master') - repository.create_branch('local_branch', 'master') + repository.create_branch('local_branch') end after do diff --git a/spec/lib/gitlab/import_export/group_tree_restorer_spec.rb b/spec/lib/gitlab/import_export/group_tree_restorer_spec.rb index 0c55ed715cc..0d9b07ffaf0 100644 --- a/spec/lib/gitlab/import_export/group_tree_restorer_spec.rb +++ b/spec/lib/gitlab/import_export/group_tree_restorer_spec.rb @@ -10,9 +10,9 @@ describe Gitlab::ImportExport::GroupTreeRestorer do describe 'restore group tree' do before(:context) do # Using an admin for import, so we can check assignment of existing members - user = create(:admin, username: 'root') - create(:user, username: 'adriene.mcclure') - create(:user, username: 'gwendolyn_robel') + user = create(:admin, email: 'root@gitlabexample.com') + create(:user, email: 'adriene.mcclure@gitlabexample.com') + create(:user, email: 'gwendolyn_robel@gitlabexample.com') RSpec::Mocks.with_temporary_scope do @group = create(:group, name: 'group', path: 'group') @@ -56,7 +56,7 @@ describe Gitlab::ImportExport::GroupTreeRestorer do end it 'has group members' do - expect(@group.members.map(&:user).map(&:username)).to contain_exactly('root', 'adriene.mcclure', 'gwendolyn_robel') + expect(@group.members.map(&:user).map(&:email)).to contain_exactly('root@gitlabexample.com', 'adriene.mcclure@gitlabexample.com', 'gwendolyn_robel@gitlabexample.com') end end end diff --git a/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb b/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb index 129f119e148..c899217d164 100644 --- a/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb +++ b/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb @@ -13,8 +13,8 @@ describe Gitlab::ImportExport::ProjectTreeRestorer do # Using an admin for import, so we can check assignment of existing members @user = create(:admin) @existing_members = [ - create(:user, username: 'bernard_willms'), - create(:user, username: 'saul_will') + create(:user, email: 'bernard_willms@gitlabexample.com'), + create(:user, email: 'saul_will@gitlabexample.com') ] RSpec::Mocks.with_temporary_scope do diff --git a/spec/lib/gitlab/runtime_spec.rb b/spec/lib/gitlab/runtime_spec.rb index 52976d925b9..f6e8ad8ae79 100644 --- a/spec/lib/gitlab/runtime_spec.rb +++ b/spec/lib/gitlab/runtime_spec.rb @@ -3,6 +3,23 @@ require 'spec_helper' describe Gitlab::Runtime do + shared_examples "valid runtime" do |runtime, max_threads| + it "identifies itself" do + expect(subject.identify).to eq(runtime) + expect(subject.public_send("#{runtime}?")).to be(true) + end + + it "does not identify as others" do + (described_class::AVAILABLE_RUNTIMES - [runtime]).each do |runtime| + expect(subject.public_send("#{runtime}?")).to eq(false) + end + end + + it "reports its maximum concurrency" do + expect(subject.max_threads).to eq(max_threads) + end + end + before do allow(described_class).to receive(:process_name).and_return('ruby') stub_rails_env('production') @@ -27,117 +44,42 @@ describe Gitlab::Runtime do context "puma" do let(:puma_type) { double('::Puma') } - let(:options) do - { - max_threads: 2 - } - end before do stub_const('::Puma', puma_type) - allow(puma_type).to receive_message_chain(:cli_config, :options).and_return(options) - end - - it "identifies itself" do - expect(subject.identify).to eq(:puma) - expect(subject.puma?).to be(true) + allow(puma_type).to receive_message_chain(:cli_config, :options).and_return(max_threads: 2) end - it "does not identify as others" do - expect(subject.unicorn?).to be(false) - expect(subject.sidekiq?).to be(false) - expect(subject.console?).to be(false) - expect(subject.rake?).to be(false) - expect(subject.test_suite?).to be(false) - end - - it "reports its maximum concurrency" do - expect(subject.max_threads).to eq(2) - end + it_behaves_like "valid runtime", :puma, 2 end context "unicorn" do - let(:unicorn_type) { Module.new } - let(:unicorn_server_type) { Class.new } - before do - stub_const('::Unicorn', unicorn_type) - stub_const('::Unicorn::HttpServer', unicorn_server_type) + stub_const('::Unicorn', Module.new) + stub_const('::Unicorn::HttpServer', Class.new) end - it "identifies itself" do - expect(subject.identify).to eq(:unicorn) - expect(subject.unicorn?).to be(true) - end - - it "does not identify as others" do - expect(subject.puma?).to be(false) - expect(subject.sidekiq?).to be(false) - expect(subject.console?).to be(false) - expect(subject.rake?).to be(false) - expect(subject.test_suite?).to be(false) - end - - it "reports its maximum concurrency" do - expect(subject.max_threads).to eq(1) - end + it_behaves_like "valid runtime", :unicorn, 1 end context "sidekiq" do let(:sidekiq_type) { double('::Sidekiq') } - let(:options) do - { - concurrency: 2 - } - end before do stub_const('::Sidekiq', sidekiq_type) allow(sidekiq_type).to receive(:server?).and_return(true) - allow(sidekiq_type).to receive(:options).and_return(options) + allow(sidekiq_type).to receive(:options).and_return(concurrency: 2) end - it "identifies itself" do - expect(subject.identify).to eq(:sidekiq) - expect(subject.sidekiq?).to be(true) - end - - it "does not identify as others" do - expect(subject.unicorn?).to be(false) - expect(subject.puma?).to be(false) - expect(subject.console?).to be(false) - expect(subject.rake?).to be(false) - expect(subject.test_suite?).to be(false) - end - - it "reports its maximum concurrency" do - expect(subject.max_threads).to eq(2) - end + it_behaves_like "valid runtime", :sidekiq, 2 end context "console" do - let(:console_type) { double('::Rails::Console') } - before do - stub_const('::Rails::Console', console_type) - end - - it "identifies itself" do - expect(subject.identify).to eq(:console) - expect(subject.console?).to be(true) - end - - it "does not identify as others" do - expect(subject.unicorn?).to be(false) - expect(subject.sidekiq?).to be(false) - expect(subject.puma?).to be(false) - expect(subject.rake?).to be(false) - expect(subject.test_suite?).to be(false) + stub_const('::Rails::Console', double('::Rails::Console')) end - it "reports its maximum concurrency" do - expect(subject.max_threads).to eq(1) - end + it_behaves_like "valid runtime", :console, 1 end context "test suite" do @@ -145,20 +87,14 @@ describe Gitlab::Runtime do stub_rails_env('test') end - it "identifies itself" do - expect(subject.identify).to eq(:test_suite) - expect(subject.test_suite?).to be(true) - end + it_behaves_like "valid runtime", :test_suite, 1 + end - it "does not identify as others" do - expect(subject.unicorn?).to be(false) - expect(subject.sidekiq?).to be(false) - expect(subject.rake?).to be(false) - expect(subject.puma?).to be(false) + context "geo log cursor" do + before do + stub_const('::GeoLogCursorOptionParser', double('::GeoLogCursorOptionParser')) end - it "reports its maximum concurrency" do - expect(subject.max_threads).to eq(1) - end + it_behaves_like "valid runtime", :geo_log_cursor, 1 end end diff --git a/spec/migrations/20190924152703_migrate_issue_trackers_data_spec.rb b/spec/migrations/20190924152703_migrate_issue_trackers_data_spec.rb index 0453ac87436..a84cac0623b 100644 --- a/spec/migrations/20190924152703_migrate_issue_trackers_data_spec.rb +++ b/spec/migrations/20190924152703_migrate_issue_trackers_data_spec.rb @@ -14,28 +14,28 @@ describe MigrateIssueTrackersData, :migration do } end let!(:jira_service) do - services.create(id: 10, type: 'JiraService', properties: properties, category: 'issue_tracker') + services.create(type: 'JiraService', properties: properties, category: 'issue_tracker') end let!(:jira_service_nil) do - services.create(id: 11, type: 'JiraService', properties: nil, category: 'issue_tracker') + services.create(type: 'JiraService', properties: nil, category: 'issue_tracker') end let!(:bugzilla_service) do - services.create(id: 12, type: 'BugzillaService', properties: properties, category: 'issue_tracker') + services.create(type: 'BugzillaService', properties: properties, category: 'issue_tracker') end let!(:youtrack_service) do - services.create(id: 13, type: 'YoutrackService', properties: properties, category: 'issue_tracker') + services.create(type: 'YoutrackService', properties: properties, category: 'issue_tracker') end let!(:youtrack_service_empty) do - services.create(id: 14, type: 'YoutrackService', properties: '', category: 'issue_tracker') + services.create(type: 'YoutrackService', properties: '', category: 'issue_tracker') end let!(:gitlab_service) do - services.create(id: 15, type: 'GitlabIssueTrackerService', properties: properties, category: 'issue_tracker') + services.create(type: 'GitlabIssueTrackerService', properties: properties, category: 'issue_tracker') end let!(:gitlab_service_empty) do - services.create(id: 16, type: 'GitlabIssueTrackerService', properties: {}, category: 'issue_tracker') + services.create(type: 'GitlabIssueTrackerService', properties: {}, category: 'issue_tracker') end let!(:other_service) do - services.create(id: 17, type: 'OtherService', properties: properties, category: 'other_category') + services.create(type: 'OtherService', properties: properties, category: 'other_category') end before do diff --git a/spec/migrations/20200130145430_reschedule_migrate_issue_trackers_data_spec.rb b/spec/migrations/20200130145430_reschedule_migrate_issue_trackers_data_spec.rb index 4f947358991..b51708dd5cd 100644 --- a/spec/migrations/20200130145430_reschedule_migrate_issue_trackers_data_spec.rb +++ b/spec/migrations/20200130145430_reschedule_migrate_issue_trackers_data_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' require Rails.root.join('db', 'post_migrate', '20200130145430_reschedule_migrate_issue_trackers_data.rb') -describe RescheduleMigrateIssueTrackersData, :migration, :sidekiq do +describe RescheduleMigrateIssueTrackersData, :migration do let(:services) { table(:services) } let(:migration_class) { Gitlab::BackgroundMigration::MigrateIssueTrackersSensitiveData } let(:migration_name) { migration_class.to_s.demodulize } diff --git a/spec/migrations/schedule_update_existing_subgroup_to_match_visibility_level_of_parent_spec.rb b/spec/migrations/schedule_update_existing_subgroup_to_match_visibility_level_of_parent_spec.rb index 5ff9ff4641f..221f266cb70 100644 --- a/spec/migrations/schedule_update_existing_subgroup_to_match_visibility_level_of_parent_spec.rb +++ b/spec/migrations/schedule_update_existing_subgroup_to_match_visibility_level_of_parent_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' require Rails.root.join('db', 'post_migrate', '20200110121314_schedule_update_existing_subgroup_to_match_visibility_level_of_parent.rb') -describe ScheduleUpdateExistingSubgroupToMatchVisibilityLevelOfParent, :migration, :sidekiq do +describe ScheduleUpdateExistingSubgroupToMatchVisibilityLevelOfParent, :migration do include MigrationHelpers::NamespacesHelpers let(:migration_class) { described_class::MIGRATION } let(:migration_name) { migration_class.to_s.demodulize } diff --git a/spec/models/ci/bridge_spec.rb b/spec/models/ci/bridge_spec.rb index a871f9b3fe6..43c843b3420 100644 --- a/spec/models/ci/bridge_spec.rb +++ b/spec/models/ci/bridge_spec.rb @@ -4,14 +4,25 @@ require 'spec_helper' describe Ci::Bridge do set(:project) { create(:project) } + set(:target_project) { create(:project, name: 'project', namespace: create(:namespace, name: 'my')) } set(:pipeline) { create(:ci_pipeline, project: project) } let(:bridge) do - create(:ci_bridge, pipeline: pipeline) + create(:ci_bridge, :variables, status: :created, + options: options, + pipeline: pipeline) + end + + let(:options) do + { trigger: { project: 'my/project', branch: 'master' } } end it { is_expected.to include_module(Ci::PipelineDelegator) } + it 'has many sourced pipelines' do + expect(bridge).to have_many(:sourced_pipelines) + end + describe '#tags' do it 'only has a bridge tag' do expect(bridge.tags).to eq [:bridge] @@ -41,4 +52,222 @@ describe Ci::Bridge do expect(bridge.scoped_variables_hash.keys).to include(*variables) end end + + describe '#inherit_status_from_downstream!' do + let(:downstream_pipeline) { build(:ci_pipeline, status: downstream_status) } + + before do + bridge.status = 'pending' + create(:ci_sources_pipeline, pipeline: downstream_pipeline, source_job: bridge) + end + + subject { bridge.inherit_status_from_downstream!(downstream_pipeline) } + + context 'when status is not supported' do + (::Ci::Pipeline::AVAILABLE_STATUSES - ::Ci::Pipeline::COMPLETED_STATUSES).map(&:to_s).each do |status| + context "when status is #{status}" do + let(:downstream_status) { status } + + it 'returns false' do + expect(subject).to eq(false) + end + + it 'does not change the bridge status' do + expect { subject }.not_to change { bridge.status }.from('pending') + end + end + end + end + + context 'when status is supported' do + using RSpec::Parameterized::TableSyntax + + where(:downstream_status, :upstream_status) do + [ + %w[success success], + *::Ci::Pipeline.completed_statuses.without(:success).map { |status| [status.to_s, 'failed'] } + ] + end + + with_them do + it 'inherits the downstream status' do + expect { subject }.to change { bridge.status }.from('pending').to(upstream_status) + end + end + end + end + + describe '#dependent?' do + subject { bridge.dependent? } + + context 'when bridge has strategy depend' do + let(:options) { { trigger: { project: 'my/project', strategy: 'depend' } } } + + it { is_expected.to be true } + end + + context 'when bridge does not have strategy depend' do + it { is_expected.to be false } + end + end + + describe '#yaml_variables' do + it 'returns YAML variables' do + expect(bridge.yaml_variables) + .to include(key: 'BRIDGE', value: 'cross', public: true) + end + end + + describe '#downstream_variables' do + it 'returns variables that are going to be passed downstream' do + expect(bridge.downstream_variables) + .to include(key: 'BRIDGE', value: 'cross') + end + + context 'when using variables interpolation' do + let(:yaml_variables) do + [ + { + key: 'EXPANDED', + value: '$BRIDGE-bridge', + public: true + }, + { + key: 'UPSTREAM_CI_PIPELINE_ID', + value: '$CI_PIPELINE_ID', + public: true + }, + { + key: 'UPSTREAM_CI_PIPELINE_URL', + value: '$CI_PIPELINE_URL', + public: true + } + ] + end + + before do + bridge.yaml_variables.concat(yaml_variables) + end + + it 'correctly expands variables with interpolation' do + expanded_values = pipeline + .persisted_variables + .to_hash + .transform_keys { |key| "UPSTREAM_#{key}" } + .map { |key, value| { key: key, value: value } } + .push(key: 'EXPANDED', value: 'cross-bridge') + + expect(bridge.downstream_variables) + .to match(a_collection_including(*expanded_values)) + end + end + + context 'when recursive interpolation has been used' do + before do + bridge.yaml_variables << { key: 'EXPANDED', value: '$EXPANDED', public: true } + end + + it 'does not expand variable recursively' do + expect(bridge.downstream_variables) + .to include(key: 'EXPANDED', value: '$EXPANDED') + end + end + end + + describe 'metadata support' do + it 'reads YAML variables from metadata' do + expect(bridge.yaml_variables).not_to be_empty + expect(bridge.metadata).to be_a Ci::BuildMetadata + expect(bridge.read_attribute(:yaml_variables)).to be_nil + expect(bridge.metadata.config_variables).to be bridge.yaml_variables + end + + it 'reads options from metadata' do + expect(bridge.options).not_to be_empty + expect(bridge.metadata).to be_a Ci::BuildMetadata + expect(bridge.read_attribute(:options)).to be_nil + expect(bridge.metadata.config_options).to be bridge.options + end + end + + describe '#triggers_child_pipeline?' do + subject { bridge.triggers_child_pipeline? } + + context 'when bridge defines a downstream YAML' do + let(:options) do + { + trigger: { + include: 'path/to/child.yml' + } + } + end + + it { is_expected.to be_truthy } + end + + context 'when bridge does not define a downstream YAML' do + let(:options) do + { + trigger: { + project: project.full_path + } + } + end + + it { is_expected.to be_falsey } + end + end + + describe '#yaml_for_downstream' do + subject { bridge.yaml_for_downstream } + + context 'when bridge defines a downstream YAML' do + let(:options) do + { + trigger: { + include: 'path/to/child.yml' + } + } + end + + let(:yaml) do + <<~EOY + --- + include: path/to/child.yml + EOY + end + + it { is_expected.to eq yaml } + end + + context 'when bridge does not define a downstream YAML' do + let(:options) { {} } + + it { is_expected.to be_nil } + end + end + + describe '#target_ref' do + context 'when trigger is defined' do + it 'returns a ref name' do + expect(bridge.target_ref).to eq 'master' + end + + context 'when using variable expansion' do + let(:options) { { trigger: { project: 'my/project', branch: '$BRIDGE-master' } } } + + it 'correctly expands variables' do + expect(bridge.target_ref).to eq('cross-master') + end + end + end + + context 'when trigger does not have project defined' do + let(:options) { nil } + + it 'returns nil' do + expect(bridge.target_ref).to be_nil + end + end + end end diff --git a/spec/models/prometheus_alert_spec.rb b/spec/models/prometheus_alert_spec.rb new file mode 100644 index 00000000000..cdcdb46a6c4 --- /dev/null +++ b/spec/models/prometheus_alert_spec.rb @@ -0,0 +1,103 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe PrometheusAlert do + let_it_be(:project) { build(:project) } + let(:metric) { build(:prometheus_metric) } + + describe '.distinct_projects' do + let(:project1) { create(:project) } + let(:project2) { create(:project) } + + before do + create(:prometheus_alert, project: project1) + create(:prometheus_alert, project: project1) + create(:prometheus_alert, project: project2) + end + + subject { described_class.distinct_projects.count } + + it 'returns a count of all distinct projects which have an alert' do + expect(subject).to eq(2) + end + end + + describe 'operators' do + it 'contains the correct equality operator' do + expect(described_class::OPERATORS_MAP.values).to include('==') + expect(described_class::OPERATORS_MAP.values).not_to include('=') + end + end + + describe 'associations' do + it { is_expected.to belong_to(:project) } + it { is_expected.to belong_to(:environment) } + end + + describe 'project validations' do + let(:environment) { build(:environment, project: project) } + let(:metric) { build(:prometheus_metric, project: project) } + + subject do + build(:prometheus_alert, prometheus_metric: metric, environment: environment, project: project) + end + + it { is_expected.to validate_presence_of(:environment) } + it { is_expected.to validate_presence_of(:project) } + it { is_expected.to validate_presence_of(:prometheus_metric) } + + context 'when environment and metric belongs same project' do + it { is_expected.to be_valid } + end + + context 'when environment belongs to different project' do + let(:environment) { build(:environment) } + + it { is_expected.not_to be_valid } + end + + context 'when metric belongs to different project' do + let(:metric) { build(:prometheus_metric) } + + it { is_expected.not_to be_valid } + end + + context 'when metric is common' do + let(:metric) { build(:prometheus_metric, :common) } + + it { is_expected.to be_valid } + end + end + + describe '#full_query' do + before do + subject.operator = "gt" + subject.threshold = 1 + subject.prometheus_metric = metric + end + + it 'returns the concatenated query' do + expect(subject.full_query).to eq("#{metric.query} > 1.0") + end + end + + describe '#to_param' do + before do + subject.operator = "gt" + subject.threshold = 1 + subject.prometheus_metric = metric + end + + it 'returns the params of the prometheus alert' do + expect(subject.to_param).to eq( + "alert" => metric.title, + "expr" => "#{metric.query} > 1.0", + "for" => "5m", + "labels" => { + "gitlab" => "hook", + "gitlab_alert_id" => metric.id + }) + end + end +end diff --git a/spec/models/push_event_spec.rb b/spec/models/push_event_spec.rb index 5509ed87308..8682e1c797b 100644 --- a/spec/models/push_event_spec.rb +++ b/spec/models/push_event_spec.rb @@ -74,7 +74,7 @@ describe PushEvent do create(:push_event_payload, event: event4, ref: 'baz', action: :removed) create(:push_event_payload, event: event5, ref: 'baz', ref_type: :tag) - project.repository.create_branch('bar', 'master') + project.repository.create_branch('bar') create( :merge_request, @@ -83,7 +83,7 @@ describe PushEvent do source_branch: 'bar' ) - project.repository.create_branch('qux', 'master') + project.repository.create_branch('qux') create( :merge_request, diff --git a/spec/models/user_callout_spec.rb b/spec/models/user_callout_spec.rb index de6534b480a..a084b1ac662 100644 --- a/spec/models/user_callout_spec.rb +++ b/spec/models/user_callout_spec.rb @@ -17,4 +17,37 @@ describe UserCallout do it { is_expected.to validate_presence_of(:feature_name) } it { is_expected.to validate_uniqueness_of(:feature_name).scoped_to(:user_id).ignoring_case_sensitivity } end + + describe 'scopes' do + describe '.with_feature_name' do + let(:second_feature_name) { described_class.feature_names.keys.second } + let(:last_feature_name) { described_class.feature_names.keys.last } + + it 'returns callout for requested feature name only' do + callout1 = create(:user_callout, feature_name: second_feature_name ) + create(:user_callout, feature_name: last_feature_name ) + + callouts = described_class.with_feature_name(second_feature_name) + + expect(callouts).to match_array([callout1]) + end + end + + describe '.with_dismissed_after' do + let(:some_feature_name) { described_class.feature_names.keys.second } + let(:callout_dismissed_month_ago) { create(:user_callout, feature_name: some_feature_name, dismissed_at: 1.month.ago )} + + it 'does not return callouts dismissed before specified date' do + callouts = described_class.with_dismissed_after(15.days.ago) + + expect(callouts).to match_array([]) + end + + it 'returns callouts dismissed after specified date' do + callouts = described_class.with_dismissed_after(2.months.ago) + + expect(callouts).to match_array([callout_dismissed_month_ago]) + end + end + end end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 855b8e3a8a7..d441f54a0fb 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -4157,6 +4157,40 @@ describe User, :do_not_mock_admin_mode do end end + describe '#dismissed_callout?' do + subject(:user) { create(:user) } + + let(:feature_name) { UserCallout.feature_names.keys.first } + + context 'when no callout dismissal record exists' do + it 'returns false when no ignore_dismissal_earlier_than provided' do + expect(user.dismissed_callout?(feature_name: feature_name)).to eq false + end + + it 'returns false when ignore_dismissal_earlier_than provided' do + expect(user.dismissed_callout?(feature_name: feature_name, ignore_dismissal_earlier_than: 3.months.ago)).to eq false + end + end + + context 'when dismissed callout exists' do + before do + create(:user_callout, user: user, feature_name: feature_name, dismissed_at: 4.months.ago) + end + + it 'returns true when no ignore_dismissal_earlier_than provided' do + expect(user.dismissed_callout?(feature_name: feature_name)).to eq true + end + + it 'returns true when ignore_dismissal_earlier_than is earlier than dismissed_at' do + expect(user.dismissed_callout?(feature_name: feature_name, ignore_dismissal_earlier_than: 6.months.ago)).to eq true + end + + it 'returns false when ignore_dismissal_earlier_than is later than dismissed_at' do + expect(user.dismissed_callout?(feature_name: feature_name, ignore_dismissal_earlier_than: 3.months.ago)).to eq false + end + end + end + describe 'bots & humans' do it 'returns corresponding users' do human = create(:user) diff --git a/spec/support/controllers/project_import_rate_limiter_shared_examples.rb b/spec/support/controllers/project_import_rate_limiter_shared_examples.rb index 336f801f923..9a543dd00d4 100644 --- a/spec/support/controllers/project_import_rate_limiter_shared_examples.rb +++ b/spec/support/controllers/project_import_rate_limiter_shared_examples.rb @@ -16,7 +16,7 @@ shared_examples 'project import rate limiter' do post :create, params: {} expect(flash[:alert]).to eq('This endpoint has been requested too many times. Try again later.') - expect(response).to have_gitlab_http_status(302) + expect(response).to have_gitlab_http_status(:found) end end end diff --git a/spec/support/helpers/api_helpers.rb b/spec/support/helpers/api_helpers.rb index aff0f87b6e4..f22ef340a5f 100644 --- a/spec/support/helpers/api_helpers.rb +++ b/spec/support/helpers/api_helpers.rb @@ -41,7 +41,7 @@ module ApiHelpers end def expect_paginated_array_response(items) - expect(response).to have_gitlab_http_status(200) + expect(response).to have_gitlab_http_status(:ok) expect(response).to include_pagination_headers expect(json_response).to be_an Array expect(json_response.map { |item| item['id'] }).to eq(Array(items)) diff --git a/spec/support/helpers/rack_attack_spec_helpers.rb b/spec/support/helpers/rack_attack_spec_helpers.rb index 234271ba1c0..e0cedb5a57b 100644 --- a/spec/support/helpers/rack_attack_spec_helpers.rb +++ b/spec/support/helpers/rack_attack_spec_helpers.rb @@ -28,6 +28,6 @@ module RackAttackSpecHelpers def expect_rejection(&block) yield - expect(response).to have_http_status(429) + expect(response).to have_gitlab_http_status(:too_many_requests) end end diff --git a/spec/tasks/gitlab/seed/group_seed_rake_spec.rb b/spec/tasks/gitlab/seed/group_seed_rake_spec.rb index bc217281594..ecf4e9575ab 100644 --- a/spec/tasks/gitlab/seed/group_seed_rake_spec.rb +++ b/spec/tasks/gitlab/seed/group_seed_rake_spec.rb @@ -2,7 +2,7 @@ require 'rake_helper' -describe 'gitlab:seed:group_seed rake task', :sidekiq do +describe 'gitlab:seed:group_seed rake task' do let(:username) { 'group_seed' } let!(:user) { create(:user, username: username) } let(:task_params) { [2, username] } -- cgit v1.2.3