From 26e0767a07b3cd714c0af92f1d84197519259214 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Fri, 7 Oct 2022 03:08:02 +0000 Subject: [PATCH] Add latest changes from gitlab-org/gitlab@master --- Gemfile | 4 +- Gemfile.checksum | 8 ++-- Gemfile.lock | 6 +-- .../javascripts/lib/utils/text_markdown.js | 1 + app/assets/javascripts/users_select/index.js | 4 +- .../profiles/preferences_controller.rb | 3 +- app/models/merge_request.rb | 16 ++++++- app/models/user.rb | 1 + app/models/user_preference.rb | 1 - app/views/profiles/preferences/show.html.haml | 4 ++ ..._preference_to_turn_off_automatic_lists.rb | 13 ++++++ db/schema_migrations/20220615172230 | 1 + db/structure.sql | 1 + doc/ci/testing/code_quality.md | 46 +++++++++++++++++-- .../templates/Jobs/Code-Quality.gitlab-ci.yml | 7 +++ lib/gitlab/gon_helper.rb | 1 + locale/gitlab.pot | 6 +++ .../markdown/gitlab_flavored_markdown_spec.rb | 9 ++-- .../search/user_searches_for_commits_spec.rb | 9 ++-- spec/frontend/lib/utils/text_markdown_spec.js | 13 ++++++ .../helpers/ci/pipeline_editor_helper_spec.rb | 9 ++-- spec/models/merge_request_spec.rb | 46 ++++++++++++------- spec/models/user_spec.rb | 3 ++ 23 files changed, 166 insertions(+), 46 deletions(-) create mode 100644 db/migrate/20220615172230_add_user_preference_to_turn_off_automatic_lists.rb create mode 100644 db/schema_migrations/20220615172230 diff --git a/Gemfile b/Gemfile index bd43a5a29c0..b35ccbce568 100644 --- a/Gemfile +++ b/Gemfile @@ -37,7 +37,7 @@ gem 'view_component', '~> 2.71.0' gem 'default_value_for', '~> 3.4.0' # Supported DBs -gem 'pg', '~> 1.4.0' +gem 'pg', '~> 1.4.3' gem 'rugged', '~> 1.2' gem 'grape-path-helpers', '~> 1.7.1' @@ -334,7 +334,7 @@ gem 'sentry-sidekiq', '~> 5.1.1' # PostgreSQL query parsing # -gem 'pg_query', '~> 2.1.0' +gem 'pg_query', '~> 2.1.4' gem 'premailer-rails', '~> 1.10.3' diff --git a/Gemfile.checksum b/Gemfile.checksum index a2fc19ab47d..357d0e4119f 100644 --- a/Gemfile.checksum +++ b/Gemfile.checksum @@ -401,10 +401,10 @@ {"name":"parslet","version":"1.8.2","platform":"ruby","checksum":"08d1ab3721cd3f175bfbee8788b2ddff71f92038f2d69bd65454c22bb9fbd98a"}, {"name":"pastel","version":"0.8.0","platform":"ruby","checksum":"481da9fb7d2f6e6b1a08faf11fa10363172dc40fd47848f096ae21209f805a75"}, {"name":"peek","version":"1.1.0","platform":"ruby","checksum":"d6501ead8cde46d8d8ed0d59eb6f0ba713d0a41c11a2c4a81447b2dce37b3ecc"}, -{"name":"pg","version":"1.4.1","platform":"ruby","checksum":"386bbffad223cce1dda903dad2c59268e41f3d183792506671ae526011ff0487"}, -{"name":"pg","version":"1.4.1","platform":"x64-mingw-ucrt","checksum":"de35769d4e7c25daa035f2dc33447e74711ab0dc8b73f685a846987e0080d030"}, -{"name":"pg","version":"1.4.1","platform":"x64-mingw32","checksum":"3457bf6bfdda7144097ef23d490a83980ba4572c78c58689aadaf58940a1989d"}, -{"name":"pg","version":"1.4.1","platform":"x86-mingw32","checksum":"323d09138b7bbfc6ae8eb427774d3639fc0e995983e65bb729527bf8e859fc29"}, +{"name":"pg","version":"1.4.3","platform":"ruby","checksum":"ab0219cdd9e5750abb04b8bca5a5a490f60abdf37503027fd2f90d0c2d31f2fa"}, +{"name":"pg","version":"1.4.3","platform":"x64-mingw-ucrt","checksum":"9f4d1d39af5ae5eea9f3c6b1e3092cbd5d26b716ff0e1283cf71c0690c69b36c"}, +{"name":"pg","version":"1.4.3","platform":"x64-mingw32","checksum":"3265afd0e00331c7c70e50d4a13eea9083e5b683ebcd808bd671af70d92b189e"}, +{"name":"pg","version":"1.4.3","platform":"x86-mingw32","checksum":"08a6ef4c702e313c1a04ad6b088b1843361ca8606843c7cd607e181e0d4e5508"}, {"name":"pg_query","version":"2.1.4","platform":"ruby","checksum":"48f1363f88cf9d86fa11d76d1b0f839ca3723b8bd397b7cbc4b578e1ca82d0bb"}, {"name":"plist","version":"3.6.0","platform":"ruby","checksum":"f468bcf6b72ec6d1585ed6744eb4817c1932a5bf91895ed056e69b7f12ca10f2"}, {"name":"png_quantizator","version":"0.2.1","platform":"ruby","checksum":"6023d4d064125c3a7e02929c95b7320ed6ac0d7341f9e8de0c9ea6576ef3106b"}, diff --git a/Gemfile.lock b/Gemfile.lock index 8d67bdc83ea..d16843b2438 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1024,7 +1024,7 @@ GEM tty-color (~> 0.5) peek (1.1.0) railties (>= 4.0.0) - pg (1.4.1) + pg (1.4.3) pg_query (2.1.4) google-protobuf (>= 3.19.2) plist (3.6.0) @@ -1720,8 +1720,8 @@ DEPENDENCIES parallel (~> 1.19) parslet (~> 1.8) peek (~> 1.1) - pg (~> 1.4.0) - pg_query (~> 2.1.0) + pg (~> 1.4.3) + pg_query (~> 2.1.4) png_quantizator (~> 0.2.1) premailer-rails (~> 1.10.3) prometheus-client-mmap (~> 0.16) diff --git a/app/assets/javascripts/lib/utils/text_markdown.js b/app/assets/javascripts/lib/utils/text_markdown.js index 5e2b8b786a4..3894ec36a0b 100644 --- a/app/assets/javascripts/lib/utils/text_markdown.js +++ b/app/assets/javascripts/lib/utils/text_markdown.js @@ -518,6 +518,7 @@ function continueOlText(listLineMatch, nextLineMatch) { } function handleContinueList(e, textArea) { + if (!gon.markdown_automatic_lists) return; if (!(e.key === 'Enter')) return; if (e.altKey || e.ctrlKey || e.metaKey || e.shiftKey) return; if (textArea.selectionStart !== textArea.selectionEnd) return; diff --git a/app/assets/javascripts/users_select/index.js b/app/assets/javascripts/users_select/index.js index 2fface2729f..5963568a00b 100644 --- a/app/assets/javascripts/users_select/index.js +++ b/app/assets/javascripts/users_select/index.js @@ -383,9 +383,7 @@ function UsersSelect(currentUser, els, options = {}) { }, suggestedUsers(users) { const selected = getSelected().filter((i) => i !== 0); - const suggestedUsers = users - .filter((u) => u.suggested && selected.indexOf(u.id) === -1) - .sort((a, b) => a.name > b.name); + const suggestedUsers = users.filter((u) => u.suggested && selected.indexOf(u.id) === -1); if (!suggestedUsers.length) return []; diff --git a/app/controllers/profiles/preferences_controller.rb b/app/controllers/profiles/preferences_controller.rb index 7aca76c2fb1..c0360d10392 100644 --- a/app/controllers/profiles/preferences_controller.rb +++ b/app/controllers/profiles/preferences_controller.rb @@ -55,7 +55,8 @@ class Profiles::PreferencesController < Profiles::ApplicationController :sourcegraph_enabled, :gitpod_enabled, :render_whitespace_in_code, - :markdown_surround_selection + :markdown_surround_selection, + :markdown_automatic_lists ] end end diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index 1fcc02a2082..ec791f91a3e 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -74,10 +74,22 @@ class MergeRequest < ApplicationRecord manual_inverse_association :latest_merge_request_diff, :merge_request def suggested_reviewer_users - return [] unless predictions && predictions.suggested_reviewers.is_a?(Hash) + return User.none unless predictions && predictions.suggested_reviewers.is_a?(Hash) usernames = Array.wrap(suggested_reviewers["reviewers"]) - project.authorized_users.active.by_username(usernames) + return User.none if usernames.empty? + + # Preserve the orginal order of suggested usernames + join_sql = MergeRequest.sanitize_sql_array( + [ + 'JOIN UNNEST(ARRAY[?]::varchar[]) WITH ORDINALITY AS t(username, ord) USING(username)', + usernames + ] + ) + + project.authorized_users.active + .joins(Arel.sql(join_sql)) + .order('t.ord') end # This is the same as latest_merge_request_diff unless: diff --git a/app/models/user.rb b/app/models/user.rb index be3bec0d142..e1186abb6c1 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -339,6 +339,7 @@ class User < ApplicationRecord :setup_for_company, :setup_for_company=, :render_whitespace_in_code, :render_whitespace_in_code=, :markdown_surround_selection, :markdown_surround_selection=, + :markdown_automatic_lists, :markdown_automatic_lists=, :diffs_deletion_color, :diffs_deletion_color=, :diffs_addition_color, :diffs_addition_color=, to: :user_preference diff --git a/app/models/user_preference.rb b/app/models/user_preference.rb index 9b4c0a2527a..b8f30413404 100644 --- a/app/models/user_preference.rb +++ b/app/models/user_preference.rb @@ -29,7 +29,6 @@ class UserPreference < ApplicationRecord default_value_for :time_display_relative, value: true, allows_nil: false default_value_for :time_format_in_24h, value: false, allows_nil: false default_value_for :render_whitespace_in_code, value: false, allows_nil: false - default_value_for :markdown_surround_selection, value: true, allows_nil: false class << self def notes_filters diff --git a/app/views/profiles/preferences/show.html.haml b/app/views/profiles/preferences/show.html.haml index e16108c5c22..a1d6ef3fec5 100644 --- a/app/views/profiles/preferences/show.html.haml +++ b/app/views/profiles/preferences/show.html.haml @@ -104,6 +104,10 @@ = f.gitlab_ui_checkbox_component :markdown_surround_selection, s_('Preferences|Surround text selection when typing quotes or brackets'), help_text: sprintf(s_( "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}."), { supported_characters: supported_characters }).html_safe + .form-group + = f.gitlab_ui_checkbox_component :markdown_automatic_lists, + s_('Preferences|Automatically add new list items'), + help_text: html_escape(s_('Preferences|When you type in a description or comment box, pressing %{kbdOpen}Enter%{kbdClose} in a list adds a new item below.')) % { kbdOpen: ''.html_safe, kbdClose: ''.html_safe } .form-group = f.label :tab_width, s_('Preferences|Tab width'), class: 'label-bold' diff --git a/db/migrate/20220615172230_add_user_preference_to_turn_off_automatic_lists.rb b/db/migrate/20220615172230_add_user_preference_to_turn_off_automatic_lists.rb new file mode 100644 index 00000000000..4a0255aad06 --- /dev/null +++ b/db/migrate/20220615172230_add_user_preference_to_turn_off_automatic_lists.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +class AddUserPreferenceToTurnOffAutomaticLists < Gitlab::Database::Migration[2.0] + enable_lock_retries! + + def up + add_column :user_preferences, :markdown_automatic_lists, :boolean, default: true, null: false + end + + def down + remove_column :user_preferences, :markdown_automatic_lists, :boolean + end +end diff --git a/db/schema_migrations/20220615172230 b/db/schema_migrations/20220615172230 new file mode 100644 index 00000000000..43057debe67 --- /dev/null +++ b/db/schema_migrations/20220615172230 @@ -0,0 +1 @@ +364a2f729196e4bd4bde635f7550df3cf0c005fa002840fa12745d8919a99147 \ No newline at end of file diff --git a/db/structure.sql b/db/structure.sql index ff6de8b3b03..a01cca4893b 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -22205,6 +22205,7 @@ CREATE TABLE user_preferences ( markdown_surround_selection boolean DEFAULT true NOT NULL, diffs_deletion_color text, diffs_addition_color text, + markdown_automatic_lists boolean DEFAULT true NOT NULL, CONSTRAINT check_89bf269f41 CHECK ((char_length(diffs_deletion_color) <= 7)), CONSTRAINT check_d07ccd35f7 CHECK ((char_length(diffs_addition_color) <= 7)) ); diff --git a/doc/ci/testing/code_quality.md b/doc/ci/testing/code_quality.md index 2e662fd3959..7345c7ca5eb 100644 --- a/doc/ci/testing/code_quality.md +++ b/doc/ci/testing/code_quality.md @@ -313,7 +313,7 @@ the nested architecture of container execution, the registry prefix must be specifically configured to be passed down into CodeClimate's subsequent `docker pull` commands for individual engines. -The following two variables can address all of the required image pulls: +The following variables can address all of the required image pulls: - `CODE_QUALITY_IMAGE`: A fully prefixed image name that can be located anywhere accessible from your job environment. GitLab Container Registry can be used here @@ -322,6 +322,8 @@ The following two variables can address all of the required image pulls: is a configuration option supported by [CodeClimate CLI](https://github.com/codeclimate/codeclimate/pull/948). You must: - Include a trailing slash (`/`). - Not include a protocol prefix, such as `https://`. +- `CODECLIMATE_REGISTRY_USERNAME`: An optional variable to specify the username for the registry domain parsed from `CODECLIMATE_PREFIX`. +- `CODECLIMATE_REGISTRY_PASSWORD`: An optional variable to specify the password for the registry domain parsed from `CODECLIMATE_PREFIX`. ```yaml include: @@ -333,13 +335,49 @@ code_quality: CODECLIMATE_PREFIX: "my-private-registry.local:12345/" ``` -The images in the private container image registry must be available without authentication. -Follow [this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/355814) for more information. - This example is specific to GitLab Code Quality. For more general instructions on how to configure DinD with a registry mirror, see the relevant [documentation](../docker/using_docker_build.md#enable-registry-mirror-for-dockerdind-service). +#### Configure Code Quality to use the Dependency Proxy + +Prerequisite: + +- The project must be in a group where the [Dependency Proxy](../../user/packages/dependency_proxy/index.md) is enabled. + +Here is an example of how to configure Code Quality to use the Dependency Proxy: + +```yaml +include: + - template: Jobs/Code-Quality.gitlab-ci.yml + +code_quality: + variables: + CODE_QUALITY_IMAGE: "$CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX/codequality:0.85.24" + ## You must add a trailing slash to `$CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX`. + CODECLIMATE_PREFIX: $CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX/ + CODECLIMATE_REGISTRY_USERNAME: $CI_DEPENDENCY_PROXY_USER + CODECLIMATE_REGISTRY_PASSWORD: $CI_DEPENDENCY_PROXY_PASSWORD +``` + +#### Configure Code Quality to use Dockerhub with authentication + +Here is an example of how to configure Code Quality to use Dockerhub with authentication: + +```yaml +include: + - template: Jobs/Code-Quality.gitlab-ci.yml + +code_quality: + variables: + CODECLIMATE_PREFIX: "registry-1.docker.io/" + CODECLIMATE_REGISTRY_USERNAME: $DOCKERHUB_USERNAME + CODECLIMATE_REGISTRY_PASSWORD: $DOCKERHUB_PASSWORD +``` + +You should add the username and password as [protected CI/CD variables](../variables/index.md#add-a-cicd-variable-to-a-project) +in the project. + ## Configuring jobs using variables The Code Quality job supports environment variables that users can set to diff --git a/lib/gitlab/ci/templates/Jobs/Code-Quality.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/Code-Quality.gitlab-ci.yml index fa2d641ba95..23efed212f8 100644 --- a/lib/gitlab/ci/templates/Jobs/Code-Quality.gitlab-ci.yml +++ b/lib/gitlab/ci/templates/Jobs/Code-Quality.gitlab-ci.yml @@ -26,6 +26,11 @@ code_quality: echo $CURRENT_ENV | grep "${VAR_NAME}=" > /dev/null && echo "--env $VAR_NAME " done } + - | + if [ -n "$CODECLIMATE_REGISTRY_USERNAME" ] && [ -n "$CODECLIMATE_REGISTRY_PASSWORD" ] && [ -n "$CODECLIMATE_PREFIX" ]; then + CODECLIMATE_REGISTRY=${CODECLIMATE_PREFIX%%/*} + docker login "$CODECLIMATE_REGISTRY" --username "$CODECLIMATE_REGISTRY_USERNAME" --password "$CODECLIMATE_REGISTRY_PASSWORD" + fi - docker pull --quiet "$CODE_QUALITY_IMAGE" - | docker run --rm \ @@ -38,6 +43,8 @@ code_quality: REPORT_FORMAT \ ENGINE_MEMORY_LIMIT_BYTES \ CODECLIMATE_PREFIX \ + CODECLIMATE_REGISTRY_USERNAME \ + CODECLIMATE_REGISTRY_PASSWORD \ ) \ --volume "$PWD":/code \ --volume /var/run/docker.sock:/var/run/docker.sock \ diff --git a/lib/gitlab/gon_helper.rb b/lib/gitlab/gon_helper.rb index d59b00f7797..2f36ece0074 100644 --- a/lib/gitlab/gon_helper.rb +++ b/lib/gitlab/gon_helper.rb @@ -15,6 +15,7 @@ module Gitlab gon.relative_url_root = Gitlab.config.gitlab.relative_url_root gon.user_color_scheme = Gitlab::ColorSchemes.for_user(current_user).css_class gon.markdown_surround_selection = current_user&.markdown_surround_selection + gon.markdown_automatic_lists = current_user&.markdown_automatic_lists if Gitlab.config.sentry.enabled gon.sentry_dsn = Gitlab.config.sentry.clientside_dsn diff --git a/locale/gitlab.pot b/locale/gitlab.pot index d912e4536b5..025e3f16c7f 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -30369,6 +30369,9 @@ msgstr "" msgid "Preferences saved." msgstr "" +msgid "Preferences|Automatically add new list items" +msgstr "" + msgid "Preferences|Behavior" msgstr "" @@ -30480,6 +30483,9 @@ msgstr "" msgid "Preferences|Use relative times" msgstr "" +msgid "Preferences|When you type in a description or comment box, pressing %{kbdOpen}Enter%{kbdClose} in a list adds a new item below." +msgstr "" + msgid "Preferences|When you type in a description or comment box, selected text is surrounded by the corresponding character after typing one of the following characters: %{supported_characters}." msgstr "" diff --git a/spec/features/markdown/gitlab_flavored_markdown_spec.rb b/spec/features/markdown/gitlab_flavored_markdown_spec.rb index e831d1be608..17fe2dab8f7 100644 --- a/spec/features/markdown/gitlab_flavored_markdown_spec.rb +++ b/spec/features/markdown/gitlab_flavored_markdown_spec.rb @@ -3,8 +3,6 @@ require 'spec_helper' RSpec.describe "GitLab Flavored Markdown" do - include CycleAnalyticsHelpers - let(:user) { create(:user) } let(:project) { create(:project) } let(:issue) { create(:issue, project: project) } @@ -24,7 +22,12 @@ RSpec.describe "GitLab Flavored Markdown" do let(:commit) { project.commit } before do - create_commit("fix #{issue.to_reference}\n\nask #{fred.to_reference} for details", project, user, 'master') + project.repository.commit_files( + user, + branch_name: 'master', + message: "fix #{issue.to_reference}\n\nask #{fred.to_reference} for details", + actions: [{ action: :create, file_path: 'a/new.file', content: 'This is a file' }] + ) end it "renders title in commits#index" do diff --git a/spec/features/search/user_searches_for_commits_spec.rb b/spec/features/search/user_searches_for_commits_spec.rb index 2dceda09d7c..a157483ce70 100644 --- a/spec/features/search/user_searches_for_commits_spec.rb +++ b/spec/features/search/user_searches_for_commits_spec.rb @@ -3,8 +3,6 @@ require 'spec_helper' RSpec.describe 'User searches for commits', :js do - include CycleAnalyticsHelpers - let(:project) { create(:project, :repository) } let(:sha) { '6d394385cf567f80a8fd85055db1ab4c5295806f' } let(:user) { create(:user) } @@ -34,7 +32,12 @@ RSpec.describe 'User searches for commits', :js do context 'when searching by message' do it 'finds a commit and holds on /search page' do - create_commit('Message referencing another sha: "deadbeef"', project, user, 'master') + project.repository.commit_files( + user, + message: 'Message referencing another sha: "deadbeef"', + branch_name: 'master', + actions: [{ action: :create, file_path: 'a/new.file', contents: 'new file' }] + ) submit_search('deadbeef') diff --git a/spec/frontend/lib/utils/text_markdown_spec.js b/spec/frontend/lib/utils/text_markdown_spec.js index ba3c73d662d..9fbb3d0a660 100644 --- a/spec/frontend/lib/utils/text_markdown_spec.js +++ b/spec/frontend/lib/utils/text_markdown_spec.js @@ -198,6 +198,7 @@ describe('init markdown', () => { textArea.addEventListener('keydown', keypressNoteText); textArea.addEventListener('compositionstart', compositionStartNoteText); textArea.addEventListener('compositionend', compositionEndNoteText); + gon.markdown_automatic_lists = true; }); it.each` @@ -317,6 +318,18 @@ describe('init markdown', () => { expect(textArea.value).toEqual(expected); expect(textArea.selectionStart).toBe(expected.length); }); + + it('does nothing if user preference disabled', () => { + const text = '- test'; + + gon.markdown_automatic_lists = false; + + textArea.value = text; + textArea.setSelectionRange(text.length, text.length); + textArea.dispatchEvent(enterEvent); + + expect(textArea.value).toEqual(text); + }); }); }); diff --git a/spec/helpers/ci/pipeline_editor_helper_spec.rb b/spec/helpers/ci/pipeline_editor_helper_spec.rb index 95d90ff5dde..c9aac63a883 100644 --- a/spec/helpers/ci/pipeline_editor_helper_spec.rb +++ b/spec/helpers/ci/pipeline_editor_helper_spec.rb @@ -3,8 +3,6 @@ require 'spec_helper' RSpec.describe Ci::PipelineEditorHelper do - include CycleAnalyticsHelpers - let_it_be(:project) { create(:project) } describe 'can_view_pipeline_editor?' do @@ -125,7 +123,12 @@ RSpec.describe Ci::PipelineEditorHelper do let(:user) { create(:user) } before do - create_commit('Message', project, user, 'feature') + project.repository.commit_files( + user, + branch_name: 'feature', + message: 'Message', + actions: [{ action: :create, file_path: 'a/new.file', content: 'This is a new file' }] + ) controller.params[:branch_name] = 'feature' end diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb index d3976d57cee..b16fa4df6c1 100644 --- a/spec/models/merge_request_spec.rb +++ b/spec/models/merge_request_spec.rb @@ -5417,21 +5417,21 @@ RSpec.describe MergeRequest, factory_default: :keep do subject(:suggested_reviewer_users) { merge_request.suggested_reviewer_users } shared_examples 'blank suggestions' do - it 'returns blank' do - expect(suggested_reviewer_users).to eq([]) + it 'returns an empty relation' do + expect(suggested_reviewer_users).to be_empty end end - context 'predictions is nil' do + context 'when predictions is nil' do it_behaves_like 'blank suggestions' end - context 'predictions is not nil' do + context 'when predictions is not nil' do before do merge_request.build_predictions end - context 'a non hash' do + context 'when predictions is a non hash' do before do merge_request.build_predictions merge_request.predictions.suggested_reviewers = 1 @@ -5440,7 +5440,7 @@ RSpec.describe MergeRequest, factory_default: :keep do it_behaves_like 'blank suggestions' end - context 'an empty hash' do + context 'when predictions is an empty hash' do before do merge_request.predictions.suggested_reviewers = {} end @@ -5448,7 +5448,7 @@ RSpec.describe MergeRequest, factory_default: :keep do it_behaves_like 'blank suggestions' end - context 'suggests a user which is not a member' do + context 'when suggests a user who is not a member' do let_it_be(:non_member) { create(:user) } before do @@ -5458,25 +5458,37 @@ RSpec.describe MergeRequest, factory_default: :keep do it_behaves_like 'blank suggestions' end - context 'suggests a user which is a non member' do - let_it_be(:member) { create(:user) } + context 'when suggests users who are members' do + let_it_be(:first_member) { create(:user) } + let_it_be(:second_member) { create(:user) } + + before_all do + project.add_developer(first_member) + project.add_developer(second_member) + end before do - project.add_developer(member) - merge_request.predictions.suggested_reviewers = { 'reviewers' => [member.username] } + merge_request.predictions.suggested_reviewers = { + 'reviewers' => [ + second_member.username, + first_member.username + ] + } end - context 'user is nonactive' do + context 'when a user is inactive' do before do - member.deactivate + second_member.deactivate end - it_behaves_like 'blank suggestions' + it 'returns only active users' do + expect(suggested_reviewer_users).to eq([first_member]) + end end - context 'user is active' do - it 'returns the user' do - expect(suggested_reviewer_users).to eq([member]) + context 'when all users are active' do + it 'returns users in correct suggested order' do + expect(suggested_reviewer_users).to eq([second_member, first_member]) end end end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index d789533f76b..a32eea7dfc9 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -69,6 +69,9 @@ RSpec.describe User do it { is_expected.to delegate_method(:markdown_surround_selection).to(:user_preference) } it { is_expected.to delegate_method(:markdown_surround_selection=).to(:user_preference).with_arguments(:args) } + it { is_expected.to delegate_method(:markdown_automatic_lists).to(:user_preference) } + it { is_expected.to delegate_method(:markdown_automatic_lists=).to(:user_preference).with_arguments(:args) } + it { is_expected.to delegate_method(:diffs_deletion_color).to(:user_preference) } it { is_expected.to delegate_method(:diffs_deletion_color=).to(:user_preference).with_arguments(:args) }