diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2023-03-07 12:08:06 +0000 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2023-03-07 12:08:06 +0000 |
commit | ebe0e306bbd6e913763bf1865b7778c001994e31 (patch) | |
tree | 49b9dc98391420a4c2a050e07bc5e6001bccdbbe | |
parent | 47da68850624438b5b5b9ff9d648b1e83282c446 (diff) | |
download | gitlab-ce-ebe0e306bbd6e913763bf1865b7778c001994e31.tar.gz |
Add latest changes from gitlab-org/gitlab@master
180 files changed, 974 insertions, 637 deletions
diff --git a/.gitignore b/.gitignore index 1dd9f4ef8aa..04d5ec06bf6 100644 --- a/.gitignore +++ b/.gitignore @@ -70,6 +70,7 @@ eslint-report.html /tags /vendor/bundle/* /vendor/gitaly-ruby +/vendor/package_metadata_db/ /builds* /.gitlab_workhorse_secret /.gitlab_pages_secret diff --git a/.gitlab/ci/package-and-test/main.gitlab-ci.yml b/.gitlab/ci/package-and-test/main.gitlab-ci.yml index 7b2f398cbda..9bcbb780dae 100644 --- a/.gitlab/ci/package-and-test/main.gitlab-ci.yml +++ b/.gitlab/ci/package-and-test/main.gitlab-ci.yml @@ -59,11 +59,11 @@ stages: - job: download-knapsack-report artifacts: true optional: true + - job: check-release-set variables: QA_GENERATE_ALLURE_REPORT: "true" QA_CAN_TEST_PRAEFECT: "false" QA_INTERCEPT_REQUESTS: "true" - QA_RUN_TYPE: e2e-package-and-test EE_LICENSE: $QA_EE_LICENSE GITHUB_ACCESS_TOKEN: $QA_GITHUB_ACCESS_TOKEN GITLAB_QA_ADMIN_ACCESS_TOKEN: $QA_ADMIN_ACCESS_TOKEN @@ -155,7 +155,6 @@ trigger-omnibus: RUBY3_BUILD: $OMNIBUS_GITLAB_RUBY3_BUILD RUBY2_BUILD: $OMNIBUS_GITLAB_RUBY2_BUILD CACHE_EDITION: $OMNIBUS_GITLAB_CACHE_EDITION - SKIP_QA_DOCKER: "true" SKIP_QA_TEST: "true" ee: "true" trigger: @@ -642,7 +641,6 @@ e2e-test-report: GITLAB_AUTH_TOKEN: $PROJECT_TOKEN_FOR_CI_SCRIPTS_API_USAGE ALLURE_PROJECT_PATH: $CI_PROJECT_PATH ALLURE_MERGE_REQUEST_IID: $CI_MERGE_REQUEST_IID - ALLURE_JOB_NAME: e2e-package-and-test GIT_STRATEGY: none upload-knapsack-report: diff --git a/.gitlab/ci/package-and-test/variables.gitlab-ci.yml b/.gitlab/ci/package-and-test/variables.gitlab-ci.yml index 1ba046308a8..b7c4e5519ca 100644 --- a/.gitlab/ci/package-and-test/variables.gitlab-ci.yml +++ b/.gitlab/ci/package-and-test/variables.gitlab-ci.yml @@ -8,6 +8,7 @@ variables: OMNIBUS_GITLAB_RUBY3_BUILD: "false" OMNIBUS_GITLAB_RUBY2_BUILD: "false" OMNIBUS_GITLAB_CACHE_EDITION: "GITLAB" + ALLURE_JOB_NAME: $CI_PROJECT_NAME QA_LOG_LEVEL: "info" QA_TESTS: "" QA_FEATURE_FLAGS: "" diff --git a/.rubocop_todo/rspec/missing_feature_category.yml b/.rubocop_todo/rspec/missing_feature_category.yml index e45726f8a51..833260cd6d4 100644 --- a/.rubocop_todo/rspec/missing_feature_category.yml +++ b/.rubocop_todo/rspec/missing_feature_category.yml @@ -1143,9 +1143,7 @@ RSpec/MissingFeatureCategory: - 'ee/spec/lib/quality/seeders/vulnerabilities_spec.rb' - 'ee/spec/lib/sidebars/groups/menus/administration_menu_spec.rb' - 'ee/spec/lib/sidebars/groups/menus/analytics_menu_spec.rb' - - 'ee/spec/lib/sidebars/groups/menus/epics_menu_spec.rb' - 'ee/spec/lib/sidebars/groups/menus/security_compliance_menu_spec.rb' - - 'ee/spec/lib/sidebars/groups/menus/wiki_menu_spec.rb' - 'ee/spec/lib/slack/api_spec.rb' - 'ee/spec/lib/slack/block_kit/app_home_opened_spec.rb' - 'ee/spec/lib/slack/block_kit/incident_management/incident_modal_opened_spec.rb' @@ -5400,37 +5398,22 @@ RSpec/MissingFeatureCategory: - 'spec/lib/sidebars/concerns/container_with_html_options_spec.rb' - 'spec/lib/sidebars/concerns/link_with_html_options_spec.rb' - 'spec/lib/sidebars/groups/menus/ci_cd_menu_spec.rb' - - 'spec/lib/sidebars/groups/menus/group_information_menu_spec.rb' - 'spec/lib/sidebars/groups/menus/invite_team_members_menu_spec.rb' - - 'spec/lib/sidebars/groups/menus/issues_menu_spec.rb' - - 'spec/lib/sidebars/groups/menus/kubernetes_menu_spec.rb' - - 'spec/lib/sidebars/groups/menus/merge_requests_menu_spec.rb' - 'spec/lib/sidebars/groups/menus/observability_menu_spec.rb' - - 'spec/lib/sidebars/groups/menus/packages_registries_menu_spec.rb' - - 'spec/lib/sidebars/groups/menus/scope_menu_spec.rb' - 'spec/lib/sidebars/groups/menus/settings_menu_spec.rb' - 'spec/lib/sidebars/menu_item_spec.rb' - 'spec/lib/sidebars/projects/context_spec.rb' - 'spec/lib/sidebars/projects/menus/analytics_menu_spec.rb' - 'spec/lib/sidebars/projects/menus/ci_cd_menu_spec.rb' - 'spec/lib/sidebars/projects/menus/confluence_menu_spec.rb' - - 'spec/lib/sidebars/projects/menus/deployments_menu_spec.rb' - 'spec/lib/sidebars/projects/menus/external_issue_tracker_menu_spec.rb' - 'spec/lib/sidebars/projects/menus/external_wiki_menu_spec.rb' - 'spec/lib/sidebars/projects/menus/hidden_menu_spec.rb' - - 'spec/lib/sidebars/projects/menus/infrastructure_menu_spec.rb' - 'spec/lib/sidebars/projects/menus/invite_team_members_menu_spec.rb' - - 'spec/lib/sidebars/projects/menus/issues_menu_spec.rb' - - 'spec/lib/sidebars/projects/menus/merge_requests_menu_spec.rb' - 'spec/lib/sidebars/projects/menus/monitor_menu_spec.rb' - - 'spec/lib/sidebars/projects/menus/packages_registries_menu_spec.rb' - - 'spec/lib/sidebars/projects/menus/project_information_menu_spec.rb' - - 'spec/lib/sidebars/projects/menus/scope_menu_spec.rb' - 'spec/lib/sidebars/projects/menus/security_compliance_menu_spec.rb' - 'spec/lib/sidebars/projects/menus/settings_menu_spec.rb' - 'spec/lib/sidebars/projects/menus/shimo_menu_spec.rb' - - 'spec/lib/sidebars/projects/menus/snippets_menu_spec.rb' - - 'spec/lib/sidebars/projects/menus/wiki_menu_spec.rb' - 'spec/lib/sidebars/projects/menus/zentao_menu_spec.rb' - 'spec/lib/system_check/app/authorized_keys_permission_check_spec.rb' - 'spec/lib/system_check/app/git_user_default_ssh_config_check_spec.rb' diff --git a/GITALY_SERVER_VERSION b/GITALY_SERVER_VERSION index 3970647ecc2..0fd64bd648e 100644 --- a/GITALY_SERVER_VERSION +++ b/GITALY_SERVER_VERSION @@ -1 +1 @@ -f99ae76f9fecec6c162dbd990845ba9c7c5727d6 +1739a8ca9a5786b4730620b742153f45e00cb094 diff --git a/app/assets/javascripts/api/user_api.js b/app/assets/javascripts/api/user_api.js index 45fddc3a696..bcb0f079d3d 100644 --- a/app/assets/javascripts/api/user_api.js +++ b/app/assets/javascripts/api/user_api.js @@ -1,5 +1,5 @@ import { DEFAULT_PER_PAGE } from '~/api'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import { __ } from '~/locale'; import axios from '../lib/utils/axios_utils'; import { buildApiUrl } from './api_utils'; diff --git a/app/assets/javascripts/confidential_merge_request/components/project_form_group.vue b/app/assets/javascripts/confidential_merge_request/components/project_form_group.vue index 196f5537a90..97762ff549b 100644 --- a/app/assets/javascripts/confidential_merge_request/components/project_form_group.vue +++ b/app/assets/javascripts/confidential_merge_request/components/project_form_group.vue @@ -1,6 +1,6 @@ <script> import { GlIcon, GlLink, GlSprintf } from '@gitlab/ui'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import Api from '~/api'; import { __ } from '~/locale'; import state from '../state'; diff --git a/app/assets/javascripts/ide/components/new_dropdown/modal.vue b/app/assets/javascripts/ide/components/new_dropdown/modal.vue index dbfaeba9708..d250552742e 100644 --- a/app/assets/javascripts/ide/components/new_dropdown/modal.vue +++ b/app/assets/javascripts/ide/components/new_dropdown/modal.vue @@ -1,7 +1,7 @@ <script> import { GlModal, GlButton } from '@gitlab/ui'; import { mapActions, mapState, mapGetters } from 'vuex'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import { __, sprintf } from '~/locale'; import { modalTypes } from '../../constants'; import { trimPathComponents, getPathParent } from '../../utils'; diff --git a/app/assets/javascripts/ide/components/repo_editor.vue b/app/assets/javascripts/ide/components/repo_editor.vue index b95f8bb5acb..61f597b5585 100644 --- a/app/assets/javascripts/ide/components/repo_editor.vue +++ b/app/assets/javascripts/ide/components/repo_editor.vue @@ -12,7 +12,7 @@ import { import { SourceEditorExtension } from '~/editor/extensions/source_editor_extension_base'; import { EditorWebIdeExtension } from '~/editor/extensions/source_editor_webide_ext'; import SourceEditor from '~/editor/source_editor'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import ModelManager from '~/ide/lib/common/model_manager'; import { defaultDiffEditorOptions, defaultEditorOptions } from '~/ide/lib/editor_options'; import { __ } from '~/locale'; diff --git a/app/assets/javascripts/ide/stores/actions.js b/app/assets/javascripts/ide/stores/actions.js index b7445d3ad0a..0106eeae162 100644 --- a/app/assets/javascripts/ide/stores/actions.js +++ b/app/assets/javascripts/ide/stores/actions.js @@ -1,6 +1,6 @@ import { escape } from 'lodash'; import Vue from 'vue'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import { HTTP_STATUS_NOT_FOUND } from '~/lib/utils/http_status'; import { visitUrl } from '~/lib/utils/url_utility'; import { __, sprintf } from '~/locale'; diff --git a/app/assets/javascripts/ide/stores/actions/merge_request.js b/app/assets/javascripts/ide/stores/actions/merge_request.js index cd8088bf667..9f1eae03685 100644 --- a/app/assets/javascripts/ide/stores/actions/merge_request.js +++ b/app/assets/javascripts/ide/stores/actions/merge_request.js @@ -1,4 +1,4 @@ -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import { __ } from '~/locale'; import { leftSidebarViews, PERMISSION_READ_MR, MAX_MR_FILES_AUTO_OPEN } from '../../constants'; import service from '../../services'; diff --git a/app/assets/javascripts/ide/stores/actions/project.js b/app/assets/javascripts/ide/stores/actions/project.js index 7a6a267e7d0..f4fa52b2d4d 100644 --- a/app/assets/javascripts/ide/stores/actions/project.js +++ b/app/assets/javascripts/ide/stores/actions/project.js @@ -1,5 +1,5 @@ import { escape } from 'lodash'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import { __, sprintf } from '~/locale'; import { logError } from '~/lib/logger'; import api from '~/api'; diff --git a/app/assets/javascripts/ide/stores/modules/commit/actions.js b/app/assets/javascripts/ide/stores/modules/commit/actions.js index 7f8e253ed37..572465f7587 100644 --- a/app/assets/javascripts/ide/stores/modules/commit/actions.js +++ b/app/assets/javascripts/ide/stores/modules/commit/actions.js @@ -1,4 +1,4 @@ -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import { addNumericSuffix } from '~/ide/utils'; import { sprintf, __ } from '~/locale'; import Tracking from '~/tracking'; diff --git a/app/assets/javascripts/ide/stores/modules/terminal/actions/session_controls.js b/app/assets/javascripts/ide/stores/modules/terminal/actions/session_controls.js index 874cc5094d3..411ff0beaba 100644 --- a/app/assets/javascripts/ide/stores/modules/terminal/actions/session_controls.js +++ b/app/assets/javascripts/ide/stores/modules/terminal/actions/session_controls.js @@ -1,4 +1,4 @@ -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import axios from '~/lib/utils/axios_utils'; import { HTTP_STATUS_NOT_FOUND, HTTP_STATUS_UNPROCESSABLE_ENTITY } from '~/lib/utils/http_status'; import * as terminalService from '../../../../services/terminals'; diff --git a/app/assets/javascripts/ide/stores/modules/terminal/actions/session_status.js b/app/assets/javascripts/ide/stores/modules/terminal/actions/session_status.js index 4aa0768d394..463634c946d 100644 --- a/app/assets/javascripts/ide/stores/modules/terminal/actions/session_status.js +++ b/app/assets/javascripts/ide/stores/modules/terminal/actions/session_status.js @@ -1,4 +1,4 @@ -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import axios from '~/lib/utils/axios_utils'; import * as messages from '../messages'; import * as types from '../mutation_types'; diff --git a/app/assets/javascripts/import_entities/components/group_dropdown.vue b/app/assets/javascripts/import_entities/components/group_dropdown.vue index f351a9a392f..5b9e80f9d68 100644 --- a/app/assets/javascripts/import_entities/components/group_dropdown.vue +++ b/app/assets/javascripts/import_entities/components/group_dropdown.vue @@ -3,7 +3,7 @@ import { GlDropdown, GlSearchBoxByType } from '@gitlab/ui'; import { debounce } from 'lodash'; import { s__ } from '~/locale'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import searchNamespacesWhereUserCanCreateProjectsQuery from '~/projects/new/queries/search_namespaces_where_user_can_create_projects.query.graphql'; import { DEBOUNCE_DELAY } from '~/vue_shared/components/filtered_search_bar/constants'; import { MINIMUM_SEARCH_LENGTH } from '~/graphql_shared/constants'; diff --git a/app/assets/javascripts/milestones/components/delete_milestone_modal.vue b/app/assets/javascripts/milestones/components/delete_milestone_modal.vue index 4b3c1bd7d10..7f46456b78f 100644 --- a/app/assets/javascripts/milestones/components/delete_milestone_modal.vue +++ b/app/assets/javascripts/milestones/components/delete_milestone_modal.vue @@ -1,6 +1,6 @@ <script> import { GlSprintf, GlModal } from '@gitlab/ui'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import axios from '~/lib/utils/axios_utils'; import { HTTP_STATUS_NOT_FOUND } from '~/lib/utils/http_status'; import { redirectTo } from '~/lib/utils/url_utility'; diff --git a/app/assets/javascripts/milestones/components/promote_milestone_modal.vue b/app/assets/javascripts/milestones/components/promote_milestone_modal.vue index 9e537fa2c82..bd3896d1a8d 100644 --- a/app/assets/javascripts/milestones/components/promote_milestone_modal.vue +++ b/app/assets/javascripts/milestones/components/promote_milestone_modal.vue @@ -1,6 +1,6 @@ <script> import { GlModal } from '@gitlab/ui'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import axios from '~/lib/utils/axios_utils'; import { visitUrl } from '~/lib/utils/url_utility'; import { __, s__, sprintf } from '~/locale'; diff --git a/app/assets/javascripts/milestones/milestone.js b/app/assets/javascripts/milestones/milestone.js index d9e72340d62..20cc0352c33 100644 --- a/app/assets/javascripts/milestones/milestone.js +++ b/app/assets/javascripts/milestones/milestone.js @@ -1,4 +1,4 @@ -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import { sanitize } from '~/lib/dompurify'; import axios from '~/lib/utils/axios_utils'; import { __ } from '~/locale'; diff --git a/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/details_page/tags_list.vue b/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/details_page/tags_list.vue index c10d8be69a0..f128e77da62 100644 --- a/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/details_page/tags_list.vue +++ b/app/assets/javascripts/packages_and_registries/container_registry/explorer/components/details_page/tags_list.vue @@ -1,6 +1,6 @@ <script> import { GlEmptyState } from '@gitlab/ui'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import { n__ } from '~/locale'; import { joinPaths } from '~/lib/utils/url_utility'; import RegistryList from '~/packages_and_registries/shared/components/registry_list.vue'; diff --git a/app/assets/javascripts/packages_and_registries/container_registry/explorer/pages/details.vue b/app/assets/javascripts/packages_and_registries/container_registry/explorer/pages/details.vue index 83c0d2cdfca..2b5fb1a70ed 100644 --- a/app/assets/javascripts/packages_and_registries/container_registry/explorer/pages/details.vue +++ b/app/assets/javascripts/packages_and_registries/container_registry/explorer/pages/details.vue @@ -1,7 +1,7 @@ <script> import { GlResizeObserverDirective, GlEmptyState } from '@gitlab/ui'; import { GlBreakpointInstance } from '@gitlab/ui/dist/utils'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import axios from '~/lib/utils/axios_utils'; import { joinPaths } from '~/lib/utils/url_utility'; import Tracking from '~/tracking'; diff --git a/app/assets/javascripts/packages_and_registries/container_registry/explorer/pages/list.vue b/app/assets/javascripts/packages_and_registries/container_registry/explorer/pages/list.vue index 8a038d7c974..f14ca4da144 100644 --- a/app/assets/javascripts/packages_and_registries/container_registry/explorer/pages/list.vue +++ b/app/assets/javascripts/packages_and_registries/container_registry/explorer/pages/list.vue @@ -10,7 +10,7 @@ import { } from '@gitlab/ui'; import { get } from 'lodash'; import getContainerRepositoriesQuery from 'shared_queries/container_registry/get_container_repositories.query.graphql'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import Tracking from '~/tracking'; import PersistedSearch from '~/packages_and_registries/shared/components/persisted_search.vue'; import { FILTERED_SEARCH_TERM } from '~/vue_shared/components/filtered_search_bar/constants'; diff --git a/app/assets/javascripts/packages_and_registries/harbor_registry/pages/details.vue b/app/assets/javascripts/packages_and_registries/harbor_registry/pages/details.vue index bafcd78ad5d..bff32a124bc 100644 --- a/app/assets/javascripts/packages_and_registries/harbor_registry/pages/details.vue +++ b/app/assets/javascripts/packages_and_registries/harbor_registry/pages/details.vue @@ -9,7 +9,7 @@ import { TAG_LABEL, } from '~/packages_and_registries/harbor_registry/constants/index'; import { OPERATORS_IS } from '~/vue_shared/components/filtered_search_bar/constants'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils'; import TagsLoader from '~/packages_and_registries/shared/components/tags_loader.vue'; import ArtifactsList from '~/packages_and_registries/harbor_registry/components/details/artifacts_list.vue'; diff --git a/app/assets/javascripts/packages_and_registries/harbor_registry/pages/harbor_tags.vue b/app/assets/javascripts/packages_and_registries/harbor_registry/pages/harbor_tags.vue index 1323d347d10..8bc1ecba5fe 100644 --- a/app/assets/javascripts/packages_and_registries/harbor_registry/pages/harbor_tags.vue +++ b/app/assets/javascripts/packages_and_registries/harbor_registry/pages/harbor_tags.vue @@ -4,7 +4,7 @@ import TagsList from '~/packages_and_registries/harbor_registry/components/tags/ import { getHarborTags } from '~/rest_api'; import { FETCH_TAGS_ERROR_MESSAGE } from '~/packages_and_registries/harbor_registry/constants'; import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import { formatPagination } from '~/packages_and_registries/harbor_registry/utils'; export default { diff --git a/app/assets/javascripts/packages_and_registries/harbor_registry/pages/list.vue b/app/assets/javascripts/packages_and_registries/harbor_registry/pages/list.vue index 931a99649cb..1d8cb0f1360 100644 --- a/app/assets/javascripts/packages_and_registries/harbor_registry/pages/list.vue +++ b/app/assets/javascripts/packages_and_registries/harbor_registry/pages/list.vue @@ -12,7 +12,7 @@ import { dockerPushCommand, dockerLoginCommand, } from '~/packages_and_registries/harbor_registry/utils'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import { SORT_FIELDS, CONNECTION_ERROR_TITLE, diff --git a/app/assets/javascripts/packages_and_registries/infrastructure_registry/details/store/actions.js b/app/assets/javascripts/packages_and_registries/infrastructure_registry/details/store/actions.js index 223f427ce0e..62c4f96eff7 100644 --- a/app/assets/javascripts/packages_and_registries/infrastructure_registry/details/store/actions.js +++ b/app/assets/javascripts/packages_and_registries/infrastructure_registry/details/store/actions.js @@ -1,5 +1,5 @@ import Api from '~/api'; -import { createAlert, VARIANT_SUCCESS, VARIANT_WARNING } from '~/flash'; +import { createAlert, VARIANT_SUCCESS, VARIANT_WARNING } from '~/alert'; import { DELETE_PACKAGE_ERROR_MESSAGE, DELETE_PACKAGE_FILE_ERROR_MESSAGE, diff --git a/app/assets/javascripts/packages_and_registries/infrastructure_registry/list/components/packages_list_app.vue b/app/assets/javascripts/packages_and_registries/infrastructure_registry/list/components/packages_list_app.vue index 0aeeb2c3d15..6ea1fff9ef0 100644 --- a/app/assets/javascripts/packages_and_registries/infrastructure_registry/list/components/packages_list_app.vue +++ b/app/assets/javascripts/packages_and_registries/infrastructure_registry/list/components/packages_list_app.vue @@ -1,7 +1,7 @@ <script> import { GlEmptyState, GlLink, GlSprintf } from '@gitlab/ui'; import { mapActions, mapState } from 'vuex'; -import { createAlert, VARIANT_INFO } from '~/flash'; +import { createAlert, VARIANT_INFO } from '~/alert'; import { historyReplaceState } from '~/lib/utils/common_utils'; import { s__ } from '~/locale'; import { SHOW_DELETE_SUCCESS_ALERT } from '~/packages_and_registries/shared/constants'; diff --git a/app/assets/javascripts/packages_and_registries/infrastructure_registry/list/stores/actions.js b/app/assets/javascripts/packages_and_registries/infrastructure_registry/list/stores/actions.js index 7a452abdc26..ecd987e5cf7 100644 --- a/app/assets/javascripts/packages_and_registries/infrastructure_registry/list/stores/actions.js +++ b/app/assets/javascripts/packages_and_registries/infrastructure_registry/list/stores/actions.js @@ -1,5 +1,5 @@ import Api from '~/api'; -import { createAlert, VARIANT_SUCCESS } from '~/flash'; +import { createAlert, VARIANT_SUCCESS } from '~/alert'; import axios from '~/lib/utils/axios_utils'; import { DELETE_PACKAGE_ERROR_MESSAGE } from '~/packages_and_registries/shared/constants'; import { FILTERED_SEARCH_TERM } from '~/vue_shared/components/filtered_search_bar/constants'; diff --git a/app/assets/javascripts/packages_and_registries/package_registry/components/functional/delete_packages.vue b/app/assets/javascripts/packages_and_registries/package_registry/components/functional/delete_packages.vue index 0914c013108..b7e66d20e78 100644 --- a/app/assets/javascripts/packages_and_registries/package_registry/components/functional/delete_packages.vue +++ b/app/assets/javascripts/packages_and_registries/package_registry/components/functional/delete_packages.vue @@ -1,6 +1,6 @@ <script> import destroyPackagesMutation from '~/packages_and_registries/package_registry/graphql/mutations/destroy_packages.mutation.graphql'; -import { createAlert, VARIANT_SUCCESS, VARIANT_WARNING } from '~/flash'; +import { createAlert, VARIANT_SUCCESS, VARIANT_WARNING } from '~/alert'; import { DELETE_PACKAGE_ERROR_MESSAGE, diff --git a/app/assets/javascripts/packages_and_registries/package_registry/pages/details.vue b/app/assets/javascripts/packages_and_registries/package_registry/pages/details.vue index 4591c2eca87..a5eda6cb47a 100644 --- a/app/assets/javascripts/packages_and_registries/package_registry/pages/details.vue +++ b/app/assets/javascripts/packages_and_registries/package_registry/pages/details.vue @@ -10,7 +10,7 @@ import { GlTabs, GlSprintf, } from '@gitlab/ui'; -import { createAlert, VARIANT_SUCCESS, VARIANT_WARNING } from '~/flash'; +import { createAlert, VARIANT_SUCCESS, VARIANT_WARNING } from '~/alert'; import { TYPENAME_PACKAGES_PACKAGE } from '~/graphql_shared/constants'; import { convertToGraphQLId } from '~/graphql_shared/utils'; import { numberToHumanSize } from '~/lib/utils/number_utils'; diff --git a/app/assets/javascripts/packages_and_registries/package_registry/pages/list.vue b/app/assets/javascripts/packages_and_registries/package_registry/pages/list.vue index ce58ec74914..0aa76a171d1 100644 --- a/app/assets/javascripts/packages_and_registries/package_registry/pages/list.vue +++ b/app/assets/javascripts/packages_and_registries/package_registry/pages/list.vue @@ -1,6 +1,6 @@ <script> import { GlEmptyState, GlLink, GlSprintf } from '@gitlab/ui'; -import { createAlert, VARIANT_INFO } from '~/flash'; +import { createAlert, VARIANT_INFO } from '~/alert'; import { historyReplaceState } from '~/lib/utils/common_utils'; import { s__ } from '~/locale'; import { SHOW_DELETE_SUCCESS_ALERT } from '~/packages_and_registries/shared/constants'; diff --git a/app/assets/javascripts/persistent_user_callout.js b/app/assets/javascripts/persistent_user_callout.js index 6ee33902a01..71dc8c3d020 100644 --- a/app/assets/javascripts/persistent_user_callout.js +++ b/app/assets/javascripts/persistent_user_callout.js @@ -1,4 +1,4 @@ -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import axios from './lib/utils/axios_utils'; import { parseBoolean } from './lib/utils/common_utils'; import { __ } from './locale'; diff --git a/app/assets/javascripts/projects/settings/branch_rules/components/view/constants.js b/app/assets/javascripts/projects/settings/branch_rules/components/view/constants.js index 0b383537e12..b71c33d2b91 100644 --- a/app/assets/javascripts/projects/settings/branch_rules/components/view/constants.js +++ b/app/assets/javascripts/projects/settings/branch_rules/components/view/constants.js @@ -14,11 +14,6 @@ export const I18N = { wildcardsHelpText: s__( 'BranchRules|%{linkStart}Wildcards%{linkEnd} such as *-stable or production/ are supported', ), - forcePushTitle: s__('BranchRules|Force push'), - allowForcePushDescription: s__( - 'BranchRules|All users with push access are allowed to force push.', - ), - disallowForcePushDescription: s__('BranchRules|Force push is not allowed.'), approvalsTitle: s__('BranchRules|Approvals'), manageApprovalsLinkTitle: s__('BranchRules|Manage in merge request approvals'), approvalsDescription: s__( @@ -33,6 +28,9 @@ export const I18N = { allowedToPushHeader: s__('BranchRules|Allowed to push and merge (%{total})'), allowedToMergeHeader: s__('BranchRules|Allowed to merge (%{total})'), approvalsHeader: s__('BranchRules|Required approvals (%{total})'), + allowForcePushTitle: s__('BranchRules|Allows force push'), + doesNotAllowForcePushTitle: s__('BranchRules|Does not allow force push'), + forcePushDescription: s__('BranchRules|From users with push access.'), requiresCodeOwnerApprovalTitle: s__('BranchRules|Requires approval from code owners'), doesNotRequireCodeOwnerApprovalTitle: s__( 'BranchRules|Does not require approval from code owners', diff --git a/app/assets/javascripts/projects/settings/branch_rules/components/view/index.vue b/app/assets/javascripts/projects/settings/branch_rules/components/view/index.vue index ff510361745..6e7c85053dc 100644 --- a/app/assets/javascripts/projects/settings/branch_rules/components/view/index.vue +++ b/app/assets/javascripts/projects/settings/branch_rules/components/view/index.vue @@ -70,10 +70,15 @@ export default { }; }, computed: { - forcePushDescription() { - return this.branchProtection?.allowForcePush - ? this.$options.i18n.allowForcePushDescription - : this.$options.i18n.disallowForcePushDescription; + forcePushAttributes() { + const { allowForcePush } = this.branchProtection; + const icon = allowForcePush ? REQUIRED_ICON : NOT_REQUIRED_ICON; + const iconClass = allowForcePush ? REQUIRED_ICON_CLASS : NOT_REQUIRED_ICON_CLASS; + const title = allowForcePush + ? this.$options.i18n.allowForcePushTitle + : this.$options.i18n.doesNotAllowForcePushTitle; + + return { icon, iconClass, title }; }, codeOwnersApprovalAttributes() { const { codeOwnerApprovalRequired } = this.branchProtection; @@ -184,10 +189,6 @@ export default { :groups="pushAccessLevels.groups" /> - <!-- Force push --> - <strong>{{ $options.i18n.forcePushTitle }}</strong> - <p>{{ forcePushDescription }}</p> - <!-- Allowed to merge --> <protection :header="allowedToMergeHeader" @@ -198,11 +199,25 @@ export default { :groups="mergeAccessLevels.groups" /> + <!-- Force push --> + <div class="gl-display-flex gl-align-items-center"> + <gl-icon + :size="14" + data-testid="force-push-icon" + :name="forcePushAttributes.icon" + :class="forcePushAttributes.iconClass" + /> + <strong class="gl-ml-2">{{ forcePushAttributes.title }}</strong> + </div> + + <div class="gl-text-gray-400 gl-mb-2">{{ $options.i18n.forcePushDescription }}</div> + <!-- EE start --> <!-- Code Owners --> <div v-if="showCodeOwners"> <div class="gl-display-flex gl-align-items-center"> <gl-icon + data-testid="code-owners-icon" :size="14" :name="codeOwnersApprovalAttributes.icon" :class="codeOwnersApprovalAttributes.iconClass" diff --git a/app/assets/javascripts/protected_branches/protected_branch_create.js b/app/assets/javascripts/protected_branches/protected_branch_create.js index 120f75d4f0c..cd37c0de6a5 100644 --- a/app/assets/javascripts/protected_branches/protected_branch_create.js +++ b/app/assets/javascripts/protected_branches/protected_branch_create.js @@ -1,6 +1,6 @@ import $ from 'jquery'; import CreateItemDropdown from '~/create_item_dropdown'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import AccessorUtilities from '~/lib/utils/accessor'; import axios from '~/lib/utils/axios_utils'; import { __ } from '~/locale'; diff --git a/app/assets/javascripts/protected_branches/protected_branch_edit.js b/app/assets/javascripts/protected_branches/protected_branch_edit.js index 1693d869b54..b6c86750723 100644 --- a/app/assets/javascripts/protected_branches/protected_branch_edit.js +++ b/app/assets/javascripts/protected_branches/protected_branch_edit.js @@ -1,5 +1,5 @@ import { find } from 'lodash'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import axios from '~/lib/utils/axios_utils'; import { __ } from '~/locale'; import AccessDropdown from '~/projects/settings/access_dropdown'; diff --git a/app/assets/javascripts/sidebar/components/assignees/sidebar_assignees.vue b/app/assets/javascripts/sidebar/components/assignees/sidebar_assignees.vue index caf3bb2f798..062f63175a7 100644 --- a/app/assets/javascripts/sidebar/components/assignees/sidebar_assignees.vue +++ b/app/assets/javascripts/sidebar/components/assignees/sidebar_assignees.vue @@ -1,6 +1,6 @@ <script> import { refreshUserMergeRequestCounts } from '~/commons/nav/user_merge_requests'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import { TYPE_ISSUE } from '~/issues/constants'; import { __ } from '~/locale'; import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin'; diff --git a/app/assets/javascripts/sidebar/components/assignees/sidebar_assignees_widget.vue b/app/assets/javascripts/sidebar/components/assignees/sidebar_assignees_widget.vue index 46668c968c3..ae81dcb95de 100644 --- a/app/assets/javascripts/sidebar/components/assignees/sidebar_assignees_widget.vue +++ b/app/assets/javascripts/sidebar/components/assignees/sidebar_assignees_widget.vue @@ -1,7 +1,7 @@ <script> import { GlDropdownItem } from '@gitlab/ui'; import Vue from 'vue'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import { TYPE_ALERT, TYPE_ISSUE, TYPE_MERGE_REQUEST } from '~/issues/constants'; import { __, n__ } from '~/locale'; import UserSelect from '~/vue_shared/components/user_select/user_select.vue'; diff --git a/app/assets/javascripts/sidebar/components/crm_contacts/crm_contacts.vue b/app/assets/javascripts/sidebar/components/crm_contacts/crm_contacts.vue index c9ecaf4102f..916ff70a5ea 100644 --- a/app/assets/javascripts/sidebar/components/crm_contacts/crm_contacts.vue +++ b/app/assets/javascripts/sidebar/components/crm_contacts/crm_contacts.vue @@ -1,7 +1,7 @@ <script> import { GlIcon, GlLink, GlPopover, GlTooltipDirective } from '@gitlab/ui'; import { __, n__, sprintf } from '~/locale'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import { convertToGraphQLId, getIdFromGraphQLId } from '~/graphql_shared/utils'; import { TYPENAME_ISSUE } from '~/graphql_shared/constants'; import getIssueCrmContactsQuery from '../../queries/get_issue_crm_contacts.query.graphql'; diff --git a/app/assets/javascripts/sidebar/components/move/move_issue_button.vue b/app/assets/javascripts/sidebar/components/move/move_issue_button.vue index e1259fad6a7..76c47305369 100644 --- a/app/assets/javascripts/sidebar/components/move/move_issue_button.vue +++ b/app/assets/javascripts/sidebar/components/move/move_issue_button.vue @@ -1,7 +1,7 @@ <script> import ProjectSelect from '~/sidebar/components/move/issuable_move_dropdown.vue'; import { __ } from '~/locale'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import { visitUrl } from '~/lib/utils/url_utility'; import moveIssueMutation from '../../queries/move_issue.mutation.graphql'; diff --git a/app/assets/javascripts/sidebar/components/move/move_issues_button.vue b/app/assets/javascripts/sidebar/components/move/move_issues_button.vue index ab4ac9500ad..68c8b35c009 100644 --- a/app/assets/javascripts/sidebar/components/move/move_issues_button.vue +++ b/app/assets/javascripts/sidebar/components/move/move_issues_button.vue @@ -1,6 +1,6 @@ <script> import { GlAlert } from '@gitlab/ui'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import { logError } from '~/lib/logger'; import { s__ } from '~/locale'; import { diff --git a/app/assets/javascripts/sidebar/components/reviewers/sidebar_reviewers.vue b/app/assets/javascripts/sidebar/components/reviewers/sidebar_reviewers.vue index 8dd58d33ecf..9c23f239b4c 100644 --- a/app/assets/javascripts/sidebar/components/reviewers/sidebar_reviewers.vue +++ b/app/assets/javascripts/sidebar/components/reviewers/sidebar_reviewers.vue @@ -3,7 +3,7 @@ // It will soon be overhauled in Issue https://gitlab.com/gitlab-org/gitlab/-/issues/233736 import Vue from 'vue'; import { refreshUserMergeRequestCounts } from '~/commons/nav/user_merge_requests'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import { TYPE_ISSUE } from '~/issues/constants'; import { __ } from '~/locale'; import { getIdFromGraphQLId } from '~/graphql_shared/utils'; diff --git a/app/assets/javascripts/sidebar/components/severity/sidebar_severity_widget.vue b/app/assets/javascripts/sidebar/components/severity/sidebar_severity_widget.vue index 17e0debe71f..55de0ceb388 100644 --- a/app/assets/javascripts/sidebar/components/severity/sidebar_severity_widget.vue +++ b/app/assets/javascripts/sidebar/components/severity/sidebar_severity_widget.vue @@ -1,6 +1,6 @@ <script> import { GlDropdown, GlDropdownItem, GlTooltip, GlSprintf } from '@gitlab/ui'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import { TYPE_INCIDENT } from '~/issues/constants'; import SidebarEditableItem from '~/sidebar/components/sidebar_editable_item.vue'; import updateIssuableSeverity from '../../queries/update_issuable_severity.mutation.graphql'; diff --git a/app/assets/javascripts/sidebar/components/time_tracking/report.vue b/app/assets/javascripts/sidebar/components/time_tracking/report.vue index cffbb6466f2..109e1af85ec 100644 --- a/app/assets/javascripts/sidebar/components/time_tracking/report.vue +++ b/app/assets/javascripts/sidebar/components/time_tracking/report.vue @@ -1,6 +1,6 @@ <script> import { GlLoadingIcon, GlTableLite, GlButton, GlTooltipDirective } from '@gitlab/ui'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import { TYPENAME_ISSUE, TYPENAME_MERGE_REQUEST } from '~/graphql_shared/constants'; import { convertToGraphQLId } from '~/graphql_shared/utils'; import { TYPE_ISSUE } from '~/issues/constants'; diff --git a/app/assets/javascripts/sidebar/components/todo_toggle/sidebar_todo_widget.vue b/app/assets/javascripts/sidebar/components/todo_toggle/sidebar_todo_widget.vue index b86ff279fd8..82ec4537338 100644 --- a/app/assets/javascripts/sidebar/components/todo_toggle/sidebar_todo_widget.vue +++ b/app/assets/javascripts/sidebar/components/todo_toggle/sidebar_todo_widget.vue @@ -1,7 +1,7 @@ <script> import { GlButton, GlIcon, GlTooltipDirective } from '@gitlab/ui'; import { produce } from 'immer'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import { __, sprintf } from '~/locale'; import glFeatureFlagsMixin from '~/vue_shared/mixins/gl_feature_flags_mixin'; import Tracking from '~/tracking'; diff --git a/app/assets/javascripts/sidebar/sidebar_mediator.js b/app/assets/javascripts/sidebar/sidebar_mediator.js index c6a66ab2275..7353694a324 100644 --- a/app/assets/javascripts/sidebar/sidebar_mediator.js +++ b/app/assets/javascripts/sidebar/sidebar_mediator.js @@ -1,4 +1,4 @@ -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import { __ } from '~/locale'; import toast from '~/vue_shared/plugins/global_toast'; import { visitUrl } from '~/lib/utils/url_utility'; diff --git a/app/assets/javascripts/single_file_diff.js b/app/assets/javascripts/single_file_diff.js index 6e5b2ce4dbe..b613e356a7a 100644 --- a/app/assets/javascripts/single_file_diff.js +++ b/app/assets/javascripts/single_file_diff.js @@ -1,7 +1,7 @@ /* eslint-disable consistent-return */ import $ from 'jquery'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import { loadingIconForLegacyJS } from '~/loading_icon_for_legacy_js'; import { spriteIcon } from '~/lib/utils/common_utils'; import FilesCommentButton from './files_comment_button'; diff --git a/app/assets/javascripts/snippets/components/snippet_header.vue b/app/assets/javascripts/snippets/components/snippet_header.vue index 759a3f31a05..231eaff41b5 100644 --- a/app/assets/javascripts/snippets/components/snippet_header.vue +++ b/app/assets/javascripts/snippets/components/snippet_header.vue @@ -78,6 +78,7 @@ export default { isSubmittingSpam: false, errorMessage: '', canCreateSnippet: false, + isDeleteModalVisible: false, }; }, computed: { @@ -164,10 +165,10 @@ export default { : `${gon.relative_url_root}dashboard/snippets`; }, closeDeleteModal() { - this.$refs.deleteModal.hide(); + this.isDeleteModalVisible = false; }, showDeleteModal() { - this.$refs.deleteModal.show(); + this.isDeleteModalVisible = true; }, deleteSnippet() { this.isLoading = true; @@ -291,12 +292,22 @@ export default { </div> </div> - <gl-modal ref="deleteModal" modal-id="delete-modal" title="Example title"> + <gl-modal + ref="deleteModal" + v-model="isDeleteModalVisible" + modal-id="delete-modal" + title="Example title" + > <template #modal-title>{{ __('Delete snippet?') }}</template> - <gl-alert v-if="errorMessage" variant="danger" class="mb-2" @dismiss="errorMessage = ''">{{ - errorMessage - }}</gl-alert> + <gl-alert + v-if="errorMessage" + variant="danger" + class="mb-2" + data-testid="delete-alert" + @dismiss="errorMessage = ''" + >{{ errorMessage }}</gl-alert + > <gl-sprintf :message="__('Are you sure you want to delete %{name}?')"> <template #name> @@ -311,6 +322,7 @@ export default { category="primary" :disabled="isLoading" data-qa-selector="delete_snippet_button" + data-testid="delete-snippet" @click="deleteSnippet" > <gl-loading-icon v-if="isLoading" size="sm" inline /> diff --git a/app/assets/javascripts/vue_shared/components/user_avatar/user_avatar_link.vue b/app/assets/javascripts/vue_shared/components/user_avatar/user_avatar_link.vue index 1a81da3eb0d..ab308d11a79 100644 --- a/app/assets/javascripts/vue_shared/components/user_avatar/user_avatar_link.vue +++ b/app/assets/javascripts/vue_shared/components/user_avatar/user_avatar_link.vue @@ -105,7 +105,7 @@ export default { v-gl-tooltip :title="tooltipText" :tooltip-placement="tooltipPlacement" - class="gl-ml-3" + class="gl-ml-1" data-testid="user-avatar-link-username" > {{ username }} diff --git a/app/controllers/projects/environments_controller.rb b/app/controllers/projects/environments_controller.rb index 600238b04e3..130456306aa 100644 --- a/app/controllers/projects/environments_controller.rb +++ b/app/controllers/projects/environments_controller.rb @@ -288,16 +288,6 @@ class Projects::EnvironmentsController < Projects::ApplicationController def authorize_update_environment! access_denied! unless can?(current_user, :update_environment, environment) end - - def append_info_to_payload(payload) - super - - return unless Feature.enabled?(:environments_search_logging) && params[:search].present? - - # Merging to :metadata will ensure these are logged as top level keys - payload[:metadata] ||= {} - payload[:metadata]['meta.environment.search'] = params[:search] - end end Projects::EnvironmentsController.prepend_mod_with('Projects::EnvironmentsController') diff --git a/app/helpers/sidebars_helper.rb b/app/helpers/sidebars_helper.rb index 823cb9e1de7..47755249a1d 100644 --- a/app/helpers/sidebars_helper.rb +++ b/app/helpers/sidebars_helper.rb @@ -90,7 +90,7 @@ module SidebarsHelper Sidebars::Projects::SuperSidebarPanel.new(context) when 'group' context = group_sidebar_context(group, user, **context_adds) - Sidebars::Groups::Panel.new(context) + Sidebars::Groups::SuperSidebarPanel.new(context) else Sidebars::YourWork::Panel.new(Sidebars::Context.new(current_user: user, container: nil, **context_adds)) end diff --git a/app/models/project.rb b/app/models/project.rb index 21f81f70f18..a4de9d3f08a 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -89,6 +89,14 @@ class Project < ApplicationRecord DEFAULT_SQUASH_COMMIT_TEMPLATE = '%{title}' + PROJECT_FEATURES_DEFAULTS = { + issues: gitlab_config_features.issues, + merge_requests: gitlab_config_features.merge_requests, + builds: gitlab_config_features.builds, + wiki: gitlab_config_features.wiki, + snippets: gitlab_config_features.snippets + }.freeze + cache_markdown_field :description, pipeline: :description attribute :packages_enabled, default: true @@ -101,18 +109,13 @@ class Project < ApplicationRecord attribute :autoclose_referenced_issues, default: true attribute :ci_config_path, default: -> { Gitlab::CurrentSettings.default_ci_config_path } - default_value_for :issues_enabled, gitlab_config_features.issues - default_value_for :merge_requests_enabled, gitlab_config_features.merge_requests - default_value_for :builds_enabled, gitlab_config_features.builds - default_value_for :wiki_enabled, gitlab_config_features.wiki - default_value_for :snippets_enabled, gitlab_config_features.snippets - add_authentication_token_field :runners_token, encrypted: -> { Feature.enabled?(:projects_tokens_optional_encryption) ? :optional : :required }, prefix: RunnersTokenPrefixable::RUNNERS_TOKEN_PREFIX # Storage specific hooks after_initialize :use_hashed_storage + after_initialize :set_project_feature_defaults, if: :new_record? before_validation :mark_remote_mirrors_for_removal, if: -> { RemoteMirror.table_exists? } before_validation :ensure_project_namespace_in_sync @@ -951,27 +954,35 @@ class Project < ApplicationRecord .where(pending_delete: false) .where(archived: false) end + + def project_features_defaults + PROJECT_FEATURES_DEFAULTS + end end def initialize(attributes = nil) - # We can't use default_value_for because the database has a default - # value of 0 for visibility_level. If someone attempts to create a - # private project, default_value_for will assume that the - # visibility_level hasn't changed and will use the application - # setting default, which could be internal or public. For projects - # inside a private group, those levels are invalid. - # - # To fix the problem, we assign the actual default in the application if - # no explicit visibility has been initialized. + # We assign the actual snippet default if no explicit visibility has been initialized. attributes ||= {} unless visibility_attribute_present?(attributes) attributes[:visibility_level] = Gitlab::CurrentSettings.default_project_visibility end + @init_attributes = attributes + super end + # Remove along with ProjectFeaturesCompatibility module + def set_project_feature_defaults + self.class.project_features_defaults.each do |attr, value| + # If the deprecated _enabled or the accepted _access_level attribute is specified, we don't need to set the default + next unless @init_attributes[:"#{attr}_enabled"].nil? && @init_attributes[:"#{attr}_access_level"].nil? + + public_send("#{attr}_enabled=", value) # rubocop:disable GitlabSecurity/PublicSend + end + end + def parent_loaded? association(:namespace).loaded? end @@ -1176,15 +1187,6 @@ class Project < ApplicationRecord end end - # Because we use default_value_for we need to be sure - # packages_enabled= method does exist even if we rollback migration. - # Otherwise many tests from spec/migrations will fail. - def packages_enabled=(value) - if has_attribute?(:packages_enabled) - write_attribute(:packages_enabled, value) - end - end - def cleanup @repository = nil end diff --git a/app/models/snippet.rb b/app/models/snippet.rb index 66d5c3ac801..8ed5513aab9 100644 --- a/app/models/snippet.rb +++ b/app/models/snippet.rb @@ -203,14 +203,7 @@ class Snippet < ApplicationRecord end def initialize(attributes = {}) - # We can't use default_value_for because the database has a default - # value of 0 for visibility_level. If someone attempts to create a - # private snippet, default_value_for will assume that the - # visibility_level hasn't changed and will use the application - # setting default, which could be internal or public. - # - # To fix the problem, we assign the actual snippet default if no - # explicit visibility has been initialized. + # We assign the actual snippet default if no explicit visibility has been initialized. attributes ||= {} unless visibility_attribute_present?(attributes) diff --git a/app/models/wiki_directory.rb b/app/models/wiki_directory.rb index 76fe664f23d..e57d186a3e3 100644 --- a/app/models/wiki_directory.rb +++ b/app/models/wiki_directory.rb @@ -7,34 +7,48 @@ class WikiDirectory validates :slug, presence: true alias_method :to_param, :slug - # Groups a list of wiki pages into a nested collection of WikiPage and WikiDirectory objects, - # preserving the order of the passed pages. - # - # Returns an array with all entries for the toplevel directory. - # - # @param [Array<WikiPage>] pages - # @return [Array<WikiPage, WikiDirectory>] - # - def self.group_pages(pages) - # Build a hash to map paths to created WikiDirectory objects, - # and recursively create them for each level of the path. - # For the toplevel directory we use '' as path, as that's what WikiPage#directory returns. - directories = Hash.new do |_, path| - directories[path] = new(path).tap do |directory| - if path.present? - parent = File.dirname(path) - parent = '' if parent == '.' - directories[parent].entries << directory - directories[parent].entries.delete_if { |item| item.is_a?(WikiPage) && item.slug == directory.slug } + class << self + # Groups a list of wiki pages into a nested collection of WikiPage and WikiDirectory objects, + # preserving the order of the passed pages. + # + # Returns an array with all entries for the toplevel directory. + # + # @param [Array<WikiPage>] pages + # @return [Array<WikiPage, WikiDirectory>] + # + def group_pages(pages) + # Build a hash to map paths to created WikiDirectory objects, + # and recursively create them for each level of the path. + # For the toplevel directory we use '' as path, as that's what WikiPage#directory returns. + directories = Hash.new do |_, path| + directories[path] = new(path).tap do |directory| + if path.present? + parent = File.dirname(path) + parent = '' if parent == '.' + directories[parent].entries << directory + directories[parent].entries.delete_if do |item| + item.is_a?(WikiPage) && item.slug.casecmp?(directory.slug) + end + end end end - end - pages.each do |page| - directories[page.directory].entries << page + pages.each do |page| + next unless directory_for_page?(directories[page.directory], page) + + directories[page.directory].entries << page + end + + directories[''].entries end - directories[''].entries + private + + def directory_for_page?(directory, page) + directory.entries.none? do |item| + item.is_a?(WikiDirectory) && item.slug.casecmp?(page.slug) + end + end end def initialize(slug, entries = []) diff --git a/config/feature_flags/development/environments_search_logging.yml b/config/feature_flags/development/environments_search_logging.yml deleted file mode 100644 index c4cb6036d3a..00000000000 --- a/config/feature_flags/development/environments_search_logging.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- -name: environments_search_logging -introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/107866 -rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/386778 -milestone: '15.8' -type: development -group: group::configure -default_enabled: false diff --git a/doc/administration/sidekiq/index.md b/doc/administration/sidekiq/index.md index 388596532d4..b5e943ccd7d 100644 --- a/doc/administration/sidekiq/index.md +++ b/doc/administration/sidekiq/index.md @@ -170,7 +170,7 @@ Updates to example must be made at: # Replace <database_host> and <database_password> gitlab_rails['db_host'] = '<database_host>' - gitlab_rails['db_port'] = '5432' + gitlab_rails['db_port'] = 5432 gitlab_rails['db_password'] = '<database_password>' ## Prevent database migrations from running on upgrade automatically gitlab_rails['auto_migrate'] = false @@ -257,7 +257,7 @@ To configure the metrics server: ```ruby sidekiq['metrics_enabled'] = true sidekiq['listen_address'] = "localhost" - sidekiq['listen_port'] = "8082" + sidekiq['listen_port'] = 8082 # Optionally log all the metrics server logs to log/sidekiq_exporter.log sidekiq['exporter_log_enabled'] = true @@ -299,7 +299,7 @@ To make health checks available from `localhost:8092`: ```ruby sidekiq['health_checks_enabled'] = true sidekiq['health_checks_listen_address'] = "localhost" - sidekiq['health_checks_listen_port'] = "8092" + sidekiq['health_checks_listen_port'] = 8092 ``` 1. Reconfigure GitLab: diff --git a/doc/user/infrastructure/iac/terraform_template_recipes.md b/doc/user/infrastructure/iac/terraform_template_recipes.md index 89a97f305e4..a79f2758441 100644 --- a/doc/user/infrastructure/iac/terraform_template_recipes.md +++ b/doc/user/infrastructure/iac/terraform_template_recipes.md @@ -36,7 +36,7 @@ include: - template: Terraform.latest.gitlab-ci.yml deploy: - envrionment: + environment: name: $TF_STATE_NAME action: start on_stop: destroy @@ -65,7 +65,7 @@ build: - when: on_success deploy: - envrionment: + environment: name: $TF_STATE_NAME action: start on_stop: destroy diff --git a/lib/gitlab/usage_data_counters/known_events/ci_templates.yml b/lib/gitlab/usage_data_counters/known_events/ci_templates.yml index 66a31e97d9e..e717679e3dc 100644 --- a/lib/gitlab/usage_data_counters/known_events/ci_templates.yml +++ b/lib/gitlab/usage_data_counters/known_events/ci_templates.yml @@ -118,7 +118,6 @@ redis_slot: ci_templates aggregation: weekly - name: p_ci_templates_security_api_discovery - category: ci_templates redis_slot: ci_templates aggregation: weekly - name: p_ci_templates_security_fortify_fod_sast @@ -452,10 +451,8 @@ redis_slot: ci_templates aggregation: weekly - name: p_ci_templates_terraform_module_base - category: ci_templates redis_slot: ci_templates aggregation: weekly - name: p_ci_templates_terraform_module - category: ci_templates redis_slot: ci_templates aggregation: weekly diff --git a/lib/gitlab/usage_data_counters/known_events/common.yml b/lib/gitlab/usage_data_counters/known_events/common.yml index 433bfae4a0a..e7e6c7046c7 100644 --- a/lib/gitlab/usage_data_counters/known_events/common.yml +++ b/lib/gitlab/usage_data_counters/known_events/common.yml @@ -182,7 +182,6 @@ aggregation: daily # Runner group - name: g_runner_fleet_read_jobs_statistics - category: runner redis_slot: runner aggregation: weekly # Secrets Management diff --git a/lib/gitlab/usage_data_counters/known_events/container_registry_events.yml b/lib/gitlab/usage_data_counters/known_events/container_registry_events.yml index e8b14de1769..ac40079a6dc 100644 --- a/lib/gitlab/usage_data_counters/known_events/container_registry_events.yml +++ b/lib/gitlab/usage_data_counters/known_events/container_registry_events.yml @@ -1,22 +1,16 @@ --- - name: i_container_registry_push_tag_user - category: user_container_registry aggregation: weekly redis_slot: container_registry - name: i_container_registry_delete_tag_user - category: user_container_registry aggregation: weekly redis_slot: container_registry - name: i_container_registry_push_repository_user - category: user_container_registry aggregation: weekly redis_slot: container_registry - name: i_container_registry_delete_repository_user - category: user_container_registry aggregation: weekly redis_slot: container_registry - name: i_container_registry_create_repository_user - category: user_container_registry aggregation: weekly redis_slot: container_registry -
\ No newline at end of file diff --git a/lib/sidebars/concerns/super_sidebar_panel.rb b/lib/sidebars/concerns/super_sidebar_panel.rb index 9303d91c0e7..5f3607debbc 100644 --- a/lib/sidebars/concerns/super_sidebar_panel.rb +++ b/lib/sidebars/concerns/super_sidebar_panel.rb @@ -5,10 +5,15 @@ module Sidebars # Contains helper methods aid conversion of a "normal" panel # into a Super Sidebar Panel module SuperSidebarPanel - # Picks an element from the given list and adds it to the current menus - # Used for menus which behave the same in the old nav and Supersidebar - def pick_from_old_menus(old_menus, element) - add_menu(remove_element(old_menus, element)) + # Picks menus from a list and adds them to the current menu list + # if they should be picked into the super sidebar + def pick_from_old_menus(old_menus) + old_menus.select! do |menu| + next true unless menu.pick_into_super_sidebar? + + add_menu(menu) + false + end end def transform_old_menus(current_menus, *old_menus) diff --git a/lib/sidebars/groups/menus/ci_cd_menu.rb b/lib/sidebars/groups/menus/ci_cd_menu.rb index 0c2995f95e6..f32bc49673f 100644 --- a/lib/sidebars/groups/menus/ci_cd_menu.rb +++ b/lib/sidebars/groups/menus/ci_cd_menu.rb @@ -21,6 +21,11 @@ module Sidebars 'rocket' end + override :pick_into_super_sidebar? + def pick_into_super_sidebar? + true + end + private def runners_menu_item diff --git a/lib/sidebars/groups/menus/group_information_menu.rb b/lib/sidebars/groups/menus/group_information_menu.rb index 3ce99e14a04..2364ad85cb5 100644 --- a/lib/sidebars/groups/menus/group_information_menu.rb +++ b/lib/sidebars/groups/menus/group_information_menu.rb @@ -28,6 +28,11 @@ module Sidebars { path: 'groups#subgroups' } end + override :serialize_as_menu_item_args + def serialize_as_menu_item_args + nil + end + private def activity_menu_item @@ -38,6 +43,7 @@ module Sidebars ::Sidebars::MenuItem.new( title: _('Activity'), link: activity_group_path(context.group), + super_sidebar_parent: ::Sidebars::Groups::SuperSidebarMenus::PlanMenu, active_routes: { path: 'groups#activity' }, item_id: :activity ) @@ -51,6 +57,8 @@ module Sidebars ::Sidebars::MenuItem.new( title: _('Labels'), link: group_labels_path(context.group), + super_sidebar_parent: ::Sidebars::Groups::SuperSidebarMenus::PlanMenu, + super_sidebar_before: :activity, active_routes: { controller: :labels }, item_id: :labels ) @@ -64,6 +72,8 @@ module Sidebars ::Sidebars::MenuItem.new( title: _('Members'), link: group_group_members_path(context.group), + sprite_icon: context.is_super_sidebar ? 'users' : nil, + super_sidebar_parent: ::Sidebars::StaticMenu, active_routes: { path: 'group_members#index' }, item_id: :members ) diff --git a/lib/sidebars/groups/menus/issues_menu.rb b/lib/sidebars/groups/menus/issues_menu.rb index 4044cb1c716..75bdb617b1a 100644 --- a/lib/sidebars/groups/menus/issues_menu.rb +++ b/lib/sidebars/groups/menus/issues_menu.rb @@ -49,12 +49,25 @@ module Sidebars } end + override :serialize_as_menu_item_args + def serialize_as_menu_item_args + super.merge({ + active_routes: list_menu_item.active_routes, + sprite_icon: sprite_icon, + pill_count: pill_count, + has_pill: has_pill?, + super_sidebar_parent: ::Sidebars::StaticMenu, + item_id: :group_issue_list + }) + end + private def list_menu_item ::Sidebars::MenuItem.new( title: _('List'), link: issues_group_path(context.group), + super_sidebar_parent: ::Sidebars::NilMenuItem, active_routes: { path: 'groups#issues' }, container_html_options: { aria: { label: _('Issues') } }, item_id: :issue_list @@ -66,11 +79,16 @@ module Sidebars return ::Sidebars::NilMenuItem.new(item_id: :boards) end - title = context.group.multiple_issue_boards_available? ? s_('IssueBoards|Boards') : s_('IssueBoards|Board') + title = if context.is_super_sidebar + context.group.multiple_issue_boards_available? ? s_('Issue boards') : s_('Issue board') + else + context.group.multiple_issue_boards_available? ? s_('IssueBoards|Boards') : s_('IssueBoards|Board') + end ::Sidebars::MenuItem.new( title: title, link: group_boards_path(context.group), + super_sidebar_parent: ::Sidebars::Groups::SuperSidebarMenus::PlanMenu, active_routes: { path: %w[boards#index boards#show] }, item_id: :boards ) @@ -84,6 +102,7 @@ module Sidebars ::Sidebars::MenuItem.new( title: _('Milestones'), link: group_milestones_path(context.group), + super_sidebar_parent: ::Sidebars::Groups::SuperSidebarMenus::PlanMenu, active_routes: { path: 'milestones#index' }, item_id: :milestones ) diff --git a/lib/sidebars/groups/menus/kubernetes_menu.rb b/lib/sidebars/groups/menus/kubernetes_menu.rb index 0d845978a93..a7c14148230 100644 --- a/lib/sidebars/groups/menus/kubernetes_menu.rb +++ b/lib/sidebars/groups/menus/kubernetes_menu.rb @@ -38,6 +38,14 @@ module Sidebars def active_routes { controller: :clusters } end + + override :serialize_as_menu_item_args + def serialize_as_menu_item_args + super.merge({ + super_sidebar_parent: ::Sidebars::Groups::SuperSidebarMenus::OperationsMenu, + item_id: :group_kubernetes_clusters + }) + end end end end diff --git a/lib/sidebars/groups/menus/merge_requests_menu.rb b/lib/sidebars/groups/menus/merge_requests_menu.rb index 050cba07641..5e25c33167c 100644 --- a/lib/sidebars/groups/menus/merge_requests_menu.rb +++ b/lib/sidebars/groups/menus/merge_requests_menu.rb @@ -52,6 +52,17 @@ module Sidebars def active_routes { path: 'groups#merge_requests' } end + + override :serialize_as_menu_item_args + def serialize_as_menu_item_args + super.merge({ + sprite_icon: sprite_icon, + pill_count: pill_count, + has_pill: has_pill?, + super_sidebar_parent: ::Sidebars::StaticMenu, + item_id: :group_merge_request_list + }) + end end end end diff --git a/lib/sidebars/groups/menus/observability_menu.rb b/lib/sidebars/groups/menus/observability_menu.rb index 0a5171eccfe..570a59f7e55 100644 --- a/lib/sidebars/groups/menus/observability_menu.rb +++ b/lib/sidebars/groups/menus/observability_menu.rb @@ -28,6 +28,11 @@ module Sidebars Gitlab::Observability.allowed_for_action?(context.current_user, context.group, :explore) end + override :pick_into_super_sidebar? + def pick_into_super_sidebar? + true + end + private def dashboards_menu_item diff --git a/lib/sidebars/groups/menus/packages_registries_menu.rb b/lib/sidebars/groups/menus/packages_registries_menu.rb index e115ca669d4..73a67bf1142 100644 --- a/lib/sidebars/groups/menus/packages_registries_menu.rb +++ b/lib/sidebars/groups/menus/packages_registries_menu.rb @@ -23,6 +23,11 @@ module Sidebars 'package' end + override :serialize_as_menu_item_args + def serialize_as_menu_item_args + nil + end + private def packages_registry_menu_item @@ -31,6 +36,7 @@ module Sidebars ::Sidebars::MenuItem.new( title: _('Package Registry'), link: group_packages_path(context.group), + super_sidebar_parent: ::Sidebars::Groups::SuperSidebarMenus::OperationsMenu, active_routes: { controller: 'groups/packages' }, item_id: :packages_registry ) @@ -44,6 +50,7 @@ module Sidebars ::Sidebars::MenuItem.new( title: _('Container Registry'), link: group_container_registries_path(context.group), + super_sidebar_parent: ::Sidebars::Groups::SuperSidebarMenus::OperationsMenu, active_routes: { controller: 'groups/registry/repositories' }, item_id: :container_registry ) @@ -59,6 +66,7 @@ module Sidebars ::Sidebars::MenuItem.new( title: _('Harbor Registry'), link: group_harbor_repositories_path(context.group), + super_sidebar_parent: ::Sidebars::Groups::SuperSidebarMenus::OperationsMenu, active_routes: { controller: 'groups/harbor/repositories' }, item_id: :harbor_registry ) @@ -74,6 +82,8 @@ module Sidebars ::Sidebars::MenuItem.new( title: _('Dependency Proxy'), link: group_dependency_proxy_path(context.group), + super_sidebar_parent: ::Sidebars::Groups::SuperSidebarMenus::OperationsMenu, + super_sidebar_before: :packages_registry, active_routes: { controller: 'groups/dependency_proxies' }, item_id: :dependency_proxy ) diff --git a/lib/sidebars/groups/menus/scope_menu.rb b/lib/sidebars/groups/menus/scope_menu.rb index f6e0906dac4..5505f56a6d3 100644 --- a/lib/sidebars/groups/menus/scope_menu.rb +++ b/lib/sidebars/groups/menus/scope_menu.rb @@ -32,6 +32,16 @@ module Sidebars def render? true end + + override :serialize_as_menu_item_args + def serialize_as_menu_item_args + super.merge({ + title: _('Group overview'), + sprite_icon: 'group', + super_sidebar_parent: ::Sidebars::StaticMenu, + item_id: :group_overview + }) + end end end end diff --git a/lib/sidebars/groups/menus/settings_menu.rb b/lib/sidebars/groups/menus/settings_menu.rb index 5b81f22c796..76c5f9c16a5 100644 --- a/lib/sidebars/groups/menus/settings_menu.rb +++ b/lib/sidebars/groups/menus/settings_menu.rb @@ -47,6 +47,11 @@ module Sidebars } end + override :pick_into_super_sidebar? + def pick_into_super_sidebar? + true + end + private def general_menu_item diff --git a/lib/sidebars/groups/panel.rb b/lib/sidebars/groups/panel.rb index 45f24a3e7c4..e8b815bdce7 100644 --- a/lib/sidebars/groups/panel.rb +++ b/lib/sidebars/groups/panel.rb @@ -24,15 +24,6 @@ module Sidebars context.group.subgroup? ? _('Subgroup navigation') : _('Group navigation') end - override :super_sidebar_context_header - def super_sidebar_context_header - @super_sidebar_context_header ||= { - title: context.group.name, - avatar: context.group.avatar_url, - id: context.group.id - } - end - private def add_invite_members_menu diff --git a/lib/sidebars/groups/super_sidebar_menus/operations_menu.rb b/lib/sidebars/groups/super_sidebar_menus/operations_menu.rb new file mode 100644 index 00000000000..195718e0681 --- /dev/null +++ b/lib/sidebars/groups/super_sidebar_menus/operations_menu.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +module Sidebars + module Groups + module SuperSidebarMenus + class OperationsMenu < ::Sidebars::Menu + override :title + def title + _('Operations') + end + + override :sprite_icon + def sprite_icon + 'deployments' + end + end + end + end +end diff --git a/lib/sidebars/groups/super_sidebar_menus/plan_menu.rb b/lib/sidebars/groups/super_sidebar_menus/plan_menu.rb new file mode 100644 index 00000000000..8a90974c0d4 --- /dev/null +++ b/lib/sidebars/groups/super_sidebar_menus/plan_menu.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +module Sidebars + module Groups + module SuperSidebarMenus + class PlanMenu < ::Sidebars::Menu + override :title + def title + _('Plan') + end + + override :sprite_icon + def sprite_icon + 'planning' + end + end + end + end +end diff --git a/lib/sidebars/groups/super_sidebar_panel.rb b/lib/sidebars/groups/super_sidebar_panel.rb new file mode 100644 index 00000000000..620f6e78eda --- /dev/null +++ b/lib/sidebars/groups/super_sidebar_panel.rb @@ -0,0 +1,43 @@ +# frozen_string_literal: true + +module Sidebars + module Groups + class SuperSidebarPanel < ::Sidebars::Groups::Panel + include ::Sidebars::Concerns::SuperSidebarPanel + extend ::Gitlab::Utils::Override + + override :configure_menus + def configure_menus + super + old_menus = @menus + @menus = [] + + add_menu(Sidebars::StaticMenu.new(context)) + add_menu(Sidebars::Groups::SuperSidebarMenus::PlanMenu.new(context)) + + pick_from_old_menus(old_menus) + + insert_menu_before( + Sidebars::Groups::Menus::ObservabilityMenu, + Sidebars::Groups::SuperSidebarMenus::OperationsMenu.new(context) + ) + + insert_menu_before( + Sidebars::Groups::Menus::SettingsMenu, + Sidebars::UncategorizedMenu.new(context) + ) + + transform_old_menus(@menus, @scope_menu, *old_menus) + end + + override :super_sidebar_context_header + def super_sidebar_context_header + { + title: context.group.name, + avatar: context.group.avatar_url, + id: context.group.id + } + end + end + end +end diff --git a/lib/sidebars/menu.rb b/lib/sidebars/menu.rb index 4af385030a8..03995362ff0 100644 --- a/lib/sidebars/menu.rb +++ b/lib/sidebars/menu.rb @@ -96,6 +96,10 @@ module Sidebars end end + def pick_into_super_sidebar? + false + end + # Returns whether the menu has any renderable menu item def has_renderable_items? renderable_items.any? diff --git a/lib/sidebars/projects/menus/analytics_menu.rb b/lib/sidebars/projects/menus/analytics_menu.rb index 643b7ebcd5a..fae2efd91de 100644 --- a/lib/sidebars/projects/menus/analytics_menu.rb +++ b/lib/sidebars/projects/menus/analytics_menu.rb @@ -41,6 +41,11 @@ module Sidebars 'chart' end + override :pick_into_super_sidebar? + def pick_into_super_sidebar? + true + end + private def ci_cd_analytics_menu_item diff --git a/lib/sidebars/projects/menus/ci_cd_menu.rb b/lib/sidebars/projects/menus/ci_cd_menu.rb index 5df99bb9d84..3d11dba1089 100644 --- a/lib/sidebars/projects/menus/ci_cd_menu.rb +++ b/lib/sidebars/projects/menus/ci_cd_menu.rb @@ -39,6 +39,11 @@ module Sidebars 'rocket' end + override :pick_into_super_sidebar? + def pick_into_super_sidebar? + true + end + private def pipelines_menu_item diff --git a/lib/sidebars/projects/menus/issues_menu.rb b/lib/sidebars/projects/menus/issues_menu.rb index 21d42fa3879..6904dc129b7 100644 --- a/lib/sidebars/projects/menus/issues_menu.rb +++ b/lib/sidebars/projects/menus/issues_menu.rb @@ -74,7 +74,8 @@ module Sidebars sprite_icon: sprite_icon, pill_count: pill_count, has_pill: has_pill?, - super_sidebar_parent: ::Sidebars::StaticMenu + super_sidebar_parent: ::Sidebars::StaticMenu, + item_id: :project_issue_list }) end diff --git a/lib/sidebars/projects/menus/merge_requests_menu.rb b/lib/sidebars/projects/menus/merge_requests_menu.rb index 1695d759ed2..cc7fda0c920 100644 --- a/lib/sidebars/projects/menus/merge_requests_menu.rb +++ b/lib/sidebars/projects/menus/merge_requests_menu.rb @@ -71,7 +71,8 @@ module Sidebars sprite_icon: sprite_icon, pill_count: pill_count, has_pill: has_pill?, - super_sidebar_parent: ::Sidebars::StaticMenu + super_sidebar_parent: ::Sidebars::StaticMenu, + item_id: :project_merge_request_list }) end end diff --git a/lib/sidebars/projects/menus/monitor_menu.rb b/lib/sidebars/projects/menus/monitor_menu.rb index fea71e4aefd..333112e13b6 100644 --- a/lib/sidebars/projects/menus/monitor_menu.rb +++ b/lib/sidebars/projects/menus/monitor_menu.rb @@ -38,6 +38,11 @@ module Sidebars { controller: [:user, :gcp] } end + override :pick_into_super_sidebar? + def pick_into_super_sidebar? + true + end + private def feature_enabled? diff --git a/lib/sidebars/projects/menus/repository_menu.rb b/lib/sidebars/projects/menus/repository_menu.rb index 5bfc9e727ff..158a29f0b31 100644 --- a/lib/sidebars/projects/menus/repository_menu.rb +++ b/lib/sidebars/projects/menus/repository_menu.rb @@ -44,6 +44,11 @@ module Sidebars 'doc-text' end + override :pick_into_super_sidebar? + def pick_into_super_sidebar? + true + end + private def files_menu_item diff --git a/lib/sidebars/projects/menus/scope_menu.rb b/lib/sidebars/projects/menus/scope_menu.rb index 77da695d49c..7e2286633e5 100644 --- a/lib/sidebars/projects/menus/scope_menu.rb +++ b/lib/sidebars/projects/menus/scope_menu.rb @@ -45,7 +45,8 @@ module Sidebars super.merge({ title: _('Project overview'), sprite_icon: 'project', - super_sidebar_parent: ::Sidebars::StaticMenu + super_sidebar_parent: ::Sidebars::StaticMenu, + item_id: :project_overview }) end end diff --git a/lib/sidebars/projects/menus/security_compliance_menu.rb b/lib/sidebars/projects/menus/security_compliance_menu.rb index 58a7ab4e8f0..eb713244a7c 100644 --- a/lib/sidebars/projects/menus/security_compliance_menu.rb +++ b/lib/sidebars/projects/menus/security_compliance_menu.rb @@ -25,6 +25,11 @@ module Sidebars 'shield' end + override :pick_into_super_sidebar? + def pick_into_super_sidebar? + true + end + private def configuration_menu_item diff --git a/lib/sidebars/projects/menus/settings_menu.rb b/lib/sidebars/projects/menus/settings_menu.rb index eea32d8b626..8b6d85e718d 100644 --- a/lib/sidebars/projects/menus/settings_menu.rb +++ b/lib/sidebars/projects/menus/settings_menu.rb @@ -44,6 +44,11 @@ module Sidebars 'settings' end + override :pick_into_super_sidebar? + def pick_into_super_sidebar? + true + end + private def general_menu_item diff --git a/lib/sidebars/projects/menus/snippets_menu.rb b/lib/sidebars/projects/menus/snippets_menu.rb index a1ba85e2b04..535f12963b1 100644 --- a/lib/sidebars/projects/menus/snippets_menu.rb +++ b/lib/sidebars/projects/menus/snippets_menu.rb @@ -40,7 +40,8 @@ module Sidebars def serialize_as_menu_item_args super.deep_merge({ super_sidebar_parent: ::Sidebars::Projects::Menus::RepositoryMenu, - super_sidebar_before: :contributors + super_sidebar_before: :contributors, + item_id: :project_snippets }) end end diff --git a/lib/sidebars/projects/menus/wiki_menu.rb b/lib/sidebars/projects/menus/wiki_menu.rb index 8bf223da4da..d800dae8be3 100644 --- a/lib/sidebars/projects/menus/wiki_menu.rb +++ b/lib/sidebars/projects/menus/wiki_menu.rb @@ -39,7 +39,8 @@ module Sidebars override :serialize_as_menu_item_args def serialize_as_menu_item_args super.merge({ - super_sidebar_parent: ::Sidebars::Projects::SuperSidebarMenus::PlanMenu + super_sidebar_parent: ::Sidebars::Projects::SuperSidebarMenus::PlanMenu, + item_id: :project_wiki }) end end diff --git a/lib/sidebars/projects/super_sidebar_panel.rb b/lib/sidebars/projects/super_sidebar_panel.rb index 2f2f3714cef..f76f28eb642 100644 --- a/lib/sidebars/projects/super_sidebar_panel.rb +++ b/lib/sidebars/projects/super_sidebar_panel.rb @@ -14,15 +14,18 @@ module Sidebars add_menu(Sidebars::StaticMenu.new(context)) add_menu(Sidebars::Projects::SuperSidebarMenus::PlanMenu.new(context)) - # "Develop" menu - pick_from_old_menus(old_menus, Sidebars::Projects::Menus::RepositoryMenu) - pick_from_old_menus(old_menus, Sidebars::Projects::Menus::CiCdMenu) - pick_from_old_menus(old_menus, Sidebars::Projects::Menus::SecurityComplianceMenu) - add_menu(Sidebars::Projects::SuperSidebarMenus::OperationsMenu.new(context)) - pick_from_old_menus(old_menus, Sidebars::Projects::Menus::MonitorMenu) - pick_from_old_menus(old_menus, Sidebars::Projects::Menus::AnalyticsMenu) - add_menu(Sidebars::UncategorizedMenu.new(context)) - pick_from_old_menus(old_menus, Sidebars::Projects::Menus::SettingsMenu) + + pick_from_old_menus(old_menus) + + insert_menu_before( + Sidebars::Projects::Menus::MonitorMenu, + Sidebars::Projects::SuperSidebarMenus::OperationsMenu.new(context) + ) + + insert_menu_before( + Sidebars::Projects::Menus::SettingsMenu, + Sidebars::UncategorizedMenu.new(context) + ) transform_old_menus(@menus, @scope_menu, *old_menus) end diff --git a/lib/tasks/gitlab/usage_data.rake b/lib/tasks/gitlab/usage_data.rake index 32db5e2dff6..b9d425a66c5 100644 --- a/lib/tasks/gitlab/usage_data.rake +++ b/lib/tasks/gitlab/usage_data.rake @@ -88,7 +88,6 @@ namespace :gitlab do def ci_template_event(event_name) { 'name' => event_name, - 'category' => 'ci_templates', 'redis_slot' => Gitlab::UsageDataCounters::CiTemplateUniqueCounter::REDIS_SLOT, 'aggregation' => 'weekly' } diff --git a/locale/gitlab.pot b/locale/gitlab.pot index f58b7d5124a..f77f1a61811 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -7150,9 +7150,6 @@ msgstr "" msgid "BranchRules|All branches" msgstr "" -msgid "BranchRules|All users with push access are allowed to force push." -msgstr "" - msgid "BranchRules|Allow all users with push access to %{linkStart}force push%{linkEnd}." msgstr "" @@ -7171,6 +7168,9 @@ msgstr "" msgid "BranchRules|Allowed to push and merge (%{total})" msgstr "" +msgid "BranchRules|Allows force push" +msgstr "" + msgid "BranchRules|Also accepts code pushes that change files listed in CODEOWNERS file." msgstr "" @@ -7207,13 +7207,13 @@ msgstr "" msgid "BranchRules|Details" msgstr "" -msgid "BranchRules|Does not require approval from code owners" +msgid "BranchRules|Does not allow force push" msgstr "" -msgid "BranchRules|Force push" +msgid "BranchRules|Does not require approval from code owners" msgstr "" -msgid "BranchRules|Force push is not allowed." +msgid "BranchRules|From users with push access." msgstr "" msgid "BranchRules|Groups" @@ -16210,6 +16210,9 @@ msgstr "" msgid "Epic actions" msgstr "" +msgid "Epic boards" +msgstr "" + msgid "Epic cannot be found." msgstr "" @@ -19908,6 +19911,9 @@ msgstr "" msgid "Group navigation" msgstr "" +msgid "Group overview" +msgstr "" + msgid "Group overview content" msgstr "" @@ -23676,6 +23682,12 @@ msgstr "" msgid "Issue already promoted to epic." msgstr "" +msgid "Issue board" +msgstr "" + +msgid "Issue boards" +msgstr "" + msgid "Issue cannot be found." msgstr "" diff --git a/scripts/generate-e2e-pipeline b/scripts/generate-e2e-pipeline index c612a700f90..ab9c432f459 100755 --- a/scripts/generate-e2e-pipeline +++ b/scripts/generate-e2e-pipeline @@ -41,8 +41,11 @@ YML echo "Using .gitlab/ci/review-apps/main.gitlab-ci.yml and .gitlab/ci/package-and-test/main.gitlab-ci.yml" cp .gitlab/ci/review-apps/main.gitlab-ci.yml "$REVIEW_PIPELINE_YML" echo "$variables" >>"$REVIEW_PIPELINE_YML" + cp .gitlab/ci/package-and-test/main.gitlab-ci.yml "$OMNIBUS_PIPELINE_YML" echo "$variables" >>"$OMNIBUS_PIPELINE_YML" +echo " ALLURE_JOB_NAME: e2e-package-and-test" >>"$OMNIBUS_PIPELINE_YML" +echo " QA_RUN_TYPE: e2e-package-and-test" >>"$OMNIBUS_PIPELINE_YML" echo "Successfully generated review-app and package-and-test pipeline with following variables section:" echo "$variables" diff --git a/spec/controllers/projects/environments_controller_spec.rb b/spec/controllers/projects/environments_controller_spec.rb index 8ab41b233c2..cbf632bfdb0 100644 --- a/spec/controllers/projects/environments_controller_spec.rb +++ b/spec/controllers/projects/environments_controller_spec.rb @@ -999,94 +999,6 @@ RSpec.describe Projects::EnvironmentsController, feature_category: :continuous_d end end - describe '#append_info_to_payload' do - let(:search_param) { 'my search param' } - - context 'when search_environment_logging feature is disabled' do - before do - stub_feature_flags(environments_search_logging: false) - end - - it 'does not log search params in meta.environment.search' do - expect(controller).to receive(:append_info_to_payload).and_wrap_original do |method, payload| - method.call(payload) - - expect(payload[:metadata]).not_to have_key('meta.environment.search') - expect(payload[:action]).to eq("search") - expect(payload[:controller]).to eq("Projects::EnvironmentsController") - end - - get :search, params: environment_params(format: :json, search: search_param) - end - - it 'logs params correctly when search params are missing' do - expect(controller).to receive(:append_info_to_payload).and_wrap_original do |method, payload| - method.call(payload) - - expect(payload[:metadata]).not_to have_key('meta.environment.search') - expect(payload[:action]).to eq("search") - expect(payload[:controller]).to eq("Projects::EnvironmentsController") - end - - get :search, params: environment_params(format: :json) - end - - it 'logs params correctly when search params is empty string' do - expect(controller).to receive(:append_info_to_payload).and_wrap_original do |method, payload| - method.call(payload) - - expect(payload[:metadata]).not_to have_key('meta.environment.search') - expect(payload[:action]).to eq("search") - expect(payload[:controller]).to eq("Projects::EnvironmentsController") - end - - get :search, params: environment_params(format: :json, search: "") - end - end - - context 'when search_environment_logging feature is enabled' do - before do - stub_feature_flags(environments_search_logging: true) - end - - it 'logs search params in meta.environment.search' do - expect(controller).to receive(:append_info_to_payload).and_wrap_original do |method, payload| - method.call(payload) - - expect(payload[:metadata]['meta.environment.search']).to eq(search_param) - expect(payload[:action]).to eq("search") - expect(payload[:controller]).to eq("Projects::EnvironmentsController") - end - - get :search, params: environment_params(format: :json, search: search_param) - end - - it 'logs params correctly when search params are missing' do - expect(controller).to receive(:append_info_to_payload).and_wrap_original do |method, payload| - method.call(payload) - - expect(payload[:metadata]).not_to have_key('meta.environment.search') - expect(payload[:action]).to eq("search") - expect(payload[:controller]).to eq("Projects::EnvironmentsController") - end - - get :search, params: environment_params(format: :json) - end - - it 'logs params correctly when search params is empty string' do - expect(controller).to receive(:append_info_to_payload).and_wrap_original do |method, payload| - method.call(payload) - - expect(payload[:metadata]).not_to have_key('meta.environment.search') - expect(payload[:action]).to eq("search") - expect(payload[:controller]).to eq("Projects::EnvironmentsController") - end - - get :search, params: environment_params(format: :json, search: "") - end - end - end - def environment_params(opts = {}) opts.reverse_merge(namespace_id: project.namespace, project_id: project, id: environment.id) end diff --git a/spec/frontend/api_spec.js b/spec/frontend/api_spec.js index 6fd106502c4..27385d00717 100644 --- a/spec/frontend/api_spec.js +++ b/spec/frontend/api_spec.js @@ -10,8 +10,6 @@ import { HTTP_STATUS_OK, } from '~/lib/utils/http_status'; -jest.mock('~/flash'); - describe('Api', () => { const dummyApiVersion = 'v3000'; const dummyUrlRoot = '/gitlab'; diff --git a/spec/frontend/blame/blame_redirect_spec.js b/spec/frontend/blame/blame_redirect_spec.js index beb10139b3a..326f60a5b13 100644 --- a/spec/frontend/blame/blame_redirect_spec.js +++ b/spec/frontend/blame/blame_redirect_spec.js @@ -1,8 +1,8 @@ import redirectToCorrectPage from '~/blame/blame_redirect'; import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; -jest.mock('~/flash'); +jest.mock('~/alert'); describe('Blame page redirect', () => { beforeEach(() => { diff --git a/spec/frontend/boards/stores/actions_spec.js b/spec/frontend/boards/stores/actions_spec.js index 13eb3865354..f430062bb73 100644 --- a/spec/frontend/boards/stores/actions_spec.js +++ b/spec/frontend/boards/stores/actions_spec.js @@ -43,7 +43,7 @@ import { mockMilestones, } from '../mock_data'; -jest.mock('~/flash'); +jest.mock('~/alert'); // We need this helper to make sure projectPath is including // subgroups when the movIssue action is called. diff --git a/spec/frontend/clusters_list/store/actions_spec.js b/spec/frontend/clusters_list/store/actions_spec.js index a2e2db3dcc2..6d23db0517d 100644 --- a/spec/frontend/clusters_list/store/actions_spec.js +++ b/spec/frontend/clusters_list/store/actions_spec.js @@ -5,13 +5,13 @@ import waitForPromises from 'helpers/wait_for_promises'; import { MAX_REQUESTS } from '~/clusters_list/constants'; import * as actions from '~/clusters_list/store/actions'; import * as types from '~/clusters_list/store/mutation_types'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import axios from '~/lib/utils/axios_utils'; import { HTTP_STATUS_BAD_REQUEST, HTTP_STATUS_OK } from '~/lib/utils/http_status'; import Poll from '~/lib/utils/poll'; import { apiData } from '../mock_data'; -jest.mock('~/flash'); +jest.mock('~/alert'); describe('Clusters store actions', () => { let captureException; @@ -81,7 +81,7 @@ describe('Clusters store actions', () => { ); }); - it('should show flash on API error', async () => { + it('should show alert on API error', async () => { mock.onGet().reply(HTTP_STATUS_BAD_REQUEST, 'Not Found'); await testAction( diff --git a/spec/frontend/deploy_tokens/components/new_deploy_token_spec.js b/spec/frontend/deploy_tokens/components/new_deploy_token_spec.js index 46f7b2f3604..efd724116ab 100644 --- a/spec/frontend/deploy_tokens/components/new_deploy_token_spec.js +++ b/spec/frontend/deploy_tokens/components/new_deploy_token_spec.js @@ -7,20 +7,12 @@ import { HTTP_STATUS_INTERNAL_SERVER_ERROR, HTTP_STATUS_OK } from '~/lib/utils/h import { TEST_HOST } from 'helpers/test_constants'; import NewDeployToken from '~/deploy_tokens/components/new_deploy_token.vue'; import waitForPromises from 'helpers/wait_for_promises'; -import { createAlert, VARIANT_INFO } from '~/flash'; +import { createAlert, VARIANT_INFO } from '~/alert'; const createNewTokenPath = `${TEST_HOST}/create`; const deployTokensHelpUrl = `${TEST_HOST}/help`; -jest.mock('~/flash', () => { - const original = jest.requireActual('~/flash'); - - return { - __esModule: true, - ...original, - createAlert: jest.fn(), - }; -}); +jest.mock('~/alert'); describe('New Deploy Token', () => { let wrapper; @@ -91,7 +83,7 @@ describe('New Deploy Token', () => { }); } - it('should flash error message if token creation fails', async () => { + it('should alert error message if token creation fails', async () => { const mockAxios = new MockAdapter(axios); const date = new Date(); diff --git a/spec/frontend/design_management/pages/design/index_spec.js b/spec/frontend/design_management/pages/design/index_spec.js index 72b143d3789..cd92198839b 100644 --- a/spec/frontend/design_management/pages/design/index_spec.js +++ b/spec/frontend/design_management/pages/design/index_spec.js @@ -23,7 +23,7 @@ import { DESIGN_SNOWPLOW_EVENT_TYPES, DESIGN_SERVICE_PING_EVENT_TYPES, } from '~/design_management/utils/tracking'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import * as cacheUpdate from '~/design_management/utils/cache_update'; import mockAllVersions from '../../mock_data/all_versions'; import design from '../../mock_data/design'; @@ -32,7 +32,7 @@ import mockResponseWithDesigns from '../../mock_data/designs'; import mockResponseNoDesigns from '../../mock_data/no_designs'; import { mockCreateImageNoteDiffResponse } from '../../mock_data/apollo_mock'; -jest.mock('~/flash'); +jest.mock('~/alert'); jest.mock('~/api.js'); const focusInput = jest.fn(); diff --git a/spec/frontend/design_management/pages/index_spec.js b/spec/frontend/design_management/pages/index_spec.js index fbb4df5eb6c..ce6a641c86d 100644 --- a/spec/frontend/design_management/pages/index_spec.js +++ b/spec/frontend/design_management/pages/index_spec.js @@ -29,7 +29,7 @@ import { DESIGN_TRACKING_PAGE_NAME, DESIGN_SNOWPLOW_EVENT_TYPES, } from '~/design_management/utils/tracking'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import DesignDropzone from '~/vue_shared/components/upload_dropzone/upload_dropzone.vue'; import { designListQueryResponse, @@ -41,7 +41,7 @@ import { moveDesignMutationResponseWithErrors, } from '../mock_data/apollo_mock'; -jest.mock('~/flash'); +jest.mock('~/alert'); const mockPageEl = { classList: { remove: jest.fn(), @@ -800,7 +800,7 @@ describe('Design management index page', () => { expect(draggableAttributes().disabled).toBe(false); }); - it('displays flash if mutation had a recoverable error', async () => { + it('displays alert if mutation had a recoverable error', async () => { createComponentWithApollo({ moveHandler: jest.fn().mockResolvedValue(moveDesignMutationResponseWithErrors), }); diff --git a/spec/frontend/design_management/utils/cache_update_spec.js b/spec/frontend/design_management/utils/cache_update_spec.js index 1c8075fac02..e89dfe9f860 100644 --- a/spec/frontend/design_management/utils/cache_update_spec.js +++ b/spec/frontend/design_management/utils/cache_update_spec.js @@ -10,10 +10,10 @@ import { ADD_IMAGE_DIFF_NOTE_ERROR, UPDATE_IMAGE_DIFF_NOTE_ERROR, } from '~/design_management/utils/error_messages'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import design from '../mock_data/design'; -jest.mock('~/flash'); +jest.mock('~/alert'); describe('Design Management cache update', () => { const mockErrors = ['code red!']; diff --git a/spec/frontend/diffs/store/actions_spec.js b/spec/frontend/diffs/store/actions_spec.js index b44b75382ad..f5036226b1e 100644 --- a/spec/frontend/diffs/store/actions_spec.js +++ b/spec/frontend/diffs/store/actions_spec.js @@ -13,7 +13,7 @@ import * as diffActions from '~/diffs/store/actions'; import * as types from '~/diffs/store/mutation_types'; import * as utils from '~/diffs/store/utils'; import * as treeWorkerUtils from '~/diffs/utils/tree_worker_utils'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import axios from '~/lib/utils/axios_utils'; import * as commonUtils from '~/lib/utils/common_utils'; import { @@ -26,7 +26,7 @@ import { mergeUrlParams } from '~/lib/utils/url_utility'; import eventHub from '~/notes/event_hub'; import { diffMetadata } from '../mock_data/diff_metadata'; -jest.mock('~/flash'); +jest.mock('~/alert'); describe('DiffsStoreActions', () => { let mock; @@ -273,7 +273,7 @@ describe('DiffsStoreActions', () => { ); }); - it('should show flash on API error', async () => { + it('should show alert on API error', async () => { mock.onGet(endpointCoverage).reply(HTTP_STATUS_BAD_REQUEST); await testAction(diffActions.fetchCoverageFiles, {}, { endpointCoverage }, [], []); diff --git a/spec/frontend/drawio/drawio_editor_spec.js b/spec/frontend/drawio/drawio_editor_spec.js index de93d042396..bcf0179e2e2 100644 --- a/spec/frontend/drawio/drawio_editor_spec.js +++ b/spec/frontend/drawio/drawio_editor_spec.js @@ -5,9 +5,9 @@ import { DIAGRAM_BACKGROUND_COLOR, DRAWIO_IFRAME_TIMEOUT, } from '~/drawio/constants'; -import { createAlert, VARIANT_SUCCESS } from '~/flash'; +import { createAlert, VARIANT_SUCCESS } from '~/alert'; -jest.mock('~/flash'); +jest.mock('~/alert'); jest.useFakeTimers(); diff --git a/spec/frontend/grafana_integration/components/grafana_integration_spec.js b/spec/frontend/grafana_integration/components/grafana_integration_spec.js index 021a3aa41ed..9cb27670c98 100644 --- a/spec/frontend/grafana_integration/components/grafana_integration_spec.js +++ b/spec/frontend/grafana_integration/components/grafana_integration_spec.js @@ -3,14 +3,14 @@ import { shallowMount } from '@vue/test-utils'; import { nextTick } from 'vue'; import { TEST_HOST } from 'helpers/test_constants'; import { mountExtended } from 'helpers/vue_test_utils_helper'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import GrafanaIntegration from '~/grafana_integration/components/grafana_integration.vue'; import { createStore } from '~/grafana_integration/store'; import axios from '~/lib/utils/axios_utils'; import { refreshCurrentPage } from '~/lib/utils/url_utility'; jest.mock('~/lib/utils/url_utility'); -jest.mock('~/flash'); +jest.mock('~/alert'); describe('grafana integration component', () => { let wrapper; @@ -103,7 +103,7 @@ describe('grafana integration component', () => { expect(refreshCurrentPage).toHaveBeenCalled(); }); - it('creates flash banner on error', async () => { + it('creates alert banner on error', async () => { const message = 'mockErrorMessage'; axios.patch.mockRejectedValue({ response: { data: { message } } }); diff --git a/spec/frontend/import_entities/import_groups/components/import_table_spec.js b/spec/frontend/import_entities/import_groups/components/import_table_spec.js index 904fd25b378..8311c447253 100644 --- a/spec/frontend/import_entities/import_groups/components/import_table_spec.js +++ b/spec/frontend/import_entities/import_groups/components/import_table_spec.js @@ -6,7 +6,7 @@ import MockAdapter from 'axios-mock-adapter'; import createMockApollo from 'helpers/mock_apollo_helper'; import waitForPromises from 'helpers/wait_for_promises'; import { createMockDirective, getBinding } from 'helpers/vue_mock_directive'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import { HTTP_STATUS_OK, HTTP_STATUS_TOO_MANY_REQUESTS } from '~/lib/utils/http_status'; import axios from '~/lib/utils/axios_utils'; import { STATUSES } from '~/import_entities/constants'; @@ -23,7 +23,7 @@ import { generateFakeEntry, } from '../graphql/fixtures'; -jest.mock('~/flash'); +jest.mock('~/alert'); jest.mock('~/import_entities/import_groups/services/status_poller'); Vue.use(VueApollo); diff --git a/spec/frontend/import_entities/import_groups/graphql/client_factory_spec.js b/spec/frontend/import_entities/import_groups/graphql/client_factory_spec.js index ce111a0c10c..83566469176 100644 --- a/spec/frontend/import_entities/import_groups/graphql/client_factory_spec.js +++ b/spec/frontend/import_entities/import_groups/graphql/client_factory_spec.js @@ -16,7 +16,7 @@ import axios from '~/lib/utils/axios_utils'; import { HTTP_STATUS_OK } from '~/lib/utils/http_status'; import { statusEndpointFixture } from './fixtures'; -jest.mock('~/flash'); +jest.mock('~/alert'); jest.mock('~/import_entities/import_groups/graphql/services/local_storage_cache', () => ({ LocalStorageCache: jest.fn().mockImplementation(function mock() { this.get = jest.fn(); diff --git a/spec/frontend/import_entities/import_groups/services/status_poller_spec.js b/spec/frontend/import_entities/import_groups/services/status_poller_spec.js index 4a1b85d24e3..5ee2b2e698f 100644 --- a/spec/frontend/import_entities/import_groups/services/status_poller_spec.js +++ b/spec/frontend/import_entities/import_groups/services/status_poller_spec.js @@ -1,6 +1,6 @@ import MockAdapter from 'axios-mock-adapter'; import Visibility from 'visibilityjs'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import { STATUSES } from '~/import_entities/constants'; import { StatusPoller } from '~/import_entities/import_groups/services/status_poller'; import axios from '~/lib/utils/axios_utils'; @@ -8,7 +8,7 @@ import { HTTP_STATUS_OK } from '~/lib/utils/http_status'; import Poll from '~/lib/utils/poll'; jest.mock('visibilityjs'); -jest.mock('~/flash'); +jest.mock('~/alert'); jest.mock('~/lib/utils/poll'); const FAKE_POLL_PATH = '/fake/poll/path'; @@ -81,7 +81,7 @@ describe('Bulk import status poller', () => { expect(pollInstance.makeRequest).toHaveBeenCalled(); }); - it('when error occurs shows flash with error', () => { + it('when error occurs shows alert with error', () => { const [[pollConfig]] = Poll.mock.calls; pollConfig.errorCallback(); expect(createAlert).toHaveBeenCalled(); diff --git a/spec/frontend/import_entities/import_projects/store/actions_spec.js b/spec/frontend/import_entities/import_projects/store/actions_spec.js index 990587d4af7..f78016eefcf 100644 --- a/spec/frontend/import_entities/import_projects/store/actions_spec.js +++ b/spec/frontend/import_entities/import_projects/store/actions_spec.js @@ -1,7 +1,7 @@ import MockAdapter from 'axios-mock-adapter'; import { TEST_HOST } from 'helpers/test_constants'; import testAction from 'helpers/vuex_action_helper'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import { STATUSES, PROVIDERS } from '~/import_entities/constants'; import actionsFactory from '~/import_entities/import_projects/store/actions'; import { getImportTarget } from '~/import_entities/import_projects/store/getters'; @@ -27,7 +27,7 @@ import { HTTP_STATUS_TOO_MANY_REQUESTS, } from '~/lib/utils/http_status'; -jest.mock('~/flash'); +jest.mock('~/alert'); const MOCK_ENDPOINT = `${TEST_HOST}/endpoint.json`; const endpoints = { diff --git a/spec/frontend/issues/show/components/header_actions_spec.js b/spec/frontend/issues/show/components/header_actions_spec.js index 00e6a6f8e90..8871b8297f3 100644 --- a/spec/frontend/issues/show/components/header_actions_spec.js +++ b/spec/frontend/issues/show/components/header_actions_spec.js @@ -3,7 +3,7 @@ import { GlButton, GlDropdownItem, GlLink, GlModal } from '@gitlab/ui'; import { shallowMount } from '@vue/test-utils'; import Vuex from 'vuex'; import { mockTracking } from 'helpers/tracking_helper'; -import { createAlert, VARIANT_SUCCESS } from '~/flash'; +import { createAlert, VARIANT_SUCCESS } from '~/alert'; import { STATUS_CLOSED, STATUS_OPEN, TYPE_INCIDENT, TYPE_ISSUE } from '~/issues/constants'; import DeleteIssueModal from '~/issues/show/components/delete_issue_modal.vue'; import AbuseCategorySelector from '~/abuse_reports/components/abuse_category_selector.vue'; @@ -14,7 +14,7 @@ import * as urlUtility from '~/lib/utils/url_utility'; import eventHub from '~/notes/event_hub'; import createStore from '~/notes/stores'; -jest.mock('~/flash'); +jest.mock('~/alert'); describe('HeaderActions component', () => { let dispatchEventSpy; diff --git a/spec/frontend/jobs/components/job/manual_variables_form_spec.js b/spec/frontend/jobs/components/job/manual_variables_form_spec.js index 4b2bf6d3a75..7d355ff0a82 100644 --- a/spec/frontend/jobs/components/job/manual_variables_form_spec.js +++ b/spec/frontend/jobs/components/job/manual_variables_form_spec.js @@ -2,7 +2,7 @@ import { GlSprintf, GlLink } from '@gitlab/ui'; import { createLocalVue } from '@vue/test-utils'; import VueApollo from 'vue-apollo'; import { nextTick } from 'vue'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import { mountExtended } from 'helpers/vue_test_utils_helper'; import createMockApollo from 'helpers/mock_apollo_helper'; import { TYPENAME_CI_BUILD } from '~/graphql_shared/constants'; @@ -23,7 +23,7 @@ import { } from './mock_data'; const localVue = createLocalVue(); -jest.mock('~/flash'); +jest.mock('~/alert'); localVue.use(VueApollo); jest.mock('~/lib/utils/url_utility', () => ({ diff --git a/spec/frontend/jobs/components/table/job_table_app_spec.js b/spec/frontend/jobs/components/table/job_table_app_spec.js index b14a3bae54f..f13cab596da 100644 --- a/spec/frontend/jobs/components/table/job_table_app_spec.js +++ b/spec/frontend/jobs/components/table/job_table_app_spec.js @@ -12,7 +12,7 @@ import { s__ } from '~/locale'; import createMockApollo from 'helpers/mock_apollo_helper'; import waitForPromises from 'helpers/wait_for_promises'; import { TEST_HOST } from 'spec/test_constants'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import getJobsQuery from '~/jobs/components/table/graphql/queries/get_jobs.query.graphql'; import getJobsCountQuery from '~/jobs/components/table/graphql/queries/get_jobs_count.query.graphql'; import JobsTable from '~/jobs/components/table/jobs_table.vue'; @@ -30,7 +30,7 @@ import { const projectPath = 'gitlab-org/gitlab'; Vue.use(VueApollo); -jest.mock('~/flash'); +jest.mock('~/alert'); describe('Job table app', () => { let wrapper; diff --git a/spec/frontend/milestones/components/delete_milestone_modal_spec.js b/spec/frontend/milestones/components/delete_milestone_modal_spec.js index 87235fa843a..21ae2b8cb47 100644 --- a/spec/frontend/milestones/components/delete_milestone_modal_spec.js +++ b/spec/frontend/milestones/components/delete_milestone_modal_spec.js @@ -6,10 +6,10 @@ import DeleteMilestoneModal from '~/milestones/components/delete_milestone_modal import eventHub from '~/milestones/event_hub'; import { HTTP_STATUS_IM_A_TEAPOT, HTTP_STATUS_NOT_FOUND } from '~/lib/utils/http_status'; import { redirectTo } from '~/lib/utils/url_utility'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; jest.mock('~/lib/utils/url_utility'); -jest.mock('~/flash'); +jest.mock('~/alert'); describe('Delete milestone modal', () => { let wrapper; diff --git a/spec/frontend/milestones/components/promote_milestone_modal_spec.js b/spec/frontend/milestones/components/promote_milestone_modal_spec.js index d7ad3d29d0a..9d8e344646d 100644 --- a/spec/frontend/milestones/components/promote_milestone_modal_spec.js +++ b/spec/frontend/milestones/components/promote_milestone_modal_spec.js @@ -3,14 +3,14 @@ import { shallowMount } from '@vue/test-utils'; import { setHTMLFixture } from 'helpers/fixtures'; import { TEST_HOST } from 'helpers/test_constants'; import waitForPromises from 'helpers/wait_for_promises'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import axios from '~/lib/utils/axios_utils'; import { HTTP_STATUS_INTERNAL_SERVER_ERROR } from '~/lib/utils/http_status'; import * as urlUtils from '~/lib/utils/url_utility'; import PromoteMilestoneModal from '~/milestones/components/promote_milestone_modal.vue'; jest.mock('~/lib/utils/url_utility'); -jest.mock('~/flash'); +jest.mock('~/alert'); describe('Promote milestone modal', () => { let wrapper; diff --git a/spec/frontend/monitoring/components/dashboard_spec.js b/spec/frontend/monitoring/components/dashboard_spec.js index 1d17a9116df..93bcba8648d 100644 --- a/spec/frontend/monitoring/components/dashboard_spec.js +++ b/spec/frontend/monitoring/components/dashboard_spec.js @@ -4,7 +4,7 @@ import { nextTick } from 'vue'; import setWindowLocation from 'helpers/set_window_location_helper'; import { TEST_HOST } from 'helpers/test_constants'; import { mountExtended, shallowMountExtended } from 'helpers/vue_test_utils_helper'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import axios from '~/lib/utils/axios_utils'; import { ESC_KEY } from '~/lib/utils/keys'; import { objectToQuery } from '~/lib/utils/url_utility'; @@ -33,7 +33,7 @@ import { setupStoreWithLinks, } from '../store_utils'; -jest.mock('~/flash'); +jest.mock('~/alert'); describe('Dashboard', () => { let store; diff --git a/spec/frontend/monitoring/components/dashboard_url_time_spec.js b/spec/frontend/monitoring/components/dashboard_url_time_spec.js index 9873654bdda..98791906700 100644 --- a/spec/frontend/monitoring/components/dashboard_url_time_spec.js +++ b/spec/frontend/monitoring/components/dashboard_url_time_spec.js @@ -1,7 +1,7 @@ import { mount } from '@vue/test-utils'; import MockAdapter from 'axios-mock-adapter'; import { nextTick } from 'vue'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import axios from '~/lib/utils/axios_utils'; import { queryToObject, @@ -18,7 +18,7 @@ import { defaultTimeRange } from '~/vue_shared/constants'; import { dashboardProps } from '../fixture_data'; import { mockProjectDir } from '../mock_data'; -jest.mock('~/flash'); +jest.mock('~/alert'); jest.mock('~/lib/utils/url_utility'); describe('dashboard invalid url parameters', () => { diff --git a/spec/frontend/monitoring/store/actions_spec.js b/spec/frontend/monitoring/store/actions_spec.js index 8eda46a2ff1..30675365513 100644 --- a/spec/frontend/monitoring/store/actions_spec.js +++ b/spec/frontend/monitoring/store/actions_spec.js @@ -1,7 +1,7 @@ import MockAdapter from 'axios-mock-adapter'; import { backoffMockImplementation } from 'helpers/backoff_helper'; import testAction from 'helpers/vuex_action_helper'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import axios from '~/lib/utils/axios_utils'; import * as commonUtils from '~/lib/utils/common_utils'; import { @@ -61,7 +61,7 @@ import { mockDashboardsErrorResponse, } from '../mock_data'; -jest.mock('~/flash'); +jest.mock('~/alert'); describe('Monitoring store actions', () => { const { convertObjectPropsToCamelCase } = commonUtils; @@ -263,7 +263,7 @@ describe('Monitoring store actions', () => { }); }); - it('does not show a flash error when showErrorBanner is disabled', async () => { + it('does not show an alert error when showErrorBanner is disabled', async () => { state.showErrorBanner = false; await result(); diff --git a/spec/frontend/nav/components/new_nav_toggle_spec.js b/spec/frontend/nav/components/new_nav_toggle_spec.js index e545c861d5d..34cf3b9c213 100644 --- a/spec/frontend/nav/components/new_nav_toggle_spec.js +++ b/spec/frontend/nav/components/new_nav_toggle_spec.js @@ -7,10 +7,10 @@ import { HTTP_STATUS_INTERNAL_SERVER_ERROR, HTTP_STATUS_OK } from '~/lib/utils/h import { useMockLocationHelper } from 'helpers/mock_window_location_helper'; import NewNavToggle from '~/nav/components/new_nav_toggle.vue'; import waitForPromises from 'helpers/wait_for_promises'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import { s__ } from '~/locale'; -jest.mock('~/flash'); +jest.mock('~/alert'); const TEST_ENDPONT = 'https://example.com/toggle'; diff --git a/spec/frontend/notes/components/comment_form_spec.js b/spec/frontend/notes/components/comment_form_spec.js index dfb05c85fc8..acee89ae096 100644 --- a/spec/frontend/notes/components/comment_form_spec.js +++ b/spec/frontend/notes/components/comment_form_spec.js @@ -8,7 +8,7 @@ import { extendedWrapper } from 'helpers/vue_test_utils_helper'; import Autosave from '~/autosave'; import batchComments from '~/batch_comments/stores/modules/batch_comments'; import { refreshUserMergeRequestCounts } from '~/commons/nav/user_merge_requests'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import axios from '~/lib/utils/axios_utils'; import { HTTP_STATUS_UNPROCESSABLE_ENTITY } from '~/lib/utils/http_status'; import CommentForm from '~/notes/components/comment_form.vue'; @@ -21,7 +21,7 @@ import { loggedOutnoteableData, notesDataMock, userDataMock, noteableDataMock } jest.mock('autosize'); jest.mock('~/commons/nav/user_merge_requests'); -jest.mock('~/flash'); +jest.mock('~/alert'); jest.mock('~/autosave'); Vue.use(Vuex); diff --git a/spec/frontend/notes/stores/actions_spec.js b/spec/frontend/notes/stores/actions_spec.js index f6cc0d12ee7..9ac67445837 100644 --- a/spec/frontend/notes/stores/actions_spec.js +++ b/spec/frontend/notes/stores/actions_spec.js @@ -3,7 +3,7 @@ import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures'; import testAction from 'helpers/vuex_action_helper'; import { TEST_HOST } from 'spec/test_constants'; import Api from '~/api'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import toast from '~/vue_shared/plugins/global_toast'; import { EVENT_ISSUABLE_VUE_APP_CHANGE } from '~/issuable/constants'; import axios from '~/lib/utils/axios_utils'; @@ -36,7 +36,7 @@ import { const TEST_ERROR_MESSAGE = 'Test error message'; const mockAlertDismiss = jest.fn(); -jest.mock('~/flash', () => ({ +jest.mock('~/alert', () => ({ createAlert: jest.fn().mockImplementation(() => ({ dismiss: mockAlertDismiss, })), @@ -876,7 +876,7 @@ describe('Actions Notes Store', () => { const res = { errors: { base: ['something went wrong'] } }; const error = { message: 'Unprocessable entity', response: { data: res } }; - it('sets flash alert using errors.base message', async () => { + it('sets an alert using errors.base message', async () => { const resp = await actions.saveNote( { commit() {}, @@ -960,7 +960,7 @@ describe('Actions Notes Store', () => { }); }); - it('when service fails, flashes error message', () => { + it('when service fails, creates an alert with error message', () => { const response = { response: { data: { message: TEST_ERROR_MESSAGE } } }; Api.applySuggestion.mockReturnValue(Promise.reject(response)); diff --git a/spec/frontend/packages_and_registries/infrastructure_registry/components/details/store/actions_spec.js b/spec/frontend/packages_and_registries/infrastructure_registry/components/details/store/actions_spec.js index ae5742fdf6c..ea4d268d84e 100644 --- a/spec/frontend/packages_and_registries/infrastructure_registry/components/details/store/actions_spec.js +++ b/spec/frontend/packages_and_registries/infrastructure_registry/components/details/store/actions_spec.js @@ -1,6 +1,6 @@ import testAction from 'helpers/vuex_action_helper'; import Api from '~/api'; -import { createAlert, VARIANT_SUCCESS, VARIANT_WARNING } from '~/flash'; +import { createAlert, VARIANT_SUCCESS, VARIANT_WARNING } from '~/alert'; import { FETCH_PACKAGE_VERSIONS_ERROR } from '~/packages_and_registries/infrastructure_registry/details/constants'; import { fetchPackageVersions, @@ -15,7 +15,7 @@ import { } from '~/packages_and_registries/shared/constants'; import { npmPackage as packageEntity } from '../../mock_data'; -jest.mock('~/flash'); +jest.mock('~/alert'); jest.mock('~/api.js'); describe('Actions Package details store', () => { @@ -53,7 +53,7 @@ describe('Actions Package details store', () => { expect(Api.projectPackage).toHaveBeenCalledWith(packageEntity.project_id, packageEntity.id); }); - it('should create flash on API error', async () => { + it('should create alert on API error', async () => { Api.projectPackage = jest.fn().mockRejectedValue(); await testAction( @@ -83,7 +83,7 @@ describe('Actions Package details store', () => { packageEntity.id, ); }); - it('should create flash on API error', async () => { + it('should create alert on API error', async () => { Api.deleteProjectPackage = jest.fn().mockRejectedValue(); await testAction(deletePackage, undefined, { packageEntity }, [], []); @@ -118,7 +118,7 @@ describe('Actions Package details store', () => { }); }); - it('should create flash on API error', async () => { + it('should create alert on API error', async () => { Api.deleteProjectPackageFile = jest.fn().mockRejectedValue(); await testAction(deletePackageFile, fileId, { packageEntity }, [], []); expect(createAlert).toHaveBeenCalledWith({ diff --git a/spec/frontend/packages_and_registries/infrastructure_registry/components/list/components/packages_list_app_spec.js b/spec/frontend/packages_and_registries/infrastructure_registry/components/list/components/packages_list_app_spec.js index d237023d0cd..36763bdcbac 100644 --- a/spec/frontend/packages_and_registries/infrastructure_registry/components/list/components/packages_list_app_spec.js +++ b/spec/frontend/packages_and_registries/infrastructure_registry/components/list/components/packages_list_app_spec.js @@ -3,7 +3,7 @@ import { shallowMount } from '@vue/test-utils'; import Vue from 'vue'; import Vuex from 'vuex'; import setWindowLocation from 'helpers/set_window_location_helper'; -import { createAlert, VARIANT_INFO } from '~/flash'; +import { createAlert, VARIANT_INFO } from '~/alert'; import * as commonUtils from '~/lib/utils/common_utils'; import PackageListApp from '~/packages_and_registries/infrastructure_registry/list/components/packages_list_app.vue'; import { DELETE_PACKAGE_SUCCESS_MESSAGE } from '~/packages_and_registries/infrastructure_registry/list/constants'; @@ -14,7 +14,7 @@ import InfrastructureSearch from '~/packages_and_registries/infrastructure_regis import { FILTERED_SEARCH_TERM } from '~/vue_shared/components/filtered_search_bar/constants'; jest.mock('~/lib/utils/common_utils'); -jest.mock('~/flash'); +jest.mock('~/alert'); Vue.use(Vuex); @@ -217,7 +217,7 @@ describe('packages_list_app', () => { setWindowLocation(originalLocation); }); - it(`creates a flash if the query string contains ${SHOW_DELETE_SUCCESS_ALERT}`, () => { + it(`creates an alert if the query string contains ${SHOW_DELETE_SUCCESS_ALERT}`, () => { mountComponent(); expect(createAlert).toHaveBeenCalledWith({ diff --git a/spec/frontend/packages_and_registries/infrastructure_registry/components/list/stores/actions_spec.js b/spec/frontend/packages_and_registries/infrastructure_registry/components/list/stores/actions_spec.js index b5251aba40f..4f051264172 100644 --- a/spec/frontend/packages_and_registries/infrastructure_registry/components/list/stores/actions_spec.js +++ b/spec/frontend/packages_and_registries/infrastructure_registry/components/list/stores/actions_spec.js @@ -2,14 +2,14 @@ import axios from 'axios'; import MockAdapter from 'axios-mock-adapter'; import testAction from 'helpers/vuex_action_helper'; import Api from '~/api'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import { HTTP_STATUS_BAD_REQUEST, HTTP_STATUS_OK } from '~/lib/utils/http_status'; import { MISSING_DELETE_PATH_ERROR } from '~/packages_and_registries/infrastructure_registry/list/constants'; import * as actions from '~/packages_and_registries/infrastructure_registry/list/stores/actions'; import * as types from '~/packages_and_registries/infrastructure_registry/list/stores/mutation_types'; import { DELETE_PACKAGE_ERROR_MESSAGE } from '~/packages_and_registries/shared/constants'; -jest.mock('~/flash'); +jest.mock('~/alert'); jest.mock('~/api.js'); describe('Actions Package list store', () => { @@ -96,7 +96,7 @@ describe('Actions Package list store', () => { }); }); - it('should create flash on API error', async () => { + it('should create alert on API error', async () => { Api.projectPackages = jest.fn().mockRejectedValue(); await testAction( actions.requestPackagesList, @@ -198,7 +198,7 @@ describe('Actions Package list store', () => { ); }); - it('should stop the loading and call create flash on api error', async () => { + it('should stop the loading and call create alert on api error', async () => { mock.onDelete(payload._links.delete_api_path).replyOnce(HTTP_STATUS_BAD_REQUEST); await testAction( actions.requestDeletePackage, diff --git a/spec/frontend/packages_and_registries/package_registry/components/functional/delete_packages_spec.js b/spec/frontend/packages_and_registries/package_registry/components/functional/delete_packages_spec.js index 689b53fa2a4..d21a7fcbeba 100644 --- a/spec/frontend/packages_and_registries/package_registry/components/functional/delete_packages_spec.js +++ b/spec/frontend/packages_and_registries/package_registry/components/functional/delete_packages_spec.js @@ -3,7 +3,7 @@ import VueApollo from 'vue-apollo'; import waitForPromises from 'helpers/wait_for_promises'; import { shallowMountExtended } from 'helpers/vue_test_utils_helper'; import createMockApollo from 'helpers/mock_apollo_helper'; -import { createAlert, VARIANT_SUCCESS, VARIANT_WARNING } from '~/flash'; +import { createAlert, VARIANT_SUCCESS, VARIANT_WARNING } from '~/alert'; import DeletePackages from '~/packages_and_registries/package_registry/components/functional/delete_packages.vue'; import destroyPackagesMutation from '~/packages_and_registries/package_registry/graphql/mutations/destroy_packages.mutation.graphql'; @@ -14,7 +14,7 @@ import { packagesListQuery, } from '../../mock_data'; -jest.mock('~/flash'); +jest.mock('~/alert'); describe('DeletePackages', () => { let wrapper; diff --git a/spec/frontend/packages_and_registries/package_registry/pages/details_spec.js b/spec/frontend/packages_and_registries/package_registry/pages/details_spec.js index b494965a3cb..8d0718a2c3b 100644 --- a/spec/frontend/packages_and_registries/package_registry/pages/details_spec.js +++ b/spec/frontend/packages_and_registries/package_registry/pages/details_spec.js @@ -6,7 +6,7 @@ import createMockApollo from 'helpers/mock_apollo_helper'; import { useMockLocationHelper } from 'helpers/mock_window_location_helper'; import { shallowMountExtended } from 'helpers/vue_test_utils_helper'; import waitForPromises from 'helpers/wait_for_promises'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import AdditionalMetadata from '~/packages_and_registries/package_registry/components/details/additional_metadata.vue'; import PackagesApp from '~/packages_and_registries/package_registry/pages/details.vue'; @@ -45,7 +45,7 @@ import { pagination, } from '../mock_data'; -jest.mock('~/flash'); +jest.mock('~/alert'); useMockLocationHelper(); describe('PackagesApp', () => { diff --git a/spec/frontend/packages_and_registries/package_registry/pages/list_spec.js b/spec/frontend/packages_and_registries/package_registry/pages/list_spec.js index a2bdba87980..33f009905a0 100644 --- a/spec/frontend/packages_and_registries/package_registry/pages/list_spec.js +++ b/spec/frontend/packages_and_registries/package_registry/pages/list_spec.js @@ -21,7 +21,7 @@ import getPackagesQuery from '~/packages_and_registries/package_registry/graphql import destroyPackagesMutation from '~/packages_and_registries/package_registry/graphql/mutations/destroy_packages.mutation.graphql'; import { packagesListQuery, packageData, pagination } from '../mock_data'; -jest.mock('~/flash'); +jest.mock('~/alert'); describe('PackagesListApp', () => { let wrapper; diff --git a/spec/frontend/packages_and_registries/settings/group/components/dependency_proxy_settings_spec.js b/spec/frontend/packages_and_registries/settings/group/components/dependency_proxy_settings_spec.js index 796d89231f4..7836fe0ace9 100644 --- a/spec/frontend/packages_and_registries/settings/group/components/dependency_proxy_settings_spec.js +++ b/spec/frontend/packages_and_registries/settings/group/components/dependency_proxy_settings_spec.js @@ -28,7 +28,7 @@ import { dependencyProxyUpdateTllPolicyMutationMock, } from '../mock_data'; -jest.mock('~/flash'); +jest.mock('~/alert'); jest.mock('~/packages_and_registries/settings/group/graphql/utils/optimistic_responses'); describe('DependencyProxySettings', () => { diff --git a/spec/frontend/packages_and_registries/settings/group/components/group_settings_app_spec.js b/spec/frontend/packages_and_registries/settings/group/components/group_settings_app_spec.js index 7edc321867c..6274fbdbb0c 100644 --- a/spec/frontend/packages_and_registries/settings/group/components/group_settings_app_spec.js +++ b/spec/frontend/packages_and_registries/settings/group/components/group_settings_app_spec.js @@ -19,7 +19,7 @@ import { dependencyProxyImageTtlPolicy, } from '../mock_data'; -jest.mock('~/flash'); +jest.mock('~/alert'); describe('Group Settings App', () => { let wrapper; diff --git a/spec/frontend/packages_and_registries/settings/group/components/package_settings_spec.js b/spec/frontend/packages_and_registries/settings/group/components/package_settings_spec.js index 807f332f4d3..7966fd40907 100644 --- a/spec/frontend/packages_and_registries/settings/group/components/package_settings_spec.js +++ b/spec/frontend/packages_and_registries/settings/group/components/package_settings_spec.js @@ -23,7 +23,7 @@ import { groupPackageSettingsMutationErrorMock, } from '../mock_data'; -jest.mock('~/flash'); +jest.mock('~/alert'); jest.mock('~/packages_and_registries/settings/group/graphql/utils/optimistic_responses'); describe('Packages Settings', () => { diff --git a/spec/frontend/packages_and_registries/settings/group/components/packages_forwarding_settings_spec.js b/spec/frontend/packages_and_registries/settings/group/components/packages_forwarding_settings_spec.js index a0b257a9496..d57077b31c8 100644 --- a/spec/frontend/packages_and_registries/settings/group/components/packages_forwarding_settings_spec.js +++ b/spec/frontend/packages_and_registries/settings/group/components/packages_forwarding_settings_spec.js @@ -25,7 +25,7 @@ import { mavenProps, } from '../mock_data'; -jest.mock('~/flash'); +jest.mock('~/alert'); jest.mock('~/packages_and_registries/settings/group/graphql/utils/optimistic_responses'); describe('Packages Forwarding Settings', () => { diff --git a/spec/frontend/profile/account/components/update_username_spec.js b/spec/frontend/profile/account/components/update_username_spec.js index b19db73459d..6b325d70561 100644 --- a/spec/frontend/profile/account/components/update_username_spec.js +++ b/spec/frontend/profile/account/components/update_username_spec.js @@ -4,12 +4,12 @@ import Vue, { nextTick } from 'vue'; import waitForPromises from 'helpers/wait_for_promises'; import { TEST_HOST } from 'helpers/test_constants'; import { shallowMountExtended } from 'helpers/vue_test_utils_helper'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import axios from '~/lib/utils/axios_utils'; import { HTTP_STATUS_BAD_REQUEST, HTTP_STATUS_OK } from '~/lib/utils/http_status'; import UpdateUsername from '~/profile/account/components/update_username.vue'; -jest.mock('~/flash'); +jest.mock('~/alert'); describe('UpdateUsername component', () => { const rootUrl = TEST_HOST; diff --git a/spec/frontend/profile/preferences/components/profile_preferences_spec.js b/spec/frontend/profile/preferences/components/profile_preferences_spec.js index 91cd868daac..808e2cf41c9 100644 --- a/spec/frontend/profile/preferences/components/profile_preferences_spec.js +++ b/spec/frontend/profile/preferences/components/profile_preferences_spec.js @@ -3,7 +3,7 @@ import { shallowMount } from '@vue/test-utils'; import { nextTick } from 'vue'; import { useMockLocationHelper } from 'helpers/mock_window_location_helper'; import { extendedWrapper } from 'helpers/vue_test_utils_helper'; -import { createAlert, VARIANT_DANGER, VARIANT_INFO } from '~/flash'; +import { createAlert, VARIANT_DANGER, VARIANT_INFO } from '~/alert'; import IntegrationView from '~/profile/preferences/components/integration_view.vue'; import ProfilePreferences from '~/profile/preferences/components/profile_preferences.vue'; import { i18n } from '~/profile/preferences/constants'; @@ -17,7 +17,7 @@ import { lightModeThemeId2, } from '../mock_data'; -jest.mock('~/flash'); +jest.mock('~/alert'); const expectedUrl = '/foo'; useMockLocationHelper(); diff --git a/spec/frontend/projects/settings/branch_rules/components/view/index_spec.js b/spec/frontend/projects/settings/branch_rules/components/view/index_spec.js index 714e0df596e..005a019ddaa 100644 --- a/spec/frontend/projects/settings/branch_rules/components/view/index_spec.js +++ b/spec/frontend/projects/settings/branch_rules/components/view/index_spec.js @@ -9,6 +9,10 @@ import Protection from '~/projects/settings/branch_rules/components/view/protect import { I18N, ALL_BRANCHES_WILDCARD, + REQUIRED_ICON, + NOT_REQUIRED_ICON, + REQUIRED_ICON_CLASS, + NOT_REQUIRED_ICON_CLASS, } from '~/projects/settings/branch_rules/components/view/constants'; import branchRulesQuery from 'ee_else_ce/projects/settings/branch_rules/queries/branch_rules_details.query.graphql'; import { sprintf } from '~/locale'; @@ -39,12 +43,13 @@ describe('View branch rules', () => { let fakeApollo; const projectPath = 'test/testing'; const protectedBranchesPath = 'protected/branches'; - const branchProtectionsMockRequestHandler = jest - .fn() - .mockResolvedValue(branchProtectionsMockResponse); + const branchProtectionsMockRequestHandler = (response = branchProtectionsMockResponse) => + jest.fn().mockResolvedValue(response); - const createComponent = async () => { - fakeApollo = createMockApollo([[branchRulesQuery, branchProtectionsMockRequestHandler]]); + const createComponent = async (mockResponse) => { + fakeApollo = createMockApollo([ + [branchRulesQuery, branchProtectionsMockRequestHandler(mockResponse)], + ]); wrapper = shallowMountExtended(RuleView, { apolloProvider: fakeApollo, @@ -63,7 +68,9 @@ describe('View branch rules', () => { const findBranchTitle = () => wrapper.findByTestId('branch-title'); const findBranchProtectionTitle = () => wrapper.findByText(I18N.protectBranchTitle); const findBranchProtections = () => wrapper.findAllComponents(Protection); - const findForcePushTitle = () => wrapper.findByText(I18N.allowForcePushDescription); + const findForcePushIcon = () => wrapper.findByTestId('force-push-icon'); + const findForcePushTitle = (title) => wrapper.findByText(title); + const findForcePushDescription = () => wrapper.findByText(I18N.forcePushDescription); const findApprovalsTitle = () => wrapper.findByText(I18N.approvalsTitle); const findStatusChecksTitle = () => wrapper.findByText(I18N.statusChecksTitle); const findMatchingBranchesLink = () => @@ -123,9 +130,23 @@ describe('View branch rules', () => { }); }); - it('renders force push protection', () => { - expect(findForcePushTitle().exists()).toBe(true); - }); + it.each` + allowForcePush | iconName | iconClass | title + ${true} | ${REQUIRED_ICON} | ${REQUIRED_ICON_CLASS} | ${I18N.allowForcePushTitle} + ${false} | ${NOT_REQUIRED_ICON} | ${NOT_REQUIRED_ICON_CLASS} | ${I18N.doesNotAllowForcePushTitle} + `( + 'renders force push section with the correct icon, title and description', + async ({ allowForcePush, iconName, iconClass, title }) => { + const mockResponse = branchProtectionsMockResponse; + mockResponse.data.project.branchRules.nodes[0].branchProtection.allowForcePush = allowForcePush; + await createComponent(mockResponse); + + expect(findForcePushIcon().props('name')).toBe(iconName); + expect(findForcePushIcon().attributes('class')).toBe(iconClass); + expect(findForcePushTitle(title).exists()).toBe(true); + expect(findForcePushDescription().exists()).toBe(true); + }, + ); it('renders a branch protection component for merge rules', () => { expect(findBranchProtections().at(1).props()).toMatchObject({ diff --git a/spec/frontend/ref/components/__snapshots__/ref_selector_spec.js.snap b/spec/frontend/ref/components/__snapshots__/ref_selector_spec.js.snap deleted file mode 100644 index 5053778369e..00000000000 --- a/spec/frontend/ref/components/__snapshots__/ref_selector_spec.js.snap +++ /dev/null @@ -1,80 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Ref selector component footer slot passes the expected slot props 1`] = ` -Object { - "isLoading": false, - "matches": Object { - "branches": Object { - "error": null, - "list": Array [ - Object { - "default": false, - "name": "add_images_and_changes", - "value": undefined, - }, - Object { - "default": false, - "name": "conflict-contains-conflict-markers", - "value": undefined, - }, - Object { - "default": false, - "name": "deleted-image-test", - "value": undefined, - }, - Object { - "default": false, - "name": "diff-files-image-to-symlink", - "value": undefined, - }, - Object { - "default": false, - "name": "diff-files-symlink-to-image", - "value": undefined, - }, - Object { - "default": false, - "name": "markdown", - "value": undefined, - }, - Object { - "default": true, - "name": "master", - "value": undefined, - }, - ], - "totalCount": 123, - }, - "commits": Object { - "error": null, - "list": Array [ - Object { - "name": "b83d6e39", - "subtitle": "Merge branch 'branch-merged' into 'master'", - "value": "b83d6e391c22777fca1ed3012fce84f633d7fed0", - }, - ], - "totalCount": 1, - }, - "tags": Object { - "error": null, - "list": Array [ - Object { - "name": "v1.1.1", - "value": undefined, - }, - Object { - "name": "v1.1.0", - "value": undefined, - }, - Object { - "name": "v1.0.0", - "value": undefined, - }, - ], - "totalCount": 456, - }, - }, - "query": "abcd1234", -} -`; diff --git a/spec/frontend/ref/components/ref_selector_spec.js b/spec/frontend/ref/components/ref_selector_spec.js index 40d3a291074..4767ca48f0f 100644 --- a/spec/frontend/ref/components/ref_selector_spec.js +++ b/spec/frontend/ref/components/ref_selector_spec.js @@ -33,6 +33,8 @@ describe('Ref selector component', () => { const fixtures = { branches, tags, commit }; const projectId = '8'; + const totalBranchesCount = 123; + const totalTagsCount = 456; let wrapper; let branchesApiCallSpy; @@ -69,10 +71,14 @@ describe('Ref selector component', () => { branchesApiCallSpy = jest .fn() - .mockReturnValue([HTTP_STATUS_OK, fixtures.branches, { [X_TOTAL_HEADER]: '123' }]); + .mockReturnValue([ + HTTP_STATUS_OK, + fixtures.branches, + { [X_TOTAL_HEADER]: totalBranchesCount }, + ]); tagsApiCallSpy = jest .fn() - .mockReturnValue([HTTP_STATUS_OK, fixtures.tags, { [X_TOTAL_HEADER]: '456' }]); + .mockReturnValue([HTTP_STATUS_OK, fixtures.tags, { [X_TOTAL_HEADER]: totalTagsCount }]); commitApiCallSpy = jest.fn().mockReturnValue([HTTP_STATUS_OK, fixtures.commit]); requestSpies = { branchesApiCallSpy, tagsApiCallSpy, commitApiCallSpy }; @@ -690,7 +696,46 @@ describe('Ref selector component', () => { // is updated. For the sake of this test, we'll just test the last call, which // represents the final state of the slot props. const lastCallProps = last(createFooter.mock.calls)[0]; - expect(lastCallProps).toMatchSnapshot(); + expect(lastCallProps.isLoading).toBe(false); + expect(lastCallProps.query).toBe('abcd1234'); + + const branchesList = fixtures.branches.map((branch) => { + return { + default: branch.default, + name: branch.name, + }; + }); + + const commitsList = [ + { + name: fixtures.commit.short_id, + subtitle: fixtures.commit.title, + value: fixtures.commit.id, + }, + ]; + + const tagsList = fixtures.tags.map((tag) => { + return { + name: tag.name, + }; + }); + + const expectedMatches = { + branches: { + list: branchesList, + totalCount: totalBranchesCount, + }, + commits: { + list: commitsList, + totalCount: 1, + }, + tags: { + list: tagsList, + totalCount: totalTagsCount, + }, + }; + + expect(lastCallProps.matches).toMatchObject(expectedMatches); }); }); }); diff --git a/spec/frontend/snippets/components/snippet_header_spec.js b/spec/frontend/snippets/components/snippet_header_spec.js index 21597d47206..2e518b09073 100644 --- a/spec/frontend/snippets/components/snippet_header_spec.js +++ b/spec/frontend/snippets/components/snippet_header_spec.js @@ -1,8 +1,9 @@ -import { GlButton, GlModal, GlDropdown } from '@gitlab/ui'; +import { GlModal, GlButton, GlDropdown } from '@gitlab/ui'; import { mount } from '@vue/test-utils'; -import { ApolloMutation } from 'vue-apollo'; +import VueApollo from 'vue-apollo'; import MockAdapter from 'axios-mock-adapter'; -import { nextTick } from 'vue'; +import Vue, { nextTick } from 'vue'; +import createMockApollo from 'helpers/mock_apollo_helper'; import { useMockLocationHelper } from 'helpers/mock_window_location_helper'; import waitForPromises from 'helpers/wait_for_promises'; import { Blob, BinaryBlob } from 'jest/blob/components/mock_data'; @@ -11,18 +12,28 @@ import SnippetHeader, { i18n } from '~/snippets/components/snippet_header.vue'; import DeleteSnippetMutation from '~/snippets/mutations/delete_snippet.mutation.graphql'; import axios from '~/lib/utils/axios_utils'; import { createAlert, VARIANT_DANGER, VARIANT_SUCCESS } from '~/alert'; +import CanCreateProjectSnippet from 'shared_queries/snippet/project_permissions.query.graphql'; +import CanCreatePersonalSnippet from 'shared_queries/snippet/user_permissions.query.graphql'; +import { getCanCreateProjectSnippetMock, getCanCreatePersonalSnippetMock } from '../mock_data'; + +const ERROR_MSG = 'Foo bar'; +const ERR = { message: ERROR_MSG }; + +const MUTATION_TYPES = { + RESOLVE: jest.fn().mockResolvedValue({ data: { destroySnippet: { errors: [] } } }), + REJECT: jest.fn().mockRejectedValue(ERR), +}; jest.mock('~/alert'); +Vue.use(VueApollo); + describe('Snippet header component', () => { let wrapper; let snippet; - let mutationTypes; - let mutationVariables; let mock; + let mockApollo; - let errorMsg; - let err; const originalRelativeUrlRoot = gon.relative_url_root; const reportAbusePath = '/-/snippets/42/mark_as_spam'; const canReportSpam = true; @@ -30,11 +41,12 @@ describe('Snippet header component', () => { const GlEmoji = { template: '<img/>' }; function createComponent({ - loading = false, permissions = {}, - mutationRes = mutationTypes.RESOLVE, snippetProps = {}, provide = {}, + canCreateProjectSnippetMock = jest.fn().mockResolvedValue(getCanCreateProjectSnippetMock()), + canCreatePersonalSnippetMock = jest.fn().mockResolvedValue(getCanCreatePersonalSnippetMock()), + deleteSnippetMock = MUTATION_TYPES.RESOLVE, } = {}) { const defaultProps = Object.assign(snippet, snippetProps); if (permissions) { @@ -42,17 +54,14 @@ describe('Snippet header component', () => { ...permissions, }); } - const $apollo = { - queries: { - canCreateSnippet: { - loading, - }, - }, - mutate: mutationRes, - }; + + mockApollo = createMockApollo([ + [CanCreateProjectSnippet, canCreateProjectSnippetMock], + [CanCreatePersonalSnippet, canCreatePersonalSnippetMock], + [DeleteSnippetMutation, deleteSnippetMock], + ]); wrapper = mount(SnippetHeader, { - mocks: { $apollo }, provide: { reportAbusePath, canReportSpam, @@ -64,9 +73,9 @@ describe('Snippet header component', () => { }, }, stubs: { - ApolloMutation, GlEmoji, }, + apolloProvider: mockApollo, }); } @@ -91,6 +100,7 @@ describe('Snippet header component', () => { title: x.attributes('title'), text: x.text(), })); + const findDeleteModal = () => wrapper.findComponent(GlModal); beforeEach(() => { gon.relative_url_root = '/foo/'; @@ -113,26 +123,11 @@ describe('Snippet header component', () => { createdAt: new Date(differenceInMilliseconds(32 * 24 * 3600 * 1000)).toISOString(), }; - mutationVariables = { - mutation: DeleteSnippetMutation, - variables: { - id: snippet.id, - }, - }; - - errorMsg = 'Foo bar'; - err = { message: errorMsg }; - - mutationTypes = { - RESOLVE: jest.fn(() => Promise.resolve({ data: { destroySnippet: { errors: [] } } })), - REJECT: jest.fn(() => Promise.reject(err)), - }; - mock = new MockAdapter(axios); }); afterEach(() => { - wrapper.destroy(); + mockApollo = null; mock.restore(); gon.relative_url_root = originalRelativeUrlRoot; }); @@ -238,15 +233,16 @@ describe('Snippet header component', () => { }); it('with canCreateSnippet permission, renders create button', async () => { - createComponent(); + createComponent({ + canCreateProjectSnippetMock: jest + .fn() + .mockResolvedValue(getCanCreateProjectSnippetMock(true)), + canCreatePersonalSnippetMock: jest + .fn() + .mockResolvedValue(getCanCreatePersonalSnippetMock(true)), + }); - // TODO: we should avoid `wrapper.setData` since they - // are component internals. Let's use the apollo mock helpers - // in a follow-up. - // setData usage is discouraged. See https://gitlab.com/groups/gitlab-org/-/epics/7330 for details - // eslint-disable-next-line no-restricted-syntax - wrapper.setData({ canCreateSnippet: true }); - await nextTick(); + await waitForPromises(); expect(findButtonsAsModel()).toEqual( expect.arrayContaining([ @@ -329,21 +325,37 @@ describe('Snippet header component', () => { }); describe('Delete mutation', () => { - it('dispatches a mutation to delete the snippet with correct variables', () => { + const deleteSnippet = async () => { + // Click delete action + findButtons().at(1).trigger('click'); + await nextTick(); + + expect(findDeleteModal().props().visible).toBe(true); + + // Click delete button in delete modal + document.querySelector('[data-testid="delete-snippet"').click(); + await waitForPromises(); + }; + + it('dispatches a mutation to delete the snippet with correct variables', async () => { createComponent(); - wrapper.vm.deleteSnippet(); - expect(mutationTypes.RESOLVE).toHaveBeenCalledWith(mutationVariables); + + await deleteSnippet(); + + expect(MUTATION_TYPES.RESOLVE).toHaveBeenCalledWith({ + id: snippet.id, + }); }); it('sets error message if mutation fails', async () => { - createComponent({ mutationRes: mutationTypes.REJECT }); + createComponent({ deleteSnippetMock: MUTATION_TYPES.REJECT }); expect(Boolean(wrapper.vm.errorMessage)).toBe(false); - wrapper.vm.deleteSnippet(); - - await waitForPromises(); + await deleteSnippet(); - expect(wrapper.vm.errorMessage).toEqual(errorMsg); + expect(document.querySelector('[data-testid="delete-alert"').textContent.trim()).toBe( + ERROR_MSG, + ); }); describe('in case of successful mutation, closes modal and redirects to correct listing', () => { @@ -353,15 +365,16 @@ describe('Snippet header component', () => { createComponent({ snippetProps, }); - wrapper.vm.closeDeleteModal = jest.fn(); - wrapper.vm.deleteSnippet(); - await nextTick(); + await deleteSnippet(); }; it('redirects to dashboard/snippets for personal snippet', async () => { await createDeleteSnippet(); - expect(wrapper.vm.closeDeleteModal).toHaveBeenCalled(); + + // Check that the modal is hidden after deleting the snippet + expect(findDeleteModal().props().visible).toBe(false); + expect(window.location.pathname).toBe(`${gon.relative_url_root}dashboard/snippets`); }); @@ -372,7 +385,10 @@ describe('Snippet header component', () => { fullPath, }, }); - expect(wrapper.vm.closeDeleteModal).toHaveBeenCalled(); + + // Check that the modal is hidden after deleting the snippet + expect(findDeleteModal().props().visible).toBe(false); + expect(window.location.pathname).toBe(`${fullPath}/-/snippets`); }); }); diff --git a/spec/frontend/snippets/mock_data.js b/spec/frontend/snippets/mock_data.js new file mode 100644 index 00000000000..7546fa575c6 --- /dev/null +++ b/spec/frontend/snippets/mock_data.js @@ -0,0 +1,19 @@ +export const getCanCreateProjectSnippetMock = (createSnippet = false) => ({ + data: { + project: { + userPermissions: { + createSnippet, + }, + }, + }, +}); + +export const getCanCreatePersonalSnippetMock = (createSnippet = false) => ({ + data: { + currentUser: { + userPermissions: { + createSnippet, + }, + }, + }, +}); diff --git a/spec/frontend/token_access/inbound_token_access_spec.js b/spec/frontend/token_access/inbound_token_access_spec.js index fcd1a33fa68..1ca58053e68 100644 --- a/spec/frontend/token_access/inbound_token_access_spec.js +++ b/spec/frontend/token_access/inbound_token_access_spec.js @@ -4,7 +4,7 @@ import VueApollo from 'vue-apollo'; import createMockApollo from 'helpers/mock_apollo_helper'; import { mountExtended, shallowMountExtended } from 'helpers/vue_test_utils_helper'; import waitForPromises from 'helpers/wait_for_promises'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import InboundTokenAccess from '~/token_access/components/inbound_token_access.vue'; import inboundAddProjectCIJobTokenScopeMutation from '~/token_access/graphql/mutations/inbound_add_project_ci_job_token_scope.mutation.graphql'; import inboundRemoveProjectCIJobTokenScopeMutation from '~/token_access/graphql/mutations/inbound_remove_project_ci_job_token_scope.mutation.graphql'; @@ -26,7 +26,7 @@ const error = new Error(message); Vue.use(VueApollo); -jest.mock('~/flash'); +jest.mock('~/alert'); describe('TokenAccess component', () => { let wrapper; diff --git a/spec/frontend/token_access/opt_in_jwt_spec.js b/spec/frontend/token_access/opt_in_jwt_spec.js index 3a68f247aa6..cdb385aa743 100644 --- a/spec/frontend/token_access/opt_in_jwt_spec.js +++ b/spec/frontend/token_access/opt_in_jwt_spec.js @@ -4,7 +4,7 @@ import VueApollo from 'vue-apollo'; import createMockApollo from 'helpers/mock_apollo_helper'; import { mountExtended, shallowMountExtended } from 'helpers/vue_test_utils_helper'; import waitForPromises from 'helpers/wait_for_promises'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import { OPT_IN_JWT_HELP_LINK } from '~/token_access/constants'; import OptInJwt from '~/token_access/components/opt_in_jwt.vue'; import getOptInJwtSettingQuery from '~/token_access/graphql/queries/get_opt_in_jwt_setting.query.graphql'; @@ -16,7 +16,7 @@ const error = new Error(errorMessage); Vue.use(VueApollo); -jest.mock('~/flash'); +jest.mock('~/alert'); describe('OptInJwt component', () => { let wrapper; diff --git a/spec/frontend/token_access/outbound_token_access_spec.js b/spec/frontend/token_access/outbound_token_access_spec.js index 893a021197f..347ea1178bc 100644 --- a/spec/frontend/token_access/outbound_token_access_spec.js +++ b/spec/frontend/token_access/outbound_token_access_spec.js @@ -4,7 +4,7 @@ import VueApollo from 'vue-apollo'; import createMockApollo from 'helpers/mock_apollo_helper'; import { mountExtended, shallowMountExtended } from 'helpers/vue_test_utils_helper'; import waitForPromises from 'helpers/wait_for_promises'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import OutboundTokenAccess from '~/token_access/components/outbound_token_access.vue'; import addProjectCIJobTokenScopeMutation from '~/token_access/graphql/mutations/add_project_ci_job_token_scope.mutation.graphql'; import removeProjectCIJobTokenScopeMutation from '~/token_access/graphql/mutations/remove_project_ci_job_token_scope.mutation.graphql'; @@ -26,7 +26,7 @@ const error = new Error(message); Vue.use(VueApollo); -jest.mock('~/flash'); +jest.mock('~/alert'); describe('TokenAccess component', () => { let wrapper; diff --git a/spec/frontend/vue_merge_request_widget/deployment/deployment_actions_spec.js b/spec/frontend/vue_merge_request_widget/deployment/deployment_actions_spec.js index 41df485b0de..15c838a4a6f 100644 --- a/spec/frontend/vue_merge_request_widget/deployment/deployment_actions_spec.js +++ b/spec/frontend/vue_merge_request_widget/deployment/deployment_actions_spec.js @@ -1,6 +1,6 @@ import { mount } from '@vue/test-utils'; import waitForPromises from 'helpers/wait_for_promises'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import { confirmAction } from '~/lib/utils/confirm_via_gl_modal/confirm_via_gl_modal'; import { visitUrl } from '~/lib/utils/url_utility'; import { @@ -21,7 +21,7 @@ import { retryDetails, } from './deployment_mock_data'; -jest.mock('~/flash'); +jest.mock('~/alert'); jest.mock('~/lib/utils/url_utility'); jest.mock('~/lib/utils/confirm_via_gl_modal/confirm_via_gl_modal'); diff --git a/spec/frontend/vue_shared/components/color_select_dropdown/color_select_root_spec.js b/spec/frontend/vue_shared/components/color_select_dropdown/color_select_root_spec.js index 5b0772f6e34..36fd87a8ce2 100644 --- a/spec/frontend/vue_shared/components/color_select_dropdown/color_select_root_spec.js +++ b/spec/frontend/vue_shared/components/color_select_dropdown/color_select_root_spec.js @@ -3,7 +3,7 @@ import Vue from 'vue'; import VueApollo from 'vue-apollo'; import createMockApollo from 'helpers/mock_apollo_helper'; import waitForPromises from 'helpers/wait_for_promises'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import SidebarEditableItem from '~/sidebar/components/sidebar_editable_item.vue'; import DropdownContents from '~/vue_shared/components/color_select_dropdown/dropdown_contents.vue'; import DropdownValue from '~/vue_shared/components/color_select_dropdown/dropdown_value.vue'; @@ -13,7 +13,7 @@ import ColorSelectRoot from '~/vue_shared/components/color_select_dropdown/color import { DROPDOWN_VARIANT } from '~/vue_shared/components/color_select_dropdown/constants'; import { colorQueryResponse, updateColorMutationResponse, color } from './mock_data'; -jest.mock('~/flash'); +jest.mock('~/alert'); Vue.use(VueApollo); @@ -145,7 +145,7 @@ describe('LabelsSelectRoot', () => { await waitForPromises(); }); - it('creates flash with error message', () => { + it('creates alert with error message', () => { expect(createAlert).toHaveBeenCalledWith({ captureError: true, message: 'Error fetching epic color.', diff --git a/spec/frontend/vue_shared/components/filtered_search_bar/store/modules/filters/actions_spec.js b/spec/frontend/vue_shared/components/filtered_search_bar/store/modules/filters/actions_spec.js index 63c22aff3d5..6e63dee843a 100644 --- a/spec/frontend/vue_shared/components/filtered_search_bar/store/modules/filters/actions_spec.js +++ b/spec/frontend/vue_shared/components/filtered_search_bar/store/modules/filters/actions_spec.js @@ -3,7 +3,7 @@ import MockAdapter from 'axios-mock-adapter'; import testAction from 'helpers/vuex_action_helper'; import { mockBranches } from 'jest/vue_shared/components/filtered_search_bar/mock_data'; import Api from '~/api'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import { HTTP_STATUS_OK, HTTP_STATUS_SERVICE_UNAVAILABLE } from '~/lib/utils/http_status'; import * as actions from '~/vue_shared/components/filtered_search_bar/store/modules/filters/actions'; import * as types from '~/vue_shared/components/filtered_search_bar/store/modules/filters/mutation_types'; @@ -15,7 +15,7 @@ const labelsEndpoint = 'fake_labels_endpoint'; const groupEndpoint = 'fake_group_endpoint'; const projectEndpoint = 'fake_project_endpoint'; -jest.mock('~/flash'); +jest.mock('~/alert'); describe('Filters actions', () => { let state; diff --git a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/branch_token_spec.js b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/branch_token_spec.js index 3b09cf581cc..a6bb32736db 100644 --- a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/branch_token_spec.js +++ b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/branch_token_spec.js @@ -9,7 +9,7 @@ import MockAdapter from 'axios-mock-adapter'; import { nextTick } from 'vue'; import waitForPromises from 'helpers/wait_for_promises'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import axios from '~/lib/utils/axios_utils'; import { OPTIONS_NONE_ANY } from '~/vue_shared/components/filtered_search_bar/constants'; import BranchToken from '~/vue_shared/components/filtered_search_bar/tokens/branch_token.vue'; @@ -17,7 +17,7 @@ import BaseToken from '~/vue_shared/components/filtered_search_bar/tokens/base_t import { mockBranches, mockBranchToken } from '../mock_data'; -jest.mock('~/flash'); +jest.mock('~/alert'); const defaultStubs = { Portal: true, GlFilteredSearchSuggestionList: { @@ -120,7 +120,7 @@ describe('BranchToken', () => { }); }); - it('calls `createAlert` with flash error message when request fails', async () => { + it('calls `createAlert` with alert error message when request fails', async () => { await triggerFetchBranches(); expect(createAlert).toHaveBeenCalledWith({ diff --git a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/crm_contact_token_spec.js b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/crm_contact_token_spec.js index 7be7035a0f2..0faac554ae1 100644 --- a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/crm_contact_token_spec.js +++ b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/crm_contact_token_spec.js @@ -8,7 +8,7 @@ import Vue, { nextTick } from 'vue'; import VueApollo from 'vue-apollo'; import createMockApollo from 'helpers/mock_apollo_helper'; import waitForPromises from 'helpers/wait_for_promises'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import { getIdFromGraphQLId } from '~/graphql_shared/utils'; import { OPTIONS_NONE_ANY } from '~/vue_shared/components/filtered_search_bar/constants'; import BaseToken from '~/vue_shared/components/filtered_search_bar/tokens/base_token.vue'; @@ -22,7 +22,7 @@ import { mockProjectCrmContactsQueryResponse, } from '../mock_data'; -jest.mock('~/flash'); +jest.mock('~/alert'); const defaultStubs = { Portal: true, @@ -159,7 +159,7 @@ describe('CrmContactToken', () => { }); }); - it('calls `createAlert` with flash error message when request fails', async () => { + it('calls `createAlert` with alert error message when request fails', async () => { mountComponent(); jest.spyOn(wrapper.vm.$apollo, 'query').mockRejectedValue({}); diff --git a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/crm_organization_token_spec.js b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/crm_organization_token_spec.js index ecd3e8a04f1..ff176c5bb47 100644 --- a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/crm_organization_token_spec.js +++ b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/crm_organization_token_spec.js @@ -8,7 +8,7 @@ import Vue, { nextTick } from 'vue'; import VueApollo from 'vue-apollo'; import createMockApollo from 'helpers/mock_apollo_helper'; import waitForPromises from 'helpers/wait_for_promises'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import { getIdFromGraphQLId } from '~/graphql_shared/utils'; import { OPTIONS_NONE_ANY } from '~/vue_shared/components/filtered_search_bar/constants'; import BaseToken from '~/vue_shared/components/filtered_search_bar/tokens/base_token.vue'; @@ -22,7 +22,7 @@ import { mockProjectCrmOrganizationsQueryResponse, } from '../mock_data'; -jest.mock('~/flash'); +jest.mock('~/alert'); const defaultStubs = { Portal: true, @@ -158,7 +158,7 @@ describe('CrmOrganizationToken', () => { }); }); - it('calls `createAlert` with flash error message when request fails', async () => { + it('calls `createAlert` with alert error message when request fails', async () => { mountComponent(); jest.spyOn(wrapper.vm.$apollo, 'query').mockRejectedValue({}); diff --git a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/emoji_token_spec.js b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/emoji_token_spec.js index 2a07957efee..4e00b6837a3 100644 --- a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/emoji_token_spec.js +++ b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/emoji_token_spec.js @@ -8,7 +8,7 @@ import { mount } from '@vue/test-utils'; import MockAdapter from 'axios-mock-adapter'; import { nextTick } from 'vue'; import waitForPromises from 'helpers/wait_for_promises'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import axios from '~/lib/utils/axios_utils'; import { @@ -21,7 +21,7 @@ import BaseToken from '~/vue_shared/components/filtered_search_bar/tokens/base_t import { mockReactionEmojiToken, mockEmojis } from '../mock_data'; -jest.mock('~/flash'); +jest.mock('~/alert'); const GlEmoji = { template: '<img/>' }; const defaultStubs = { Portal: true, @@ -119,7 +119,7 @@ describe('EmojiToken', () => { return triggerFetchEmojis(); }); - it('calls `createAlert` with flash error message', () => { + it('calls `createAlert` with alert error message', () => { expect(createAlert).toHaveBeenCalledWith({ message: 'There was a problem fetching emojis.', }); diff --git a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/label_token_spec.js b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/label_token_spec.js index cfd8853119b..b9275409125 100644 --- a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/label_token_spec.js +++ b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/label_token_spec.js @@ -11,7 +11,7 @@ import { mockRegularLabel, mockLabels, } from 'jest/sidebar/components/labels/labels_select_vue/mock_data'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import axios from '~/lib/utils/axios_utils'; import { OPTIONS_NONE_ANY } from '~/vue_shared/components/filtered_search_bar/constants'; @@ -20,7 +20,7 @@ import LabelToken from '~/vue_shared/components/filtered_search_bar/tokens/label import { mockLabelToken } from '../mock_data'; -jest.mock('~/flash'); +jest.mock('~/alert'); const defaultStubs = { Portal: true, BaseToken, @@ -152,7 +152,7 @@ describe('LabelToken', () => { await triggerFetchLabels(); }); - it('calls `createAlert` with flash error message', () => { + it('calls `createAlert` with alert error message', () => { expect(createAlert).toHaveBeenCalledWith({ message: 'There was a problem fetching labels.', }); diff --git a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/milestone_token_spec.js b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/milestone_token_spec.js index 8a06c990711..fea1496a80b 100644 --- a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/milestone_token_spec.js +++ b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/milestone_token_spec.js @@ -8,7 +8,7 @@ import { mount } from '@vue/test-utils'; import MockAdapter from 'axios-mock-adapter'; import { nextTick } from 'vue'; import waitForPromises from 'helpers/wait_for_promises'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import axios from '~/lib/utils/axios_utils'; import { sortMilestonesByDueDate } from '~/milestones/utils'; @@ -18,7 +18,7 @@ import BaseToken from '~/vue_shared/components/filtered_search_bar/tokens/base_t import { mockMilestoneToken, mockMilestones, mockRegularMilestone } from '../mock_data'; -jest.mock('~/flash'); +jest.mock('~/alert'); jest.mock('~/milestones/utils'); const defaultStubs = { @@ -134,7 +134,7 @@ describe('MilestoneToken', () => { return triggerFetchMilestones(); }); - it('calls `createAlert` with flash error message', () => { + it('calls `createAlert` with alert error message', () => { expect(createAlert).toHaveBeenCalledWith({ message: 'There was a problem fetching milestones.', }); diff --git a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/release_token_spec.js b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/release_token_spec.js index 0e5fa0f66d4..1d564597969 100644 --- a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/release_token_spec.js +++ b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/release_token_spec.js @@ -2,11 +2,11 @@ import { GlFilteredSearchToken, GlFilteredSearchTokenSegment } from '@gitlab/ui' import { mount } from '@vue/test-utils'; import { nextTick } from 'vue'; import waitForPromises from 'helpers/wait_for_promises'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import ReleaseToken from '~/vue_shared/components/filtered_search_bar/tokens/release_token.vue'; import { mockReleaseToken } from '../mock_data'; -jest.mock('~/flash'); +jest.mock('~/alert'); describe('ReleaseToken', () => { const id = '123'; diff --git a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/user_token_spec.js b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/user_token_spec.js index 4671ee43d9e..a910e85a03e 100644 --- a/spec/frontend/vue_shared/components/filtered_search_bar/tokens/user_token_spec.js +++ b/spec/frontend/vue_shared/components/filtered_search_bar/tokens/user_token_spec.js @@ -8,7 +8,7 @@ import { mount } from '@vue/test-utils'; import MockAdapter from 'axios-mock-adapter'; import { nextTick } from 'vue'; import waitForPromises from 'helpers/wait_for_promises'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import axios from '~/lib/utils/axios_utils'; import { OPTIONS_NONE_ANY } from '~/vue_shared/components/filtered_search_bar/constants'; @@ -17,7 +17,7 @@ import BaseToken from '~/vue_shared/components/filtered_search_bar/tokens/base_t import { mockAuthorToken, mockUsers } from '../mock_data'; -jest.mock('~/flash'); +jest.mock('~/alert'); const defaultStubs = { Portal: true, GlFilteredSearchSuggestionList: { @@ -136,7 +136,7 @@ describe('UserToken', () => { return triggerFetchUsers(); }); - it('calls `createAlert` with flash error message', () => { + it('calls `createAlert` with alert error message', () => { expect(createAlert).toHaveBeenCalledWith({ message: 'There was a problem fetching users.', }); diff --git a/spec/frontend/vue_shared/components/metric_images/store/actions_spec.js b/spec/frontend/vue_shared/components/metric_images/store/actions_spec.js index 537367940e0..626f6fc735e 100644 --- a/spec/frontend/vue_shared/components/metric_images/store/actions_spec.js +++ b/spec/frontend/vue_shared/components/metric_images/store/actions_spec.js @@ -4,11 +4,11 @@ import actionsFactory from '~/vue_shared/components/metric_images/store/actions' import * as types from '~/vue_shared/components/metric_images/store/mutation_types'; import createStore from '~/vue_shared/components/metric_images/store'; import testAction from 'helpers/vuex_action_helper'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import { convertObjectPropsToCamelCase } from '~/lib/utils/common_utils'; import { fileList, initialData } from '../mock_data'; -jest.mock('~/flash'); +jest.mock('~/alert'); const service = { getMetricImages: jest.fn(), uploadMetricImage: jest.fn(), diff --git a/spec/frontend/vue_shared/components/new_resource_dropdown/new_resource_dropdown_spec.js b/spec/frontend/vue_shared/components/new_resource_dropdown/new_resource_dropdown_spec.js index 31320b1d2a6..a116233a065 100644 --- a/spec/frontend/vue_shared/components/new_resource_dropdown/new_resource_dropdown_spec.js +++ b/spec/frontend/vue_shared/components/new_resource_dropdown/new_resource_dropdown_spec.js @@ -21,7 +21,7 @@ import { searchProjectsWithinGroupQueryResponse, } from './mock_data'; -jest.mock('~/flash'); +jest.mock('~/alert'); describe('NewResourceDropdown component', () => { useLocalStorageSpy(); diff --git a/spec/frontend/vue_shared/components/security_reports/artifact_downloads/merge_request_artifact_download_spec.js b/spec/frontend/vue_shared/components/security_reports/artifact_downloads/merge_request_artifact_download_spec.js index 09b0b3d43ad..c032af04d3e 100644 --- a/spec/frontend/vue_shared/components/security_reports/artifact_downloads/merge_request_artifact_download_spec.js +++ b/spec/frontend/vue_shared/components/security_reports/artifact_downloads/merge_request_artifact_download_spec.js @@ -6,7 +6,7 @@ import { expectedDownloadDropdownPropsWithTitle, securityReportMergeRequestDownloadPathsQueryResponse, } from 'jest/vue_shared/security_reports/mock_data'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import Component from '~/vue_shared/security_reports/components/artifact_downloads/merge_request_artifact_download.vue'; import SecurityReportDownloadDropdown from '~/vue_shared/security_reports/components/security_report_download_dropdown.vue'; import { @@ -15,7 +15,7 @@ import { } from '~/vue_shared/security_reports/constants'; import securityReportMergeRequestDownloadPathsQuery from '~/vue_shared/security_reports/graphql/queries/security_report_merge_request_download_paths.query.graphql'; -jest.mock('~/flash'); +jest.mock('~/alert'); describe('Merge request artifact Download', () => { let wrapper; diff --git a/spec/frontend/vue_shared/components/upload_dropzone/upload_dropzone_spec.js b/spec/frontend/vue_shared/components/upload_dropzone/upload_dropzone_spec.js index a063a5591e3..56eb8e785d4 100644 --- a/spec/frontend/vue_shared/components/upload_dropzone/upload_dropzone_spec.js +++ b/spec/frontend/vue_shared/components/upload_dropzone/upload_dropzone_spec.js @@ -3,8 +3,6 @@ import { shallowMount } from '@vue/test-utils'; import { nextTick } from 'vue'; import UploadDropzone from '~/vue_shared/components/upload_dropzone/upload_dropzone.vue'; -jest.mock('~/flash'); - describe('Upload dropzone component', () => { let wrapper; diff --git a/spec/frontend/vue_shared/components/user_popover/user_popover_spec.js b/spec/frontend/vue_shared/components/user_popover/user_popover_spec.js index f6316af6ad8..d6d8ea6be03 100644 --- a/spec/frontend/vue_shared/components/user_popover/user_popover_spec.js +++ b/spec/frontend/vue_shared/components/user_popover/user_popover_spec.js @@ -13,11 +13,11 @@ import { I18N_ERROR_UNFOLLOW, } from '~/vue_shared/components/user_popover/constants'; import axios from '~/lib/utils/axios_utils'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import { followUser, unfollowUser } from '~/api/user_api'; import { mockTracking } from 'helpers/tracking_helper'; -jest.mock('~/flash'); +jest.mock('~/alert'); jest.mock('~/api/user_api', () => ({ followUser: jest.fn(), unfollowUser: jest.fn(), diff --git a/spec/frontend/vue_shared/issuable/show/components/issuable_body_spec.js b/spec/frontend/vue_shared/issuable/show/components/issuable_body_spec.js index 6b20f0c77a3..cee84806b43 100644 --- a/spec/frontend/vue_shared/issuable/show/components/issuable_body_spec.js +++ b/spec/frontend/vue_shared/issuable/show/components/issuable_body_spec.js @@ -13,7 +13,7 @@ import TimeAgoTooltip from '~/vue_shared/components/time_ago_tooltip.vue'; import { mockIssuableShowProps, mockIssuable } from '../mock_data'; jest.mock('~/autosave'); -jest.mock('~/flash'); +jest.mock('~/alert'); const issuableBodyProps = { ...mockIssuableShowProps, diff --git a/spec/frontend/vue_shared/security_reports/security_reports_app_spec.js b/spec/frontend/vue_shared/security_reports/security_reports_app_spec.js index 221da35de3d..ae02f38e7fe 100644 --- a/spec/frontend/vue_shared/security_reports/security_reports_app_spec.js +++ b/spec/frontend/vue_shared/security_reports/security_reports_app_spec.js @@ -14,7 +14,7 @@ import { sastDiffSuccessMock, secretDetectionDiffSuccessMock, } from 'jest/vue_shared/security_reports/mock_data'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import axios from '~/lib/utils/axios_utils'; import { HTTP_STATUS_INTERNAL_SERVER_ERROR, HTTP_STATUS_OK } from '~/lib/utils/http_status'; import HelpIcon from '~/vue_shared/security_reports/components/help_icon.vue'; @@ -26,7 +26,7 @@ import { import securityReportMergeRequestDownloadPathsQuery from '~/vue_shared/security_reports/graphql/queries/security_report_merge_request_download_paths.query.graphql'; import SecurityReportsApp from '~/vue_shared/security_reports/security_reports_app.vue'; -jest.mock('~/flash'); +jest.mock('~/alert'); Vue.use(VueApollo); Vue.use(Vuex); diff --git a/spec/frontend/work_items/components/work_item_links/work_item_link_child_spec.js b/spec/frontend/work_items/components/work_item_links/work_item_link_child_spec.js index 0470249d7ce..26446dc5451 100644 --- a/spec/frontend/work_items/components/work_item_links/work_item_link_child_spec.js +++ b/spec/frontend/work_items/components/work_item_links/work_item_link_child_spec.js @@ -7,7 +7,7 @@ import waitForPromises from 'helpers/wait_for_promises'; import WorkItemLinkChildMetadata from 'ee_else_ce/work_items/components/work_item_links/work_item_link_child_metadata.vue'; -import { createAlert } from '~/flash'; +import { createAlert } from '~/alert'; import RichTimestampTooltip from '~/vue_shared/components/rich_timestamp_tooltip.vue'; import getWorkItemTreeQuery from '~/work_items/graphql/work_item_tree.query.graphql'; @@ -31,7 +31,7 @@ import { workItemObjectiveMetadataWidgets, } from '../../mock_data'; -jest.mock('~/flash'); +jest.mock('~/alert'); describe('WorkItemLinkChild', () => { const WORK_ITEM_ID = 'gid://gitlab/WorkItem/2'; diff --git a/spec/helpers/sidebars_helper_spec.rb b/spec/helpers/sidebars_helper_spec.rb index ddfea50a86f..68c41bc4c35 100644 --- a/spec/helpers/sidebars_helper_spec.rb +++ b/spec/helpers/sidebars_helper_spec.rb @@ -209,7 +209,7 @@ RSpec.describe SidebarsHelper, feature_category: :navigation do end it 'returns Group Panel for group nav' do - expect(helper.super_sidebar_nav_panel(nav: 'group')).to be_a(Sidebars::Groups::Panel) + expect(helper.super_sidebar_nav_panel(nav: 'group')).to be_a(Sidebars::Groups::SuperSidebarPanel) end it 'returns "Your Work" Panel for your_work nav', :use_clean_rails_memory_store_caching do diff --git a/spec/lib/gitlab/usage_data_counters/hll_redis_counter_spec.rb b/spec/lib/gitlab/usage_data_counters/hll_redis_counter_spec.rb index 3322075cd5c..b7be257246f 100644 --- a/spec/lib/gitlab/usage_data_counters/hll_redis_counter_spec.rb +++ b/spec/lib/gitlab/usage_data_counters/hll_redis_counter_spec.rb @@ -389,9 +389,9 @@ RSpec.describe Gitlab::UsageDataCounters::HLLRedisCounter, :clean_gitlab_redis_s let(:known_events) do [ - { name: 'event_name_1', redis_slot: 'event', category: 'category1', aggregation: "weekly" }, - { name: 'event_name_2', redis_slot: 'event', category: 'category1', aggregation: "weekly" }, - { name: 'event_name_3', redis_slot: 'event', category: 'category1', aggregation: "weekly" } + { name: 'event_name_1', redis_slot: 'event', aggregation: "weekly" }, + { name: 'event_name_2', redis_slot: 'event', aggregation: "weekly" }, + { name: 'event_name_3', redis_slot: 'event', aggregation: "weekly" } ].map(&:with_indifferent_access) end @@ -430,11 +430,11 @@ RSpec.describe Gitlab::UsageDataCounters::HLLRedisCounter, :clean_gitlab_redis_s let(:time_range) { { start_date: 7.days.ago, end_date: DateTime.current } } let(:known_events) do [ - { name: 'event1_slot', redis_slot: "slot", category: 'category1', aggregation: "weekly" }, - { name: 'event2_slot', redis_slot: "slot", category: 'category2', aggregation: "weekly" }, - { name: 'event3_slot', redis_slot: "slot", category: 'category3', aggregation: "weekly" }, - { name: 'event5_slot', redis_slot: "slot", category: 'category4', aggregation: "daily" }, - { name: 'event4', category: 'category2', aggregation: "weekly" } + { name: 'event1_slot', redis_slot: "slot", aggregation: "weekly" }, + { name: 'event2_slot', redis_slot: "slot", aggregation: "weekly" }, + { name: 'event3_slot', redis_slot: "slot", aggregation: "weekly" }, + { name: 'event5_slot', redis_slot: "slot", aggregation: "daily" }, + { name: 'event4', aggregation: "weekly" } ].map(&:with_indifferent_access) end diff --git a/spec/lib/sidebars/concerns/super_sidebar_panel_spec.rb b/spec/lib/sidebars/concerns/super_sidebar_panel_spec.rb index 55598948271..f33cb4ab7f6 100644 --- a/spec/lib/sidebars/concerns/super_sidebar_panel_spec.rb +++ b/spec/lib/sidebars/concerns/super_sidebar_panel_spec.rb @@ -11,6 +11,10 @@ RSpec.describe Sidebars::Concerns::SuperSidebarPanel, feature_category: :navigat def title "Bar" end + + def pick_into_super_sidebar? + true + end end end @@ -28,22 +32,16 @@ RSpec.describe Sidebars::Concerns::SuperSidebarPanel, feature_category: :navigat end describe '#pick_from_old_menus' do - it 'removes element of a given class from a list and adds it to menus' do + it 'removes items with #pick_into_super_sidebar? from a list and adds them to the panel menus' do old_menus = [menu_foo, menu_bar] - subject.pick_from_old_menus(old_menus, menu_class_foo) - - expect(old_menus).not_to include(menu_foo) - expect(subject.renderable_menus).to include(menu_foo) - end - - it 'is a noop, if the list does not contain an element of the wanted class' do - old_menus = [menu_foo] + subject.pick_from_old_menus(old_menus) - subject.pick_from_old_menus(old_menus, menu_class_bar) + expect(old_menus).to include(menu_foo) + expect(subject.renderable_menus).not_to include(menu_foo) - expect(old_menus).to eq([menu_foo]) - expect(subject.renderable_menus).to eq([]) + expect(old_menus).not_to include(menu_bar) + expect(subject.renderable_menus).to include(menu_bar) end end diff --git a/spec/lib/sidebars/groups/menus/group_information_menu_spec.rb b/spec/lib/sidebars/groups/menus/group_information_menu_spec.rb index 1b27db53b6f..4a0301e2f2d 100644 --- a/spec/lib/sidebars/groups/menus/group_information_menu_spec.rb +++ b/spec/lib/sidebars/groups/menus/group_information_menu_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Sidebars::Groups::Menus::GroupInformationMenu do +RSpec.describe Sidebars::Groups::Menus::GroupInformationMenu, feature_category: :navigation do let_it_be(:owner) { create(:user) } let_it_be(:root_group) do build(:group, :private).tap do |g| @@ -14,6 +14,10 @@ RSpec.describe Sidebars::Groups::Menus::GroupInformationMenu do let(:user) { owner } let(:context) { Sidebars::Groups::Context.new(current_user: user, container: group) } + it_behaves_like 'not serializable as super_sidebar_menu_args' do + let(:menu) { described_class.new(context) } + end + describe '#title' do subject { described_class.new(context).title } diff --git a/spec/lib/sidebars/groups/menus/issues_menu_spec.rb b/spec/lib/sidebars/groups/menus/issues_menu_spec.rb index 3d55eb3af40..ceeda4a7ac3 100644 --- a/spec/lib/sidebars/groups/menus/issues_menu_spec.rb +++ b/spec/lib/sidebars/groups/menus/issues_menu_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Sidebars::Groups::Menus::IssuesMenu do +RSpec.describe Sidebars::Groups::Menus::IssuesMenu, feature_category: :navigation do let_it_be(:owner) { create(:user) } let_it_be(:group) do build(:group, :private).tap do |g| @@ -51,4 +51,17 @@ RSpec.describe Sidebars::Groups::Menus::IssuesMenu do it_behaves_like 'pill_count formatted results' do let(:count_service) { ::Groups::OpenIssuesCountService } end + + it_behaves_like 'serializable as super_sidebar_menu_args' do + let(:extra_attrs) do + { + item_id: :group_issue_list, + active_routes: { path: 'groups#issues' }, + sprite_icon: 'issues', + pill_count: menu.pill_count, + has_pill: menu.has_pill?, + super_sidebar_parent: ::Sidebars::StaticMenu + } + end + end end diff --git a/spec/lib/sidebars/groups/menus/kubernetes_menu_spec.rb b/spec/lib/sidebars/groups/menus/kubernetes_menu_spec.rb index 5bf8be9d6e5..8eb9a22e3e1 100644 --- a/spec/lib/sidebars/groups/menus/kubernetes_menu_spec.rb +++ b/spec/lib/sidebars/groups/menus/kubernetes_menu_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Sidebars::Groups::Menus::KubernetesMenu, :request_store do +RSpec.describe Sidebars::Groups::Menus::KubernetesMenu, :request_store, feature_category: :navigation do let_it_be(:owner) { create(:user) } let_it_be(:group) do build(:group, :private).tap do |g| @@ -14,6 +14,15 @@ RSpec.describe Sidebars::Groups::Menus::KubernetesMenu, :request_store do let(:context) { Sidebars::Groups::Context.new(current_user: user, container: group) } let(:menu) { described_class.new(context) } + it_behaves_like 'serializable as super_sidebar_menu_args' do + let(:extra_attrs) do + { + super_sidebar_parent: Sidebars::Groups::SuperSidebarMenus::OperationsMenu, + item_id: :group_kubernetes_clusters + } + end + end + describe '#render?' do context 'when user can read clusters' do it 'returns true' do diff --git a/spec/lib/sidebars/groups/menus/merge_requests_menu_spec.rb b/spec/lib/sidebars/groups/menus/merge_requests_menu_spec.rb index 3aceff29d6d..72f85f7930a 100644 --- a/spec/lib/sidebars/groups/menus/merge_requests_menu_spec.rb +++ b/spec/lib/sidebars/groups/menus/merge_requests_menu_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Sidebars::Groups::Menus::MergeRequestsMenu do +RSpec.describe Sidebars::Groups::Menus::MergeRequestsMenu, feature_category: :navigation do let_it_be(:owner) { create(:user) } let_it_be(:group) do build(:group, :private).tap do |g| @@ -33,4 +33,16 @@ RSpec.describe Sidebars::Groups::Menus::MergeRequestsMenu do it_behaves_like 'pill_count formatted results' do let(:count_service) { ::Groups::MergeRequestsCountService } end + + it_behaves_like 'serializable as super_sidebar_menu_args' do + let(:extra_attrs) do + { + item_id: :group_merge_request_list, + sprite_icon: 'git-merge', + pill_count: menu.pill_count, + has_pill: menu.has_pill?, + super_sidebar_parent: ::Sidebars::StaticMenu + } + end + end end diff --git a/spec/lib/sidebars/groups/menus/packages_registries_menu_spec.rb b/spec/lib/sidebars/groups/menus/packages_registries_menu_spec.rb index ce368ad5bd6..382ee07e458 100644 --- a/spec/lib/sidebars/groups/menus/packages_registries_menu_spec.rb +++ b/spec/lib/sidebars/groups/menus/packages_registries_menu_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Sidebars::Groups::Menus::PackagesRegistriesMenu do +RSpec.describe Sidebars::Groups::Menus::PackagesRegistriesMenu, feature_category: :navigation do let_it_be(:owner) { create(:user) } let_it_be_with_reload(:group) do build(:group, :private).tap do |g| @@ -16,6 +16,8 @@ RSpec.describe Sidebars::Groups::Menus::PackagesRegistriesMenu do let(:context) { Sidebars::Groups::Context.new(current_user: user, container: group) } let(:menu) { described_class.new(context) } + it_behaves_like 'not serializable as super_sidebar_menu_args' + describe '#render?' do context 'when menu has menu items to show' do it 'returns true' do diff --git a/spec/lib/sidebars/groups/menus/scope_menu_spec.rb b/spec/lib/sidebars/groups/menus/scope_menu_spec.rb index 4b77a09117a..d3aceaf422b 100644 --- a/spec/lib/sidebars/groups/menus/scope_menu_spec.rb +++ b/spec/lib/sidebars/groups/menus/scope_menu_spec.rb @@ -2,14 +2,26 @@ require 'spec_helper' -RSpec.describe Sidebars::Groups::Menus::ScopeMenu do +RSpec.describe Sidebars::Groups::Menus::ScopeMenu, feature_category: :navigation do let(:group) { build(:group) } let(:user) { group.owner } let(:context) { Sidebars::Groups::Context.new(current_user: user, container: group) } + let(:menu) { described_class.new(context) } describe '#extra_nav_link_html_options' do - subject { described_class.new(context).extra_nav_link_html_options } + subject { menu.extra_nav_link_html_options } specify { is_expected.to match(hash_including(class: 'context-header has-tooltip', title: context.group.name)) } end + + it_behaves_like 'serializable as super_sidebar_menu_args' do + let(:extra_attrs) do + { + sprite_icon: 'group', + super_sidebar_parent: ::Sidebars::StaticMenu, + title: _('Group overview'), + item_id: :group_overview + } + end + end end diff --git a/spec/lib/sidebars/groups/panel_spec.rb b/spec/lib/sidebars/groups/panel_spec.rb deleted file mode 100644 index 61b65e3f83c..00000000000 --- a/spec/lib/sidebars/groups/panel_spec.rb +++ /dev/null @@ -1,15 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe Sidebars::Groups::Panel, feature_category: :navigation do - let_it_be(:group) { create(:group) } - - let(:context) { Sidebars::Groups::Context.new(current_user: nil, container: group) } - - subject { described_class.new(context) } - - it 'implements #super_sidebar_context_header' do - expect(subject.super_sidebar_context_header).to eq({ title: group.name, avatar: group.avatar_url, id: group.id }) - end -end diff --git a/spec/lib/sidebars/groups/super_sidebar_panel_spec.rb b/spec/lib/sidebars/groups/super_sidebar_panel_spec.rb new file mode 100644 index 00000000000..beaf3875f1c --- /dev/null +++ b/spec/lib/sidebars/groups/super_sidebar_panel_spec.rb @@ -0,0 +1,44 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Sidebars::Groups::SuperSidebarPanel, feature_category: :navigation do + let_it_be(:group) { create(:group) } + + let(:user) { group.first_owner } + + let(:context) do + double("Stubbed context", current_user: user, container: group, group: group).as_null_object # rubocop:disable RSpec/VerifiedDoubles + end + + subject { described_class.new(context) } + + it 'implements #super_sidebar_context_header' do + expect(subject.super_sidebar_context_header).to eq( + { + title: group.name, + avatar: group.avatar_url, + id: group.id + }) + end + + describe '#renderable_menus' do + let(:category_menu) do + [ + Sidebars::StaticMenu, + Sidebars::Groups::SuperSidebarMenus::PlanMenu, + Sidebars::Groups::Menus::CiCdMenu, + (Sidebars::Groups::Menus::SecurityComplianceMenu if Gitlab.ee?), + Sidebars::Groups::SuperSidebarMenus::OperationsMenu, + Sidebars::Groups::Menus::ObservabilityMenu, + (Sidebars::Groups::Menus::AnalyticsMenu if Gitlab.ee?), + Sidebars::UncategorizedMenu, + Sidebars::Groups::Menus::SettingsMenu + ].compact + end + + it "is exposed as a renderable menu" do + expect(subject.instance_variable_get(:@menus).map(&:class)).to eq(category_menu) + end + end +end diff --git a/spec/lib/sidebars/projects/menus/deployments_menu_spec.rb b/spec/lib/sidebars/projects/menus/deployments_menu_spec.rb index ce971915174..5065c261cf8 100644 --- a/spec/lib/sidebars/projects/menus/deployments_menu_spec.rb +++ b/spec/lib/sidebars/projects/menus/deployments_menu_spec.rb @@ -2,12 +2,16 @@ require 'spec_helper' -RSpec.describe Sidebars::Projects::Menus::DeploymentsMenu do +RSpec.describe Sidebars::Projects::Menus::DeploymentsMenu, feature_category: :navigation do let_it_be(:project, reload: true) { create(:project, :repository) } let(:user) { project.first_owner } let(:context) { Sidebars::Projects::Context.new(current_user: user, container: project) } + it_behaves_like 'not serializable as super_sidebar_menu_args' do + let(:menu) { described_class.new(context) } + end + describe '#render?' do subject { described_class.new(context) } diff --git a/spec/lib/sidebars/projects/menus/infrastructure_menu_spec.rb b/spec/lib/sidebars/projects/menus/infrastructure_menu_spec.rb index 57d1475e564..a5031ff6a82 100644 --- a/spec/lib/sidebars/projects/menus/infrastructure_menu_spec.rb +++ b/spec/lib/sidebars/projects/menus/infrastructure_menu_spec.rb @@ -2,11 +2,15 @@ require 'spec_helper' -RSpec.describe Sidebars::Projects::Menus::InfrastructureMenu do +RSpec.describe Sidebars::Projects::Menus::InfrastructureMenu, feature_category: :navigation do let(:project) { build(:project) } let(:user) { project.first_owner } let(:context) { Sidebars::Projects::Context.new(current_user: user, container: project, show_cluster_hint: false) } + it_behaves_like 'not serializable as super_sidebar_menu_args' do + let(:menu) { described_class.new(context) } + end + describe '#render?' do subject { described_class.new(context) } diff --git a/spec/lib/sidebars/projects/menus/issues_menu_spec.rb b/spec/lib/sidebars/projects/menus/issues_menu_spec.rb index 4c0016a77a1..c7ff846bc95 100644 --- a/spec/lib/sidebars/projects/menus/issues_menu_spec.rb +++ b/spec/lib/sidebars/projects/menus/issues_menu_spec.rb @@ -2,13 +2,26 @@ require 'spec_helper' -RSpec.describe Sidebars::Projects::Menus::IssuesMenu do +RSpec.describe Sidebars::Projects::Menus::IssuesMenu, feature_category: :navigation do let(:project) { build(:project) } let(:user) { project.first_owner } let(:context) { Sidebars::Projects::Context.new(current_user: user, container: project) } subject { described_class.new(context) } + it_behaves_like 'serializable as super_sidebar_menu_args' do + let(:menu) { subject } + let(:extra_attrs) do + { + item_id: :project_issue_list, + sprite_icon: 'issues', + pill_count: menu.pill_count, + has_pill: menu.has_pill?, + super_sidebar_parent: ::Sidebars::StaticMenu + } + end + end + describe '#render?' do context 'when user can read issues' do it 'returns true' do diff --git a/spec/lib/sidebars/projects/menus/merge_requests_menu_spec.rb b/spec/lib/sidebars/projects/menus/merge_requests_menu_spec.rb index 45c49500e46..a19df559b58 100644 --- a/spec/lib/sidebars/projects/menus/merge_requests_menu_spec.rb +++ b/spec/lib/sidebars/projects/menus/merge_requests_menu_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Sidebars::Projects::Menus::MergeRequestsMenu do +RSpec.describe Sidebars::Projects::Menus::MergeRequestsMenu, feature_category: :navigation do let_it_be(:project) { create(:project, :repository) } let(:user) { project.first_owner } @@ -10,6 +10,19 @@ RSpec.describe Sidebars::Projects::Menus::MergeRequestsMenu do subject { described_class.new(context) } + it_behaves_like 'serializable as super_sidebar_menu_args' do + let(:menu) { subject } + let(:extra_attrs) do + { + item_id: :project_merge_request_list, + sprite_icon: 'git-merge', + pill_count: menu.pill_count, + has_pill: menu.has_pill?, + super_sidebar_parent: ::Sidebars::StaticMenu + } + end + end + describe '#render?' do context 'when repository is not present' do let(:project) { build(:project) } diff --git a/spec/lib/sidebars/projects/menus/packages_registries_menu_spec.rb b/spec/lib/sidebars/projects/menus/packages_registries_menu_spec.rb index b03269c424a..554bc763345 100644 --- a/spec/lib/sidebars/projects/menus/packages_registries_menu_spec.rb +++ b/spec/lib/sidebars/projects/menus/packages_registries_menu_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Sidebars::Projects::Menus::PackagesRegistriesMenu do +RSpec.describe Sidebars::Projects::Menus::PackagesRegistriesMenu, feature_category: :navigation do let_it_be(:project) { create(:project) } let_it_be(:harbor_integration) { create(:harbor_integration, project: project) } @@ -12,6 +12,10 @@ RSpec.describe Sidebars::Projects::Menus::PackagesRegistriesMenu do subject { described_class.new(context) } + it_behaves_like 'not serializable as super_sidebar_menu_args' do + let(:menu) { subject } + end + describe '#render?' do context 'when menu does not have any menu item to show' do it 'returns false' do diff --git a/spec/lib/sidebars/projects/menus/project_information_menu_spec.rb b/spec/lib/sidebars/projects/menus/project_information_menu_spec.rb index 7ff06ac229e..7547f152b27 100644 --- a/spec/lib/sidebars/projects/menus/project_information_menu_spec.rb +++ b/spec/lib/sidebars/projects/menus/project_information_menu_spec.rb @@ -2,12 +2,16 @@ require 'spec_helper' -RSpec.describe Sidebars::Projects::Menus::ProjectInformationMenu do +RSpec.describe Sidebars::Projects::Menus::ProjectInformationMenu, feature_category: :navigation do let_it_be_with_reload(:project) { create(:project, :repository) } let(:user) { project.first_owner } let(:context) { Sidebars::Projects::Context.new(current_user: user, container: project) } + it_behaves_like 'not serializable as super_sidebar_menu_args' do + let(:menu) { described_class.new(context) } + end + describe '#container_html_options' do subject { described_class.new(context).container_html_options } diff --git a/spec/lib/sidebars/projects/menus/scope_menu_spec.rb b/spec/lib/sidebars/projects/menus/scope_menu_spec.rb index 4e87f3b8ead..45464278880 100644 --- a/spec/lib/sidebars/projects/menus/scope_menu_spec.rb +++ b/spec/lib/sidebars/projects/menus/scope_menu_spec.rb @@ -2,11 +2,23 @@ require 'spec_helper' -RSpec.describe Sidebars::Projects::Menus::ScopeMenu do +RSpec.describe Sidebars::Projects::Menus::ScopeMenu, feature_category: :navigation do let(:project) { build(:project) } let(:user) { project.first_owner } let(:context) { Sidebars::Projects::Context.new(current_user: user, container: project) } + it_behaves_like 'serializable as super_sidebar_menu_args' do + let(:menu) { described_class.new(context) } + let(:extra_attrs) do + { + title: _('Project overview'), + sprite_icon: 'project', + super_sidebar_parent: ::Sidebars::StaticMenu, + item_id: :project_overview + } + end + end + describe '#container_html_options' do subject { described_class.new(context).container_html_options } diff --git a/spec/lib/sidebars/projects/menus/snippets_menu_spec.rb b/spec/lib/sidebars/projects/menus/snippets_menu_spec.rb index 04b8c128e3d..c5fd407dae9 100644 --- a/spec/lib/sidebars/projects/menus/snippets_menu_spec.rb +++ b/spec/lib/sidebars/projects/menus/snippets_menu_spec.rb @@ -2,13 +2,24 @@ require 'spec_helper' -RSpec.describe Sidebars::Projects::Menus::SnippetsMenu do +RSpec.describe Sidebars::Projects::Menus::SnippetsMenu, feature_category: :navigation do let(:project) { build(:project) } let(:user) { project.first_owner } let(:context) { Sidebars::Projects::Context.new(current_user: user, container: project) } subject { described_class.new(context) } + it_behaves_like 'serializable as super_sidebar_menu_args' do + let(:menu) { subject } + let(:extra_attrs) do + { + super_sidebar_parent: ::Sidebars::Projects::Menus::RepositoryMenu, + super_sidebar_before: :contributors, + item_id: :project_snippets + } + end + end + describe '#render?' do context 'when user cannot access snippets' do let(:user) { nil } diff --git a/spec/lib/sidebars/projects/menus/wiki_menu_spec.rb b/spec/lib/sidebars/projects/menus/wiki_menu_spec.rb index 362da3e7b50..64050e3e488 100644 --- a/spec/lib/sidebars/projects/menus/wiki_menu_spec.rb +++ b/spec/lib/sidebars/projects/menus/wiki_menu_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Sidebars::Projects::Menus::WikiMenu do +RSpec.describe Sidebars::Projects::Menus::WikiMenu, feature_category: :navigation do let(:project) { build(:project) } let(:user) { project.first_owner } let(:context) { Sidebars::Projects::Context.new(current_user: user, container: project) } @@ -28,4 +28,14 @@ RSpec.describe Sidebars::Projects::Menus::WikiMenu do end end end + + it_behaves_like 'serializable as super_sidebar_menu_args' do + let(:menu) { subject } + let(:extra_attrs) do + { + super_sidebar_parent: ::Sidebars::Projects::SuperSidebarMenus::PlanMenu, + item_id: :project_wiki + } + end + end end diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index e6f2d373128..0d546b8d17f 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -8903,6 +8903,32 @@ RSpec.describe Project, factory_default: :keep, feature_category: :projects do end end + describe 'deprecated project attributes' do + where(:project_attr, :project_method, :project_feature_attr) do + :wiki_enabled | :wiki_enabled? | :wiki_access_level + :builds_enabled | :builds_enabled? | :builds_access_level + :merge_requests_enabled | :merge_requests_enabled? | :merge_requests_access_level + :issues_enabled | :issues_enabled? | :issues_access_level + :snippets_enabled | :snippets_enabled? | :snippets_access_level + end + + with_them do + it 'delegates the attributes to project feature' do + project = Project.new(project_attr => false) + + expect(project.public_send(project_method)).to eq(false) + expect(project.project_feature.public_send(project_feature_attr)).to eq(ProjectFeature::DISABLED) + end + + it 'sets the default value' do + project = Project.new + + expect(project.public_send(project_method)).to eq(true) + expect(project.project_feature.public_send(project_feature_attr)).to eq(ProjectFeature::ENABLED) + end + end + end + private def finish_job(export_job) diff --git a/spec/models/wiki_directory_spec.rb b/spec/models/wiki_directory_spec.rb index 1b177934ace..c30e79f79ce 100644 --- a/spec/models/wiki_directory_spec.rb +++ b/spec/models/wiki_directory_spec.rb @@ -13,6 +13,8 @@ RSpec.describe WikiDirectory do let_it_be(:toplevel1) { build(:wiki_page, title: 'aaa-toplevel1') } let_it_be(:toplevel2) { build(:wiki_page, title: 'zzz-toplevel2') } let_it_be(:toplevel3) { build(:wiki_page, title: 'zzz-toplevel3') } + let_it_be(:home) { build(:wiki_page, title: 'home') } + let_it_be(:homechild) { build(:wiki_page, title: 'Home/homechild') } let_it_be(:parent1) { build(:wiki_page, title: 'parent1') } let_it_be(:parent2) { build(:wiki_page, title: 'parent2') } let_it_be(:child1) { build(:wiki_page, title: 'parent1/child1') } @@ -24,13 +26,18 @@ RSpec.describe WikiDirectory do it 'returns a nested array of entries' do entries = described_class.group_pages( - [toplevel1, toplevel2, toplevel3, + [toplevel1, toplevel2, toplevel3, home, homechild, parent1, parent2, child1, child2, child3, subparent, grandchild1, grandchild2].sort_by(&:title) ) expect(entries).to match( [ + a_kind_of(WikiDirectory).and( + having_attributes( + slug: 'Home', entries: [homechild] + ) + ), toplevel1, a_kind_of(WikiDirectory).and( having_attributes( diff --git a/spec/services/ci/unlock_artifacts_service_spec.rb b/spec/services/ci/unlock_artifacts_service_spec.rb index 3aaae74ff8c..2746cfdbcd0 100644 --- a/spec/services/ci/unlock_artifacts_service_spec.rb +++ b/spec/services/ci/unlock_artifacts_service_spec.rb @@ -24,7 +24,7 @@ RSpec.describe Ci::UnlockArtifactsService, feature_category: :continuous_integra let!(:older_ambiguous_pipeline) { create(:ci_pipeline, :with_persisted_artifacts, ref: ref, tag: !tag, project: project, locked: :artifacts_locked) } let!(:code_coverage_pipeline) { create(:ci_pipeline, :with_coverage_report_artifact, ref: ref, tag: tag, project: project, locked: :artifacts_locked) } let!(:pipeline) { create(:ci_pipeline, :with_persisted_artifacts, ref: ref, tag: tag, project: project, locked: :artifacts_locked) } - let!(:child_pipeline) { create(:ci_pipeline, :with_persisted_artifacts, ref: ref, tag: tag, project: project, locked: :artifacts_locked) } + let!(:child_pipeline) { create(:ci_pipeline, :with_persisted_artifacts, ref: ref, tag: tag, child_of: pipeline, project: project, locked: :artifacts_locked) } let!(:newer_pipeline) { create(:ci_pipeline, :with_persisted_artifacts, ref: ref, tag: tag, project: project, locked: :artifacts_locked) } let!(:other_ref_pipeline) { create(:ci_pipeline, :with_persisted_artifacts, ref: 'other_ref', tag: tag, project: project, locked: :artifacts_locked) } let!(:sources_pipeline) { create(:ci_sources_pipeline, source_job: source_job, source_project: project, pipeline: child_pipeline, project: project) } diff --git a/spec/support/shared_examples/lib/menus_shared_examples.rb b/spec/support/shared_examples/lib/menus_shared_examples.rb index 2c2cb362b07..ed3165079fb 100644 --- a/spec/support/shared_examples/lib/menus_shared_examples.rb +++ b/spec/support/shared_examples/lib/menus_shared_examples.rb @@ -37,3 +37,27 @@ RSpec.shared_examples_for 'pill_count formatted results' do expect(pill_count).to eq('112.6k') end end + +RSpec.shared_examples_for 'serializable as super_sidebar_menu_args' do + let(:extra_attrs) { raise NotImplementedError } + + it 'returns hash with provided attributes' do + expect(menu.serialize_as_menu_item_args).to eq({ + title: menu.title, + link: menu.link, + active_routes: menu.active_routes, + container_html_options: menu.container_html_options, + **extra_attrs + }) + end + + it 'returns hash with an item_id' do + expect(menu.serialize_as_menu_item_args[:item_id]).not_to be_nil + end +end + +RSpec.shared_examples_for 'not serializable as super_sidebar_menu_args' do + it 'returns nil' do + expect(menu.serialize_as_menu_item_args).to be_nil + end +end |