From bd27a42f5497d66db227aaa5978e11c0fe072105 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Tue, 11 Aug 2020 12:09:55 +0000 Subject: [PATCH] Add latest changes from gitlab-org/gitlab@master --- app/assets/javascripts/flash.js | 58 +++ .../components/dashboard_actions_menu.vue | 249 +++++++++++ .../components/dashboard_header.vue | 211 ++-------- .../components/composer_installation.vue | 59 +++ .../components/installation_commands.vue | 2 + .../javascripts/packages/details/constants.js | 4 + .../packages/details/store/getters.js | 9 + app/controllers/import/gitea_controller.rb | 10 + app/controllers/import/github_controller.rb | 76 +++- app/helpers/packages_helper.rb | 4 + app/policies/personal_access_token_policy.rb | 2 +- app/services/import/github_service.rb | 2 +- .../projects/packages/packages/show.html.haml | 2 + ...tructions-for-composer-dependencies-in.yml | 5 + .../astoicescu-actions_menu_update.yml | 5 + .../graphql/reference/gitlab_schema.graphql | 2 +- doc/api/graphql/reference/gitlab_schema.json | 2 +- ...ctions_menu_create_new_dashboard_v13_2.png | Bin 11479 -> 0 bytes ...ctions_menu_create_new_dashboard_v13_3.png | Bin 0 -> 18560 bytes .../img/metrics_settings_button_v13_2.png | Bin 1901 -> 0 bytes .../img/metrics_settings_button_v13_3.png | Bin 0 -> 3903 bytes doc/operations/metrics/dashboards/index.md | 10 +- .../metrics/img/example-dashboard_v13_1.png | Bin 33311 -> 0 bytes .../metrics/img/example-dashboard_v13_3.png | Bin 0 -> 64275 bytes .../prometheus_monitoring_dashboard_v13_1.png | Bin 40765 -> 0 bytes .../prometheus_monitoring_dashboard_v13_3.png | Bin 0 -> 64275 bytes doc/operations/metrics/index.md | 20 +- lib/api/import_github.rb | 6 +- locale/gitlab.pot | 33 +- qa/qa/flow/saml.rb | 3 +- qa/qa/page/project/operations/metrics/show.rb | 7 +- .../import/gitea_controller_spec.rb | 8 + .../import/github_controller_spec.rb | 98 ++++- spec/features/issuables/issuable_list_spec.rb | 2 +- spec/frontend/flash_spec.js | 111 ++++- .../dashboard_template_spec.js.snap | 35 +- .../components/dashboard_actions_menu_spec.js | 388 ++++++++++++++++++ .../components/dashboard_header_spec.js | 261 ++++-------- .../monitoring/components/dashboard_spec.js | 180 -------- spec/frontend/monitoring/mock_data.js | 7 + .../components/composer_installation_spec.js | 95 +++++ .../components/installations_commands_spec.js | 24 +- spec/helpers/packages_helper_spec.rb | 8 + .../personal_access_token_policy_spec.rb | 63 ++- spec/requests/api/import_github_spec.rb | 2 +- spec/services/import/github_service_spec.rb | 69 ++-- ...ubish_import_controller_shared_examples.rb | 83 ++-- 47 files changed, 1493 insertions(+), 722 deletions(-) create mode 100644 app/assets/javascripts/monitoring/components/dashboard_actions_menu.vue create mode 100644 app/assets/javascripts/packages/details/components/composer_installation.vue create mode 100644 changelogs/unreleased/232794-include-the-installation-instructions-for-composer-dependencies-in.yml create mode 100644 changelogs/unreleased/astoicescu-actions_menu_update.yml delete mode 100644 doc/operations/metrics/dashboards/img/actions_menu_create_new_dashboard_v13_2.png create mode 100644 doc/operations/metrics/dashboards/img/actions_menu_create_new_dashboard_v13_3.png delete mode 100644 doc/operations/metrics/dashboards/img/metrics_settings_button_v13_2.png create mode 100644 doc/operations/metrics/dashboards/img/metrics_settings_button_v13_3.png delete mode 100644 doc/operations/metrics/img/example-dashboard_v13_1.png create mode 100644 doc/operations/metrics/img/example-dashboard_v13_3.png delete mode 100644 doc/operations/metrics/img/prometheus_monitoring_dashboard_v13_1.png create mode 100644 doc/operations/metrics/img/prometheus_monitoring_dashboard_v13_3.png create mode 100644 spec/frontend/monitoring/components/dashboard_actions_menu_spec.js create mode 100644 spec/frontend/packages/details/components/composer_installation_spec.js diff --git a/app/assets/javascripts/flash.js b/app/assets/javascripts/flash.js index 74c00d21535..262e7c4e412 100644 --- a/app/assets/javascripts/flash.js +++ b/app/assets/javascripts/flash.js @@ -1,3 +1,4 @@ +import * as Sentry from '@sentry/browser'; import { escape } from 'lodash'; import { spriteIcon } from './lib/utils/common_utils'; @@ -109,8 +110,65 @@ const createFlash = function createFlash( return flashContainer; }; +/* + * Flash banner supports different types of Flash configurations + * along with ability to provide actionConfig which can be used to show + * additional action or link on banner next to message + * + * @param {Object} options Options to control the flash message + * @param {String} options.message Flash message text + * @param {String} options.type Type of Flash, it can be `notice`, `success`, `warning` or `alert` (default) + * @param {Object} options.parent Reference to parent element under which Flash needs to appear + * @param {Object} options.actonConfig Map of config to show action on banner + * @param {String} href URL to which action config should point to (default: '#') + * @param {String} title Title of action + * @param {Function} clickHandler Method to call when action is clicked on + * @param {Boolean} options.fadeTransition Boolean to determine whether to fade the alert out + * @param {Boolean} options.captureError Boolean to determine whether to send error to sentry + * @param {Object} options.error Error to be captured in sentry + */ +const newCreateFlash = function newCreateFlash({ + message, + type = FLASH_TYPES.ALERT, + parent = document, + actionConfig = null, + fadeTransition = true, + addBodyClass = false, + captureError = false, + error = null, +}) { + const flashContainer = parent.querySelector('.flash-container'); + + if (!flashContainer) return null; + + flashContainer.innerHTML = createFlashEl(message, type); + + const flashEl = flashContainer.querySelector(`.flash-${type}`); + + if (actionConfig) { + flashEl.insertAdjacentHTML('beforeend', createAction(actionConfig)); + + if (actionConfig.clickHandler) { + flashEl + .querySelector('.flash-action') + .addEventListener('click', e => actionConfig.clickHandler(e)); + } + } + + removeFlashClickListener(flashEl, fadeTransition); + + flashContainer.classList.add('gl-display-block'); + + if (addBodyClass) document.body.classList.add('flash-shown'); + + if (captureError && error) Sentry.captureException(error); + + return flashContainer; +}; + export { createFlash as default, + newCreateFlash, createFlashEl, createAction, hideFlash, diff --git a/app/assets/javascripts/monitoring/components/dashboard_actions_menu.vue b/app/assets/javascripts/monitoring/components/dashboard_actions_menu.vue new file mode 100644 index 00000000000..54586c67fef --- /dev/null +++ b/app/assets/javascripts/monitoring/components/dashboard_actions_menu.vue @@ -0,0 +1,249 @@ + + + diff --git a/app/assets/javascripts/monitoring/components/dashboard_header.vue b/app/assets/javascripts/monitoring/components/dashboard_header.vue index a7e23be98b3..1c921548ce7 100644 --- a/app/assets/javascripts/monitoring/components/dashboard_header.vue +++ b/app/assets/javascripts/monitoring/components/dashboard_header.vue @@ -7,17 +7,11 @@ import { GlDeprecatedDropdownItem, GlDeprecatedDropdownHeader, GlDeprecatedDropdownDivider, - GlNewDropdown, - GlNewDropdownDivider, - GlNewDropdownItem, - GlModal, GlLoadingIcon, GlSearchBoxByType, GlModalDirective, GlTooltipDirective, } from '@gitlab/ui'; -import { s__ } from '~/locale'; -import CustomMetricsFormFields from '~/custom_metrics/components/custom_metrics_form_fields.vue'; import { mergeUrlParams, redirectTo } from '~/lib/utils/url_utility'; import invalidUrl from '~/lib/utils/invalid_url'; import Icon from '~/vue_shared/components/icon.vue'; @@ -25,11 +19,9 @@ import DateTimePicker from '~/vue_shared/components/date_time_picker/date_time_p import DashboardsDropdown from './dashboards_dropdown.vue'; import RefreshButton from './refresh_button.vue'; -import CreateDashboardModal from './create_dashboard_modal.vue'; -import DuplicateDashboardModal from './duplicate_dashboard_modal.vue'; +import ActionsMenu from './dashboard_actions_menu.vue'; -import TrackEventDirective from '~/vue_shared/directives/track_event'; -import { getAddMetricTrackingOptions, timeRangeToUrl } from '../utils'; +import { timeRangeToUrl } from '../utils'; import { timeRanges } from '~/vue_shared/constants'; import { timezones } from '../format_date'; @@ -42,23 +34,17 @@ export default { GlDeprecatedDropdownItem, GlDeprecatedDropdownHeader, GlDeprecatedDropdownDivider, - GlNewDropdown, - GlNewDropdownDivider, - GlNewDropdownItem, GlSearchBoxByType, - GlModal, - CustomMetricsFormFields, DateTimePicker, DashboardsDropdown, RefreshButton, - DuplicateDashboardModal, - CreateDashboardModal, + + ActionsMenu, }, directives: { GlModal: GlModalDirective, GlTooltip: GlTooltipDirective, - TrackEvent: TrackEventDirective, }, props: { defaultBranch: { @@ -94,29 +80,19 @@ export default { required: true, }, }, - data() { - return { - formIsValid: null, - }; - }, computed: { ...mapState('monitoringDashboard', [ 'emptyState', 'environmentsLoading', 'currentEnvironmentName', - 'isUpdatingStarredValue', 'dashboardTimezone', 'projectPath', 'canAccessOperationsSettings', 'operationsSettingsPath', 'currentDashboard', - 'addDashboardDocumentationPath', 'externalDashboardUrl', ]), ...mapGetters('monitoringDashboard', ['selectedDashboard', 'filteredEnvironments']), - isOutOfTheBoxDashboard() { - return this.selectedDashboard?.out_of_the_box_dashboard; - }, shouldShowEmptyState() { return Boolean(this.emptyState); }, @@ -130,7 +106,7 @@ export default { // Custom metrics only avaialble on system dashboards because // they are stored in the database. This can be improved. See: // https://gitlab.com/gitlab-org/gitlab/-/issues/28241 - this.selectedDashboard?.system_dashboard + this.selectedDashboard?.out_of_the_box_dashboard ); }, showRearrangePanelsBtn() { @@ -139,15 +115,12 @@ export default { displayUtc() { return this.dashboardTimezone === timezones.UTC; }, - shouldShowActionsMenu() { - return Boolean(this.projectPath); - }, shouldShowSettingsButton() { return this.canAccessOperationsSettings && this.operationsSettingsPath; }, }, methods: { - ...mapActions('monitoringDashboard', ['filterEnvironments', 'toggleStarredValue']), + ...mapActions('monitoringDashboard', ['filterEnvironments']), selectDashboard(dashboard) { // Once the sidebar See metrics link is updated to the new URL, // this sort of hardcoding will not be necessary. @@ -171,16 +144,6 @@ export default { toggleRearrangingPanels() { this.$emit('setRearrangingPanels', !this.isRearrangingPanels); }, - setFormValidity(isValid) { - this.formIsValid = isValid; - }, - hideAddMetricModal() { - this.$refs.addMetricModal.hide(); - }, - getAddMetricTrackingOptions, - submitCustomMetricsForm() { - this.$refs.customMetricsForm.submit(); - }, getEnvironmentPath(environment) { // Once the sidebar See metrics link is updated to the new URL, // this sort of hardcoding will not be necessary. @@ -193,16 +156,6 @@ export default { return mergeUrlParams({ environment }, url); }, }, - modalIds: { - addMetric: 'addMetric', - createDashboard: 'createDashboard', - duplicateDashboard: 'duplicateDashboard', - }, - i18n: { - starDashboard: s__('Metrics|Star dashboard'), - unstarDashboard: s__('Metrics|Unstar dashboard'), - addMetric: s__('Metrics|Add metric'), - }, timeRanges, }; @@ -280,29 +233,6 @@ export default {
-
- -
- -
-
-
-
- - {{ $options.i18n.addMetric }} - - -
- - -
- - {{ __('Cancel') }} - - - {{ __('Save changes') }} - -
-
-
- -
- - {{ __('Edit dashboard') }} - -
- - - -
- - {{ s__('Metrics|Create new dashboard') }} - - - - - -
- -
- +
+ +
diff --git a/app/assets/javascripts/packages/details/components/composer_installation.vue b/app/assets/javascripts/packages/details/components/composer_installation.vue new file mode 100644 index 00000000000..c295995935f --- /dev/null +++ b/app/assets/javascripts/packages/details/components/composer_installation.vue @@ -0,0 +1,59 @@ + + + diff --git a/app/assets/javascripts/packages/details/components/installation_commands.vue b/app/assets/javascripts/packages/details/components/installation_commands.vue index 8ed1c0f267f..219e72df9dc 100644 --- a/app/assets/javascripts/packages/details/components/installation_commands.vue +++ b/app/assets/javascripts/packages/details/components/installation_commands.vue @@ -4,6 +4,7 @@ import MavenInstallation from './maven_installation.vue'; import NpmInstallation from './npm_installation.vue'; import NugetInstallation from './nuget_installation.vue'; import PypiInstallation from './pypi_installation.vue'; +import ComposerInstallation from './composer_installation.vue'; import { PackageType } from '../../shared/constants'; export default { @@ -14,6 +15,7 @@ export default { [PackageType.NPM]: NpmInstallation, [PackageType.NUGET]: NugetInstallation, [PackageType.PYPI]: PypiInstallation, + [PackageType.COMPOSER]: ComposerInstallation, }, props: { packageEntity: { diff --git a/app/assets/javascripts/packages/details/constants.js b/app/assets/javascripts/packages/details/constants.js index 88469656eb2..c6e1b388132 100644 --- a/app/assets/javascripts/packages/details/constants.js +++ b/app/assets/javascripts/packages/details/constants.js @@ -7,6 +7,7 @@ export const TrackingLabels = { NPM_INSTALLATION: 'npm_installation', NUGET_INSTALLATION: 'nuget_installation', PYPI_INSTALLATION: 'pypi_installation', + COMPOSER_INSTALLATION: 'composer_installation', }; export const TrackingActions = { @@ -31,6 +32,9 @@ export const TrackingActions = { COPY_PIP_INSTALL_COMMAND: 'copy_pip_install_command', COPY_PYPI_SETUP_COMMAND: 'copy_pypi_setup_command', + + COPY_COMPOSER_REGISTRY_INCLUDE_COMMAND: 'copy_composer_registry_include_command', + COPY_COMPOSER_PACKAGE_INCLUDE_COMMAND: 'copy_composer_package_include_command', }; export const NpmManager = { diff --git a/app/assets/javascripts/packages/details/store/getters.js b/app/assets/javascripts/packages/details/store/getters.js index bcf74713f03..77dc24ff169 100644 --- a/app/assets/javascripts/packages/details/store/getters.js +++ b/app/assets/javascripts/packages/details/store/getters.js @@ -104,3 +104,12 @@ export const pypiSetupCommand = ({ pypiSetupPath }) => `[gitlab] repository = ${pypiSetupPath} username = __token__ password = `; + +export const composerRegistryInclude = ({ composerPath }) => { + const base = { type: 'composer', url: composerPath }; + return JSON.stringify(base); +}; +export const composerPackageInclude = ({ packageEntity }) => { + const base = { package_name: packageEntity.name }; + return JSON.stringify(base); +}; diff --git a/app/controllers/import/gitea_controller.rb b/app/controllers/import/gitea_controller.rb index efeff8439e4..4785a71b8a1 100644 --- a/app/controllers/import/gitea_controller.rb +++ b/app/controllers/import/gitea_controller.rb @@ -54,6 +54,16 @@ class Import::GiteaController < Import::GithubController end end + override :client_repos + def client_repos + @client_repos ||= filtered(client.repos) + end + + override :client + def client + @client ||= Gitlab::LegacyGithubImport::Client.new(session[access_token_key], client_options) + end + override :client_options def client_options { host: provider_url, api_version: 'v1' } diff --git a/app/controllers/import/github_controller.rb b/app/controllers/import/github_controller.rb index ac6b8c06d66..29fe34f0734 100644 --- a/app/controllers/import/github_controller.rb +++ b/app/controllers/import/github_controller.rb @@ -10,6 +10,9 @@ class Import::GithubController < Import::BaseController before_action :provider_auth, only: [:status, :realtime_changes, :create] before_action :expire_etag_cache, only: [:status, :create] + OAuthConfigMissingError = Class.new(StandardError) + + rescue_from OAuthConfigMissingError, with: :missing_oauth_config rescue_from Octokit::Unauthorized, with: :provider_unauthorized rescue_from Octokit::TooManyRequests, with: :provider_rate_limit @@ -22,7 +25,7 @@ class Import::GithubController < Import::BaseController end def callback - session[access_token_key] = client.get_token(params[:code]) + session[access_token_key] = get_token(params[:code]) redirect_to status_import_url end @@ -77,9 +80,7 @@ class Import::GithubController < Import::BaseController override :provider_url def provider_url strong_memoize(:provider_url) do - provider = Gitlab::Auth::OAuth::Provider.config_for('github') - - provider&.dig('url').presence || 'https://github.com' + oauth_config&.dig('url').presence || 'https://github.com' end end @@ -104,11 +105,66 @@ class Import::GithubController < Import::BaseController end def client - @client ||= Gitlab::LegacyGithubImport::Client.new(session[access_token_key], client_options) + @client ||= if Feature.enabled?(:remove_legacy_github_client) + Gitlab::GithubImport::Client.new(session[access_token_key]) + else + Gitlab::LegacyGithubImport::Client.new(session[access_token_key], client_options) + end end def client_repos - @client_repos ||= filtered(client.repos) + @client_repos ||= if Feature.enabled?(:remove_legacy_github_client) + filtered(concatenated_repos) + else + filtered(client.repos) + end + end + + def concatenated_repos + return [] unless client.respond_to?(:each_page) + + client.each_page(:repos).flat_map(&:objects) + end + + def oauth_client + raise OAuthConfigMissingError unless oauth_config + + @oauth_client ||= ::OAuth2::Client.new( + oauth_config.app_id, + oauth_config.app_secret, + oauth_options.merge(ssl: { verify: oauth_config['verify_ssl'] }) + ) + end + + def oauth_config + @oauth_config ||= Gitlab::Auth::OAuth::Provider.config_for('github') + end + + def oauth_options + if oauth_config + oauth_config.dig('args', 'client_options').deep_symbolize_keys + else + OmniAuth::Strategies::GitHub.default_options[:client_options].symbolize_keys + end + end + + def authorize_url + if Feature.enabled?(:remove_legacy_github_client) + oauth_client.auth_code.authorize_url( + redirect_uri: callback_import_url, + scope: 'repo, user, user:email' + ) + else + client.authorize_url(callback_import_url) + end + end + + def get_token(code) + if Feature.enabled?(:remove_legacy_github_client) + oauth_client.auth_code.get_token(code).token + else + client.get_token(code) + end end def verify_import_enabled @@ -116,7 +172,7 @@ class Import::GithubController < Import::BaseController end def go_to_provider_for_permissions - redirect_to client.authorize_url(callback_import_url) + redirect_to authorize_url end def import_enabled? @@ -152,6 +208,12 @@ class Import::GithubController < Import::BaseController alert: _("GitHub API rate limit exceeded. Try again after %{reset_time}") % { reset_time: reset_time } end + def missing_oauth_config + session[access_token_key] = nil + redirect_to new_import_url, + alert: _('Missing OAuth configuration for GitHub.') + end + def access_token_key :"#{provider_name}_access_token" end diff --git a/app/helpers/packages_helper.rb b/app/helpers/packages_helper.rb index a0434284ce6..e6ecc403a88 100644 --- a/app/helpers/packages_helper.rb +++ b/app/helpers/packages_helper.rb @@ -30,6 +30,10 @@ module PackagesHelper full_url.sub!('://', '://__token__:@') end + def composer_registry_url(group_id) + expose_url(api_v4_group___packages_composer_packages_path(id: group_id, format: '.json')) + end + def packages_coming_soon_enabled?(resource) ::Feature.enabled?(:packages_coming_soon, resource) && ::Gitlab.dev_env_or_com? end diff --git a/app/policies/personal_access_token_policy.rb b/app/policies/personal_access_token_policy.rb index aa87550fd6b..1e5404b7822 100644 --- a/app/policies/personal_access_token_policy.rb +++ b/app/policies/personal_access_token_policy.rb @@ -3,7 +3,7 @@ class PersonalAccessTokenPolicy < BasePolicy condition(:is_owner) { user && subject.user_id == user.id } - rule { is_owner | admin & ~blocked }.policy do + rule { (is_owner | admin) & ~blocked }.policy do enable :read_token enable :revoke_token end diff --git a/app/services/import/github_service.rb b/app/services/import/github_service.rb index 0cf17568c78..a2923b1e4f9 100644 --- a/app/services/import/github_service.rb +++ b/app/services/import/github_service.rb @@ -33,7 +33,7 @@ module Import end def repo - @repo ||= client.repo(params[:repo_id].to_i) + @repo ||= client.repository(params[:repo_id].to_i) end def project_name diff --git a/app/views/projects/packages/packages/show.html.haml b/app/views/projects/packages/packages/show.html.haml index 2f547a4811f..a66ae466d9d 100644 --- a/app/views/projects/packages/packages/show.html.haml +++ b/app/views/projects/packages/packages/show.html.haml @@ -20,4 +20,6 @@ pypi_path: pypi_registry_url(@project.id), pypi_setup_path: package_registry_project_url(@project.id, :pypi), pypi_help_path: help_page_path('user/packages/pypi_repository/index'), + composer_path: composer_registry_url(@project&.group&.id), + composer_help_path: help_page_path('user/packages/composer_repository/index'), project_name: @project.name} } diff --git a/changelogs/unreleased/232794-include-the-installation-instructions-for-composer-dependencies-in.yml b/changelogs/unreleased/232794-include-the-installation-instructions-for-composer-dependencies-in.yml new file mode 100644 index 00000000000..a781dd15804 --- /dev/null +++ b/changelogs/unreleased/232794-include-the-installation-instructions-for-composer-dependencies-in.yml @@ -0,0 +1,5 @@ +--- +title: Add installation instructions for Composer +merge_request: 38779 +author: +type: changed diff --git a/changelogs/unreleased/astoicescu-actions_menu_update.yml b/changelogs/unreleased/astoicescu-actions_menu_update.yml new file mode 100644 index 00000000000..02b85ac7c6b --- /dev/null +++ b/changelogs/unreleased/astoicescu-actions_menu_update.yml @@ -0,0 +1,5 @@ +--- +title: Change UI and add new actions to monitor dashboard actions menu +merge_request: 38946 +author: +type: changed diff --git a/doc/api/graphql/reference/gitlab_schema.graphql b/doc/api/graphql/reference/gitlab_schema.graphql index 61adc3283b9..ee55360e5f5 100644 --- a/doc/api/graphql/reference/gitlab_schema.graphql +++ b/doc/api/graphql/reference/gitlab_schema.graphql @@ -2391,7 +2391,7 @@ input DastOnDemandScanCreateInput { """ ID of the site profile to be used for the scan. """ - dastSiteProfileId: ID! + dastSiteProfileId: DastSiteProfileID! """ The project the site profile belongs to. diff --git a/doc/api/graphql/reference/gitlab_schema.json b/doc/api/graphql/reference/gitlab_schema.json index f61025aedc7..3fe75338d84 100644 --- a/doc/api/graphql/reference/gitlab_schema.json +++ b/doc/api/graphql/reference/gitlab_schema.json @@ -6374,7 +6374,7 @@ "name": null, "ofType": { "kind": "SCALAR", - "name": "ID", + "name": "DastSiteProfileID", "ofType": null } }, diff --git a/doc/operations/metrics/dashboards/img/actions_menu_create_new_dashboard_v13_2.png b/doc/operations/metrics/dashboards/img/actions_menu_create_new_dashboard_v13_2.png deleted file mode 100644 index 5d530a80421b49b87086d2a6ca39945dd0eae3b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11479 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 bx^PJh{v5;7407hcy8XyWD@zr>H4gk=(A1p8 diff --git a/doc/operations/metrics/dashboards/img/actions_menu_create_new_dashboard_v13_3.png b/doc/operations/metrics/dashboards/img/actions_menu_create_new_dashboard_v13_3.png new file mode 100644 index 0000000000000000000000000000000000000000..4b7a8418eef5351ce6c2da2de0098ab5750b4635 GIT binary patch literal 18560 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 diff --git a/doc/operations/metrics/dashboards/img/metrics_settings_button_v13_3.png b/doc/operations/metrics/dashboards/img/metrics_settings_button_v13_3.png new file mode 100644 index 0000000000000000000000000000000000000000..9c0eac12a3fd9fa418f7685a37b30960b16984f8 GIT binary patch literal 3903 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 Ve@u_9Nc#O>G=`b$SL?dO{s$M=M<@UQ literal 0 HcmV?d00001 diff --git a/doc/operations/metrics/dashboards/index.md b/doc/operations/metrics/dashboards/index.md index 9207a6bd951..b9008c18e13 100644 --- a/doc/operations/metrics/dashboards/index.md +++ b/doc/operations/metrics/dashboards/index.md @@ -20,7 +20,7 @@ The metrics as defined below do not support alerts, unlike ## Add a new dashboard to your project -> UI option [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/223204) in GitLab 13.2. +> UI option [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/228856) in GitLab 13.3. You can configure a custom dashboard by adding a new YAML file into your project's `.gitlab/dashboards/` directory. For the dashboard to display on your project's **Operations > Metrics** page, the files must have a `.yml` @@ -31,9 +31,9 @@ To create a new dashboard from the GitLab user interface: 1. Sign in to GitLab as a user with Maintainer or Owner [permissions](../../../user/permissions.md#project-members-permissions). 1. Navigate to your dashboard at **Operations > Metrics**. -1. In the top-right corner of your dashboard, click the **{file-addition-solid}** **Actions** menu, +1. In the top-right corner of your dashboard, click the **{{ellipsis_v}}** **More actions** menu, and select **Create new**: - ![Monitoring Dashboard actions menu with create new item](img/actions_menu_create_new_dashboard_v13_2.png) + ![Monitoring Dashboard actions menu with create new item](img/actions_menu_create_new_dashboard_v13_3.png) 1. In the modal window, click **Open Repository**, then follow the instructions for creating a new dashboard from the command line. @@ -82,7 +82,7 @@ The resulting `.yml` file can be customized and adapted to your project. You can decide to save the dashboard `.yml` file in the project's **default** branch or in a new branch. -1. Click **Duplicate dashboard** in the actions menu. +1. Click **Duplicate current dashboard** in the **{{ellipsis_v}}** **More actions** menu. NOTE: **Note:** You can duplicate only GitLab-defined dashboards. @@ -105,7 +105,7 @@ To manage the settings for your metrics dashboard: 1. Navigate to your dashboard at **Operations > Metrics**. 1. In the top-right corner of your dashboard, click **Metrics Settings**: - ![Monitoring Dashboard actions menu with create new item](img/metrics_settings_button_v13_2.png) + ![Monitoring Dashboard actions menu with create new item](img/metrics_settings_button_v13_3.png) ## Chart Context Menu diff --git a/doc/operations/metrics/img/example-dashboard_v13_1.png b/doc/operations/metrics/img/example-dashboard_v13_1.png deleted file mode 100644 index 0805346b91658e34a6876a51563a1c0d4e4d42f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33311 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 noB8R(V6L*IZ~uO8kY`>_kf)ypO%j zT9$HO{vrq5%sV<=ZQpVE2-RCFI;wMk3g2Ur48=OvRroSpbSp`Vwdg_U;j)VJ)-j2u zjPNfJFMrE57A*R(_^{YdC36l7aPHY#RKCh(&|(0k^jjA_}{|6L?lnq zb)O1Pv3AEYe8PfhQra#`DMNm{I%{D2px&V&Fi!B+0Czt?CwQ-afSxMIZ%KASQEJBAo11q+3`jm`jl7NfRYKHp$3@iex|my#-l(p?Wi$w@tpR4G|6yuc zas*wI*5FzzRLLi`8b&!m?Qc>x;Y_izSDKrm-yW&?3Zo!(5u5Gr|>--lGd7S zTmd0rXOqQr!#xQ@{|#aqD^-!P>8J}(ITSjgY!9@FDp#zjl!p?a1Fv?2N4_$;x&2VbMe~%50_Qi-Vssw_U;~p)HfIMxi zntj`Q_F~J)IhXYKV$N_Qw5ELeLJukqZ{PI-Isy$ke9CD~hm0G7?UatU! zZj85iQwee3XuNhh%fFV22DR)Yc8+Oih=?vx3;3impDU=+LMx61eaH&b(0W`nE)iAG zeFR)2)jl5gbQ^gQb`JJxQ5Z3M4jpIlUtjDh-xD}JdlLVJ{5X>vc=6P=lvoAPswn7d z1!WGcsy2fP4=xllaVFiol>m}Ob;irL)3D=I^dYprcb;3DSSdi?e6Yi%!_O*(nn%#+WjhERHSD)Y^Y)$0IG(01CBnTV7!TC`TmQXofb1im(iapUiLXk&z8`$LfS0!g-uhrZx4u6qE&O3Io0vz40yBob;<(q#E#kc! z&c9K7Jn=j5TYTn;&gG~pFb4^yPGHQtfILtJ(7@pSX;#Yp_3>n`DK#+3Ug~^`?E3n* z%xOKKV-13Z$jPP-dkKe7#i{vlYJza$NEtpj{Ds8x-*ViarT>MDwGquLjWVGl;BnQ# wzftc(i!LKMKK>Wk|B1N#|G=!U0r5pC=c6!ZuYB?2UqT`o3B@lJ;zmFI4-|UYcmMzZ diff --git a/doc/operations/metrics/img/example-dashboard_v13_3.png b/doc/operations/metrics/img/example-dashboard_v13_3.png new file mode 100644 index 0000000000000000000000000000000000000000..1178b4a9be78e7dd5d0f12a3c91033143cfc2bb5 GIT binary patch literal 64275 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 d)>-1iNk4OZm}x^8mz8URqhILc%EUe*j$AZ3zGX literal 0 HcmV?d00001 diff --git a/doc/operations/metrics/img/prometheus_monitoring_dashboard_v13_1.png b/doc/operations/metrics/img/prometheus_monitoring_dashboard_v13_1.png deleted file mode 100644 index 56a0a508a1d983ff8d2748b52a9bad9eba6dc84c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40765 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 P*CHqNN@^4T9`OGF$NUo> diff --git a/doc/operations/metrics/img/prometheus_monitoring_dashboard_v13_3.png b/doc/operations/metrics/img/prometheus_monitoring_dashboard_v13_3.png new file mode 100644 index 0000000000000000000000000000000000000000..1178b4a9be78e7dd5d0f12a3c91033143cfc2bb5 GIT binary patch literal 64275 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 d)>-1iNk4OZm}x^8mz8URqhILc%EUe*j$AZ3zGX literal 0 HcmV?d00001 diff --git a/doc/operations/metrics/index.md b/doc/operations/metrics/index.md index de817fe0c52..99b3a485002 100644 --- a/doc/operations/metrics/index.md +++ b/doc/operations/metrics/index.md @@ -25,7 +25,7 @@ To view the metrics dashboard for an environment that has GitLab displays the default metrics dashboard for the environment, like the following example: -![Example of metrics dashboard](img/example-dashboard_v13_1.png) +![Example of metrics dashboard](img/example-dashboard_v13_3.png) The top of the dashboard contains a navigation bar. From left to right, the navigation bar contains: @@ -37,15 +37,19 @@ navigation bar contains: - **Range** - The time period of data to display. - **Refresh dashboard** **{retry}** - Reload the dashboard with current data. - **Set refresh rate** - Set a time frame for refreshing the data displayed. -- **Star dashboard** **{star-o}** - Click to mark a dashboard as a favorite. +- **More actions** **{ellipsis_v}** - More dashboard actions + - **Add metric** - Adds a [custom metric](#adding-custom-metrics). Only available on GitLab-defined dashboards. + ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/34779) in GitLab 12.5.) + - **Edit dashboard YAML** - Edit the source YAML file of a custom dashboard. Only available on + [custom dashboards](dashboards/index.md). + ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/34779) in GitLab 12.5.) + - **Duplicate current dashboard** - Save a [complete copy of a dashboard](dashboards/index.md#duplicate-a-gitlab-defined-dashboard). Only available on GitLab-defined dashboards. + - **Star dashboard** **{star-o}** - Click to mark a dashboard as a favorite. Starred dashboards display a solid star **{star}** button, and display first in the **Dashboard** dropdown list. ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/214582) in GitLab 13.0.) -- **Edit dashboard** - Edit the source YAML file of a custom dashboard. Only available on - [custom dashboards](dashboards/index.md). - ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/34779) in GitLab 12.5.) -- **Create dashboard** **{file-addition-solid}** - Create a - [new custom dashboard for your project](dashboards/index.md#add-a-new-dashboard-to-your-project). + - **Create new dashboard** - Create a [new custom dashboard for your project](dashboards/index.md#add-a-new-dashboard-to-your-project). + ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/228856) in GitLab 13.3.) - **Metrics settings** - Configure the [settings for this dashboard](dashboards/index.md#manage-the-metrics-dashboard-settings). @@ -70,7 +74,7 @@ helps quickly create a deployment: 1. When the pipeline has run successfully, graphs are available on the **Operations > Metrics** page. -![Monitoring Dashboard](img/prometheus_monitoring_dashboard_v13_1.png) +![Monitoring Dashboard](img/prometheus_monitoring_dashboard_v13_3.png) ## Customize your metrics dashboard diff --git a/lib/api/import_github.rb b/lib/api/import_github.rb index 1e839816006..0bab891eada 100644 --- a/lib/api/import_github.rb +++ b/lib/api/import_github.rb @@ -10,7 +10,11 @@ module API helpers do def client - @client ||= Gitlab::LegacyGithubImport::Client.new(params[:personal_access_token], client_options) + @client ||= if Feature.enabled?(:remove_legacy_github_client) + Gitlab::GithubImport::Client.new(params[:personal_access_token]) + else + Gitlab::LegacyGithubImport::Client.new(params[:personal_access_token], client_options) + end end def access_params diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 73c4ba5002d..09468fbdde6 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -8804,9 +8804,6 @@ msgstr "" msgid "Edit comment" msgstr "" -msgid "Edit dashboard" -msgstr "" - msgid "Edit description" msgstr "" @@ -15236,9 +15233,6 @@ msgstr "" msgid "Metrics|Create custom dashboard %{fileName}" msgstr "" -msgid "Metrics|Create dashboard" -msgstr "" - msgid "Metrics|Create metric" msgstr "" @@ -15272,9 +15266,15 @@ msgstr "" msgid "Metrics|Duplicate dashboard" msgstr "" +msgid "Metrics|Duplicate this dashboard to edit dashboard YAML" +msgstr "" + msgid "Metrics|Duplicating..." msgstr "" +msgid "Metrics|Edit dashboard YAML" +msgstr "" + msgid "Metrics|Edit metric" msgid_plural "Metrics|Edit metrics" msgstr[0] "" @@ -15316,6 +15316,9 @@ msgstr "" msgid "Metrics|Min" msgstr "" +msgid "Metrics|More actions" +msgstr "" + msgid "Metrics|Must be a valid PromQL query." msgstr "" @@ -15639,6 +15642,9 @@ msgstr "" msgid "Mirroring will only be available if the feature is included in the plan of the selected group or user." msgstr "" +msgid "Missing OAuth configuration for GitHub." +msgstr "" + msgid "Missing commit signatures endpoint!" msgstr "" @@ -17122,6 +17128,12 @@ msgstr "" msgid "PackageRegistry|Copy npm setup command" msgstr "" +msgid "PackageRegistry|Copy registry include" +msgstr "" + +msgid "PackageRegistry|Copy require package include" +msgstr "" + msgid "PackageRegistry|Copy yarn command" msgstr "" @@ -17137,6 +17149,9 @@ msgstr "" msgid "PackageRegistry|Filter by name" msgstr "" +msgid "PackageRegistry|For more information on Composer packages in GitLab, %{linkStart}see the documentation.%{linkEnd}" +msgstr "" + msgid "PackageRegistry|For more information on the Conan registry, %{linkStart}see the documentation%{linkEnd}." msgstr "" @@ -17257,6 +17272,12 @@ msgstr "" msgid "PackageRegistry|You may also need to setup authentication using an auth token. %{linkStart}See the documentation%{linkEnd} to find out more." msgstr "" +msgid "PackageRegistry|composer.json registry include" +msgstr "" + +msgid "PackageRegistry|composer.json require package include" +msgstr "" + msgid "PackageRegistry|npm" msgstr "" diff --git a/qa/qa/flow/saml.rb b/qa/qa/flow/saml.rb index 676be2beb01..e8007978071 100644 --- a/qa/qa/flow/saml.rb +++ b/qa/qa/flow/saml.rb @@ -18,7 +18,7 @@ module QA end end - def enable_saml_sso(group, saml_idp_service) + def enable_saml_sso(group, saml_idp_service, default_membership_role = 'Guest') page.visit Runtime::Scenario.gitlab_address Page::Main::Login.perform(&:sign_in_using_credentials) unless Page::Main::Menu.perform(&:signed_in?) @@ -29,6 +29,7 @@ module QA EE::Page::Group::Settings::SamlSSO.perform do |saml_sso| saml_sso.set_id_provider_sso_url(saml_idp_service.idp_sso_url) saml_sso.set_cert_fingerprint(saml_idp_service.idp_certificate_fingerprint) + saml_sso.set_default_membership_role(default_membership_role) saml_sso.click_save_changes saml_sso.user_login_url_link_text diff --git a/qa/qa/page/project/operations/metrics/show.rb b/qa/qa/page/project/operations/metrics/show.rb index ee5f42147f6..7576e11bf59 100644 --- a/qa/qa/page/project/operations/metrics/show.rb +++ b/qa/qa/page/project/operations/metrics/show.rb @@ -18,9 +18,12 @@ module QA view 'app/assets/javascripts/monitoring/components/dashboard_header.vue' do element :dashboards_filter_dropdown element :environments_dropdown - element :edit_dashboard_button element :range_picker_dropdown + end + + view 'app/assets/javascripts/monitoring/components/dashboard_actions_menu.vue' do element :actions_menu_dropdown + element :edit_dashboard_button_enabled end view 'app/assets/javascripts/monitoring/components/duplicate_dashboard_form.vue' do @@ -56,7 +59,7 @@ module QA def has_edit_dashboard_enabled? within_element :prometheus_graphs do - has_element? :edit_dashboard_button + has_element? :edit_dashboard_button_enabled end end diff --git a/spec/controllers/import/gitea_controller_spec.rb b/spec/controllers/import/gitea_controller_spec.rb index 9001faef408..3e4b159271a 100644 --- a/spec/controllers/import/gitea_controller_spec.rb +++ b/spec/controllers/import/gitea_controller_spec.rb @@ -34,6 +34,14 @@ RSpec.describe Import::GiteaController do assign_host_url end + it "requests provider repos list" do + expect(stub_client(repos: [], orgs: [])).to receive(:repos) + + get :status + + expect(response).to have_gitlab_http_status(:ok) + end + context 'when host url is local or not http' do %w[https://localhost:3000 http://192.168.0.1 ftp://testing].each do |url| let(:host_url) { url } diff --git a/spec/controllers/import/github_controller_spec.rb b/spec/controllers/import/github_controller_spec.rb index a5a3dc463d3..e19b6caca5b 100644 --- a/spec/controllers/import/github_controller_spec.rb +++ b/spec/controllers/import/github_controller_spec.rb @@ -15,10 +15,7 @@ RSpec.describe Import::GithubController do it "redirects to GitHub for an access token if logged in with GitHub" do allow(controller).to receive(:logged_in_with_provider?).and_return(true) expect(controller).to receive(:go_to_provider_for_permissions).and_call_original - allow_any_instance_of(Gitlab::LegacyGithubImport::Client) - .to receive(:authorize_url) - .with(users_import_github_callback_url) - .and_call_original + allow(controller).to receive(:authorize_url).and_call_original get :new @@ -46,13 +43,15 @@ RSpec.describe Import::GithubController do end describe "GET callback" do + before do + allow(controller).to receive(:get_token).and_return(token) + allow(controller).to receive(:oauth_options).and_return({}) + + stub_omniauth_provider('github') + end + it "updates access token" do token = "asdasd12345" - allow_any_instance_of(Gitlab::LegacyGithubImport::Client) - .to receive(:get_token).and_return(token) - allow_any_instance_of(Gitlab::LegacyGithubImport::Client) - .to receive(:github_options).and_return({}) - stub_omniauth_provider('github') get :callback @@ -66,7 +65,86 @@ RSpec.describe Import::GithubController do end describe "GET status" do - it_behaves_like 'a GitHub-ish import controller: GET status' + context 'when using OAuth' do + before do + allow(controller).to receive(:logged_in_with_provider?).and_return(true) + end + + context 'when OAuth config is missing' do + let(:new_import_url) { public_send("new_import_#{provider}_url") } + + before do + allow(controller).to receive(:oauth_config).and_return(nil) + end + + it 'returns missing config error' do + expect(controller).to receive(:go_to_provider_for_permissions).and_call_original + + get :status + + expect(session[:"#{provider}_access_token"]).to be_nil + expect(controller).to redirect_to(new_import_url) + expect(flash[:alert]).to eq('Missing OAuth configuration for GitHub.') + end + end + end + + context 'when feature remove_legacy_github_client is disabled' do + before do + stub_feature_flags(remove_legacy_github_client: false) + session[:"#{provider}_access_token"] = 'asdasd12345' + end + + it_behaves_like 'a GitHub-ish import controller: GET status' + + it 'uses Gitlab::LegacyGitHubImport::Client' do + expect(controller.send(:client)).to be_instance_of(Gitlab::LegacyGithubImport::Client) + end + + it 'fetches repos using legacy client' do + expect_next_instance_of(Gitlab::LegacyGithubImport::Client) do |client| + expect(client).to receive(:repos) + end + + get :status + end + end + + context 'when feature remove_legacy_github_client is enabled' do + before do + stub_feature_flags(remove_legacy_github_client: true) + session[:"#{provider}_access_token"] = 'asdasd12345' + end + + it_behaves_like 'a GitHub-ish import controller: GET status' + + it 'uses Gitlab::GithubImport::Client' do + expect(controller.send(:client)).to be_instance_of(Gitlab::GithubImport::Client) + end + + it 'fetches repos using latest github client' do + expect_next_instance_of(Gitlab::GithubImport::Client) do |client| + expect(client).to receive(:each_page).with(:repos).and_return([].to_enum) + end + + get :status + end + + it 'concatenates list of repos from multiple pages' do + repo_1 = OpenStruct.new(login: 'emacs', full_name: 'asd/emacs', name: 'emacs', owner: { login: 'owner' }) + repo_2 = OpenStruct.new(login: 'vim', full_name: 'asd/vim', name: 'vim', owner: { login: 'owner' }) + repos = [OpenStruct.new(objects: [repo_1]), OpenStruct.new(objects: [repo_2])].to_enum + + allow(stub_client).to receive(:each_page).and_return(repos) + + get :status, format: :json + + expect(response).to have_gitlab_http_status(:ok) + expect(json_response.dig('provider_repos').count).to eq(2) + expect(json_response.dig('provider_repos', 0, 'id')).to eq(repo_1.id) + expect(json_response.dig('provider_repos', 1, 'id')).to eq(repo_2.id) + end + end end describe "POST create" do diff --git a/spec/features/issuables/issuable_list_spec.rb b/spec/features/issuables/issuable_list_spec.rb index abebff00f76..7790d8f1c4c 100644 --- a/spec/features/issuables/issuable_list_spec.rb +++ b/spec/features/issuables/issuable_list_spec.rb @@ -15,7 +15,7 @@ RSpec.describe 'issuable list', :js do end issuable_types.each do |issuable_type| - it "avoids N+1 database queries for #{issuable_type.to_s.humanize.pluralize}" do + it "avoids N+1 database queries for #{issuable_type.to_s.humanize.pluralize}", quarantine: { issue: 'https://gitlab.com/gitlab-org/gitlab/-/issues/231426' } do control_count = ActiveRecord::QueryRecorder.new { visit_issuable_list(issuable_type) }.count create_issuables(issuable_type) diff --git a/spec/frontend/flash_spec.js b/spec/frontend/flash_spec.js index fa7c1904339..68e506702c7 100644 --- a/spec/frontend/flash_spec.js +++ b/spec/frontend/flash_spec.js @@ -1,4 +1,10 @@ -import flash, { createFlashEl, createAction, hideFlash, removeFlashClickListener } from '~/flash'; +import flash, { + newCreateFlash, + createFlashEl, + createAction, + hideFlash, + removeFlashClickListener, +} from '~/flash'; describe('Flash', () => { describe('createFlashEl', () => { @@ -205,6 +211,109 @@ describe('Flash', () => { }); }); + describe('newCreateFlash', () => { + const message = 'test'; + const type = 'alert'; + const parent = document; + const fadeTransition = false; + const addBodyClass = true; + const defaultParams = { + message, + type, + parent, + actionConfig: null, + fadeTransition, + addBodyClass, + }; + + describe('no flash-container', () => { + it('does not add to the DOM', () => { + const flashEl = newCreateFlash({ message }); + + expect(flashEl).toBeNull(); + + expect(document.querySelector('.flash-alert')).toBeNull(); + }); + }); + + describe('with flash-container', () => { + beforeEach(() => { + setFixtures( + '
      ', + ); + }); + + afterEach(() => { + document.querySelector('.js-content-wrapper').remove(); + }); + + it('adds flash element into container', () => { + newCreateFlash({ ...defaultParams }); + + expect(document.querySelector('.flash-alert')).not.toBeNull(); + + expect(document.body.className).toContain('flash-shown'); + }); + + it('adds flash into specified parent', () => { + newCreateFlash({ ...defaultParams, parent: document.querySelector('.content-wrapper') }); + + expect(document.querySelector('.content-wrapper .flash-alert')).not.toBeNull(); + expect(document.querySelector('.content-wrapper').innerText.trim()).toEqual(message); + }); + + it('adds container classes when inside content-wrapper', () => { + newCreateFlash(defaultParams); + + expect(document.querySelector('.flash-text').className).toBe('flash-text'); + expect(document.querySelector('.content-wrapper').innerText.trim()).toEqual(message); + }); + + it('does not add container when outside of content-wrapper', () => { + document.querySelector('.content-wrapper').className = 'js-content-wrapper'; + newCreateFlash(defaultParams); + + expect(document.querySelector('.flash-text').className.trim()).toContain('flash-text'); + }); + + it('removes element after clicking', () => { + newCreateFlash({ ...defaultParams }); + + document.querySelector('.flash-alert .js-close-icon').click(); + + expect(document.querySelector('.flash-alert')).toBeNull(); + + expect(document.body.className).not.toContain('flash-shown'); + }); + + describe('with actionConfig', () => { + it('adds action link', () => { + newCreateFlash({ + ...defaultParams, + actionConfig: { + title: 'test', + }, + }); + + expect(document.querySelector('.flash-action')).not.toBeNull(); + }); + + it('calls actionConfig clickHandler on click', () => { + const actionConfig = { + title: 'test', + clickHandler: jest.fn(), + }; + + newCreateFlash({ ...defaultParams, actionConfig }); + + document.querySelector('.flash-action').click(); + + expect(actionConfig.clickHandler).toHaveBeenCalled(); + }); + }); + }); + }); + describe('removeFlashClickListener', () => { beforeEach(() => { document.body.innerHTML += ` diff --git a/spec/frontend/monitoring/components/__snapshots__/dashboard_template_spec.js.snap b/spec/frontend/monitoring/components/__snapshots__/dashboard_template_spec.js.snap index 5662d1c3700..f50b14570af 100644 --- a/spec/frontend/monitoring/components/__snapshots__/dashboard_template_spec.js.snap +++ b/spec/frontend/monitoring/components/__snapshots__/dashboard_template_spec.js.snap @@ -99,36 +99,21 @@ exports[`Dashboard template matches the default snapshot 1`] = `
      + + + +
      -
      - -
      +
      - - - - - - - - - - - -
      diff --git a/spec/frontend/monitoring/components/dashboard_actions_menu_spec.js b/spec/frontend/monitoring/components/dashboard_actions_menu_spec.js new file mode 100644 index 00000000000..1f6178b895b --- /dev/null +++ b/spec/frontend/monitoring/components/dashboard_actions_menu_spec.js @@ -0,0 +1,388 @@ +import { shallowMount } from '@vue/test-utils'; +import { createStore } from '~/monitoring/stores'; +import { setupAllDashboards, setupStoreWithData } from '../store_utils'; +import { redirectTo } from '~/lib/utils/url_utility'; +import Tracking from '~/tracking'; +import ActionsMenu from '~/monitoring/components/dashboard_actions_menu.vue'; +import CustomMetricsFormFields from '~/custom_metrics/components/custom_metrics_form_fields.vue'; +import { dashboardActionsMenuProps, dashboardGitResponse } from '../mock_data'; +import * as types from '~/monitoring/stores/mutation_types'; + +jest.mock('~/lib/utils/url_utility', () => ({ + redirectTo: jest.fn(), + queryToObject: jest.fn(), +})); + +describe('Actions menu', () => { + const ootbDashboards = [dashboardGitResponse[0], dashboardGitResponse[2]]; + const customDashboard = dashboardGitResponse[1]; + + let store; + let wrapper; + + const findAddMetricItem = () => wrapper.find('[data-testid="add-metric-item"]'); + const findAddMetricModal = () => wrapper.find('[data-testid="add-metric-modal"]'); + const findAddMetricModalSubmitButton = () => + wrapper.find('[data-testid="add-metric-modal-submit-button"]'); + const findStarDashboardItem = () => wrapper.find('[data-testid="star-dashboard-item"]'); + const findEditDashboardItemEnabled = () => + wrapper.find('[data-testid="edit-dashboard-item-enabled"]'); + const findEditDashboardItemDisabled = () => + wrapper.find('[data-testid="edit-dashboard-item-disabled"]'); + const findDuplicateDashboardItem = () => wrapper.find('[data-testid="duplicate-dashboard-item"]'); + const findDuplicateDashboardModal = () => + wrapper.find('[data-testid="duplicate-dashboard-modal"]'); + const findCreateDashboardItem = () => wrapper.find('[data-testid="create-dashboard-item"]'); + const findCreateDashboardModal = () => wrapper.find('[data-testid="create-dashboard-modal"]'); + + const createShallowWrapper = (props = {}, options = {}) => { + wrapper = shallowMount(ActionsMenu, { + propsData: { ...dashboardActionsMenuProps, ...props }, + store, + ...options, + }); + }; + + beforeEach(() => { + store = createStore(); + }); + + afterEach(() => { + wrapper.destroy(); + wrapper = null; + }); + + describe('add metric item', () => { + it('is rendered when custom metrics are available', () => { + createShallowWrapper(); + + return wrapper.vm.$nextTick(() => { + expect(findAddMetricItem().exists()).toBe(true); + }); + }); + + it('is not rendered when custom metrics are not available', () => { + createShallowWrapper({ + addingMetricsAvailable: false, + }); + + return wrapper.vm.$nextTick(() => { + expect(findAddMetricItem().exists()).toBe(false); + }); + }); + + describe('when available', () => { + beforeEach(() => { + createShallowWrapper(); + }); + + it('modal for custom metrics form is rendered', () => { + expect(findAddMetricModal().exists()).toBe(true); + expect(findAddMetricModal().attributes().modalid).toBe('addMetric'); + }); + + it('add metric modal submit button exists', () => { + expect(findAddMetricModalSubmitButton().exists()).toBe(true); + }); + + it('renders custom metrics form fields', () => { + expect(wrapper.find(CustomMetricsFormFields).exists()).toBe(true); + }); + }); + + describe('when not available', () => { + beforeEach(() => { + createShallowWrapper({ addingMetricsAvailable: false }); + }); + + it('modal for custom metrics form is not rendered', () => { + expect(findAddMetricModal().exists()).toBe(false); + }); + }); + + describe('adding new metric from modal', () => { + let origPage; + + beforeEach(done => { + jest.spyOn(Tracking, 'event').mockReturnValue(); + createShallowWrapper(); + + setupStoreWithData(store); + + origPage = document.body.dataset.page; + document.body.dataset.page = 'projects:environments:metrics'; + + wrapper.vm.$nextTick(done); + }); + + afterEach(() => { + document.body.dataset.page = origPage; + }); + + it('is tracked', done => { + const submitButton = findAddMetricModalSubmitButton().vm; + + wrapper.vm.$nextTick(() => { + submitButton.$el.click(); + wrapper.vm.$nextTick(() => { + expect(Tracking.event).toHaveBeenCalledWith( + document.body.dataset.page, + 'click_button', + { + label: 'add_new_metric', + property: 'modal', + value: undefined, + }, + ); + done(); + }); + }); + }); + }); + }); + + describe('edit dashboard yml item', () => { + beforeEach(() => { + createShallowWrapper(); + }); + + describe('when current dashboard is custom', () => { + beforeEach(() => { + setupAllDashboards(store, customDashboard.path); + }); + + it('enabled item is rendered and has falsy disabled attribute', () => { + expect(findEditDashboardItemEnabled().exists()).toBe(true); + expect(findEditDashboardItemEnabled().attributes('disabled')).toBe(undefined); + }); + + it('enabled item links to their edit path', () => { + expect(findEditDashboardItemEnabled().attributes('href')).toBe( + customDashboard.project_blob_path, + ); + }); + + it('disabled item is not rendered', () => { + expect(findEditDashboardItemDisabled().exists()).toBe(false); + }); + }); + + describe.each(ootbDashboards)('when current dashboard is OOTB', dashboard => { + beforeEach(() => { + setupAllDashboards(store, dashboard.path); + }); + + it('disabled item is rendered and has disabled attribute set on it', () => { + expect(findEditDashboardItemDisabled().exists()).toBe(true); + expect(findEditDashboardItemDisabled().attributes('disabled')).toBe(''); + }); + + it('enabled item is not rendered', () => { + expect(findEditDashboardItemEnabled().exists()).toBe(false); + }); + }); + }); + + describe('duplicate dashboard item', () => { + beforeEach(() => { + createShallowWrapper(); + }); + + describe.each(ootbDashboards)('when current dashboard is OOTB', dashboard => { + beforeEach(() => { + setupAllDashboards(store, dashboard.path); + }); + + it('is rendered', () => { + expect(findDuplicateDashboardItem().exists()).toBe(true); + }); + + it('duplicate dashboard modal is rendered', () => { + expect(findDuplicateDashboardModal().exists()).toBe(true); + }); + + it('clicking on item opens up the duplicate dashboard modal', () => { + const modalId = 'duplicateDashboard'; + const modalTrigger = findDuplicateDashboardItem(); + const rootEmit = jest.spyOn(wrapper.vm.$root, '$emit'); + + modalTrigger.trigger('click'); + + return wrapper.vm.$nextTick().then(() => { + expect(rootEmit.mock.calls[0]).toContainEqual(modalId); + }); + }); + }); + + describe('when current dashboard is custom', () => { + beforeEach(() => { + setupAllDashboards(store, customDashboard.path); + }); + + it('is not rendered', () => { + expect(findDuplicateDashboardItem().exists()).toBe(false); + }); + + it('duplicate dashboard modal is not rendered', () => { + expect(findDuplicateDashboardModal().exists()).toBe(false); + }); + }); + + describe('when no dashboard is set', () => { + it('is not rendered', () => { + expect(findDuplicateDashboardItem().exists()).toBe(false); + }); + + it('duplicate dashboard modal is not rendered', () => { + expect(findDuplicateDashboardModal().exists()).toBe(false); + }); + }); + + describe('when a dashboard has been duplicated in the duplicate dashboard modal', () => { + beforeEach(() => { + store.state.monitoringDashboard.projectPath = 'root/sandbox'; + + setupAllDashboards(store, dashboardGitResponse[0].path); + }); + + it('redirects to the newly created dashboard', () => { + delete window.location; + window.location = new URL('https://localhost'); + + const newDashboard = dashboardGitResponse[1]; + + const newDashboardUrl = 'root/sandbox/-/metrics/dashboard.yml'; + findDuplicateDashboardModal().vm.$emit('dashboardDuplicated', newDashboard); + + return wrapper.vm.$nextTick().then(() => { + expect(redirectTo).toHaveBeenCalled(); + expect(redirectTo).toHaveBeenCalledWith(newDashboardUrl); + }); + }); + }); + }); + + describe('star dashboard item', () => { + beforeEach(() => { + createShallowWrapper(); + setupAllDashboards(store); + + jest.spyOn(store, 'dispatch').mockResolvedValue(); + }); + + it('is shown', () => { + expect(findStarDashboardItem().exists()).toBe(true); + }); + + it('is not disabled', () => { + expect(findStarDashboardItem().attributes('disabled')).toBeFalsy(); + }); + + it('is disabled when starring is taking place', () => { + store.commit(`monitoringDashboard/${types.REQUEST_DASHBOARD_STARRING}`); + + return wrapper.vm.$nextTick(() => { + expect(findStarDashboardItem().exists()).toBe(true); + expect(findStarDashboardItem().attributes('disabled')).toBe('true'); + }); + }); + + it('on click it dispatches a toggle star action', () => { + findStarDashboardItem().vm.$emit('click'); + + return wrapper.vm.$nextTick().then(() => { + expect(store.dispatch).toHaveBeenCalledWith( + 'monitoringDashboard/toggleStarredValue', + undefined, + ); + }); + }); + + describe('when dashboard is not starred', () => { + beforeEach(() => { + store.commit(`monitoringDashboard/${types.SET_INITIAL_STATE}`, { + currentDashboard: dashboardGitResponse[0].path, + }); + return wrapper.vm.$nextTick(); + }); + + it('item text shows "Star dashboard"', () => { + expect(findStarDashboardItem().html()).toMatch(/Star dashboard/); + }); + }); + + describe('when dashboard is starred', () => { + beforeEach(() => { + store.commit(`monitoringDashboard/${types.SET_INITIAL_STATE}`, { + currentDashboard: dashboardGitResponse[1].path, + }); + return wrapper.vm.$nextTick(); + }); + + it('item text shows "Unstar dashboard"', () => { + expect(findStarDashboardItem().html()).toMatch(/Unstar dashboard/); + }); + }); + }); + + describe('create dashboard item', () => { + beforeEach(() => { + createShallowWrapper(); + }); + + it('is rendered by default but it is disabled', () => { + expect(findCreateDashboardItem().attributes('disabled')).toBe('true'); + }); + + describe('when project path is set', () => { + const mockProjectPath = 'root/sandbox'; + const mockAddDashboardDocPath = '/doc/add-dashboard'; + + beforeEach(() => { + store.state.monitoringDashboard.projectPath = mockProjectPath; + store.state.monitoringDashboard.addDashboardDocumentationPath = mockAddDashboardDocPath; + }); + + it('is not disabled', () => { + expect(findCreateDashboardItem().attributes('disabled')).toBe(undefined); + }); + + it('renders a modal for creating a dashboard', () => { + expect(findCreateDashboardModal().exists()).toBe(true); + }); + + it('clicking opens up the modal', () => { + const modalId = 'createDashboard'; + const modalTrigger = findCreateDashboardItem(); + const rootEmit = jest.spyOn(wrapper.vm.$root, '$emit'); + + modalTrigger.trigger('click'); + + return wrapper.vm.$nextTick().then(() => { + expect(rootEmit.mock.calls[0]).toContainEqual(modalId); + }); + }); + + it('modal gets passed correct props', () => { + expect(findCreateDashboardModal().props('projectPath')).toBe(mockProjectPath); + expect(findCreateDashboardModal().props('addDashboardDocumentationPath')).toBe( + mockAddDashboardDocPath, + ); + }); + }); + + describe('when project path is not set', () => { + beforeEach(() => { + store.state.monitoringDashboard.projectPath = null; + }); + + it('is disabled', () => { + expect(findCreateDashboardItem().attributes('disabled')).toBe('true'); + }); + + it('does not render a modal for creating a dashboard', () => { + expect(findCreateDashboardModal().exists()).toBe(false); + }); + }); + }); +}); diff --git a/spec/frontend/monitoring/components/dashboard_header_spec.js b/spec/frontend/monitoring/components/dashboard_header_spec.js index ad592a3354a..134c5f32bf7 100644 --- a/spec/frontend/monitoring/components/dashboard_header_spec.js +++ b/spec/frontend/monitoring/components/dashboard_header_spec.js @@ -6,8 +6,7 @@ import DateTimePicker from '~/vue_shared/components/date_time_picker/date_time_p import RefreshButton from '~/monitoring/components/refresh_button.vue'; import DashboardHeader from '~/monitoring/components/dashboard_header.vue'; import DashboardsDropdown from '~/monitoring/components/dashboards_dropdown.vue'; -import DuplicateDashboardModal from '~/monitoring/components/duplicate_dashboard_modal.vue'; -import CreateDashboardModal from '~/monitoring/components/create_dashboard_modal.vue'; +import ActionsMenu from '~/monitoring/components/dashboard_actions_menu.vue'; import { setupAllDashboards, setupStoreWithDashboard, setupStoreWithData } from '../store_utils'; import { environmentData, @@ -18,7 +17,6 @@ import { import { redirectTo } from '~/lib/utils/url_utility'; const mockProjectPath = 'https://path/to/project'; -const mockAddDashboardDocPath = '/doc/add-dashboard'; jest.mock('~/lib/utils/url_utility', () => ({ redirectTo: jest.fn(), @@ -41,13 +39,7 @@ describe('Dashboard header', () => { const findDateTimePicker = () => wrapper.find(DateTimePicker); const findRefreshButton = () => wrapper.find(RefreshButton); - const findActionsMenu = () => wrapper.find('[data-testid="actions-menu"]'); - const findCreateDashboardMenuItem = () => - findActionsMenu().find('[data-testid="action-create-dashboard"]'); - const findCreateDashboardDuplicateItem = () => - findActionsMenu().find('[data-testid="action-duplicate-dashboard"]'); - const findDuplicateDashboardModal = () => wrapper.find(DuplicateDashboardModal); - const findCreateDashboardModal = () => wrapper.find('[data-testid="create-dashboard-modal"]'); + const findActionsMenu = () => wrapper.find(ActionsMenu); const setSearchTerm = searchTerm => { store.commit(`monitoringDashboard/${types.SET_ENVIRONMENTS_FILTER}`, searchTerm); @@ -264,31 +256,6 @@ describe('Dashboard header', () => { }); }); - describe('when a dashboard has been duplicated in the duplicate dashboard modal', () => { - beforeEach(() => { - store.state.monitoringDashboard.projectPath = 'root/sandbox'; - - setupAllDashboards(store, dashboardGitResponse[0].path); - }); - - it('redirects to the newly created dashboard', () => { - delete window.location; - window.location = new URL('https://localhost'); - - const newDashboard = dashboardGitResponse[1]; - - createShallowWrapper(); - - const newDashboardUrl = 'root/sandbox/-/metrics/dashboard.yml'; - findDuplicateDashboardModal().vm.$emit('dashboardDuplicated', newDashboard); - - return wrapper.vm.$nextTick().then(() => { - expect(redirectTo).toHaveBeenCalled(); - expect(redirectTo).toHaveBeenCalledWith(newDashboardUrl); - }); - }); - }); - describe('external dashboard link', () => { beforeEach(() => { store.state.monitoringDashboard.externalDashboardUrl = '/mockUrl'; @@ -307,113 +274,97 @@ describe('Dashboard header', () => { }); describe('actions menu', () => { - beforeEach(() => { - store.state.monitoringDashboard.projectPath = ''; - createShallowWrapper(); - }); - - it('is rendered if projectPath is set in store', () => { - store.state.monitoringDashboard.projectPath = mockProjectPath; - - return wrapper.vm.$nextTick().then(() => { - expect(findActionsMenu().exists()).toBe(true); - }); - }); - - it('is not rendered if projectPath is not set in store', () => { - expect(findActionsMenu().exists()).toBe(false); - }); - - it('contains the create dashboard modal', () => { - store.state.monitoringDashboard.projectPath = mockProjectPath; - - return wrapper.vm.$nextTick().then(() => { - expect(findActionsMenu().contains(CreateDashboardModal)).toBe(true); - }); - }); - - const duplicableCases = [ - null, // When no path is specified, it uses the overview dashboard path. + const ootbDashboards = [ dashboardGitResponse[0].path, - dashboardGitResponse[2].path, selfMonitoringDashboardGitResponse[0].path, ]; - - describe.each(duplicableCases)( - 'when the selected dashboard can be duplicated', - dashboardPath => { - it('contains menu items for "Create New", "Duplicate Dashboard" and a modal for duplicating dashboards', () => { - store.state.monitoringDashboard.projectPath = mockProjectPath; - setupAllDashboards(store, dashboardPath); - - return wrapper.vm.$nextTick().then(() => { - expect(findCreateDashboardMenuItem().exists()).toBe(true); - expect(findCreateDashboardDuplicateItem().exists()).toBe(true); - expect(findDuplicateDashboardModal().exists()).toBe(true); - }); - }); - }, - ); - - const nonDuplicableCases = [ + const customDashboards = [ dashboardGitResponse[1].path, selfMonitoringDashboardGitResponse[1].path, ]; - describe.each(nonDuplicableCases)( - 'when the selected dashboard cannot be duplicated', - dashboardPath => { - it('contains a "Create New" menu item, but no "Duplicate Dashboard" menu item and modal', () => { - store.state.monitoringDashboard.projectPath = mockProjectPath; + it('is rendered', () => { + createShallowWrapper(); + + expect(findActionsMenu().exists()).toBe(true); + }); + + describe('adding metrics prop', () => { + it.each(ootbDashboards)('gets passed true if current dashboard is OOTB', dashboardPath => { + createShallowWrapper({ customMetricsAvailable: true }); + + store.state.monitoringDashboard.emptyState = false; + setupAllDashboards(store, dashboardPath); + + return wrapper.vm.$nextTick().then(() => { + expect(findActionsMenu().props('addingMetricsAvailable')).toBe(true); + }); + }); + + it.each(customDashboards)( + 'gets passed false if current dashboard is custom', + dashboardPath => { + createShallowWrapper({ customMetricsAvailable: true }); + + store.state.monitoringDashboard.emptyState = false; setupAllDashboards(store, dashboardPath); return wrapper.vm.$nextTick().then(() => { - expect(findCreateDashboardMenuItem().exists()).toBe(true); - expect(findCreateDashboardDuplicateItem().exists()).toBe(false); - expect(findDuplicateDashboardModal().exists()).toBe(false); + expect(findActionsMenu().props('addingMetricsAvailable')).toBe(false); }); + }, + ); + + it('gets passed false if empty state is shown', () => { + createShallowWrapper({ customMetricsAvailable: true }); + + store.state.monitoringDashboard.emptyState = true; + setupAllDashboards(store, ootbDashboards[0]); + + return wrapper.vm.$nextTick().then(() => { + expect(findActionsMenu().props('addingMetricsAvailable')).toBe(false); }); - }, - ); - }); + }); - describe('actions menu modals', () => { - beforeEach(() => { - store.state.monitoringDashboard.projectPath = mockProjectPath; - store.state.monitoringDashboard.addDashboardDocumentationPath = mockAddDashboardDocPath; - setupAllDashboards(store); + it('gets passed false if custom metrics are not available', () => { + createShallowWrapper({ customMetricsAvailable: false }); - createShallowWrapper(); - }); + store.state.monitoringDashboard.emptyState = false; + setupAllDashboards(store, ootbDashboards[0]); - it('Clicking on "Create New" opens up a modal', () => { - const modalId = 'createDashboard'; - const modalTrigger = findCreateDashboardMenuItem(); - const rootEmit = jest.spyOn(wrapper.vm.$root, '$emit'); - - modalTrigger.trigger('click'); - - return wrapper.vm.$nextTick().then(() => { - expect(rootEmit.mock.calls[0]).toContainEqual(modalId); + return wrapper.vm.$nextTick().then(() => { + expect(findActionsMenu().props('addingMetricsAvailable')).toBe(false); + }); }); }); - it('"Create new dashboard" modal contains correct buttons', () => { - expect(findCreateDashboardModal().props('projectPath')).toBe(mockProjectPath); - expect(findCreateDashboardModal().props('addDashboardDocumentationPath')).toBe( - mockAddDashboardDocPath, - ); - }); + it('custom metrics path gets passed', () => { + const path = 'https://path/to/customMetrics'; - it('"Duplicate Dashboard" opens up a modal', () => { - const modalId = 'duplicateDashboard'; - const modalTrigger = findCreateDashboardDuplicateItem(); - const rootEmit = jest.spyOn(wrapper.vm.$root, '$emit'); - - modalTrigger.trigger('click'); + createShallowWrapper({ customMetricsPath: path }); return wrapper.vm.$nextTick().then(() => { - expect(rootEmit.mock.calls[0]).toContainEqual(modalId); + expect(findActionsMenu().props('customMetricsPath')).toBe(path); + }); + }); + + it('validate query path gets passed', () => { + const path = 'https://path/to/validateQuery'; + + createShallowWrapper({ validateQueryPath: path }); + + return wrapper.vm.$nextTick().then(() => { + expect(findActionsMenu().props('validateQueryPath')).toBe(path); + }); + }); + + it('default branch gets passed', () => { + const branch = 'branchName'; + + createShallowWrapper({ defaultBranch: branch }); + + return wrapper.vm.$nextTick().then(() => { + expect(findActionsMenu().props('defaultBranch')).toBe(branch); }); }); }); @@ -465,72 +416,4 @@ describe('Dashboard header', () => { }); }); }); - - describe('Add metric button', () => { - const findAddMetricButton = () => wrapper.find('[data-qa-selector="add_metric_button"]'); - - it('is not rendered when custom metrics are not available', () => { - store.state.monitoringDashboard.emptyState = false; - - createShallowWrapper({ - customMetricsAvailable: false, - }); - - setupAllDashboards(store, dashboardGitResponse[0].path); - - return wrapper.vm.$nextTick(() => { - expect(findAddMetricButton().exists()).toBe(false); - }); - }); - - it('is not rendered when displaying empty state', () => { - store.state.monitoringDashboard.emptyState = true; - - createShallowWrapper({ - customMetricsAvailable: true, - }); - - setupAllDashboards(store, dashboardGitResponse[0].path); - - return wrapper.vm.$nextTick(() => { - expect(findAddMetricButton().exists()).toBe(false); - }); - }); - - describe('system dashboards', () => { - const systemDashboards = [ - dashboardGitResponse[0].path, - selfMonitoringDashboardGitResponse[0].path, - ]; - const nonSystemDashboards = [ - dashboardGitResponse[1].path, - dashboardGitResponse[2].path, - selfMonitoringDashboardGitResponse[1].path, - ]; - - beforeEach(() => { - store.state.monitoringDashboard.emptyState = false; - - createShallowWrapper({ - customMetricsAvailable: true, - }); - }); - - it.each(systemDashboards)('is rendered for system dashboards', dashboardPath => { - setupAllDashboards(store, dashboardPath); - - return wrapper.vm.$nextTick(() => { - expect(findAddMetricButton().exists()).toBe(true); - }); - }); - - it.each(nonSystemDashboards)('is not rendered for non-system dashboards', dashboardPath => { - setupAllDashboards(store, dashboardPath); - - return wrapper.vm.$nextTick(() => { - expect(findAddMetricButton().exists()).toBe(false); - }); - }); - }); - }); }); diff --git a/spec/frontend/monitoring/components/dashboard_spec.js b/spec/frontend/monitoring/components/dashboard_spec.js index 1f9f6a738f2..4ab3ae3588d 100644 --- a/spec/frontend/monitoring/components/dashboard_spec.js +++ b/spec/frontend/monitoring/components/dashboard_spec.js @@ -1,7 +1,5 @@ import { shallowMount, mount } from '@vue/test-utils'; -import Tracking from '~/tracking'; import { ESC_KEY, ESC_KEY_IE11 } from '~/lib/utils/keys'; -import { GlModal } from '@gitlab/ui'; import { objectToQuery } from '~/lib/utils/url_utility'; import VueDraggable from 'vuedraggable'; import MockAdapter from 'axios-mock-adapter'; @@ -10,7 +8,6 @@ import { dashboardEmptyStates, metricStates } from '~/monitoring/constants'; import Dashboard from '~/monitoring/components/dashboard.vue'; import DashboardHeader from '~/monitoring/components/dashboard_header.vue'; -import CustomMetricsFormFields from '~/custom_metrics/components/custom_metrics_form_fields.vue'; import EmptyState from '~/monitoring/components/empty_state.vue'; import GroupEmptyState from '~/monitoring/components/group_empty_state.vue'; import DashboardPanel from '~/monitoring/components/dashboard_panel.vue'; @@ -42,8 +39,6 @@ describe('Dashboard', () => { let wrapper; let mock; - const findDashboardHeader = () => wrapper.find(DashboardHeader); - const createShallowWrapper = (props = {}, options = {}) => { wrapper = shallowMount(Dashboard, { propsData: { ...dashboardProps, ...props }, @@ -446,84 +441,6 @@ describe('Dashboard', () => { }); }); - describe('star dashboards', () => { - const findToggleStar = () => findDashboardHeader().find({ ref: 'toggleStarBtn' }); - - beforeEach(() => { - createShallowWrapper(); - setupAllDashboards(store); - }); - - it('toggle star button is shown', () => { - expect(findToggleStar().exists()).toBe(true); - expect(findToggleStar().props('disabled')).toBe(false); - }); - - it('toggle star button is disabled when starring is taking place', () => { - store.commit(`monitoringDashboard/${types.REQUEST_DASHBOARD_STARRING}`); - - return wrapper.vm.$nextTick(() => { - expect(findToggleStar().exists()).toBe(true); - expect(findToggleStar().props('disabled')).toBe(true); - }); - }); - - describe('when the dashboard list is loaded', () => { - // Tooltip element should wrap directly - const getToggleTooltip = () => findToggleStar().element.parentElement.getAttribute('title'); - - beforeEach(() => { - setupAllDashboards(store); - jest.spyOn(store, 'dispatch'); - }); - - it('dispatches a toggle star action', () => { - findToggleStar().vm.$emit('click'); - - return wrapper.vm.$nextTick().then(() => { - expect(store.dispatch).toHaveBeenCalledWith( - 'monitoringDashboard/toggleStarredValue', - undefined, - ); - }); - }); - - describe('when dashboard is not starred', () => { - beforeEach(() => { - store.commit(`monitoringDashboard/${types.SET_INITIAL_STATE}`, { - currentDashboard: dashboardGitResponse[0].path, - }); - return wrapper.vm.$nextTick(); - }); - - it('toggle star button shows "Star dashboard"', () => { - expect(getToggleTooltip()).toBe('Star dashboard'); - }); - - it('toggle star button shows an unstarred state', () => { - expect(findToggleStar().attributes('icon')).toBe('star-o'); - }); - }); - - describe('when dashboard is starred', () => { - beforeEach(() => { - store.commit(`monitoringDashboard/${types.SET_INITIAL_STATE}`, { - currentDashboard: dashboardGitResponse[1].path, - }); - return wrapper.vm.$nextTick(); - }); - - it('toggle star button shows "Star dashboard"', () => { - expect(getToggleTooltip()).toBe('Unstar dashboard'); - }); - - it('toggle star button shows a starred state', () => { - expect(findToggleStar().attributes('icon')).toBe('star'); - }); - }); - }); - }); - describe('variables section', () => { beforeEach(() => { createShallowWrapper({ hasMetrics: true }); @@ -800,33 +717,6 @@ describe('Dashboard', () => { }); }); - describe('dashboard edit link', () => { - const findEditLink = () => wrapper.find('.js-edit-link'); - - beforeEach(() => { - createShallowWrapper({ hasMetrics: true }); - - setupAllDashboards(store); - return wrapper.vm.$nextTick(); - }); - - it('is not present for the overview dashboard', () => { - expect(findEditLink().exists()).toBe(false); - }); - - it('is present for a custom dashboard, and links to its edit_path', () => { - const dashboard = dashboardGitResponse[1]; - store.commit(`monitoringDashboard/${types.SET_INITIAL_STATE}`, { - currentDashboard: dashboard.path, - }); - - return wrapper.vm.$nextTick().then(() => { - expect(findEditLink().exists()).toBe(true); - expect(findEditLink().attributes('href')).toBe(dashboard.project_blob_path); - }); - }); - }); - describe('document title', () => { const originalTitle = 'Original Title'; const overviewDashboardName = dashboardGitResponse[0].display_name; @@ -940,74 +830,4 @@ describe('Dashboard', () => { expect(dashboardPanel.exists()).toBe(true); }); }); - - describe('add custom metrics', () => { - const findAddMetricButton = () => findDashboardHeader().find({ ref: 'addMetricBtn' }); - - describe('when not available', () => { - beforeEach(() => { - createShallowWrapper({ - hasMetrics: true, - customMetricsPath: '/endpoint', - }); - }); - it('does not render add button on the dashboard', () => { - expect(findAddMetricButton().exists()).toBe(false); - }); - }); - - describe('when available', () => { - let origPage; - beforeEach(done => { - jest.spyOn(Tracking, 'event').mockReturnValue(); - createShallowWrapper({ - hasMetrics: true, - customMetricsPath: '/endpoint', - customMetricsAvailable: true, - }); - setupStoreWithData(store); - - origPage = document.body.dataset.page; - document.body.dataset.page = 'projects:environments:metrics'; - - wrapper.vm.$nextTick(done); - }); - afterEach(() => { - document.body.dataset.page = origPage; - }); - - it('renders add button on the dashboard', () => { - expect(findAddMetricButton()).toBeDefined(); - }); - - it('uses modal for custom metrics form', () => { - expect(wrapper.find(GlModal).exists()).toBe(true); - expect(wrapper.find(GlModal).attributes().modalid).toBe('addMetric'); - }); - it('adding new metric is tracked', done => { - const submitButton = wrapper - .find(DashboardHeader) - .find({ ref: 'submitCustomMetricsFormBtn' }).vm; - wrapper.vm.$nextTick(() => { - submitButton.$el.click(); - wrapper.vm.$nextTick(() => { - expect(Tracking.event).toHaveBeenCalledWith( - document.body.dataset.page, - 'click_button', - { - label: 'add_new_metric', - property: 'modal', - value: undefined, - }, - ); - done(); - }); - }); - }); - - it('renders custom metrics form fields', () => { - expect(wrapper.find(CustomMetricsFormFields).exists()).toBe(true); - }); - }); - }); }); diff --git a/spec/frontend/monitoring/mock_data.js b/spec/frontend/monitoring/mock_data.js index a22f35b4315..17b1df30269 100644 --- a/spec/frontend/monitoring/mock_data.js +++ b/spec/frontend/monitoring/mock_data.js @@ -622,3 +622,10 @@ export const dashboardHeaderProps = { end: '2020-01-01T01:00:00.000Z', }, }; + +export const dashboardActionsMenuProps = { + defaultBranch: 'master', + addingMetricsAvailable: true, + customMetricsPath: 'https://path/to/customMetrics', + validateQueryPath: 'https://path/to/validateQuery', +}; diff --git a/spec/frontend/packages/details/components/composer_installation_spec.js b/spec/frontend/packages/details/components/composer_installation_spec.js new file mode 100644 index 00000000000..767945d416d --- /dev/null +++ b/spec/frontend/packages/details/components/composer_installation_spec.js @@ -0,0 +1,95 @@ +import Vuex from 'vuex'; +import { shallowMount, createLocalVue } from '@vue/test-utils'; +import { GlSprintf, GlLink } from '@gitlab/ui'; +import ComposerInstallation from '~/packages/details/components/composer_installation.vue'; +import CodeInstructions from '~/packages/details/components/code_instruction.vue'; +import { TrackingActions } from '~/packages/details/constants'; +import { registryUrl as composerHelpPath } from 'jest/packages/details/mock_data'; +import { composerPackage as packageEntity } from 'jest/packages/mock_data'; + +const localVue = createLocalVue(); +localVue.use(Vuex); + +describe('ComposerInstallation', () => { + let wrapper; + + const composerRegistryIncludeStr = 'foo/registry'; + const composerPackageIncludeStr = 'foo/package'; + + const store = new Vuex.Store({ + state: { + packageEntity, + composerHelpPath, + }, + getters: { + composerRegistryInclude: () => composerRegistryIncludeStr, + composerPackageInclude: () => composerPackageIncludeStr, + }, + }); + + const findCodeInstructions = () => wrapper.findAll(CodeInstructions); + const findRegistryIncludeTitle = () => wrapper.find('[data-testid="registry-include-title"]'); + const findPackageIncludeTitle = () => wrapper.find('[data-testid="package-include-title"]'); + const findHelpText = () => wrapper.find('[data-testid="help-text"]'); + const findHelpLink = () => wrapper.find(GlLink); + + function createComponent() { + wrapper = shallowMount(ComposerInstallation, { + localVue, + store, + stubs: { + GlSprintf, + }, + }); + } + + beforeEach(() => { + createComponent(); + }); + + afterEach(() => { + wrapper.destroy(); + }); + + describe('registry include command', () => { + it('uses code_instructions', () => { + const registryIncludeCommand = findCodeInstructions().at(0); + expect(registryIncludeCommand.exists()).toBe(true); + expect(registryIncludeCommand.props()).toMatchObject({ + instruction: composerRegistryIncludeStr, + copyText: 'Copy registry include', + trackingAction: TrackingActions.COPY_COMPOSER_REGISTRY_INCLUDE_COMMAND, + }); + }); + + it('has the correct title', () => { + expect(findRegistryIncludeTitle().text()).toBe('composer.json registry include'); + }); + }); + + describe('package include command', () => { + it('uses code_instructions', () => { + const registryIncludeCommand = findCodeInstructions().at(1); + expect(registryIncludeCommand.exists()).toBe(true); + expect(registryIncludeCommand.props()).toMatchObject({ + instruction: composerPackageIncludeStr, + copyText: 'Copy require package include', + trackingAction: TrackingActions.COPY_COMPOSER_PACKAGE_INCLUDE_COMMAND, + }); + }); + + it('has the correct title', () => { + expect(findPackageIncludeTitle().text()).toBe('composer.json require package include'); + }); + + it('has the correct help text', () => { + expect(findHelpText().text()).toBe( + 'For more information on Composer packages in GitLab, see the documentation.', + ); + expect(findHelpLink().attributes()).toMatchObject({ + href: composerHelpPath, + target: '_blank', + }); + }); + }); +}); diff --git a/spec/frontend/packages/details/components/installations_commands_spec.js b/spec/frontend/packages/details/components/installations_commands_spec.js index 65904749e2c..60da34ebcd9 100644 --- a/spec/frontend/packages/details/components/installations_commands_spec.js +++ b/spec/frontend/packages/details/components/installations_commands_spec.js @@ -6,8 +6,16 @@ import MavenInstallation from '~/packages/details/components/maven_installation. import ConanInstallation from '~/packages/details/components/conan_installation.vue'; import NugetInstallation from '~/packages/details/components/nuget_installation.vue'; import PypiInstallation from '~/packages/details/components/pypi_installation.vue'; +import ComposerInstallation from '~/packages/details/components/composer_installation.vue'; -import { conanPackage, mavenPackage, npmPackage, nugetPackage, pypiPackage } from '../../mock_data'; +import { + conanPackage, + mavenPackage, + npmPackage, + nugetPackage, + pypiPackage, + composerPackage, +} from '../../mock_data'; describe('InstallationCommands', () => { let wrapper; @@ -23,6 +31,7 @@ describe('InstallationCommands', () => { const conanInstallation = () => wrapper.find(ConanInstallation); const nugetInstallation = () => wrapper.find(NugetInstallation); const pypiInstallation = () => wrapper.find(PypiInstallation); + const composerInstallation = () => wrapper.find(ComposerInstallation); afterEach(() => { wrapper.destroy(); @@ -30,12 +39,13 @@ describe('InstallationCommands', () => { describe('installation instructions', () => { describe.each` - packageEntity | selector - ${conanPackage} | ${conanInstallation} - ${mavenPackage} | ${mavenInstallation} - ${npmPackage} | ${npmInstallation} - ${nugetPackage} | ${nugetInstallation} - ${pypiPackage} | ${pypiInstallation} + packageEntity | selector + ${conanPackage} | ${conanInstallation} + ${mavenPackage} | ${mavenInstallation} + ${npmPackage} | ${npmInstallation} + ${nugetPackage} | ${nugetInstallation} + ${pypiPackage} | ${pypiInstallation} + ${composerPackage} | ${composerInstallation} `('renders', ({ packageEntity, selector }) => { it(`${packageEntity.package_type} instructions exist`, () => { createComponent({ packageEntity }); diff --git a/spec/helpers/packages_helper_spec.rb b/spec/helpers/packages_helper_spec.rb index 6dc6f8b2299..1917c851547 100644 --- a/spec/helpers/packages_helper_spec.rb +++ b/spec/helpers/packages_helper_spec.rb @@ -44,6 +44,14 @@ RSpec.describe PackagesHelper do end end + describe 'composer_registry_url' do + it 'return the composer registry url' do + url = helper.composer_registry_url(1) + + expect(url).to eq("#{base_url}group/1/-/packages/composer/packages.json") + end + end + describe 'packages_coming_soon_enabled?' do it 'returns false when the feature flag is disabled' do stub_feature_flags(packages_coming_soon: false) diff --git a/spec/policies/personal_access_token_policy_spec.rb b/spec/policies/personal_access_token_policy_spec.rb index 706150597b2..71795202e13 100644 --- a/spec/policies/personal_access_token_policy_spec.rb +++ b/spec/policies/personal_access_token_policy_spec.rb @@ -5,38 +5,59 @@ require 'spec_helper' RSpec.describe PersonalAccessTokenPolicy do include AdminModeHelper - using RSpec::Parameterized::TableSyntax + subject { described_class.new(current_user, token) } - where(:user_type, :owned_by_same_user, :expected_permitted?) do - :user | true | true - :user | false | false - :admin | false | true + context 'current_user is an administrator', :enable_admin_mode do + let_it_be(:current_user) { build(:admin) } + + context 'not the owner of the token' do + let_it_be(:token) { build(:personal_access_token) } + + it { is_expected.to be_allowed(:read_token) } + it { is_expected.to be_allowed(:revoke_token) } + end + + context 'owner of the token' do + let_it_be(:token) { build(:personal_access_token, user: current_user) } + + it { is_expected.to be_allowed(:read_token) } + it { is_expected.to be_allowed(:revoke_token) } + end end - with_them do - context 'determine if a token is readable or revocable by a user' do - let(:user) { build_stubbed(user_type) } - let(:token_owner) { owned_by_same_user ? user : build(:user) } - let(:token) { build(:personal_access_token, user: token_owner) } + context 'current_user is not an administrator' do + let_it_be(:current_user) { build(:user) } - subject { described_class.new(user, token) } + context 'not the owner of the token' do + let_it_be(:token) { build(:personal_access_token) } - before do - enable_admin_mode!(user) if user.admin? - end + it { is_expected.to be_disallowed(:read_token) } + it { is_expected.to be_disallowed(:revoke_token) } + end - it { is_expected.to(expected_permitted? ? be_allowed(:read_token) : be_disallowed(:read_token)) } - it { is_expected.to(expected_permitted? ? be_allowed(:revoke_token) : be_disallowed(:revoke_token)) } + context 'owner of the token' do + let_it_be(:token) { build(:personal_access_token, user: current_user) } + + it { is_expected.to be_allowed(:read_token) } + it { is_expected.to be_allowed(:revoke_token) } end end context 'current_user is a blocked administrator', :enable_admin_mode do - subject { described_class.new(current_user, token) } + let_it_be(:current_user) { build(:admin, :blocked) } - let(:current_user) { create(:user, :admin, :blocked) } - let(:token) { create(:personal_access_token) } + context 'owner of the token' do + let_it_be(:token) { build(:personal_access_token, user: current_user) } - it { is_expected.to be_disallowed(:revoke_token) } - it { is_expected.to be_disallowed(:read_token) } + it { is_expected.to be_disallowed(:read_token) } + it { is_expected.to be_disallowed(:revoke_token) } + end + + context 'not the owner of the token' do + let_it_be(:token) { build(:personal_access_token) } + + it { is_expected.to be_disallowed(:read_token) } + it { is_expected.to be_disallowed(:revoke_token) } + end end end diff --git a/spec/requests/api/import_github_spec.rb b/spec/requests/api/import_github_spec.rb index f026314f7a8..bbfb17fe753 100644 --- a/spec/requests/api/import_github_spec.rb +++ b/spec/requests/api/import_github_spec.rb @@ -22,7 +22,7 @@ RSpec.describe API::ImportGithub do before do Grape::Endpoint.before_each do |endpoint| - allow(endpoint).to receive(:client).and_return(double('client', user: provider_user, repo: provider_repo).as_null_object) + allow(endpoint).to receive(:client).and_return(double('client', user: provider_user, repository: provider_repo).as_null_object) end end diff --git a/spec/services/import/github_service_spec.rb b/spec/services/import/github_service_spec.rb index 266ff309662..408d7767254 100644 --- a/spec/services/import/github_service_spec.rb +++ b/spec/services/import/github_service_spec.rb @@ -6,7 +6,6 @@ RSpec.describe Import::GithubService do let_it_be(:user) { create(:user) } let_it_be(:token) { 'complex-token' } let_it_be(:access_params) { { github_access_token: 'github-complex-token' } } - let_it_be(:client) { Gitlab::LegacyGithubImport::Client.new(token) } let_it_be(:params) { { repo_id: 123, new_name: 'new_repo', target_namespace: 'root' } } let(:subject) { described_class.new(client, user, params) } @@ -15,41 +14,61 @@ RSpec.describe Import::GithubService do allow(subject).to receive(:authorized?).and_return(true) end - context 'do not raise an exception on input error' do - let(:exception) { Octokit::ClientError.new(status: 404, body: 'Not Found') } + shared_examples 'handles errors' do |klass| + let(:client) { klass.new(token) } - before do - expect(client).to receive(:repo).and_raise(exception) + context 'do not raise an exception on input error' do + let(:exception) { Octokit::ClientError.new(status: 404, body: 'Not Found') } + + before do + expect(client).to receive(:repository).and_raise(exception) + end + + it 'logs the original error' do + expect(Gitlab::Import::Logger).to receive(:error).with({ + message: 'Import failed due to a GitHub error', + status: 404, + error: 'Not Found' + }).and_call_original + + subject.execute(access_params, :github) + end + + it 'returns an error' do + result = subject.execute(access_params, :github) + + expect(result).to include( + message: 'Import failed due to a GitHub error: Not Found', + status: :error, + http_status: :unprocessable_entity + ) + end end - it 'logs the original error' do - expect(Gitlab::Import::Logger).to receive(:error).with({ - message: 'Import failed due to a GitHub error', - status: 404, - error: 'Not Found' - }).and_call_original + it 'raises an exception for unknown error causes' do + exception = StandardError.new('Not Implemented') - subject.execute(access_params, :github) - end + expect(client).to receive(:repository).and_raise(exception) - it 'returns an error' do - result = subject.execute(access_params, :github) + expect(Gitlab::Import::Logger).not_to receive(:error) - expect(result).to include( - message: 'Import failed due to a GitHub error: Not Found', - status: :error, - http_status: :unprocessable_entity - ) + expect { subject.execute(access_params, :github) }.to raise_error(exception) end end - it 'raises an exception for unknown error causes' do - exception = StandardError.new('Not Implemented') + context 'when remove_legacy_github_client feature flag is enabled' do + before do + stub_feature_flags(remove_legacy_github_client: true) + end - expect(client).to receive(:repo).and_raise(exception) + include_examples 'handles errors', Gitlab::GithubImport::Client + end - expect(Gitlab::Import::Logger).not_to receive(:error) + context 'when remove_legacy_github_client feature flag is enabled' do + before do + stub_feature_flags(remove_legacy_github_client: false) + end - expect { subject.execute(access_params, :github) }.to raise_error(exception) + include_examples 'handles errors', Gitlab::LegacyGithubImport::Client end end diff --git a/spec/support/shared_examples/controllers/githubish_import_controller_shared_examples.rb b/spec/support/shared_examples/controllers/githubish_import_controller_shared_examples.rb index a01fa49d701..8bc91f72b8c 100644 --- a/spec/support/shared_examples/controllers/githubish_import_controller_shared_examples.rb +++ b/spec/support/shared_examples/controllers/githubish_import_controller_shared_examples.rb @@ -72,7 +72,7 @@ RSpec.shared_examples 'a GitHub-ish import controller: GET status' do project = create(:project, import_type: provider, namespace: user.namespace, import_status: :finished, import_source: 'example/repo') group = create(:group) group.add_owner(user) - stub_client(repos: [repo, org_repo], orgs: [org], org_repos: [org_repo]) + stub_client(repos: [repo, org_repo], orgs: [org], org_repos: [org_repo], each_page: [OpenStruct.new(objects: [repo, org_repo])].to_enum) get :status, format: :json @@ -85,7 +85,7 @@ RSpec.shared_examples 'a GitHub-ish import controller: GET status' do it "does not show already added project" do project = create(:project, import_type: provider, namespace: user.namespace, import_status: :finished, import_source: 'asd/vim') - stub_client(repos: [repo], orgs: []) + stub_client(repos: [repo], orgs: [], each_page: [OpenStruct.new(objects: [repo])].to_enum) get :status, format: :json @@ -94,7 +94,8 @@ RSpec.shared_examples 'a GitHub-ish import controller: GET status' do end it "touches the etag cache store" do - expect(stub_client(repos: [], orgs: [])).to receive(:repos) + stub_client(repos: [], orgs: [], each_page: []) + expect_next_instance_of(Gitlab::EtagCaching::Store) do |store| expect(store).to receive(:touch) { "realtime_changes_import_#{provider}_path" } end @@ -102,17 +103,11 @@ RSpec.shared_examples 'a GitHub-ish import controller: GET status' do get :status, format: :json end - it "requests provider repos list" do - expect(stub_client(repos: [], orgs: [])).to receive(:repos) - - get :status - - expect(response).to have_gitlab_http_status(:ok) - end - it "handles an invalid access token" do - allow_any_instance_of(Gitlab::LegacyGithubImport::Client) - .to receive(:repos).and_raise(Octokit::Unauthorized) + client = stub_client(repos: [], orgs: [], each_page: []) + + allow(client).to receive(:repos).and_raise(Octokit::Unauthorized) + allow(client).to receive(:each_page).and_raise(Octokit::Unauthorized) get :status @@ -122,7 +117,7 @@ RSpec.shared_examples 'a GitHub-ish import controller: GET status' do end it "does not produce N+1 database queries" do - stub_client(repos: [repo], orgs: []) + stub_client(repos: [repo], orgs: [], each_page: [].to_enum) group_a = create(:group) group_a.add_owner(user) create(:project, :import_started, import_type: provider, namespace: user.namespace) @@ -144,10 +139,12 @@ RSpec.shared_examples 'a GitHub-ish import controller: GET status' do let(:repo_2) { OpenStruct.new(login: 'emacs', full_name: 'asd/emacs', name: 'emacs', owner: { login: 'owner' }) } let(:project) { create(:project, import_type: provider, namespace: user.namespace, import_status: :finished, import_source: 'example/repo') } let(:group) { create(:group) } + let(:repos) { [repo, repo_2, org_repo] } before do group.add_owner(user) - stub_client(repos: [repo, repo_2, org_repo], orgs: [org], org_repos: [org_repo]) + client = stub_client(repos: repos, orgs: [org], org_repos: [org_repo]) + allow(client).to receive(:each_page).and_return([OpenStruct.new(objects: repos)].to_enum) end it 'filters list of repositories by name' do @@ -187,14 +184,14 @@ RSpec.shared_examples 'a GitHub-ish import controller: POST create' do end before do - stub_client(user: provider_user, repo: provider_repo) + stub_client(user: provider_user, repo: provider_repo, repository: provider_repo) assign_session_token(provider) end it 'returns 200 response when the project is imported successfully' do allow(Gitlab::LegacyGithubImport::ProjectCreator) .to receive(:new).with(provider_repo, provider_repo.name, user.namespace, user, access_params, type: provider) - .and_return(double(execute: project)) + .and_return(double(execute: project)) post :create, format: :json @@ -208,7 +205,7 @@ RSpec.shared_examples 'a GitHub-ish import controller: POST create' do allow(Gitlab::LegacyGithubImport::ProjectCreator) .to receive(:new).with(provider_repo, provider_repo.name, user.namespace, user, access_params, type: provider) - .and_return(double(execute: project)) + .and_return(double(execute: project)) post :create, format: :json @@ -219,7 +216,7 @@ RSpec.shared_examples 'a GitHub-ish import controller: POST create' do it "touches the etag cache store" do allow(Gitlab::LegacyGithubImport::ProjectCreator) .to receive(:new).with(provider_repo, provider_repo.name, user.namespace, user, access_params, type: provider) - .and_return(double(execute: project)) + .and_return(double(execute: project)) expect_next_instance_of(Gitlab::EtagCaching::Store) do |store| expect(store).to receive(:touch) { "realtime_changes_import_#{provider}_path" } end @@ -232,7 +229,7 @@ RSpec.shared_examples 'a GitHub-ish import controller: POST create' do it "takes the current user's namespace" do expect(Gitlab::LegacyGithubImport::ProjectCreator) .to receive(:new).with(provider_repo, provider_repo.name, user.namespace, user, access_params, type: provider) - .and_return(double(execute: project)) + .and_return(double(execute: project)) post :create, format: :json end @@ -244,7 +241,7 @@ RSpec.shared_examples 'a GitHub-ish import controller: POST create' do it "takes the current user's namespace" do expect(Gitlab::LegacyGithubImport::ProjectCreator) .to receive(:new).with(provider_repo, provider_repo.name, user.namespace, user, access_params, type: provider) - .and_return(double(execute: project)) + .and_return(double(execute: project)) post :create, format: :json end @@ -271,7 +268,7 @@ RSpec.shared_examples 'a GitHub-ish import controller: POST create' do it "takes the existing namespace" do expect(Gitlab::LegacyGithubImport::ProjectCreator) .to receive(:new).with(provider_repo, provider_repo.name, existing_namespace, user, access_params, type: provider) - .and_return(double(execute: project)) + .and_return(double(execute: project)) post :create, format: :json end @@ -283,7 +280,7 @@ RSpec.shared_examples 'a GitHub-ish import controller: POST create' do expect(Gitlab::LegacyGithubImport::ProjectCreator) .to receive(:new).with(provider_repo, provider_repo.name, user.namespace, user, access_params, type: provider) - .and_return(double(execute: project)) + .and_return(double(execute: project)) post :create, format: :json end @@ -302,7 +299,7 @@ RSpec.shared_examples 'a GitHub-ish import controller: POST create' do it "takes the new namespace" do expect(Gitlab::LegacyGithubImport::ProjectCreator) .to receive(:new).with(provider_repo, provider_repo.name, an_instance_of(Group), user, access_params, type: provider) - .and_return(double(execute: project)) + .and_return(double(execute: project)) post :create, params: { target_namespace: provider_repo.name }, format: :json end @@ -323,7 +320,7 @@ RSpec.shared_examples 'a GitHub-ish import controller: POST create' do it "takes the current user's namespace" do expect(Gitlab::LegacyGithubImport::ProjectCreator) .to receive(:new).with(provider_repo, provider_repo.name, user.namespace, user, access_params, type: provider) - .and_return(double(execute: project)) + .and_return(double(execute: project)) post :create, format: :json end @@ -341,7 +338,7 @@ RSpec.shared_examples 'a GitHub-ish import controller: POST create' do it 'takes the selected namespace and name' do expect(Gitlab::LegacyGithubImport::ProjectCreator) .to receive(:new).with(provider_repo, test_name, test_namespace, user, access_params, type: provider) - .and_return(double(execute: project)) + .and_return(double(execute: project)) post :create, params: { target_namespace: test_namespace.name, new_name: test_name }, format: :json end @@ -349,7 +346,7 @@ RSpec.shared_examples 'a GitHub-ish import controller: POST create' do it 'takes the selected name and default namespace' do expect(Gitlab::LegacyGithubImport::ProjectCreator) .to receive(:new).with(provider_repo, test_name, user.namespace, user, access_params, type: provider) - .and_return(double(execute: project)) + .and_return(double(execute: project)) post :create, params: { new_name: test_name }, format: :json end @@ -368,7 +365,7 @@ RSpec.shared_examples 'a GitHub-ish import controller: POST create' do it 'takes the selected namespace and name' do expect(Gitlab::LegacyGithubImport::ProjectCreator) .to receive(:new).with(provider_repo, test_name, nested_namespace, user, access_params, type: provider) - .and_return(double(execute: project)) + .and_return(double(execute: project)) post :create, params: { target_namespace: nested_namespace.full_path, new_name: test_name }, format: :json end @@ -380,7 +377,7 @@ RSpec.shared_examples 'a GitHub-ish import controller: POST create' do it 'takes the selected namespace and name' do expect(Gitlab::LegacyGithubImport::ProjectCreator) .to receive(:new).with(provider_repo, test_name, kind_of(Namespace), user, access_params, type: provider) - .and_return(double(execute: project)) + .and_return(double(execute: project)) post :create, params: { target_namespace: 'foo/bar', new_name: test_name }, format: :json end @@ -388,7 +385,7 @@ RSpec.shared_examples 'a GitHub-ish import controller: POST create' do it 'creates the namespaces' do allow(Gitlab::LegacyGithubImport::ProjectCreator) .to receive(:new).with(provider_repo, test_name, kind_of(Namespace), user, access_params, type: provider) - .and_return(double(execute: project)) + .and_return(double(execute: project)) expect { post :create, params: { target_namespace: 'foo/bar', new_name: test_name }, format: :json } .to change { Namespace.count }.by(2) @@ -397,7 +394,7 @@ RSpec.shared_examples 'a GitHub-ish import controller: POST create' do it 'new namespace has the right parent' do allow(Gitlab::LegacyGithubImport::ProjectCreator) .to receive(:new).with(provider_repo, test_name, kind_of(Namespace), user, access_params, type: provider) - .and_return(double(execute: project)) + .and_return(double(execute: project)) post :create, params: { target_namespace: 'foo/bar', new_name: test_name }, format: :json @@ -416,7 +413,7 @@ RSpec.shared_examples 'a GitHub-ish import controller: POST create' do it 'takes the selected namespace and name' do expect(Gitlab::LegacyGithubImport::ProjectCreator) .to receive(:new).with(provider_repo, test_name, kind_of(Namespace), user, access_params, type: provider) - .and_return(double(execute: project)) + .and_return(double(execute: project)) post :create, params: { target_namespace: 'foo/foobar/bar', new_name: test_name }, format: :json end @@ -424,7 +421,7 @@ RSpec.shared_examples 'a GitHub-ish import controller: POST create' do it 'creates the namespaces' do allow(Gitlab::LegacyGithubImport::ProjectCreator) .to receive(:new).with(provider_repo, test_name, kind_of(Namespace), user, access_params, type: provider) - .and_return(double(execute: project)) + .and_return(double(execute: project)) expect { post :create, params: { target_namespace: 'foo/foobar/bar', new_name: test_name }, format: :json } .to change { Namespace.count }.by(2) @@ -432,11 +429,11 @@ RSpec.shared_examples 'a GitHub-ish import controller: POST create' do it 'does not create a new namespace under the user namespace' do expect(Gitlab::LegacyGithubImport::ProjectCreator) - .to receive(:new).with(provider_repo, test_name, user.namespace, user, access_params, type: provider) - .and_return(double(execute: project)) + .to receive(:new).with(provider_repo, test_name, user.namespace, user, access_params, type: provider) + .and_return(double(execute: project)) expect { post :create, params: { target_namespace: "#{user.namespace_path}/test_group", new_name: test_name }, format: :js } - .not_to change { Namespace.count } + .not_to change { Namespace.count } end end @@ -446,19 +443,19 @@ RSpec.shared_examples 'a GitHub-ish import controller: POST create' do it 'does not take the selected namespace and name' do expect(Gitlab::LegacyGithubImport::ProjectCreator) - .to receive(:new).with(provider_repo, test_name, user.namespace, user, access_params, type: provider) - .and_return(double(execute: project)) + .to receive(:new).with(provider_repo, test_name, user.namespace, user, access_params, type: provider) + .and_return(double(execute: project)) post :create, params: { target_namespace: 'foo/foobar/bar', new_name: test_name }, format: :js end it 'does not create the namespaces' do allow(Gitlab::LegacyGithubImport::ProjectCreator) - .to receive(:new).with(provider_repo, test_name, kind_of(Namespace), user, access_params, type: provider) - .and_return(double(execute: project)) + .to receive(:new).with(provider_repo, test_name, kind_of(Namespace), user, access_params, type: provider) + .and_return(double(execute: project)) expect { post :create, params: { target_namespace: 'foo/foobar/bar', new_name: test_name }, format: :js } - .not_to change { Namespace.count } + .not_to change { Namespace.count } end end @@ -471,8 +468,8 @@ RSpec.shared_examples 'a GitHub-ish import controller: POST create' do user.update!(can_create_group: false) expect(Gitlab::LegacyGithubImport::ProjectCreator) - .to receive(:new).with(provider_repo, test_name, group, user, access_params, type: provider) - .and_return(double(execute: project)) + .to receive(:new).with(provider_repo, test_name, group, user, access_params, type: provider) + .and_return(double(execute: project)) post :create, params: { target_namespace: 'foo', new_name: test_name }, format: :js end