Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.rubocop_todo/rails/render_inline.yml4
-rw-r--r--app/controllers/projects/artifacts_controller.rb8
-rw-r--r--config/feature_flags/development/artifacts_management_page.yml8
-rw-r--r--data/deprecations/15-9-JWT-OIDC.yml40
-rw-r--r--db/docs/deleted_tables/clusters_applications_cert_managers.yml (renamed from db/docs/clusters_applications_cert_managers.yml)2
-rw-r--r--db/post_migrate/20230501180958_drop_clusters_applications_cert_managers.rb27
-rw-r--r--db/schema_migrations/202305011809581
-rw-r--r--db/structure.sql27
-rw-r--r--doc/ci/jobs/job_artifacts.md5
-rw-r--r--doc/development/cicd/cicd_tables.md32
-rw-r--r--doc/development/testing_guide/frontend_testing.md197
-rw-r--r--doc/update/deprecations.md57
-rw-r--r--lib/sidebars/projects/menus/ci_cd_menu.rb4
-rw-r--r--lib/sidebars/search/panel.rb4
-rw-r--r--locale/gitlab.pot3
-rw-r--r--spec/controllers/projects/artifacts_controller_spec.rb28
-rw-r--r--spec/db/schema_spec.rb1
-rw-r--r--spec/frontend/alert_management/components/alert_management_empty_state_spec.js6
-rw-r--r--spec/frontend/alert_management/components/alert_management_list_wrapper_spec.js6
-rw-r--r--spec/frontend/alert_management/components/alert_management_table_spec.js3
-rw-r--r--spec/frontend/alerts_settings/components/alert_mapping_builder_spec.js7
-rw-r--r--spec/frontend/alerts_settings/components/alerts_form_spec.js6
-rw-r--r--spec/frontend/alerts_settings/components/alerts_integrations_list_spec.js7
-rw-r--r--spec/frontend/alerts_settings/components/alerts_settings_form_spec.js6
-rw-r--r--spec/frontend/boards/components/new_board_button_spec.js6
-rw-r--r--spec/frontend/branches/components/sort_dropdown_spec.js6
-rw-r--r--spec/frontend/clusters_list/components/agent_empty_state_spec.js6
-rw-r--r--spec/frontend/content_editor/components/toolbar_text_style_dropdown_spec.js1
-rw-r--r--spec/frontend/diffs/components/app_spec.js6
-rw-r--r--spec/frontend/diffs/components/diff_file_spec.js6
-rw-r--r--spec/frontend/environments/canary_ingress_spec.js6
-rw-r--r--spec/frontend/environments/canary_update_modal_spec.js6
-rw-r--r--spec/frontend/environments/environment_item_spec.js4
-rw-r--r--spec/frontend/environments/environment_pin_spec.js4
-rw-r--r--spec/frontend/environments/environment_table_spec.js4
-rw-r--r--spec/frontend/error_tracking/components/error_details_spec.js6
-rw-r--r--spec/frontend/error_tracking/components/error_tracking_actions_spec.js6
-rw-r--r--spec/frontend/error_tracking/components/stacktrace_entry_spec.js6
-rw-r--r--spec/frontend/error_tracking/components/stacktrace_spec.js6
-rw-r--r--spec/frontend/error_tracking_settings/components/app_spec.js6
-rw-r--r--spec/frontend/error_tracking_settings/components/error_tracking_form_spec.js6
-rw-r--r--spec/frontend/error_tracking_settings/components/project_dropdown_spec.js6
-rw-r--r--spec/frontend/feature_flags/components/edit_feature_flag_spec.js4
-rw-r--r--spec/frontend/feature_flags/components/empty_state_spec.js6
-rw-r--r--spec/frontend/feature_flags/components/new_environments_dropdown_spec.js4
-rw-r--r--spec/frontend/feature_flags/components/new_feature_flag_spec.js4
-rw-r--r--spec/frontend/feature_flags/components/strategies/flexible_rollout_spec.js6
-rw-r--r--spec/frontend/feature_flags/components/strategies/parameter_form_group_spec.js6
-rw-r--r--spec/frontend/feature_flags/components/strategies/percent_rollout_spec.js6
-rw-r--r--spec/frontend/feature_flags/components/strategies/users_with_id_spec.js6
-rw-r--r--spec/frontend/feature_flags/components/strategy_parameters_spec.js6
-rw-r--r--spec/frontend/feature_flags/components/strategy_spec.js11
-rw-r--r--spec/frontend/grafana_integration/components/grafana_integration_spec.js7
-rw-r--r--spec/frontend/groups/components/item_caret_spec.js7
-rw-r--r--spec/frontend/groups/components/item_stats_spec.js7
-rw-r--r--spec/frontend/groups/components/item_stats_value_spec.js7
-rw-r--r--spec/frontend/groups/components/item_type_icon_spec.js7
-rw-r--r--spec/frontend/ide/components/jobs/list_spec.js5
-rw-r--r--spec/frontend/import_entities/import_projects/components/bitbucket_status_table_spec.js7
-rw-r--r--spec/frontend/import_entities/import_projects/components/import_projects_table_spec.js7
-rw-r--r--spec/frontend/incidents/components/incidents_list_spec.js7
-rw-r--r--spec/frontend/issuable/related_issues/components/issue_token_spec.js7
-rw-r--r--spec/frontend/issuable/related_issues/components/related_issues_block_spec.js7
-rw-r--r--spec/frontend/issuable/related_issues/components/related_issues_list_spec.js7
-rw-r--r--spec/frontend/issues/show/components/incidents/highlight_bar_spec.js7
-rw-r--r--spec/frontend/issues/show/components/incidents/timeline_events_tab_spec.js6
-rw-r--r--spec/frontend/issues/show/components/sentry_error_stack_trace_spec.js6
-rw-r--r--spec/frontend/jobs/components/job/empty_state_spec.js7
-rw-r--r--spec/frontend/jobs/components/job/job_log_controllers_spec.js3
-rw-r--r--spec/frontend/jobs/components/job/job_retry_forward_deployment_modal_spec.js7
-rw-r--r--spec/frontend/jobs/components/job/job_sidebar_details_container_spec.js7
-rw-r--r--spec/frontend/jobs/components/job/job_sidebar_retry_button_spec.js6
-rw-r--r--spec/frontend/jobs/components/job/stuck_block_spec.js7
-rw-r--r--spec/frontend/monitoring/components/dashboard_url_time_spec.js3
-rw-r--r--spec/frontend/monitoring/components/embeds/embed_group_spec.js3
-rw-r--r--spec/frontend/monitoring/components/embeds/metric_embed_spec.js3
-rw-r--r--spec/frontend/monitoring/pages/dashboard_page_spec.js7
-rw-r--r--spec/frontend/notes/components/discussion_navigator_spec.js6
-rw-r--r--spec/frontend/notes/components/timeline_toggle_spec.js4
-rw-r--r--spec/frontend/operation_settings/components/metrics_settings_spec.js3
-rw-r--r--spec/frontend/packages_and_registries/shared/components/package_tags_spec.js4
-rw-r--r--spec/frontend/pages/import/bitbucket_server/components/bitbucket_server_status_table_spec.js7
-rw-r--r--spec/frontend/pipeline_wizard/components/step_spec.js4
-rw-r--r--spec/frontend/pipeline_wizard/components/widgets/text_spec.js6
-rw-r--r--spec/frontend/pipeline_wizard/components/wrapper_spec.js4
-rw-r--r--spec/frontend/pipelines/components/dag/dag_annotations_spec.js4
-rw-r--r--spec/frontend/pipelines/components/dag/dag_spec.js4
-rw-r--r--spec/frontend/projects/pipelines/charts/components/ci_cd_analytics_charts_spec.js7
-rw-r--r--spec/frontend/projects/settings_service_desk/components/service_desk_setting_spec.js6
-rw-r--r--spec/frontend/projects/settings_service_desk/components/service_desk_template_dropdown_spec.js6
-rw-r--r--spec/frontend/sidebar/components/severity/severity_spec.js7
-rw-r--r--spec/frontend/tags/components/sort_dropdown_spec.js6
-rw-r--r--spec/frontend/vue_merge_request_widget/components/mr_widget_pipeline_spec.js7
-rw-r--r--spec/frontend/vue_merge_request_widget/components/states/mr_widget_closed_spec.js6
-rw-r--r--spec/frontend/vue_merge_request_widget/deployment/deployment_actions_spec.js5
-rw-r--r--spec/frontend/vue_merge_request_widget/deployment/deployment_spec.js4
-rw-r--r--spec/frontend/vue_shared/alert_details/alert_status_spec.js6
-rw-r--r--spec/frontend/vue_shared/alert_details/alert_summary_row_spec.js7
-rw-r--r--spec/frontend/vue_shared/alert_details/sidebar/alert_sidebar_spec.js3
-rw-r--r--spec/frontend/vue_shared/alert_details/sidebar/alert_sidebar_status_spec.js6
-rw-r--r--spec/frontend/vue_shared/alert_details/system_notes/alert_management_system_note_spec.js7
-rw-r--r--spec/frontend/vue_shared/components/metric_images/metric_images_tab_spec.js7
-rw-r--r--spec/frontend/vue_shared/components/metric_images/metric_images_table_spec.js7
-rw-r--r--spec/frontend/vue_shared/components/notes/noteable_warning_spec.js7
-rw-r--r--spec/frontend/vue_shared/components/paginated_table_with_search_and_tabs/paginated_table_with_search_and_tabs_spec.js6
-rw-r--r--spec/frontend/vue_shared/components/resizable_chart/skeleton_loader_spec.js6
-rw-r--r--spec/frontend/vue_shared/components/slot_switch_spec.js6
-rw-r--r--spec/lib/sidebars/projects/menus/ci_cd_menu_spec.rb16
-rw-r--r--spec/lib/sidebars/search/panel_spec.rb6
109 files changed, 272 insertions, 717 deletions
diff --git a/.rubocop_todo/rails/render_inline.yml b/.rubocop_todo/rails/render_inline.yml
deleted file mode 100644
index fbebec72cd7..00000000000
--- a/.rubocop_todo/rails/render_inline.yml
+++ /dev/null
@@ -1,4 +0,0 @@
----
-Rails/RenderInline:
- Exclude:
- - 'ee/app/controllers/sitemap_controller.rb'
diff --git a/app/controllers/projects/artifacts_controller.rb b/app/controllers/projects/artifacts_controller.rb
index 65576bcade6..b5b023a4d64 100644
--- a/app/controllers/projects/artifacts_controller.rb
+++ b/app/controllers/projects/artifacts_controller.rb
@@ -27,13 +27,7 @@ class Projects::ArtifactsController < Projects::ApplicationController
feature_category :build_artifacts
- def index
- # Loading artifacts is very expensive in projects with a lot of artifacts.
- # This feature flag prevents a DOS attack vector.
- # It should be removed only after resolving the underlying performance
- # issues: https://gitlab.com/gitlab-org/gitlab/issues/32281
- return head :no_content unless Feature.enabled?(:artifacts_management_page, @project)
- end
+ def index; end
def destroy
notice = if artifact.destroy
diff --git a/config/feature_flags/development/artifacts_management_page.yml b/config/feature_flags/development/artifacts_management_page.yml
deleted file mode 100644
index 078e18a703f..00000000000
--- a/config/feature_flags/development/artifacts_management_page.yml
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: artifacts_management_page
-introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/16654
-rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/254938
-milestone: '12.4'
-type: development
-group: group::pipeline security
-default_enabled: false
diff --git a/data/deprecations/15-9-JWT-OIDC.yml b/data/deprecations/15-9-JWT-OIDC.yml
index e924d698bc5..1afd5056104 100644
--- a/data/deprecations/15-9-JWT-OIDC.yml
+++ b/data/deprecations/15-9-JWT-OIDC.yml
@@ -1,42 +1,28 @@
-# This is a template for announcing a feature deprecation or other important planned change.
-#
-# Please refer to the deprecation guidelines to confirm your understanding of GitLab's definitions.
-# https://docs.gitlab.com/ee/development/deprecation_guidelines/#terminology
-#
-# Deprecations and other future breaking changes must be announced at least
-# three releases prior to removal.
-#
-# Breaking changes must happen in a major release.
-#
-# See the OPTIONAL END OF SUPPORT FIELDS section below if an End of Support period also applies.
-#
-# For more information please refer to the handbook documentation here:
-# https://about.gitlab.com/handbook/marketing/blog/release-posts/#deprecations-and-other-planned-breaking-change-announcements
-#
-# Please delete this line and above before submitting your merge request.
-#
-# REQUIRED FIELDS
-#
+---
- title: "Old versions of JSON web tokens are deprecated"
announcement_milestone: "15.9" # (required) The milestone when this feature was first announced as deprecated.
- removal_milestone: "16.0" # (required) The milestone when this feature is planned to be removed
+ removal_milestone: "16.5" # (required) The milestone when this feature is planned to be removed
breaking_change: true # (required) Change to false if this is not a breaking change.
reporter: dhershkovitch # (required) GitLab username of the person reporting the change
stage: Verify # (required) String value of the stage that the feature was created in. e.g., Growth
issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/366798 # (required) Link to the deprecation issue in GitLab
body: | # (required) Do not modify this line, instead modify the lines below.
Now that we have released [ID tokens](https://docs.gitlab.com/ee/ci/secrets/id_token_authentication.html)
- with OIDC support, the old JSON web tokens are deprecated and will be removed.
- Both the `CI_JOB_JWT` and `CI_JOB_JWT_V2` tokens, exposed to jobs as predefined variables,
- will no longer be available in GitLab 16.0.
+ with OIDC support, the old JSON web tokens are deprecated.
+ Both the `CI_JOB_JWT` and `CI_JOB_JWT_V2` tokens, exposed to jobs as predefined variables, will:
- To prepare for this change, you should:
+ - Not be creatable in GitLab 16.0 and later.
+ - Be removed in GitLab 16.5.
- - Configure your pipelines to use the fully configurable and more secure
+ To prepare for this change:
+
+ - Before the release of GitLab 16.5, configure your pipelines to use the fully configurable and more secure
[`id_token`](https://docs.gitlab.com/ee/ci/yaml/index.html#id_tokens) keyword instead.
- [Enable the **Limit JSON Web Token (JWT) access**](https://docs.gitlab.com/ee/ci/secrets/id_token_authentication.html#enable-automatic-id-token-authentication)
- setting, which prevents the old tokens from being exposed to any jobs. This setting
- will be permanently enabled for all projects in GitLab 16.0.
+ setting, which prevents the old tokens from being exposed to any jobs.
+
+ In GitLab 16.0 and later, the ability to set this option will be removed and all new projects will have the option
+ enabled.
#
# If an End of Support period applies, the announcement should be shared with GitLab Support
# in the `#spt_managers` channel in Slack, and mention `@gitlab-com/support` in this MR.
diff --git a/db/docs/clusters_applications_cert_managers.yml b/db/docs/deleted_tables/clusters_applications_cert_managers.yml
index 0285b786f9f..cdf170d2a89 100644
--- a/db/docs/clusters_applications_cert_managers.yml
+++ b/db/docs/deleted_tables/clusters_applications_cert_managers.yml
@@ -6,3 +6,5 @@ description: "(Deprecated) A GitLab managed cert-manager installation in a Kuber
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/commit/8837519445c319a699e0f3ced1c6912c839f3389
milestone: '11.6'
gitlab_schema: gitlab_main
+removed_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/119238
+removed_in_milestone: '16.0' \ No newline at end of file
diff --git a/db/post_migrate/20230501180958_drop_clusters_applications_cert_managers.rb b/db/post_migrate/20230501180958_drop_clusters_applications_cert_managers.rb
new file mode 100644
index 00000000000..8949e37dcc3
--- /dev/null
+++ b/db/post_migrate/20230501180958_drop_clusters_applications_cert_managers.rb
@@ -0,0 +1,27 @@
+# frozen_string_literal: true
+
+# See https://docs.gitlab.com/ee/development/migration_style_guide.html
+# for more information on how to write migrations for GitLab.
+
+class DropClustersApplicationsCertManagers < Gitlab::Database::Migration[2.1]
+ def up
+ drop_table :clusters_applications_cert_managers
+ end
+
+ # Based on init migration:
+ # https://gitlab.com/gitlab-org/gitlab/-/blob/b237f836df215a4ada92b9406733e6cd2483ca2d/db/migrate/20181228175414_init_schema.rb#L680-L689
+ # rubocop:disable Migration/SchemaAdditionMethodsNoPost
+ def down
+ create_table "clusters_applications_cert_managers", id: :serial, force: :cascade do |t|
+ t.integer "cluster_id", null: false
+ t.integer "status", null: false
+ t.string "version", null: false
+ t.string "email", null: false
+ t.datetime_with_timezone "created_at", null: false
+ t.datetime_with_timezone "updated_at", null: false
+ t.text "status_reason"
+ t.index ["cluster_id"], name: "index_clusters_applications_cert_managers_on_cluster_id", unique: true
+ end
+ end
+ # rubocop:enable Migration/SchemaAdditionMethodsNoPost
+end
diff --git a/db/schema_migrations/20230501180958 b/db/schema_migrations/20230501180958
new file mode 100644
index 00000000000..f7d05a866c6
--- /dev/null
+++ b/db/schema_migrations/20230501180958
@@ -0,0 +1 @@
+cf1a6d7a46b0166fea848ed823c0cfcfaeeff66ccbc3f85207a949fbc9eb7660 \ No newline at end of file
diff --git a/db/structure.sql b/db/structure.sql
index ce4aadefaeb..bbf8d5dc287 100644
--- a/db/structure.sql
+++ b/db/structure.sql
@@ -14350,26 +14350,6 @@ CREATE TABLE clusters (
helm_major_version integer DEFAULT 3 NOT NULL
);
-CREATE TABLE clusters_applications_cert_managers (
- id integer NOT NULL,
- cluster_id integer NOT NULL,
- status integer NOT NULL,
- version character varying NOT NULL,
- email character varying NOT NULL,
- created_at timestamp with time zone NOT NULL,
- updated_at timestamp with time zone NOT NULL,
- status_reason text
-);
-
-CREATE SEQUENCE clusters_applications_cert_managers_id_seq
- START WITH 1
- INCREMENT BY 1
- NO MINVALUE
- NO MAXVALUE
- CACHE 1;
-
-ALTER SEQUENCE clusters_applications_cert_managers_id_seq OWNED BY clusters_applications_cert_managers.id;
-
CREATE TABLE clusters_applications_cilium (
id bigint NOT NULL,
cluster_id bigint NOT NULL,
@@ -25073,8 +25053,6 @@ ALTER TABLE ONLY cluster_providers_gcp ALTER COLUMN id SET DEFAULT nextval('clus
ALTER TABLE ONLY clusters ALTER COLUMN id SET DEFAULT nextval('clusters_id_seq'::regclass);
-ALTER TABLE ONLY clusters_applications_cert_managers ALTER COLUMN id SET DEFAULT nextval('clusters_applications_cert_managers_id_seq'::regclass);
-
ALTER TABLE ONLY clusters_applications_cilium ALTER COLUMN id SET DEFAULT nextval('clusters_applications_cilium_id_seq'::regclass);
ALTER TABLE ONLY clusters_applications_crossplane ALTER COLUMN id SET DEFAULT nextval('clusters_applications_crossplane_id_seq'::regclass);
@@ -26985,9 +26963,6 @@ ALTER TABLE ONLY cluster_providers_aws
ALTER TABLE ONLY cluster_providers_gcp
ADD CONSTRAINT cluster_providers_gcp_pkey PRIMARY KEY (id);
-ALTER TABLE ONLY clusters_applications_cert_managers
- ADD CONSTRAINT clusters_applications_cert_managers_pkey PRIMARY KEY (id);
-
ALTER TABLE ONLY clusters_applications_cilium
ADD CONSTRAINT clusters_applications_cilium_pkey PRIMARY KEY (id);
@@ -30432,8 +30407,6 @@ CREATE INDEX index_cluster_providers_gcp_on_cloud_run ON cluster_providers_gcp U
CREATE UNIQUE INDEX index_cluster_providers_gcp_on_cluster_id ON cluster_providers_gcp USING btree (cluster_id);
-CREATE UNIQUE INDEX index_clusters_applications_cert_managers_on_cluster_id ON clusters_applications_cert_managers USING btree (cluster_id);
-
CREATE UNIQUE INDEX index_clusters_applications_cilium_on_cluster_id ON clusters_applications_cilium USING btree (cluster_id);
CREATE UNIQUE INDEX index_clusters_applications_crossplane_on_cluster_id ON clusters_applications_crossplane USING btree (cluster_id);
diff --git a/doc/ci/jobs/job_artifacts.md b/doc/ci/jobs/job_artifacts.md
index a6838f2e87a..0d8c9dcf715 100644
--- a/doc/ci/jobs/job_artifacts.md
+++ b/doc/ci/jobs/job_artifacts.md
@@ -188,7 +188,10 @@ job:
## View all job artifacts in a project
-> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/254938) in GitLab 15.11 [with a flag](../../administration/feature_flags.md) named `artifacts_management_page`. Disabled by default.
+> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/31271) in GitLab 12.4 [with a flag](../../administration/feature_flags.md) named `artifacts_management_page`. Disabled by default.
+> - [Improved look](https://gitlab.com/gitlab-org/gitlab/-/issues/33418) in GitLab 15.6.
+> - [Improved performance](https://gitlab.com/gitlab-org/gitlab/-/issues/387765) in GitLab 15.9.
+> - [Generally available](https://gitlab.com/gitlab-org/gitlab/-/issues/407475) in GitLab 16.0. Feature flag `artifacts_management_page` removed.
You can view all artifacts stored in a project from the **CI/CD > Artifacts** page.
This list displays all jobs and their associated artifacts. Expand an entry to access
diff --git a/doc/development/cicd/cicd_tables.md b/doc/development/cicd/cicd_tables.md
index c86540c10f0..b246328a817 100644
--- a/doc/development/cicd/cicd_tables.md
+++ b/doc/development/cicd/cicd_tables.md
@@ -15,25 +15,27 @@ should be partitioned from the start.
## Create a new routing table
-The database helpers for creating tables do not accept partitioning options,
-so the best solution is to create the tables using raw SQL:
+Here is an example on how to use database helpers to create a new table and foreign keys:
```ruby
- enable_lock_retries!
+ include Gitlab::Database::PartitioningMigrationHelpers
+ disable_ddl_transaction!
def up
- execute(<<~SQL)
- CREATE TABLE p_ci_examples (
- id bigint NOT NULL,
- partition_id bigint NOT NULL,
- build_id bigint NOT NULL,
- PRIMARY KEY (id, partition_id),
- CONSTRAINT fk_bb490f12fe_p FOREIGN KEY (partition_id, build_id)
- REFERENCES ci_builds(partition_id, id)
- ON UPDATE CASCADE ON DELETE CASCADE
- )
- PARTITION BY LIST (partition_id);
- SQL
+ create_table(:p_ci_examples, primary_key: [:id, :partition_id], options: 'PARTITION BY LIST (partition_id)', if_not_exists: true) do |t|
+ t.bigserial :id, null: false
+ t.bigint :partition_id, null: false
+ t.bigint :build_id, null: false
+ end
+
+ add_concurrent_partitioned_foreign_key(
+ :p_ci_examples, :ci_builds,
+ column: [:partition_id, :build_id],
+ target_column: [:partition_id, :id],
+ on_update: :cascade,
+ on_delete: :cascade,
+ reverse_lock_order: true
+ )
end
def down
diff --git a/doc/development/testing_guide/frontend_testing.md b/doc/development/testing_guide/frontend_testing.md
index ba965ab204a..c815851579a 100644
--- a/doc/development/testing_guide/frontend_testing.md
+++ b/doc/development/testing_guide/frontend_testing.md
@@ -1230,15 +1230,14 @@ You can download any older version of Firefox from the releases FTP server, <htt
## Snapshots
-By now you've probably heard of [Jest snapshot tests](https://jestjs.io/docs/snapshot-testing) and why they are useful for various reasons.
-To use them within GitLab, there are a few guidelines that should be highlighted:
+[Jest snapshot tests](https://jestjs.io/docs/snapshot-testing) are a useful way to prevent unexpected changes to the HTML output of a given component. They should **only** be used when other testing methods (such as asserting elements with `vue-tests-utils`) do not cover the required usecase. To use them within GitLab, there are a few guidelines that should be highlighted:
- Treat snapshots as code
- Don't think of a snapshot file as a black box
- Care for the output of the snapshot, otherwise, it's not providing any real value. This will usually involve reading the generated snapshot file as you would read any other piece of code
Think of a snapshot test as a simple way to store a raw `String` representation of what you've put into the item being tested. This can be used to evaluate changes in a component, a store, a complex piece of generated output, etc. You can see more in the list below for some recommended `Do's and Don'ts`.
-While snapshot tests can be a very powerful tool. They are meant to supplement, not to replace unit tests.
+While snapshot tests can be a very powerful tool, they are meant to supplement, not to replace unit tests.
Jest provides a great set of docs on [best practices](https://jestjs.io/docs/snapshot-testing#best-practices) that we should keep in mind when creating snapshots.
@@ -1250,6 +1249,161 @@ Should the outcome of your spec be different from what is in the generated snaps
Find all the details in Jests official documentation [https://jestjs.io/docs/snapshot-testing](https://jestjs.io/docs/snapshot-testing)
+### Pros and Cons
+
+**Pros**
+
+- Provides a good warning against accidental changes of important HTML structures
+- Ease of setup
+
+**Cons**
+
+- Lacks the clarity or guard rails that `vue-tests-utils` provides by finding elements and asserting their presence directly
+- Creates unnecessary noise when updating components purposefully
+- High risk of taking a snapshot of bugs, which then turns the tests against us since the test will now fail when fixing the issue
+- No meaningful assertions or expectations within snapshots makes them harder to reason about or replace
+- When used with dependencies like [GitLab UI](https://gitlab.com/gitlab-org/gitlab-ui), it creates fragility in tests when the underlying library changes the HTML of a component we are testing
+
+### When to use
+
+**Use snapshots when**
+
+- Protecting critical HTML structures so it doesn't change by accident
+- Asserting JS object or JSON outputs of complex utility functions
+
+### When not to use
+
+**Don't use snapshots when**
+
+- Tests could be written using `vue-tests-utils` instead
+- Asserting the logic of a component
+- Predicting data structure(s) outputs
+- There are UI elements outside of the repository (think of GitLab UI version updates)
+
+### Examples
+
+As you can see, the cons of snapshot tests far outweight the pros in general. To illustrate this better, this section will show a few examples of when you might be tempted to
+use snapshot testing and why they are not good patterns.
+
+#### Example #1 - Element visiblity
+
+When testing elements visibility, favour using `vue-tests-utils (VTU)` to find a given component and then a basic `.exists()` method call on the VTU wrapper. This provides better readability and more resilient testing. If you look at the examples below, notice how the assertions on the snapshots do not tell you what you are expecting to see. We are relying entirely on `it` description to give us context and on the assumption that the snapshot has captured the desired behavior.
+
+```vue
+<template>
+ <my-component v-if="isVisible" />
+</template>
+```
+
+Bad:
+
+```javascript
+it('hides the component', () => {
+ createComponent({ props: { isVisible: false }})
+
+ expect(wrapper.element).toMatchSnapshot()
+})
+
+it('shows the component', () => {
+ createComponent({ props: { isVisible: true }})
+
+ expect(wrapper.element).toMatchSnapshot()
+})
+```
+
+Good:
+
+```javascript
+it('hides the component', () => {
+ createComponent({ props: { isVisible: false }})
+
+ expect(findMyComponent().exists()).toBe(false)
+})
+
+it('shows the component', () => {
+ createComponent({ props: { isVisible: true }})
+
+ expect(findMyComponent().exists()).toBe(true)
+})
+```
+
+Not only that, but imagine having passed the wrong prop to your component and having the wrong visibility: the snapshot test would still pass because you would have captured the HTML **with the issue** and so unless you double-checked the output of the snapshot, you would never know that your test is broken.
+
+#### Example #2 - Presence of text
+
+Finding text within a component is very easy by using the `vue-test-utils` method `wrapper.text()`. However, there are some cases where it might be tempting to use snapshots when the value returned has a lot of inconsistent spacing due to formatting or HTML nesting.
+
+In these instances, it is better to assert each string individually and make multiple assertions than to use a snapshot to ignore the spaces. This is because any change to the DOM layout will fail the snapshot test even if the text is still perfectly formatted.
+
+```vue
+<template>
+ <gl-sprintf :message="my-message">
+ <template #code="{ content }">
+ <code>{{ content }}</code>
+ </template>
+ </gl-sprintf>
+ <p> My second message </p>
+</template>
+```
+
+Bad:
+
+```javascript
+it('renders the text as I expect', () => {
+ expect(wrapper.text()).toMatchSnapshot()
+})
+```
+
+Good:
+
+```javascript
+it('renders the code snippet', () => {
+ expect(findCodeTag().text()).toContain("myFunction()")
+})
+
+it('renders the paragraph text', () => {
+ expect(findOtherText().text()).toBe("My second message")
+})
+```
+
+#### Example #3 - Complex HTML
+
+When we have very complex HTML, we should focus on asserting specific sensitive and meaningful points rather than capturing it as a whole. The value in a snapshot test is to **warn developers** that they might have accidentally change an HTML structure that they did not intend to change. If the output of the change is hard to read, which is often the case with complex HTML output, then **is the signal itself that something changed** sufficient? And if it is, can it be accomplished without snapshots?
+
+A good example of a complex HTML output is `GlTable`. Snapshot testing might feel like a good option since you can capture rows and columns structure, but we should instead try to assert text we expect or count the number of rows and columns manually.
+
+```vue
+<template>
+ <gl-table ...all-them-props />
+</template>
+```
+
+Bad:
+
+```javascript
+it('renders GlTable as I expect', () => {
+ expect(findGlTable().element).toMatchSnapshot()
+})
+```
+
+Good:
+
+```javascript
+it('renders the right number of rows', () => {
+ expect(findGlTable().findAllRows()).toHaveLength(expectedLength)
+})
+
+it('renders the special icon that only appears on a full moon', () => {
+ expect(findGlTable().findMoonIcon().exists()).toBe(true)
+})
+
+it('renders the correct email format', () => {
+ expect(findGlTable().text()).toContain('my_strange_email@shaddyprovide.com')
+})
+```
+
+Although more verbose, this now means that our tests are not going to break if `GlTable` changes its internal implementation, we communicate to other developers (or ourselves in 6 months) what is important to preserve when refactoring or adding to our table.
+
### How to take a snapshot
```javascript
@@ -1280,43 +1434,6 @@ it('renders the component correctly', () => {
The above test will create two snapshots. It's important to decide which of the snapshots provide more value for codebase safety. That is, if one of these snapshots changes, does that highlight a possible break in the codebase? This can help catch unexpected changes if something in an underlying dependency changes without our knowledge.
-### Pros and Cons
-
-**Pros**
-
-- Speed up the creation of unit tests
-- Easy to maintain
-- Provides a good safety net to protect against accidental breakage of important HTML structures
-
-**Cons**
-
-- Is not a catch-all solution that replaces the work of integration or unit tests
-- No meaningful assertions or expectations within snapshots
-- When carelessly used with [GitLab UI](https://gitlab.com/gitlab-org/gitlab-ui) it can create fragility in tests when the underlying library changes the HTML of a component we are testing
-
-A good guideline to follow: the more complex the component you may want to steer away from just snapshot testing. But that's not to say you can't still snapshot test and test your component as normal.
-
-### When to use
-
-**Use snapshots when**
-
-- to capture a components rendered output
-- to fully or partially match templates
-- to match readable data structures
-- to verify correctly composed native HTML elements
-- as a safety net for critical structures so others don't break it by accident
-- Template heavy component
-- Not a lot of logic in the component
-- Composed of native HTML elements
-
-### When not to use
-
-**Don't use snapshots when**
-
-- To capture large data structures just to have something
-- To just have some kind of test written
-- To capture highly volatile UI elements without stubbing them (Think of GitLab UI version updates)
-
## Get started with feature tests
### What is a feature test
diff --git a/doc/update/deprecations.md b/doc/update/deprecations.md
index 7b5b48a1d74..09e0693509b 100644
--- a/doc/update/deprecations.md
+++ b/doc/update/deprecations.md
@@ -545,6 +545,39 @@ During the transition to the GitLab Observability UI, we will migrate the [GitLa
</div>
</div>
+<div class="milestone-wrapper" data-milestone="16.5">
+
+## GitLab 16.5
+
+<div class="deprecation breaking-change" data-milestone="16.5">
+
+### Old versions of JSON web tokens are deprecated
+
+<div class="deprecation-notes">
+- Announced in: GitLab <span class="milestone">15.9</span>
+- [Breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/)
+</div>
+
+Now that we have released [ID tokens](https://docs.gitlab.com/ee/ci/secrets/id_token_authentication.html)
+with OIDC support, the old JSON web tokens are deprecated.
+Both the `CI_JOB_JWT` and `CI_JOB_JWT_V2` tokens, exposed to jobs as predefined variables, will:
+
+- Not be creatable in GitLab 16.0 and later.
+- Be removed in GitLab 16.5.
+
+To prepare for this change:
+
+- Before the release of GitLab 16.5, configure your pipelines to use the fully configurable and more secure
+ [`id_token`](https://docs.gitlab.com/ee/ci/yaml/index.html#id_tokens) keyword instead.
+- [Enable the **Limit JSON Web Token (JWT) access**](https://docs.gitlab.com/ee/ci/secrets/id_token_authentication.html#enable-automatic-id-token-authentication)
+ setting, which prevents the old tokens from being exposed to any jobs.
+
+ In GitLab 16.0 and later, the ability to set this option will be removed and all new projects will have the option
+ enabled.
+
+</div>
+</div>
+
<div class="milestone-wrapper" data-milestone="16.1">
## GitLab 16.1
@@ -1394,30 +1427,6 @@ and `config/redis.shared_state.yml` files.
<div class="deprecation breaking-change" data-milestone="16.0">
-### Old versions of JSON web tokens are deprecated
-
-<div class="deprecation-notes">
-- Announced in: GitLab <span class="milestone">15.9</span>
-- [Breaking change](https://docs.gitlab.com/ee/development/deprecation_guidelines/)
-</div>
-
-Now that we have released [ID tokens](https://docs.gitlab.com/ee/ci/secrets/id_token_authentication.html)
-with OIDC support, the old JSON web tokens are deprecated and will be removed.
-Both the `CI_JOB_JWT` and `CI_JOB_JWT_V2` tokens, exposed to jobs as predefined variables,
-will no longer be available in GitLab 16.0.
-
-To prepare for this change, you should:
-
-- Configure your pipelines to use the fully configurable and more secure
- [`id_token`](https://docs.gitlab.com/ee/ci/yaml/index.html#id_tokens) keyword instead.
-- [Enable the **Limit JSON Web Token (JWT) access**](https://docs.gitlab.com/ee/ci/secrets/id_token_authentication.html#enable-automatic-id-token-authentication)
- setting, which prevents the old tokens from being exposed to any jobs. This setting
- will be permanently enabled for all projects in GitLab 16.0.
-
-</div>
-
-<div class="deprecation breaking-change" data-milestone="16.0">
-
### Option to delete projects immediately is deprecated from deletion protection settings
<div class="deprecation-notes">
diff --git a/lib/sidebars/projects/menus/ci_cd_menu.rb b/lib/sidebars/projects/menus/ci_cd_menu.rb
index 3f5ead53152..02596b16cfa 100644
--- a/lib/sidebars/projects/menus/ci_cd_menu.rb
+++ b/lib/sidebars/projects/menus/ci_cd_menu.rb
@@ -99,10 +99,6 @@ module Sidebars
end
def artifacts_menu_item
- unless Feature.enabled?(:artifacts_management_page, context.project)
- return ::Sidebars::NilMenuItem.new(item_id: :artifacts)
- end
-
::Sidebars::MenuItem.new(
title: _('Artifacts'),
link: project_artifacts_path(context.project),
diff --git a/lib/sidebars/search/panel.rb b/lib/sidebars/search/panel.rb
index d606dc388b5..83079fa8e72 100644
--- a/lib/sidebars/search/panel.rb
+++ b/lib/sidebars/search/panel.rb
@@ -5,14 +5,14 @@ module Sidebars
class Panel < ::Sidebars::Panel
override :aria_label
def aria_label
- _('Search')
+ _('Search results')
end
override :super_sidebar_context_header
def super_sidebar_context_header
@super_sidebar_context_header ||= {
title: aria_label,
- icon: 'search'
+ icon: 'search-results'
}
end
end
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index b153f370848..bfdefb4c8dc 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -39688,6 +39688,9 @@ msgstr ""
msgid "Search requirements"
msgstr ""
+msgid "Search results"
+msgstr ""
+
msgid "Search settings"
msgstr ""
diff --git a/spec/controllers/projects/artifacts_controller_spec.rb b/spec/controllers/projects/artifacts_controller_spec.rb
index c91aa562a85..c7b74b5cf68 100644
--- a/spec/controllers/projects/artifacts_controller_spec.rb
+++ b/spec/controllers/projects/artifacts_controller_spec.rb
@@ -27,31 +27,13 @@ RSpec.describe Projects::ArtifactsController, feature_category: :build_artifacts
describe 'GET index' do
subject { get :index, params: { namespace_id: project.namespace, project_id: project } }
- context 'when feature flag is on' do
- render_views
+ render_views
- before do
- stub_feature_flags(artifacts_management_page: true)
- end
-
- it 'renders the page with data for the artifacts app' do
- subject
-
- expect(response).to have_gitlab_http_status(:ok)
- expect(response).to render_template('projects/artifacts/index')
- end
- end
-
- context 'when feature flag is off' do
- before do
- stub_feature_flags(artifacts_management_page: false)
- end
-
- it 'renders no content' do
- subject
+ it 'renders the page with data for the artifacts app' do
+ subject
- expect(response).to have_gitlab_http_status(:no_content)
- end
+ expect(response).to have_gitlab_http_status(:ok)
+ expect(response).to render_template('projects/artifacts/index')
end
end
diff --git a/spec/db/schema_spec.rb b/spec/db/schema_spec.rb
index c13790b70ec..54f894c0436 100644
--- a/spec/db/schema_spec.rb
+++ b/spec/db/schema_spec.rb
@@ -22,7 +22,6 @@ RSpec.describe 'Database schema', feature_category: :database do
# In the subsequent table removal MR, remove the entries.
# See: https://docs.gitlab.com/ee/development/migration_style_guide.html#dropping-a-database-table
REMOVED_FKS = {
- clusters_applications_cert_managers: %w[cluster_id],
clusters_applications_cilium: %w[cluster_id],
clusters_applications_crossplane: %w[cluster_id],
clusters_applications_helm: %w[cluster_id],
diff --git a/spec/frontend/alert_management/components/alert_management_empty_state_spec.js b/spec/frontend/alert_management/components/alert_management_empty_state_spec.js
index 0d6bc1b74fb..b2889d429b1 100644
--- a/spec/frontend/alert_management/components/alert_management_empty_state_spec.js
+++ b/spec/frontend/alert_management/components/alert_management_empty_state_spec.js
@@ -19,12 +19,6 @@ describe('AlertManagementEmptyState', () => {
mountComponent();
});
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- }
- });
-
const EmptyState = () => wrapper.findComponent(GlEmptyState);
describe('Empty state', () => {
diff --git a/spec/frontend/alert_management/components/alert_management_list_wrapper_spec.js b/spec/frontend/alert_management/components/alert_management_list_wrapper_spec.js
index 3a5fb99fdf1..3cc2d59295c 100644
--- a/spec/frontend/alert_management/components/alert_management_list_wrapper_spec.js
+++ b/spec/frontend/alert_management/components/alert_management_list_wrapper_spec.js
@@ -20,12 +20,6 @@ describe('AlertManagementList', () => {
mountComponent();
});
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- }
- });
-
describe('Alert List Wrapper', () => {
it('should show the empty state when alerts are not enabled', () => {
expect(wrapper.findComponent(AlertManagementEmptyState).exists()).toBe(true);
diff --git a/spec/frontend/alert_management/components/alert_management_table_spec.js b/spec/frontend/alert_management/components/alert_management_table_spec.js
index 3f709d8c9f5..afd88e1a6ac 100644
--- a/spec/frontend/alert_management/components/alert_management_table_spec.js
+++ b/spec/frontend/alert_management/components/alert_management_table_spec.js
@@ -79,9 +79,6 @@ describe('AlertManagementTable', () => {
});
afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- }
mock.restore();
});
diff --git a/spec/frontend/alerts_settings/components/alert_mapping_builder_spec.js b/spec/frontend/alerts_settings/components/alert_mapping_builder_spec.js
index 2b8479eab6d..04dc0fef5da 100644
--- a/spec/frontend/alerts_settings/components/alert_mapping_builder_spec.js
+++ b/spec/frontend/alerts_settings/components/alert_mapping_builder_spec.js
@@ -19,13 +19,6 @@ describe('AlertMappingBuilder', () => {
});
}
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- wrapper = null;
- }
- });
-
beforeEach(() => {
mountComponent();
});
diff --git a/spec/frontend/alerts_settings/components/alerts_form_spec.js b/spec/frontend/alerts_settings/components/alerts_form_spec.js
index 33098282bf8..c4e5598ed39 100644
--- a/spec/frontend/alerts_settings/components/alerts_form_spec.js
+++ b/spec/frontend/alerts_settings/components/alerts_form_spec.js
@@ -22,12 +22,6 @@ describe('Alert integration settings form', () => {
});
});
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- }
- });
-
describe('default state', () => {
it('should match the default snapshot', () => {
expect(wrapper.element).toMatchSnapshot();
diff --git a/spec/frontend/alerts_settings/components/alerts_integrations_list_spec.js b/spec/frontend/alerts_settings/components/alerts_integrations_list_spec.js
index 9983af873c2..76d0c12e434 100644
--- a/spec/frontend/alerts_settings/components/alerts_integrations_list_spec.js
+++ b/spec/frontend/alerts_settings/components/alerts_integrations_list_spec.js
@@ -42,13 +42,6 @@ describe('AlertIntegrationsList', () => {
});
}
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- wrapper = null;
- }
- });
-
beforeEach(() => {
mountComponent();
});
diff --git a/spec/frontend/alerts_settings/components/alerts_settings_form_spec.js b/spec/frontend/alerts_settings/components/alerts_settings_form_spec.js
index 5eb5ae2f783..4a0c7f65493 100644
--- a/spec/frontend/alerts_settings/components/alerts_settings_form_spec.js
+++ b/spec/frontend/alerts_settings/components/alerts_settings_form_spec.js
@@ -63,12 +63,6 @@ describe('AlertsSettingsForm', () => {
const findActionBtn = () => wrapper.findByTestId('payload-action-btn');
const findTabs = () => wrapper.findAllComponents(GlTab);
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- }
- });
-
const selectOptionAtIndex = async (index) => {
const options = findSelect().findAll('option');
await options.at(index).setSelected();
diff --git a/spec/frontend/boards/components/new_board_button_spec.js b/spec/frontend/boards/components/new_board_button_spec.js
index 2bbd3797abf..7ec35d1b796 100644
--- a/spec/frontend/boards/components/new_board_button_spec.js
+++ b/spec/frontend/boards/components/new_board_button_spec.js
@@ -21,12 +21,6 @@ describe('NewBoardButton', () => {
}),
);
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- }
- });
-
describe('control variant', () => {
beforeAll(() => {
stubExperiments({ [FEATURE]: 'control' });
diff --git a/spec/frontend/branches/components/sort_dropdown_spec.js b/spec/frontend/branches/components/sort_dropdown_spec.js
index bd41b0daaaa..64ef30bb8a8 100644
--- a/spec/frontend/branches/components/sort_dropdown_spec.js
+++ b/spec/frontend/branches/components/sort_dropdown_spec.js
@@ -29,12 +29,6 @@ describe('Branches Sort Dropdown', () => {
const findSearchBox = () => wrapper.findComponent(GlSearchBoxByClick);
const findBranchesDropdown = () => wrapper.findByTestId('branches-dropdown');
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- }
- });
-
describe('When in overview mode', () => {
beforeEach(() => {
wrapper = createWrapper();
diff --git a/spec/frontend/clusters_list/components/agent_empty_state_spec.js b/spec/frontend/clusters_list/components/agent_empty_state_spec.js
index 22775aa6603..2e52d16c739 100644
--- a/spec/frontend/clusters_list/components/agent_empty_state_spec.js
+++ b/spec/frontend/clusters_list/components/agent_empty_state_spec.js
@@ -22,12 +22,6 @@ describe('AgentEmptyStateComponent', () => {
});
});
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- }
- });
-
it('renders the empty state', () => {
expect(findEmptyState().exists()).toBe(true);
});
diff --git a/spec/frontend/content_editor/components/toolbar_text_style_dropdown_spec.js b/spec/frontend/content_editor/components/toolbar_text_style_dropdown_spec.js
index 31ed13541e6..97f6bdaf778 100644
--- a/spec/frontend/content_editor/components/toolbar_text_style_dropdown_spec.js
+++ b/spec/frontend/content_editor/components/toolbar_text_style_dropdown_spec.js
@@ -117,7 +117,6 @@ describe('content_editor/components/toolbar_text_style_dropdown', () => {
},
],
]);
- wrapper.destroy();
});
});
});
diff --git a/spec/frontend/diffs/components/app_spec.js b/spec/frontend/diffs/components/app_spec.js
index aa74721ee3c..42eec0af961 100644
--- a/spec/frontend/diffs/components/app_spec.js
+++ b/spec/frontend/diffs/components/app_spec.js
@@ -93,12 +93,6 @@ describe('diffs/components/app', () => {
// reset globals
window.mrTabs = oldMrTabs;
- // reset component
- if (wrapper) {
- wrapper.destroy();
- wrapper = null;
- }
-
mock.restore();
});
diff --git a/spec/frontend/diffs/components/diff_file_spec.js b/spec/frontend/diffs/components/diff_file_spec.js
index 8552e69012b..389b192a515 100644
--- a/spec/frontend/diffs/components/diff_file_spec.js
+++ b/spec/frontend/diffs/components/diff_file_spec.js
@@ -511,8 +511,6 @@ describe('DiffFile', () => {
});
it('loads collapsed file on mounted when single file mode is enabled', async () => {
- wrapper.destroy();
-
const file = {
...getReadableFile(),
load_collapsed_diff_url: '/diff_for_path',
@@ -531,10 +529,6 @@ describe('DiffFile', () => {
});
describe('merge conflicts', () => {
- beforeEach(() => {
- wrapper.destroy();
- });
-
it('does not render conflict alert', () => {
const file = {
...getReadableFile(),
diff --git a/spec/frontend/environments/canary_ingress_spec.js b/spec/frontend/environments/canary_ingress_spec.js
index 17ecd93361f..e0247731b63 100644
--- a/spec/frontend/environments/canary_ingress_spec.js
+++ b/spec/frontend/environments/canary_ingress_spec.js
@@ -33,12 +33,6 @@ describe('/environments/components/canary_ingress.vue', () => {
createComponent();
});
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- }
- });
-
describe('stable weight', () => {
let stableWeightDropdown;
diff --git a/spec/frontend/environments/canary_update_modal_spec.js b/spec/frontend/environments/canary_update_modal_spec.js
index a101ed4e00a..4fa7b34d817 100644
--- a/spec/frontend/environments/canary_update_modal_spec.js
+++ b/spec/frontend/environments/canary_update_modal_spec.js
@@ -30,12 +30,6 @@ describe('/environments/components/canary_update_modal.vue', () => {
modal = wrapper.findComponent(GlModal);
};
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- }
- });
-
beforeEach(() => {
createComponent();
});
diff --git a/spec/frontend/environments/environment_item_spec.js b/spec/frontend/environments/environment_item_spec.js
index 59e94dfd662..690db66efd1 100644
--- a/spec/frontend/environments/environment_item_spec.js
+++ b/spec/frontend/environments/environment_item_spec.js
@@ -19,10 +19,6 @@ describe('Environment item', () => {
let tracking;
const factory = (options = {}) => {
- // This destroys any wrappers created before a nested call to factory reassigns it
- if (wrapper && wrapper.destroy) {
- wrapper.destroy();
- }
wrapper = mount(EnvironmentItem, {
...options,
});
diff --git a/spec/frontend/environments/environment_pin_spec.js b/spec/frontend/environments/environment_pin_spec.js
index 2f38dea2833..ee195b41bc8 100644
--- a/spec/frontend/environments/environment_pin_spec.js
+++ b/spec/frontend/environments/environment_pin_spec.js
@@ -11,10 +11,6 @@ describe('Pin Component', () => {
let wrapper;
const factory = (options = {}) => {
- // This destroys any wrappers created before a nested call to factory reassigns it
- if (wrapper && wrapper.destroy) {
- wrapper.destroy();
- }
wrapper = shallowMount(PinComponent, {
...options,
});
diff --git a/spec/frontend/environments/environment_table_spec.js b/spec/frontend/environments/environment_table_spec.js
index 652b0f807fe..f41d1324b81 100644
--- a/spec/frontend/environments/environment_table_spec.js
+++ b/spec/frontend/environments/environment_table_spec.js
@@ -16,10 +16,6 @@ describe('Environment table', () => {
let wrapper;
const factory = (options = {}) => {
- // This destroys any wrappers created before a nested call to factory reassigns it
- if (wrapper && wrapper.destroy) {
- wrapper.destroy();
- }
wrapper = mount(EnvironmentTable, {
...options,
});
diff --git a/spec/frontend/error_tracking/components/error_details_spec.js b/spec/frontend/error_tracking/components/error_details_spec.js
index 4d77560ffe8..4e73db13a17 100644
--- a/spec/frontend/error_tracking/components/error_details_spec.js
+++ b/spec/frontend/error_tracking/components/error_details_spec.js
@@ -108,12 +108,6 @@ describe('ErrorDetails', () => {
};
});
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- }
- });
-
describe('loading', () => {
beforeEach(() => {
mountComponent();
diff --git a/spec/frontend/error_tracking/components/error_tracking_actions_spec.js b/spec/frontend/error_tracking/components/error_tracking_actions_spec.js
index 5f6c9ddb4d7..d959d73c86b 100644
--- a/spec/frontend/error_tracking/components/error_tracking_actions_spec.js
+++ b/spec/frontend/error_tracking/components/error_tracking_actions_spec.js
@@ -29,12 +29,6 @@ describe('Error Tracking Actions', () => {
mountComponent();
});
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- }
- });
-
const findButtons = () => wrapper.findAllComponents(GlButton);
describe('when error status is unresolved', () => {
diff --git a/spec/frontend/error_tracking/components/stacktrace_entry_spec.js b/spec/frontend/error_tracking/components/stacktrace_entry_spec.js
index 0de4277b08a..45fc1ad04ff 100644
--- a/spec/frontend/error_tracking/components/stacktrace_entry_spec.js
+++ b/spec/frontend/error_tracking/components/stacktrace_entry_spec.js
@@ -28,12 +28,6 @@ describe('Stacktrace Entry', () => {
});
}
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- }
- });
-
it('should render stacktrace entry collapsed', () => {
mountComponent({ lines });
expect(wrapper.findComponent(StackTraceEntry).exists()).toBe(true);
diff --git a/spec/frontend/error_tracking/components/stacktrace_spec.js b/spec/frontend/error_tracking/components/stacktrace_spec.js
index cd5a57f5683..29301c3e5ee 100644
--- a/spec/frontend/error_tracking/components/stacktrace_spec.js
+++ b/spec/frontend/error_tracking/components/stacktrace_spec.js
@@ -25,12 +25,6 @@ describe('ErrorDetails', () => {
}
describe('Stacktrace', () => {
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- }
- });
-
it('should render single Stacktrace entry', () => {
mountComponent([stackTraceEntry]);
expect(wrapper.findAllComponents(StackTraceEntry).length).toBe(1);
diff --git a/spec/frontend/error_tracking_settings/components/app_spec.js b/spec/frontend/error_tracking_settings/components/app_spec.js
index dfe9652073e..9b7701d46bc 100644
--- a/spec/frontend/error_tracking_settings/components/app_spec.js
+++ b/spec/frontend/error_tracking_settings/components/app_spec.js
@@ -68,12 +68,6 @@ describe('error tracking settings app', () => {
mountComponent();
});
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- }
- });
-
describe('section', () => {
it('renders the form and dropdown', () => {
expect(wrapper.findComponent(ErrorTrackingForm).exists()).toBe(true);
diff --git a/spec/frontend/error_tracking_settings/components/error_tracking_form_spec.js b/spec/frontend/error_tracking_settings/components/error_tracking_form_spec.js
index 69d684faec2..b1cf5d673f1 100644
--- a/spec/frontend/error_tracking_settings/components/error_tracking_form_spec.js
+++ b/spec/frontend/error_tracking_settings/components/error_tracking_form_spec.js
@@ -24,12 +24,6 @@ describe('error tracking settings form', () => {
mountComponent();
});
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- }
- });
-
describe('an empty form', () => {
it('is rendered', () => {
expect(wrapper.findAllComponents(GlFormInput).length).toBe(2);
diff --git a/spec/frontend/error_tracking_settings/components/project_dropdown_spec.js b/spec/frontend/error_tracking_settings/components/project_dropdown_spec.js
index 8653ebac20d..03d090c5314 100644
--- a/spec/frontend/error_tracking_settings/components/project_dropdown_spec.js
+++ b/spec/frontend/error_tracking_settings/components/project_dropdown_spec.js
@@ -33,12 +33,6 @@ describe('error tracking settings project dropdown', () => {
mountComponent();
});
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- }
- });
-
describe('empty project list', () => {
it('renders the dropdown', () => {
expect(wrapper.find('#project-dropdown').exists()).toBe(true);
diff --git a/spec/frontend/feature_flags/components/edit_feature_flag_spec.js b/spec/frontend/feature_flags/components/edit_feature_flag_spec.js
index c26fd80865d..b8d058e7bc5 100644
--- a/spec/frontend/feature_flags/components/edit_feature_flag_spec.js
+++ b/spec/frontend/feature_flags/components/edit_feature_flag_spec.js
@@ -24,10 +24,6 @@ describe('Edit feature flag form', () => {
});
const factory = (provide = { searchPath: '/search' }) => {
- if (wrapper) {
- wrapper.destroy();
- wrapper = null;
- }
wrapper = shallowMount(EditFeatureFlag, {
store,
provide,
diff --git a/spec/frontend/feature_flags/components/empty_state_spec.js b/spec/frontend/feature_flags/components/empty_state_spec.js
index d983332f7c1..4aa0b261e2a 100644
--- a/spec/frontend/feature_flags/components/empty_state_spec.js
+++ b/spec/frontend/feature_flags/components/empty_state_spec.js
@@ -44,12 +44,6 @@ describe('feature_flags/components/feature_flags_tab.vue', () => {
},
);
- afterEach(() => {
- if (wrapper?.destroy) {
- wrapper.destroy();
- }
- });
-
describe('alerts', () => {
let alerts;
diff --git a/spec/frontend/feature_flags/components/new_environments_dropdown_spec.js b/spec/frontend/feature_flags/components/new_environments_dropdown_spec.js
index 14e1f34bc59..6156addd63f 100644
--- a/spec/frontend/feature_flags/components/new_environments_dropdown_spec.js
+++ b/spec/frontend/feature_flags/components/new_environments_dropdown_spec.js
@@ -22,10 +22,6 @@ describe('New Environments Dropdown', () => {
afterEach(() => {
axiosMock.restore();
- if (wrapper) {
- wrapper.destroy();
- wrapper = null;
- }
});
describe('before results', () => {
diff --git a/spec/frontend/feature_flags/components/new_feature_flag_spec.js b/spec/frontend/feature_flags/components/new_feature_flag_spec.js
index 46c9118cbd9..c5418477661 100644
--- a/spec/frontend/feature_flags/components/new_feature_flag_spec.js
+++ b/spec/frontend/feature_flags/components/new_feature_flag_spec.js
@@ -22,10 +22,6 @@ describe('New feature flag form', () => {
});
const factory = (opts = {}) => {
- if (wrapper) {
- wrapper.destroy();
- wrapper = null;
- }
wrapper = shallowMount(NewFeatureFlag, {
store,
provide: {
diff --git a/spec/frontend/feature_flags/components/strategies/flexible_rollout_spec.js b/spec/frontend/feature_flags/components/strategies/flexible_rollout_spec.js
index 5feaf094701..a6eb81ef6f0 100644
--- a/spec/frontend/feature_flags/components/strategies/flexible_rollout_spec.js
+++ b/spec/frontend/feature_flags/components/strategies/flexible_rollout_spec.js
@@ -20,12 +20,6 @@ describe('feature_flags/components/strategies/flexible_rollout.vue', () => {
const factory = (props = {}) =>
mount(FlexibleRollout, { propsData: { ...DEFAULT_PROPS, ...props } });
- afterEach(() => {
- if (wrapper?.destroy) {
- wrapper.destroy();
- }
- });
-
describe('with valid percentage', () => {
beforeEach(() => {
wrapper = factory();
diff --git a/spec/frontend/feature_flags/components/strategies/parameter_form_group_spec.js b/spec/frontend/feature_flags/components/strategies/parameter_form_group_spec.js
index 365f1e534b5..8ad70466e90 100644
--- a/spec/frontend/feature_flags/components/strategies/parameter_form_group_spec.js
+++ b/spec/frontend/feature_flags/components/strategies/parameter_form_group_spec.js
@@ -24,12 +24,6 @@ describe('~/feature_flags/strategies/parameter_form_group.vue', () => {
slot = wrapper.find('[data-testid="slot"]');
});
- afterEach(() => {
- if (wrapper?.destroy) {
- wrapper.destroy();
- }
- });
-
it('should display the default slot', () => {
expect(slot.exists()).toBe(true);
});
diff --git a/spec/frontend/feature_flags/components/strategies/percent_rollout_spec.js b/spec/frontend/feature_flags/components/strategies/percent_rollout_spec.js
index b20061c12a2..e00869fdd09 100644
--- a/spec/frontend/feature_flags/components/strategies/percent_rollout_spec.js
+++ b/spec/frontend/feature_flags/components/strategies/percent_rollout_spec.js
@@ -18,12 +18,6 @@ describe('~/feature_flags/components/strategies/percent_rollout.vue', () => {
const factory = (props = {}) =>
mount(PercentRollout, { propsData: { ...DEFAULT_PROPS, ...props } });
- afterEach(() => {
- if (wrapper?.destroy) {
- wrapper.destroy();
- }
- });
-
describe('with valid percentage', () => {
beforeEach(() => {
wrapper = factory();
diff --git a/spec/frontend/feature_flags/components/strategies/users_with_id_spec.js b/spec/frontend/feature_flags/components/strategies/users_with_id_spec.js
index ae489f3a6e6..f3b8535a650 100644
--- a/spec/frontend/feature_flags/components/strategies/users_with_id_spec.js
+++ b/spec/frontend/feature_flags/components/strategies/users_with_id_spec.js
@@ -18,12 +18,6 @@ describe('~/feature_flags/components/users_with_id.vue', () => {
textarea = wrapper.findComponent(GlFormTextarea);
});
- afterEach(() => {
- if (wrapper?.destroy) {
- wrapper.destroy();
- }
- });
-
it('should display the current value of the parameters', () => {
expect(textarea.element.value).toBe(usersWithIdStrategy.parameters.userIds);
});
diff --git a/spec/frontend/feature_flags/components/strategy_parameters_spec.js b/spec/frontend/feature_flags/components/strategy_parameters_spec.js
index cd8270f1801..bc34888d1c1 100644
--- a/spec/frontend/feature_flags/components/strategy_parameters_spec.js
+++ b/spec/frontend/feature_flags/components/strategy_parameters_spec.js
@@ -28,12 +28,6 @@ describe('~/feature_flags/components/strategy_parameters.vue', () => {
},
});
- afterEach(() => {
- if (wrapper?.destroy) {
- wrapper.destroy();
- }
- });
-
describe.each`
name | component
${ROLLOUT_STRATEGY_ALL_USERS} | ${Default}
diff --git a/spec/frontend/feature_flags/components/strategy_spec.js b/spec/frontend/feature_flags/components/strategy_spec.js
index 84d4180fe63..1428d99aa76 100644
--- a/spec/frontend/feature_flags/components/strategy_spec.js
+++ b/spec/frontend/feature_flags/components/strategy_spec.js
@@ -44,10 +44,6 @@ describe('Feature flags strategy', () => {
provide,
},
) => {
- if (wrapper) {
- wrapper.destroy();
- wrapper = null;
- }
wrapper = mount(Strategy, { store: createStore({ projectId: '1' }), ...opts });
};
@@ -55,13 +51,6 @@ describe('Feature flags strategy', () => {
Api.searchFeatureFlagUserLists.mockResolvedValue({ data: [userList] });
});
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- wrapper = null;
- }
- });
-
describe('helper links', () => {
const propsData = { strategy: {}, index: 0, userLists: [userList] };
factory({ propsData, provide });
diff --git a/spec/frontend/grafana_integration/components/grafana_integration_spec.js b/spec/frontend/grafana_integration/components/grafana_integration_spec.js
index 9cb27670c98..540fc597aa9 100644
--- a/spec/frontend/grafana_integration/components/grafana_integration_spec.js
+++ b/spec/frontend/grafana_integration/components/grafana_integration_spec.js
@@ -28,11 +28,8 @@ describe('grafana integration component', () => {
});
afterEach(() => {
- if (wrapper.destroy) {
- wrapper.destroy();
- createAlert.mockReset();
- refreshCurrentPage.mockReset();
- }
+ createAlert.mockReset();
+ refreshCurrentPage.mockReset();
});
describe('default state', () => {
diff --git a/spec/frontend/groups/components/item_caret_spec.js b/spec/frontend/groups/components/item_caret_spec.js
index 2333f04bb2e..ff273fcf6da 100644
--- a/spec/frontend/groups/components/item_caret_spec.js
+++ b/spec/frontend/groups/components/item_caret_spec.js
@@ -15,13 +15,6 @@ describe('ItemCaret', () => {
});
};
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- wrapper = null;
- }
- });
-
const findAllGlIcons = () => wrapper.findAllComponents(GlIcon);
const findGlIcon = () => wrapper.findComponent(GlIcon);
diff --git a/spec/frontend/groups/components/item_stats_spec.js b/spec/frontend/groups/components/item_stats_spec.js
index 0c2912adc66..b98e60bed63 100644
--- a/spec/frontend/groups/components/item_stats_spec.js
+++ b/spec/frontend/groups/components/item_stats_spec.js
@@ -17,13 +17,6 @@ describe('ItemStats', () => {
});
};
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- wrapper = null;
- }
- });
-
const findItemStatsValue = () => wrapper.findComponent(ItemStatsValue);
describe('template', () => {
diff --git a/spec/frontend/groups/components/item_stats_value_spec.js b/spec/frontend/groups/components/item_stats_value_spec.js
index b9db83c7dd7..e110004dbac 100644
--- a/spec/frontend/groups/components/item_stats_value_spec.js
+++ b/spec/frontend/groups/components/item_stats_value_spec.js
@@ -18,13 +18,6 @@ describe('ItemStatsValue', () => {
});
};
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- wrapper = null;
- }
- });
-
const findGlIcon = () => wrapper.findComponent(GlIcon);
const findStatValue = () => wrapper.find('[data-testid="itemStatValue"]');
diff --git a/spec/frontend/groups/components/item_type_icon_spec.js b/spec/frontend/groups/components/item_type_icon_spec.js
index aa00e82150b..c269dc98a45 100644
--- a/spec/frontend/groups/components/item_type_icon_spec.js
+++ b/spec/frontend/groups/components/item_type_icon_spec.js
@@ -16,13 +16,6 @@ describe('ItemTypeIcon', () => {
});
};
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- wrapper = null;
- }
- });
-
const findGlIcon = () => wrapper.findComponent(GlIcon);
describe('template', () => {
diff --git a/spec/frontend/ide/components/jobs/list_spec.js b/spec/frontend/ide/components/jobs/list_spec.js
index b4c7eb51781..0ece42bce51 100644
--- a/spec/frontend/ide/components/jobs/list_spec.js
+++ b/spec/frontend/ide/components/jobs/list_spec.js
@@ -50,11 +50,6 @@ describe('IDE stages list', () => {
Object.values(storeActions).forEach((actionMock) => actionMock.mockClear());
});
- afterAll(() => {
- wrapper.destroy();
- wrapper = null;
- });
-
it('renders loading icon when no stages & loading', () => {
createComponent({ loading: true, stages: [] });
diff --git a/spec/frontend/import_entities/import_projects/components/bitbucket_status_table_spec.js b/spec/frontend/import_entities/import_projects/components/bitbucket_status_table_spec.js
index 9eae4ed974e..5773ab33e05 100644
--- a/spec/frontend/import_entities/import_projects/components/bitbucket_status_table_spec.js
+++ b/spec/frontend/import_entities/import_projects/components/bitbucket_status_table_spec.js
@@ -14,13 +14,6 @@ const ImportProjectsTableStub = {
describe('BitbucketStatusTable', () => {
let wrapper;
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- wrapper = null;
- }
- });
-
function createComponent(propsData, importProjectsTableStub = true, slots) {
wrapper = shallowMount(BitbucketStatusTable, {
propsData,
diff --git a/spec/frontend/import_entities/import_projects/components/import_projects_table_spec.js b/spec/frontend/import_entities/import_projects/components/import_projects_table_spec.js
index 51f82dab381..f7bc0e4a0e8 100644
--- a/spec/frontend/import_entities/import_projects/components/import_projects_table_spec.js
+++ b/spec/frontend/import_entities/import_projects/components/import_projects_table_spec.js
@@ -81,13 +81,6 @@ describe('ImportProjectsTable', () => {
});
}
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- wrapper = null;
- }
- });
-
it('renders a loading icon while repos are loading', () => {
createComponent({ state: { isLoadingRepos: true } });
diff --git a/spec/frontend/incidents/components/incidents_list_spec.js b/spec/frontend/incidents/components/incidents_list_spec.js
index 6e64eeaf295..a0710ddb06c 100644
--- a/spec/frontend/incidents/components/incidents_list_spec.js
+++ b/spec/frontend/incidents/components/incidents_list_spec.js
@@ -97,13 +97,6 @@ describe('Incidents List', () => {
);
}
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- wrapper = null;
- }
- });
-
it('shows the loading state', () => {
mountComponent({
loading: true,
diff --git a/spec/frontend/issuable/related_issues/components/issue_token_spec.js b/spec/frontend/issuable/related_issues/components/issue_token_spec.js
index bacebbade7f..4f2a96306e3 100644
--- a/spec/frontend/issuable/related_issues/components/issue_token_spec.js
+++ b/spec/frontend/issuable/related_issues/components/issue_token_spec.js
@@ -24,13 +24,6 @@ describe('IssueToken', () => {
});
};
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- wrapper = null;
- }
- });
-
const findLink = () => wrapper.findComponent({ ref: 'link' });
const findReference = () => wrapper.findComponent({ ref: 'reference' });
const findReferenceIcon = () => wrapper.find('[data-testid="referenceIcon"]');
diff --git a/spec/frontend/issuable/related_issues/components/related_issues_block_spec.js b/spec/frontend/issuable/related_issues/components/related_issues_block_spec.js
index 8807bc311f0..e97c0312181 100644
--- a/spec/frontend/issuable/related_issues/components/related_issues_block_spec.js
+++ b/spec/frontend/issuable/related_issues/components/related_issues_block_spec.js
@@ -57,13 +57,6 @@ describe('RelatedIssuesBlock', () => {
});
};
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- wrapper = null;
- }
- });
-
describe('with defaults', () => {
beforeEach(() => {
createComponent();
diff --git a/spec/frontend/issuable/related_issues/components/related_issues_list_spec.js b/spec/frontend/issuable/related_issues/components/related_issues_list_spec.js
index 0a6a0a90d44..592dc19f0ea 100644
--- a/spec/frontend/issuable/related_issues/components/related_issues_list_spec.js
+++ b/spec/frontend/issuable/related_issues/components/related_issues_list_spec.js
@@ -37,13 +37,6 @@ describe('RelatedIssuesList', () => {
});
};
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- wrapper = null;
- }
- });
-
describe('with defaults', () => {
const heading = 'Related to';
diff --git a/spec/frontend/issues/show/components/incidents/highlight_bar_spec.js b/spec/frontend/issues/show/components/incidents/highlight_bar_spec.js
index 1cfb7d12a91..ad730fd69f7 100644
--- a/spec/frontend/issues/show/components/incidents/highlight_bar_spec.js
+++ b/spec/frontend/issues/show/components/incidents/highlight_bar_spec.js
@@ -34,13 +34,6 @@ describe('Highlight Bar', () => {
mountComponent();
});
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- wrapper = null;
- }
- });
-
const findLink = () => wrapper.findComponent(GlLink);
describe('empty state', () => {
diff --git a/spec/frontend/issues/show/components/incidents/timeline_events_tab_spec.js b/spec/frontend/issues/show/components/incidents/timeline_events_tab_spec.js
index 48c3f0984a0..41c103d5bcb 100644
--- a/spec/frontend/issues/show/components/incidents/timeline_events_tab_spec.js
+++ b/spec/frontend/issues/show/components/incidents/timeline_events_tab_spec.js
@@ -44,12 +44,6 @@ describe('TimelineEventsTab', () => {
});
};
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- }
- });
-
const findLoadingSpinner = () => wrapper.findComponent(GlLoadingIcon);
const findEmptyState = () => wrapper.findComponent(GlEmptyState);
const findTimelineEventsList = () => wrapper.findComponent(IncidentTimelineEventsList);
diff --git a/spec/frontend/issues/show/components/sentry_error_stack_trace_spec.js b/spec/frontend/issues/show/components/sentry_error_stack_trace_spec.js
index d4202f4a6ab..02b20b9e7b7 100644
--- a/spec/frontend/issues/show/components/sentry_error_stack_trace_spec.js
+++ b/spec/frontend/issues/show/components/sentry_error_stack_trace_spec.js
@@ -53,12 +53,6 @@ describe('Sentry Error Stack Trace', () => {
});
});
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- }
- });
-
describe('loading', () => {
it('should show spinner while loading', () => {
mountComponent();
diff --git a/spec/frontend/jobs/components/job/empty_state_spec.js b/spec/frontend/jobs/components/job/empty_state_spec.js
index c6ab259bf46..970c2591795 100644
--- a/spec/frontend/jobs/components/job/empty_state_spec.js
+++ b/spec/frontend/jobs/components/job/empty_state_spec.js
@@ -35,13 +35,6 @@ describe('Empty State', () => {
const findAction = () => wrapper.findByTestId('job-empty-state-action');
const findManualVarsForm = () => wrapper.findComponent(ManualVariablesForm);
- afterEach(() => {
- if (wrapper?.destroy) {
- wrapper.destroy();
- wrapper = null;
- }
- });
-
describe('renders image and title', () => {
beforeEach(() => {
createWrapper();
diff --git a/spec/frontend/jobs/components/job/job_log_controllers_spec.js b/spec/frontend/jobs/components/job/job_log_controllers_spec.js
index db060c0d606..218096b9745 100644
--- a/spec/frontend/jobs/components/job/job_log_controllers_spec.js
+++ b/spec/frontend/jobs/components/job/job_log_controllers_spec.js
@@ -16,9 +16,6 @@ describe('Job log controllers', () => {
});
afterEach(() => {
- if (wrapper?.destroy) {
- wrapper.destroy();
- }
commonUtils.backOff.mockReset();
});
diff --git a/spec/frontend/jobs/components/job/job_retry_forward_deployment_modal_spec.js b/spec/frontend/jobs/components/job/job_retry_forward_deployment_modal_spec.js
index 712269a1e83..a44a13259aa 100644
--- a/spec/frontend/jobs/components/job/job_retry_forward_deployment_modal_spec.js
+++ b/spec/frontend/jobs/components/job/job_retry_forward_deployment_modal_spec.js
@@ -27,13 +27,6 @@ describe('Job Retry Forward Deployment Modal', () => {
});
};
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- wrapper = null;
- }
- });
-
beforeEach(createWrapper);
describe('Modal configuration', () => {
diff --git a/spec/frontend/jobs/components/job/job_sidebar_details_container_spec.js b/spec/frontend/jobs/components/job/job_sidebar_details_container_spec.js
index 4da17ed8366..c1028f3929d 100644
--- a/spec/frontend/jobs/components/job/job_sidebar_details_container_spec.js
+++ b/spec/frontend/jobs/components/job/job_sidebar_details_container_spec.js
@@ -26,13 +26,6 @@ describe('Job Sidebar Details Container', () => {
);
};
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- wrapper = null;
- }
- });
-
describe('when no details are available', () => {
beforeEach(() => {
createWrapper();
diff --git a/spec/frontend/jobs/components/job/job_sidebar_retry_button_spec.js b/spec/frontend/jobs/components/job/job_sidebar_retry_button_spec.js
index 91821a38a78..8a63bfdc3d6 100644
--- a/spec/frontend/jobs/components/job/job_sidebar_retry_button_spec.js
+++ b/spec/frontend/jobs/components/job/job_sidebar_retry_button_spec.js
@@ -24,12 +24,6 @@ describe('Job Sidebar Retry Button', () => {
});
};
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- }
- });
-
beforeEach(createWrapper);
it.each([
diff --git a/spec/frontend/jobs/components/job/stuck_block_spec.js b/spec/frontend/jobs/components/job/stuck_block_spec.js
index 8dc570cce27..0f014a9222b 100644
--- a/spec/frontend/jobs/components/job/stuck_block_spec.js
+++ b/spec/frontend/jobs/components/job/stuck_block_spec.js
@@ -5,13 +5,6 @@ import StuckBlock from '~/jobs/components/job/stuck_block.vue';
describe('Stuck Block Job component', () => {
let wrapper;
- afterEach(() => {
- if (wrapper?.destroy) {
- wrapper.destroy();
- wrapper = null;
- }
- });
-
const createWrapper = (props) => {
wrapper = shallowMount(StuckBlock, {
propsData: {
diff --git a/spec/frontend/monitoring/components/dashboard_url_time_spec.js b/spec/frontend/monitoring/components/dashboard_url_time_spec.js
index 98791906700..c43f6446b99 100644
--- a/spec/frontend/monitoring/components/dashboard_url_time_spec.js
+++ b/spec/frontend/monitoring/components/dashboard_url_time_spec.js
@@ -46,9 +46,6 @@ describe('dashboard invalid url parameters', () => {
});
afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- }
mock.restore();
queryToObject.mockReset();
});
diff --git a/spec/frontend/monitoring/components/embeds/embed_group_spec.js b/spec/frontend/monitoring/components/embeds/embed_group_spec.js
index 6695353bdb5..beb698c838f 100644
--- a/spec/frontend/monitoring/components/embeds/embed_group_spec.js
+++ b/spec/frontend/monitoring/components/embeds/embed_group_spec.js
@@ -48,9 +48,6 @@ describe('Embed Group', () => {
afterEach(() => {
metricsWithDataGetter.mockReset();
- if (wrapper) {
- wrapper.destroy();
- }
});
describe('interactivity', () => {
diff --git a/spec/frontend/monitoring/components/embeds/metric_embed_spec.js b/spec/frontend/monitoring/components/embeds/metric_embed_spec.js
index beff3da2baf..db25d524592 100644
--- a/spec/frontend/monitoring/components/embeds/metric_embed_spec.js
+++ b/spec/frontend/monitoring/components/embeds/metric_embed_spec.js
@@ -52,9 +52,6 @@ describe('MetricEmbed', () => {
afterEach(() => {
metricsWithDataGetter.mockClear();
- if (wrapper) {
- wrapper.destroy();
- }
});
describe('no metrics are available yet', () => {
diff --git a/spec/frontend/monitoring/pages/dashboard_page_spec.js b/spec/frontend/monitoring/pages/dashboard_page_spec.js
index 3de99673e71..7fcb7607772 100644
--- a/spec/frontend/monitoring/pages/dashboard_page_spec.js
+++ b/spec/frontend/monitoring/pages/dashboard_page_spec.js
@@ -38,13 +38,6 @@ describe('monitoring/pages/dashboard_page', () => {
jest.spyOn(store, 'dispatch').mockResolvedValue();
});
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- wrapper = null;
- }
- });
-
it('throws errors if dashboard props are not passed', () => {
expect(() => assertProps(DashboardPage, {})).toThrow('Missing required prop: "dashboardProps"');
});
diff --git a/spec/frontend/notes/components/discussion_navigator_spec.js b/spec/frontend/notes/components/discussion_navigator_spec.js
index 14181287381..885a7e2802e 100644
--- a/spec/frontend/notes/components/discussion_navigator_spec.js
+++ b/spec/frontend/notes/components/discussion_navigator_spec.js
@@ -32,12 +32,6 @@ describe('notes/components/discussion_navigator', () => {
jumpToPreviousDiscussion = jest.fn();
});
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- }
- });
-
describe('on create', () => {
let onSpy;
let vm;
diff --git a/spec/frontend/notes/components/timeline_toggle_spec.js b/spec/frontend/notes/components/timeline_toggle_spec.js
index cf79416d300..caa6f95d5da 100644
--- a/spec/frontend/notes/components/timeline_toggle_spec.js
+++ b/spec/frontend/notes/components/timeline_toggle_spec.js
@@ -35,10 +35,6 @@ describe('Timeline toggle', () => {
});
afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- wrapper = null;
- }
store.dispatch.mockReset();
mockEvent.currentTarget.blur.mockReset();
Tracking.event.mockReset();
diff --git a/spec/frontend/operation_settings/components/metrics_settings_spec.js b/spec/frontend/operation_settings/components/metrics_settings_spec.js
index 6ea08d4a9a5..5bccf4943ae 100644
--- a/spec/frontend/operation_settings/components/metrics_settings_spec.js
+++ b/spec/frontend/operation_settings/components/metrics_settings_spec.js
@@ -47,9 +47,6 @@ describe('operation settings external dashboard component', () => {
});
afterEach(() => {
- if (wrapper.destroy) {
- wrapper.destroy();
- }
axios.patch.mockReset();
refreshCurrentPage.mockReset();
createAlert.mockReset();
diff --git a/spec/frontend/packages_and_registries/shared/components/package_tags_spec.js b/spec/frontend/packages_and_registries/shared/components/package_tags_spec.js
index 33e96c0775e..b025517ae47 100644
--- a/spec/frontend/packages_and_registries/shared/components/package_tags_spec.js
+++ b/spec/frontend/packages_and_registries/shared/components/package_tags_spec.js
@@ -20,10 +20,6 @@ describe('PackageTags', () => {
const tagBadges = () => wrapper.findAll('[data-testid="tagBadge"]');
const moreBadge = () => wrapper.find('[data-testid="moreBadge"]');
- afterEach(() => {
- if (wrapper) wrapper.destroy();
- });
-
describe('tag label', () => {
it('shows the tag label by default', () => {
createComponent();
diff --git a/spec/frontend/pages/import/bitbucket_server/components/bitbucket_server_status_table_spec.js b/spec/frontend/pages/import/bitbucket_server/components/bitbucket_server_status_table_spec.js
index 8eab5061e97..40d5dff9d06 100644
--- a/spec/frontend/pages/import/bitbucket_server/components/bitbucket_server_status_table_spec.js
+++ b/spec/frontend/pages/import/bitbucket_server/components/bitbucket_server_status_table_spec.js
@@ -18,13 +18,6 @@ describe('BitbucketServerStatusTable', () => {
.filter((w) => w.props().variant === 'info')
.at(0);
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- wrapper = null;
- }
- });
-
function createComponent(bitbucketStatusTableStub = true) {
wrapper = shallowMount(BitbucketServerStatusTable, {
propsData: { providerTitle: 'Test', reconfigurePath: '/reconfigure' },
diff --git a/spec/frontend/pipeline_wizard/components/step_spec.js b/spec/frontend/pipeline_wizard/components/step_spec.js
index 4d5f563228c..99a7eff7acc 100644
--- a/spec/frontend/pipeline_wizard/components/step_spec.js
+++ b/spec/frontend/pipeline_wizard/components/step_spec.js
@@ -56,10 +56,6 @@ describe('Pipeline Wizard - Step Page', () => {
});
};
- afterEach(async () => {
- await wrapper.destroy();
- });
-
describe('input children', () => {
beforeEach(() => {
createComponent();
diff --git a/spec/frontend/pipeline_wizard/components/widgets/text_spec.js b/spec/frontend/pipeline_wizard/components/widgets/text_spec.js
index abfb4a33c0f..041ca05fd2c 100644
--- a/spec/frontend/pipeline_wizard/components/widgets/text_spec.js
+++ b/spec/frontend/pipeline_wizard/components/widgets/text_spec.js
@@ -27,12 +27,6 @@ describe('Pipeline Wizard - Text Widget', () => {
});
};
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- }
- });
-
it('creates an input element with the correct label', () => {
createComponent();
diff --git a/spec/frontend/pipeline_wizard/components/wrapper_spec.js b/spec/frontend/pipeline_wizard/components/wrapper_spec.js
index 2808fd0c7a5..b8d84572873 100644
--- a/spec/frontend/pipeline_wizard/components/wrapper_spec.js
+++ b/spec/frontend/pipeline_wizard/components/wrapper_spec.js
@@ -211,10 +211,6 @@ describe('Pipeline Wizard - wrapper.vue', () => {
createComponent();
});
- afterAll(() => {
- wrapper.destroy();
- });
-
it('editor reflects changes', async () => {
const newCompiledDoc = new Document({ faa: 'bur' });
await getStepWrapper().vm.$emit('update:compiled', newCompiledDoc);
diff --git a/spec/frontend/pipelines/components/dag/dag_annotations_spec.js b/spec/frontend/pipelines/components/dag/dag_annotations_spec.js
index aecaa640266..124f02bcec7 100644
--- a/spec/frontend/pipelines/components/dag/dag_annotations_spec.js
+++ b/spec/frontend/pipelines/components/dag/dag_annotations_spec.js
@@ -14,10 +14,6 @@ describe('The DAG annotations', () => {
const getToggleButton = () => wrapper.findComponent(GlButton);
const createComponent = (propsData = {}, method = shallowMount) => {
- if (wrapper?.destroy) {
- wrapper.destroy();
- }
-
wrapper = method(DagAnnotations, {
propsData,
data() {
diff --git a/spec/frontend/pipelines/components/dag/dag_spec.js b/spec/frontend/pipelines/components/dag/dag_spec.js
index 5483c1c7b99..53719065611 100644
--- a/spec/frontend/pipelines/components/dag/dag_spec.js
+++ b/spec/frontend/pipelines/components/dag/dag_spec.js
@@ -30,10 +30,6 @@ describe('Pipeline DAG graph wrapper', () => {
provideOverride = {},
method = shallowMount,
} = {}) => {
- if (wrapper?.destroy) {
- wrapper.destroy();
- }
-
wrapper = method(Dag, {
provide: {
pipelineProjectPath: 'root/abc-dag',
diff --git a/spec/frontend/projects/pipelines/charts/components/ci_cd_analytics_charts_spec.js b/spec/frontend/projects/pipelines/charts/components/ci_cd_analytics_charts_spec.js
index cf28eda5349..38760a724ff 100644
--- a/spec/frontend/projects/pipelines/charts/components/ci_cd_analytics_charts_spec.js
+++ b/spec/frontend/projects/pipelines/charts/components/ci_cd_analytics_charts_spec.js
@@ -47,13 +47,6 @@ describe('~/vue_shared/components/ci_cd_analytics/ci_cd_analytics_charts.vue', (
},
});
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- wrapper = null;
- }
- });
-
const findMetricsSlot = () => wrapper.findByTestId('metrics-slot');
const findSegmentedControl = () => wrapper.findComponent(SegmentedControlButtonGroup);
diff --git a/spec/frontend/projects/settings_service_desk/components/service_desk_setting_spec.js b/spec/frontend/projects/settings_service_desk/components/service_desk_setting_spec.js
index f9762491507..84eafc3d0f3 100644
--- a/spec/frontend/projects/settings_service_desk/components/service_desk_setting_spec.js
+++ b/spec/frontend/projects/settings_service_desk/components/service_desk_setting_spec.js
@@ -27,12 +27,6 @@ describe('ServiceDeskSetting', () => {
}),
);
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- }
- });
-
describe('when isEnabled=true', () => {
describe('only isEnabled', () => {
describe('as project admin', () => {
diff --git a/spec/frontend/projects/settings_service_desk/components/service_desk_template_dropdown_spec.js b/spec/frontend/projects/settings_service_desk/components/service_desk_template_dropdown_spec.js
index 6adcfbe8157..7090db5cad7 100644
--- a/spec/frontend/projects/settings_service_desk/components/service_desk_template_dropdown_spec.js
+++ b/spec/frontend/projects/settings_service_desk/components/service_desk_template_dropdown_spec.js
@@ -19,12 +19,6 @@ describe('ServiceDeskTemplateDropdown', () => {
}),
);
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- }
- });
-
describe('templates dropdown', () => {
it('renders a dropdown to choose a template', () => {
wrapper = createComponent();
diff --git a/spec/frontend/sidebar/components/severity/severity_spec.js b/spec/frontend/sidebar/components/severity/severity_spec.js
index 99d33e840d5..939d86917bb 100644
--- a/spec/frontend/sidebar/components/severity/severity_spec.js
+++ b/spec/frontend/sidebar/components/severity/severity_spec.js
@@ -14,13 +14,6 @@ describe('SeverityToken', () => {
});
}
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- wrapper = null;
- }
- });
-
const findIcon = () => wrapper.findComponent(GlIcon);
it('renders severity token for each severity type', () => {
diff --git a/spec/frontend/tags/components/sort_dropdown_spec.js b/spec/frontend/tags/components/sort_dropdown_spec.js
index b0fd98ec68e..e0ff370d313 100644
--- a/spec/frontend/tags/components/sort_dropdown_spec.js
+++ b/spec/frontend/tags/components/sort_dropdown_spec.js
@@ -26,12 +26,6 @@ describe('Tags sort dropdown', () => {
const findSearchBox = () => wrapper.findComponent(GlSearchBoxByClick);
const findTagsDropdown = () => wrapper.findByTestId('tags-dropdown');
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- }
- });
-
describe('default state', () => {
beforeEach(() => {
wrapper = createWrapper();
diff --git a/spec/frontend/vue_merge_request_widget/components/mr_widget_pipeline_spec.js b/spec/frontend/vue_merge_request_widget/components/mr_widget_pipeline_spec.js
index 6a899c00b98..820e486c13f 100644
--- a/spec/frontend/vue_merge_request_widget/components/mr_widget_pipeline_spec.js
+++ b/spec/frontend/vue_merge_request_widget/components/mr_widget_pipeline_spec.js
@@ -53,13 +53,6 @@ describe('MRWidgetPipeline', () => {
);
};
- afterEach(() => {
- if (wrapper?.destroy) {
- wrapper.destroy();
- wrapper = null;
- }
- });
-
it('should render CI error if there is a pipeline, but no status', () => {
createWrapper({ ciStatus: null }, mount);
expect(findCIErrorMessage().text()).toBe(ciErrorMessage);
diff --git a/spec/frontend/vue_merge_request_widget/components/states/mr_widget_closed_spec.js b/spec/frontend/vue_merge_request_widget/components/states/mr_widget_closed_spec.js
index 270a37f87e7..04cc396af40 100644
--- a/spec/frontend/vue_merge_request_widget/components/states/mr_widget_closed_spec.js
+++ b/spec/frontend/vue_merge_request_widget/components/states/mr_widget_closed_spec.js
@@ -67,12 +67,6 @@ describe('MRWidgetClosed', () => {
wrapper = createComponent();
});
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- }
- });
-
it('renders closed icon', () => {
expect(wrapper.findComponent(StateContainer).exists()).toBe(true);
expect(wrapper.findComponent(StateContainer).props().status).toBe('closed');
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 1fdbbadf8b0..f2b78dedf3a 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
@@ -30,11 +30,6 @@ describe('DeploymentAction component', () => {
let executeActionSpy;
const factory = (options = {}) => {
- // This destroys any wrappers created before a nested call to factory reassigns it
- if (wrapper && wrapper.destroy) {
- wrapper.destroy();
- }
-
wrapper = mount(DeploymentActions, options);
};
diff --git a/spec/frontend/vue_merge_request_widget/deployment/deployment_spec.js b/spec/frontend/vue_merge_request_widget/deployment/deployment_spec.js
index 74122f47ad3..234491c531a 100644
--- a/spec/frontend/vue_merge_request_widget/deployment/deployment_spec.js
+++ b/spec/frontend/vue_merge_request_widget/deployment/deployment_spec.js
@@ -16,10 +16,6 @@ describe('Deployment component', () => {
let wrapper;
const factory = (options = {}) => {
- // This destroys any wrappers created before a nested call to factory reassigns it
- if (wrapper && wrapper.destroy) {
- wrapper.destroy();
- }
wrapper = mount(DeploymentComponent, options);
};
diff --git a/spec/frontend/vue_shared/alert_details/alert_status_spec.js b/spec/frontend/vue_shared/alert_details/alert_status_spec.js
index 2a37ff2b784..98cb2f5cb0b 100644
--- a/spec/frontend/vue_shared/alert_details/alert_status_spec.js
+++ b/spec/frontend/vue_shared/alert_details/alert_status_spec.js
@@ -45,12 +45,6 @@ describe('AlertManagementStatus', () => {
});
}
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- }
- });
-
describe('sidebar', () => {
it('displays the dropdown status header', () => {
mountComponent({ props: { isSidebar: true } });
diff --git a/spec/frontend/vue_shared/alert_details/alert_summary_row_spec.js b/spec/frontend/vue_shared/alert_details/alert_summary_row_spec.js
index a2981478954..0ecca0a69b9 100644
--- a/spec/frontend/vue_shared/alert_details/alert_summary_row_spec.js
+++ b/spec/frontend/vue_shared/alert_details/alert_summary_row_spec.js
@@ -16,13 +16,6 @@ describe('AlertSummaryRow', () => {
});
}
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- wrapper = null;
- }
- });
-
describe('Alert Summary Row', () => {
beforeEach(() => {
mountComponent({
diff --git a/spec/frontend/vue_shared/alert_details/sidebar/alert_sidebar_spec.js b/spec/frontend/vue_shared/alert_details/sidebar/alert_sidebar_spec.js
index 3b38349622f..89d02cc9de8 100644
--- a/spec/frontend/vue_shared/alert_details/sidebar/alert_sidebar_spec.js
+++ b/spec/frontend/vue_shared/alert_details/sidebar/alert_sidebar_spec.js
@@ -44,9 +44,6 @@ describe('Alert Details Sidebar', () => {
}
afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- }
mock.restore();
});
diff --git a/spec/frontend/vue_shared/alert_details/sidebar/alert_sidebar_status_spec.js b/spec/frontend/vue_shared/alert_details/sidebar/alert_sidebar_status_spec.js
index a3adbcf8d3a..7df744cd11d 100644
--- a/spec/frontend/vue_shared/alert_details/sidebar/alert_sidebar_status_spec.js
+++ b/spec/frontend/vue_shared/alert_details/sidebar/alert_sidebar_status_spec.js
@@ -45,12 +45,6 @@ describe('Alert Details Sidebar Status', () => {
});
}
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- }
- });
-
describe('sidebar expanded', () => {
beforeEach(() => {
mountComponent({
diff --git a/spec/frontend/vue_shared/alert_details/system_notes/alert_management_system_note_spec.js b/spec/frontend/vue_shared/alert_details/system_notes/alert_management_system_note_spec.js
index 6a750bb99c0..72c16e8ff22 100644
--- a/spec/frontend/vue_shared/alert_details/system_notes/alert_management_system_note_spec.js
+++ b/spec/frontend/vue_shared/alert_details/system_notes/alert_management_system_note_spec.js
@@ -17,13 +17,6 @@ describe('Alert Details System Note', () => {
});
}
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- wrapper = null;
- }
- });
-
describe('System notes', () => {
beforeEach(() => {
mountComponent({});
diff --git a/spec/frontend/vue_shared/components/metric_images/metric_images_tab_spec.js b/spec/frontend/vue_shared/components/metric_images/metric_images_tab_spec.js
index 1789610dba9..4b0b89fe1e7 100644
--- a/spec/frontend/vue_shared/components/metric_images/metric_images_tab_spec.js
+++ b/spec/frontend/vue_shared/components/metric_images/metric_images_tab_spec.js
@@ -45,13 +45,6 @@ describe('Metric images tab', () => {
mountComponent();
});
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- wrapper = null;
- }
- });
-
const findUploadDropzone = () => wrapper.findComponent(UploadDropzone);
const findImages = () => wrapper.findAllComponents(MetricImagesTable);
const findModal = () => wrapper.findComponent(GlModal);
diff --git a/spec/frontend/vue_shared/components/metric_images/metric_images_table_spec.js b/spec/frontend/vue_shared/components/metric_images/metric_images_table_spec.js
index 9c91dc9b5fc..12dca95e9ba 100644
--- a/spec/frontend/vue_shared/components/metric_images/metric_images_table_spec.js
+++ b/spec/frontend/vue_shared/components/metric_images/metric_images_table_spec.js
@@ -39,13 +39,6 @@ describe('Metrics upload item', () => {
);
};
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- wrapper = null;
- }
- });
-
const findImageLink = () => wrapper.findComponent(GlLink);
const findLabelTextSpan = () => wrapper.find('[data-testid="metric-image-label-span"]');
const findCollapseButton = () => wrapper.find('[data-testid="collapse-button"]');
diff --git a/spec/frontend/vue_shared/components/notes/noteable_warning_spec.js b/spec/frontend/vue_shared/components/notes/noteable_warning_spec.js
index f87674246d1..d7fcb9a25d4 100644
--- a/spec/frontend/vue_shared/components/notes/noteable_warning_spec.js
+++ b/spec/frontend/vue_shared/components/notes/noteable_warning_spec.js
@@ -22,13 +22,6 @@ describe('Issue Warning Component', () => {
},
});
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- wrapper = null;
- }
- });
-
describe('when issue is locked but not confidential', () => {
beforeEach(() => {
wrapper = createComponent({
diff --git a/spec/frontend/vue_shared/components/paginated_table_with_search_and_tabs/paginated_table_with_search_and_tabs_spec.js b/spec/frontend/vue_shared/components/paginated_table_with_search_and_tabs/paginated_table_with_search_and_tabs_spec.js
index 25bfa688e5b..9b6f5ae3e38 100644
--- a/spec/frontend/vue_shared/components/paginated_table_with_search_and_tabs/paginated_table_with_search_and_tabs_spec.js
+++ b/spec/frontend/vue_shared/components/paginated_table_with_search_and_tabs/paginated_table_with_search_and_tabs_spec.js
@@ -90,12 +90,6 @@ describe('AlertManagementEmptyState', () => {
mountComponent();
});
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- }
- });
-
const EmptyState = () => wrapper.find('.empty-state');
const ItemsTable = () => wrapper.find('.gl-table');
const ErrorAlert = () => wrapper.findComponent(GlAlert);
diff --git a/spec/frontend/vue_shared/components/resizable_chart/skeleton_loader_spec.js b/spec/frontend/vue_shared/components/resizable_chart/skeleton_loader_spec.js
index bfc3aeb0303..043552baf0c 100644
--- a/spec/frontend/vue_shared/components/resizable_chart/skeleton_loader_spec.js
+++ b/spec/frontend/vue_shared/components/resizable_chart/skeleton_loader_spec.js
@@ -19,12 +19,6 @@ describe('Resizable Skeleton Loader', () => {
expect(labelItems.length).toBe(8);
};
- afterEach(() => {
- if (wrapper?.destroy) {
- wrapper.destroy();
- }
- });
-
describe('default setup', () => {
beforeEach(() => {
createComponent({ uniqueKey: null });
diff --git a/spec/frontend/vue_shared/components/slot_switch_spec.js b/spec/frontend/vue_shared/components/slot_switch_spec.js
index daca4977817..3a2147c6c89 100644
--- a/spec/frontend/vue_shared/components/slot_switch_spec.js
+++ b/spec/frontend/vue_shared/components/slot_switch_spec.js
@@ -20,12 +20,6 @@ describe('SlotSwitch', () => {
const getChildrenHtml = () => wrapper.findAll('* *').wrappers.map((c) => c.html());
- afterEach(() => {
- if (wrapper) {
- wrapper.destroy();
- }
- });
-
it('throws an error if activeSlotNames is missing', () => {
expect(() => assertProps(SlotSwitch, {})).toThrow(
'[Vue warn]: Missing required prop: "activeSlotNames"',
diff --git a/spec/lib/sidebars/projects/menus/ci_cd_menu_spec.rb b/spec/lib/sidebars/projects/menus/ci_cd_menu_spec.rb
index 2ceb9dcada9..6116fff792a 100644
--- a/spec/lib/sidebars/projects/menus/ci_cd_menu_spec.rb
+++ b/spec/lib/sidebars/projects/menus/ci_cd_menu_spec.rb
@@ -50,20 +50,8 @@ RSpec.describe Sidebars::Projects::Menus::CiCdMenu do
describe 'Artifacts' do
let(:item_id) { :artifacts }
- context 'when feature flag :artifacts_management_page is disabled' do
- it 'does not include artifacts menu item' do
- stub_feature_flags(artifacts_management_page: false)
-
- is_expected.to be_nil
- end
- end
-
- context 'when feature flag :artifacts_management_page is enabled' do
- it 'includes artifacts menu item' do
- stub_feature_flags(artifacts_management_page: true)
-
- is_expected.not_to be_nil
- end
+ it 'includes artifacts menu item' do
+ is_expected.not_to be_nil
end
end
end
diff --git a/spec/lib/sidebars/search/panel_spec.rb b/spec/lib/sidebars/search/panel_spec.rb
index 22c2bff0a32..30801ff800e 100644
--- a/spec/lib/sidebars/search/panel_spec.rb
+++ b/spec/lib/sidebars/search/panel_spec.rb
@@ -15,15 +15,15 @@ RSpec.describe Sidebars::Search::Panel, feature_category: :navigation do
describe '#aria_label' do
it 'returns the correct aria label' do
- expect(panel.aria_label).to eq(_('Search'))
+ expect(panel.aria_label).to eq(_('Search results'))
end
end
describe '#super_sidebar_context_header' do
it 'returns a hash with the correct title and icon' do
expected_header = {
- title: 'Search',
- icon: 'search'
+ title: 'Search results',
+ icon: 'search-results'
}
expect(panel.super_sidebar_context_header).to eq(expected_header)
end