From 7af1a79108bdfa024587a8dc48b760a51a98acd5 Mon Sep 17 00:00:00 2001
From: Doug Stull <dstull@gitlab.com>
Date: Thu, 5 Oct 2023 21:14:17 +0000
Subject: [PATCH] Move in product emails fully under ee as that is their only
 use

- re-organize some helper code as well
---
 .rubocop_todo/layout/array_alignment.yml      |  3 -
 .../first_array_element_indentation.yml       |  3 -
 ...e_end_string_concatenation_indentation.yml |  1 -
 .rubocop_todo/layout/line_length.yml          | 14 ---
 .../lint/ambiguous_operator_precedence.yml    |  1 -
 .rubocop_todo/rails/output_safety.yml         |  4 -
 .../rspec/before_all_role_assignment.yml      |  1 -
 .rubocop_todo/rspec/context_wording.yml       |  7 --
 .../rspec/factory_bot/avoid_create.yml        |  1 -
 .../rspec/missing_feature_category.yml        | 12 ---
 .rubocop_todo/rspec/return_from_stub.yml      |  1 -
 .rubocop_todo/rspec/scattered_let.yml         |  1 -
 .rubocop_todo/style/format_string.yml         |  4 -
 .rubocop_todo/style/if_unless_modifier.yml    |  1 -
 .rubocop_todo/style/string_concatenation.yml  |  1 -
 app/mailers/notify.rb                         |  1 -
 .../mailers/ee/emails/in_product_marketing.rb | 13 ---
 .../mailers/emails/in_product_marketing.rb    |  8 +-
 .../email/message/account_validation.rb       | 99 ++++++++++++++++++-
 .../email/message/account_validation_spec.rb  |  6 +-
 .../emails/in_product_marketing_spec.rb       | 16 ++-
 .../message/in_product_marketing/helper.rb    | 97 ------------------
 .../in_product_marketing/helper_spec.rb       | 75 --------------
 .../emails/in_product_marketing_spec.rb       | 17 ----
 spec/support/rspec_order_todo.yml             | 11 ---
 25 files changed, 120 insertions(+), 278 deletions(-)
 delete mode 100644 ee/app/mailers/ee/emails/in_product_marketing.rb
 rename {app => ee/app}/mailers/emails/in_product_marketing.rb (79%)
 delete mode 100644 lib/gitlab/email/message/in_product_marketing/helper.rb
 delete mode 100644 spec/lib/gitlab/email/message/in_product_marketing/helper_spec.rb
 delete mode 100644 spec/mailers/emails/in_product_marketing_spec.rb

diff --git a/.rubocop_todo/layout/array_alignment.yml b/.rubocop_todo/layout/array_alignment.yml
index 88d093954c6bd..8d040f5738ec7 100644
--- a/.rubocop_todo/layout/array_alignment.yml
+++ b/.rubocop_todo/layout/array_alignment.yml
@@ -166,9 +166,6 @@ Layout/ArrayAlignment:
     - 'lib/gitlab/conflict/file_collection.rb'
     - 'lib/gitlab/content_security_policy/config_loader.rb'
     - 'lib/gitlab/database/background_migration/batched_job.rb'
-    - 'lib/gitlab/email/message/in_product_marketing/team.rb'
-    - 'lib/gitlab/email/message/in_product_marketing/trial.rb'
-    - 'lib/gitlab/email/message/in_product_marketing/verify.rb'
     - 'lib/gitlab/email/receiver.rb'
     - 'lib/gitlab/etag_caching/router/rails.rb'
     - 'lib/gitlab/git/diff.rb'
diff --git a/.rubocop_todo/layout/first_array_element_indentation.yml b/.rubocop_todo/layout/first_array_element_indentation.yml
index fa90c937813f6..05f12783fc67d 100644
--- a/.rubocop_todo/layout/first_array_element_indentation.yml
+++ b/.rubocop_todo/layout/first_array_element_indentation.yml
@@ -44,9 +44,6 @@ Layout/FirstArrayElementIndentation:
     - 'ee/spec/requests/api/saml_group_links_spec.rb'
     - 'ee/spec/services/audit_events/export_csv_service_spec.rb'
     - 'ee/spec/services/groups/seat_usage_export_service_spec.rb'
-    - 'lib/gitlab/email/message/in_product_marketing/team.rb'
-    - 'lib/gitlab/email/message/in_product_marketing/trial.rb'
-    - 'lib/gitlab/email/message/in_product_marketing/verify.rb'
     - 'lib/gitlab/object_hierarchy.rb'
     - 'lib/gitlab/project_authorizations.rb'
     - 'qa/qa/specs/features/api/12_systems/gitaly/automatic_failover_and_recovery_spec.rb'
diff --git a/.rubocop_todo/layout/line_end_string_concatenation_indentation.yml b/.rubocop_todo/layout/line_end_string_concatenation_indentation.yml
index 25ab7ecb1ef33..28edc75a55a6d 100644
--- a/.rubocop_todo/layout/line_end_string_concatenation_indentation.yml
+++ b/.rubocop_todo/layout/line_end_string_concatenation_indentation.yml
@@ -266,7 +266,6 @@ Layout/LineEndStringConcatenationIndentation:
     - 'spec/lib/gitlab/ci/templates/themekit_gitlab_ci_yaml_spec.rb'
     - 'spec/lib/gitlab/database/background_migration/batched_migration_runner_spec.rb'
     - 'spec/lib/gitlab/database/migrations/batched_background_migration_helpers_spec.rb'
-    - 'spec/lib/gitlab/email/message/in_product_marketing/helper_spec.rb'
     - 'spec/lib/gitlab/github_import/markdown_text_spec.rb'
     - 'spec/lib/gitlab/github_import/representation/issue_event_spec.rb'
     - 'spec/lib/gitlab/insecure_key_fingerprint_spec.rb'
diff --git a/.rubocop_todo/layout/line_length.yml b/.rubocop_todo/layout/line_length.yml
index df594c22dea84..936ca4b0122ac 100644
--- a/.rubocop_todo/layout/line_length.yml
+++ b/.rubocop_todo/layout/line_length.yml
@@ -1262,7 +1262,6 @@ Layout/LineLength:
     - 'ee/lib/gitlab/elastic/group_search_results.rb'
     - 'ee/lib/gitlab/elastic/project_search_results.rb'
     - 'ee/lib/gitlab/elastic/search_results.rb'
-    - 'ee/lib/gitlab/email/message/account_validation.rb'
     - 'ee/lib/gitlab/expiring_subscription_message.rb'
     - 'ee/lib/gitlab/geo.rb'
     - 'ee/lib/gitlab/geo/geo_node_status_check.rb'
@@ -2687,13 +2686,6 @@ Layout/LineLength:
     - 'lib/gitlab/email/failure_handler.rb'
     - 'lib/gitlab/email/handler/create_issue_handler.rb'
     - 'lib/gitlab/email/handler/create_merge_request_handler.rb'
-    - 'lib/gitlab/email/message/in_product_marketing/base.rb'
-    - 'lib/gitlab/email/message/in_product_marketing/create.rb'
-    - 'lib/gitlab/email/message/in_product_marketing/helper.rb'
-    - 'lib/gitlab/email/message/in_product_marketing/team.rb'
-    - 'lib/gitlab/email/message/in_product_marketing/trial.rb'
-    - 'lib/gitlab/email/message/in_product_marketing/trial_short.rb'
-    - 'lib/gitlab/email/message/in_product_marketing/verify.rb'
     - 'lib/gitlab/encrypted_command_base.rb'
     - 'lib/gitlab/encrypted_configuration.rb'
     - 'lib/gitlab/endpoint_attributes/config.rb'
@@ -3868,12 +3860,6 @@ Layout/LineLength:
     - 'spec/lib/gitlab/email/handler/unsubscribe_handler_spec.rb'
     - 'spec/lib/gitlab/email/handler_spec.rb'
     - 'spec/lib/gitlab/email/hook/smime_signature_interceptor_spec.rb'
-    - 'spec/lib/gitlab/email/message/in_product_marketing/admin_verify_spec.rb'
-    - 'spec/lib/gitlab/email/message/in_product_marketing/base_spec.rb'
-    - 'spec/lib/gitlab/email/message/in_product_marketing/team_short_spec.rb'
-    - 'spec/lib/gitlab/email/message/in_product_marketing/team_spec.rb'
-    - 'spec/lib/gitlab/email/message/in_product_marketing/trial_short_spec.rb'
-    - 'spec/lib/gitlab/email/message/in_product_marketing/trial_spec.rb'
     - 'spec/lib/gitlab/email/receiver_spec.rb'
     - 'spec/lib/gitlab/email/reply_parser_spec.rb'
     - 'spec/lib/gitlab/emoji_spec.rb'
diff --git a/.rubocop_todo/lint/ambiguous_operator_precedence.yml b/.rubocop_todo/lint/ambiguous_operator_precedence.yml
index f21c101d4a2e0..19816ce1f85ca 100644
--- a/.rubocop_todo/lint/ambiguous_operator_precedence.yml
+++ b/.rubocop_todo/lint/ambiguous_operator_precedence.yml
@@ -67,7 +67,6 @@ Lint/AmbiguousOperatorPrecedence:
     - 'lib/gitlab/database/partitioning_migration_helpers/table_management_helpers.rb'
     - 'lib/gitlab/database/postgres_hll/buckets.rb'
     - 'lib/gitlab/database/query_analyzers/prevent_cross_database_modification.rb'
-    - 'lib/gitlab/email/message/in_product_marketing/helper.rb'
     - 'lib/gitlab/i18n/po_linter.rb'
     - 'lib/gitlab/import_export/project/relation_factory.rb'
     - 'lib/gitlab/memory/instrumentation.rb'
diff --git a/.rubocop_todo/rails/output_safety.yml b/.rubocop_todo/rails/output_safety.yml
index 85388e8a1da79..36628384477d9 100644
--- a/.rubocop_todo/rails/output_safety.yml
+++ b/.rubocop_todo/rails/output_safety.yml
@@ -118,7 +118,6 @@ Rails/OutputSafety:
     - 'ee/app/helpers/push_rules_helper.rb'
     - 'ee/app/models/integrations/github.rb'
     - 'ee/lib/ee/gitlab/namespace_storage_size_error_message.rb'
-    - 'ee/lib/gitlab/email/message/account_validation.rb'
     - 'ee/lib/gitlab/expiring_subscription_message.rb'
     - 'ee/lib/gitlab/licenses/submit_license_usage_data_banner.rb'
     - 'ee/lib/gitlab/manual_quarterly_co_term_banner.rb'
@@ -139,9 +138,6 @@ Rails/OutputSafety:
     - 'lib/gitlab/diff/inline_diff_marker.rb'
     - 'lib/gitlab/diff/line.rb'
     - 'lib/gitlab/diff/rendered/notebook/diff_file_helper.rb'
-    - 'lib/gitlab/email/message/in_product_marketing/helper.rb'
-    - 'lib/gitlab/email/message/in_product_marketing/trial.rb'
-    - 'lib/gitlab/email/message/in_product_marketing/verify.rb'
     - 'lib/gitlab/highlight.rb'
     - 'lib/gitlab/observability.rb'
     - 'lib/gitlab/other_markup.rb'
diff --git a/.rubocop_todo/rspec/before_all_role_assignment.yml b/.rubocop_todo/rspec/before_all_role_assignment.yml
index 3d4ee2f036942..8f9e618d47cf7 100644
--- a/.rubocop_todo/rspec/before_all_role_assignment.yml
+++ b/.rubocop_todo/rspec/before_all_role_assignment.yml
@@ -1157,7 +1157,6 @@ RSpec/BeforeAllRoleAssignment:
     - 'spec/lib/gitlab/search_results_spec.rb'
     - 'spec/lib/gitlab/slash_commands/presenters/issue_move_spec.rb'
     - 'spec/lib/gitlab/tree_summary_spec.rb'
-    - 'spec/mailers/emails/in_product_marketing_spec.rb'
     - 'spec/models/ci/bridge_spec.rb'
     - 'spec/models/ci/catalog/listing_spec.rb'
     - 'spec/models/ci/pipeline_spec.rb'
diff --git a/.rubocop_todo/rspec/context_wording.yml b/.rubocop_todo/rspec/context_wording.yml
index e76e33b35a329..3b6729a320b31 100644
--- a/.rubocop_todo/rspec/context_wording.yml
+++ b/.rubocop_todo/rspec/context_wording.yml
@@ -1778,13 +1778,6 @@ RSpec/ContextWording:
     - 'spec/lib/gitlab/email/handler/service_desk_handler_spec.rb'
     - 'spec/lib/gitlab/email/handler/unsubscribe_handler_spec.rb'
     - 'spec/lib/gitlab/email/handler_spec.rb'
-    - 'spec/lib/gitlab/email/message/in_product_marketing/admin_verify_spec.rb'
-    - 'spec/lib/gitlab/email/message/in_product_marketing/base_spec.rb'
-    - 'spec/lib/gitlab/email/message/in_product_marketing/helper_spec.rb'
-    - 'spec/lib/gitlab/email/message/in_product_marketing/team_short_spec.rb'
-    - 'spec/lib/gitlab/email/message/in_product_marketing/team_spec.rb'
-    - 'spec/lib/gitlab/email/message/in_product_marketing/trial_short_spec.rb'
-    - 'spec/lib/gitlab/email/message/in_product_marketing/trial_spec.rb'
     - 'spec/lib/gitlab/email/message/repository_push_spec.rb'
     - 'spec/lib/gitlab/email/reply_parser_spec.rb'
     - 'spec/lib/gitlab/encoding_helper_spec.rb'
diff --git a/.rubocop_todo/rspec/factory_bot/avoid_create.yml b/.rubocop_todo/rspec/factory_bot/avoid_create.yml
index 2725b035d65f8..b0758b9f65cf1 100644
--- a/.rubocop_todo/rspec/factory_bot/avoid_create.yml
+++ b/.rubocop_todo/rspec/factory_bot/avoid_create.yml
@@ -360,7 +360,6 @@ RSpec/FactoryBot/AvoidCreate:
     - 'spec/mailers/devise_mailer_spec.rb'
     - 'spec/mailers/emails/auto_devops_spec.rb'
     - 'spec/mailers/emails/groups_spec.rb'
-    - 'spec/mailers/emails/in_product_marketing_spec.rb'
     - 'spec/mailers/emails/issues_spec.rb'
     - 'spec/mailers/emails/merge_requests_spec.rb'
     - 'spec/mailers/emails/pages_domains_spec.rb'
diff --git a/.rubocop_todo/rspec/missing_feature_category.yml b/.rubocop_todo/rspec/missing_feature_category.yml
index 39d1c8eb3930d..f3dbdd498bcca 100644
--- a/.rubocop_todo/rspec/missing_feature_category.yml
+++ b/.rubocop_todo/rspec/missing_feature_category.yml
@@ -971,7 +971,6 @@ RSpec/MissingFeatureCategory:
     - 'ee/spec/mailers/ee/emails/projects_spec.rb'
     - 'ee/spec/mailers/emails/epics_spec.rb'
     - 'ee/spec/mailers/emails/group_memberships_spec.rb'
-    - 'ee/spec/mailers/emails/in_product_marketing_spec.rb'
     - 'ee/spec/mailers/emails/namespace_storage_usage_mailer_spec.rb'
     - 'ee/spec/mailers/emails/requirements_spec.rb'
     - 'ee/spec/mailers/emails/user_cap_spec.rb'
@@ -3493,16 +3492,6 @@ RSpec/MissingFeatureCategory:
     - 'spec/lib/gitlab/email/hook/delivery_metrics_observer_spec.rb'
     - 'spec/lib/gitlab/email/hook/disable_email_interceptor_spec.rb'
     - 'spec/lib/gitlab/email/hook/smime_signature_interceptor_spec.rb'
-    - 'spec/lib/gitlab/email/message/in_product_marketing/admin_verify_spec.rb'
-    - 'spec/lib/gitlab/email/message/in_product_marketing/base_spec.rb'
-    - 'spec/lib/gitlab/email/message/in_product_marketing/create_spec.rb'
-    - 'spec/lib/gitlab/email/message/in_product_marketing/helper_spec.rb'
-    - 'spec/lib/gitlab/email/message/in_product_marketing/team_short_spec.rb'
-    - 'spec/lib/gitlab/email/message/in_product_marketing/team_spec.rb'
-    - 'spec/lib/gitlab/email/message/in_product_marketing/trial_short_spec.rb'
-    - 'spec/lib/gitlab/email/message/in_product_marketing/trial_spec.rb'
-    - 'spec/lib/gitlab/email/message/in_product_marketing/verify_spec.rb'
-    - 'spec/lib/gitlab/email/message/in_product_marketing_spec.rb'
     - 'spec/lib/gitlab/email/message/repository_push_spec.rb'
     - 'spec/lib/gitlab/email/receiver_spec.rb'
     - 'spec/lib/gitlab/email/service_desk_receiver_spec.rb'
@@ -4463,7 +4452,6 @@ RSpec/MissingFeatureCategory:
     - 'spec/mailers/emails/auto_devops_spec.rb'
     - 'spec/mailers/emails/groups_spec.rb'
     - 'spec/mailers/emails/identity_verification_spec.rb'
-    - 'spec/mailers/emails/in_product_marketing_spec.rb'
     - 'spec/mailers/emails/merge_requests_spec.rb'
     - 'spec/mailers/emails/pages_domains_spec.rb'
     - 'spec/mailers/emails/pipelines_spec.rb'
diff --git a/.rubocop_todo/rspec/return_from_stub.yml b/.rubocop_todo/rspec/return_from_stub.yml
index 1a668f2d7e2be..7624216e8ed3a 100644
--- a/.rubocop_todo/rspec/return_from_stub.yml
+++ b/.rubocop_todo/rspec/return_from_stub.yml
@@ -137,7 +137,6 @@ RSpec/ReturnFromStub:
     - 'spec/lib/gitlab/daemon_spec.rb'
     - 'spec/lib/gitlab/database_importers/instance_administrators/create_group_spec.rb'
     - 'spec/lib/gitlab/diff/file_spec.rb'
-    - 'spec/lib/gitlab/email/message/in_product_marketing/helper_spec.rb'
     - 'spec/lib/gitlab/exclusive_lease_helpers/sleeping_lock_spec.rb'
     - 'spec/lib/gitlab/exclusive_lease_helpers_spec.rb'
     - 'spec/lib/gitlab/external_authorization_spec.rb'
diff --git a/.rubocop_todo/rspec/scattered_let.yml b/.rubocop_todo/rspec/scattered_let.yml
index 479ff4fd8f92e..4d93c6816cc21 100644
--- a/.rubocop_todo/rspec/scattered_let.yml
+++ b/.rubocop_todo/rspec/scattered_let.yml
@@ -176,7 +176,6 @@ RSpec/ScatteredLet:
     - 'spec/lib/gitlab/utils/measuring_spec.rb'
     - 'spec/lib/gitlab/zentao/client_spec.rb'
     - 'spec/lib/peek/views/external_http_spec.rb'
-    - 'spec/mailers/emails/in_product_marketing_spec.rb'
     - 'spec/mailers/notify_spec.rb'
     - 'spec/mailers/previews_spec.rb'
     - 'spec/migrations/20220329175119_remove_leftover_ci_job_artifact_deletions_spec.rb'
diff --git a/.rubocop_todo/style/format_string.yml b/.rubocop_todo/style/format_string.yml
index c45ddab84414f..fc52fd7574805 100644
--- a/.rubocop_todo/style/format_string.yml
+++ b/.rubocop_todo/style/format_string.yml
@@ -260,10 +260,6 @@ Style/FormatString:
     - 'lib/gitlab/database/postgres_hll/batch_distinct_counter.rb'
     - 'lib/gitlab/database/reindexing/reindex_concurrently.rb'
     - 'lib/gitlab/database_importers/instance_administrators/create_group.rb'
-    - 'lib/gitlab/email/message/in_product_marketing/base.rb'
-    - 'lib/gitlab/email/message/in_product_marketing/create.rb'
-    - 'lib/gitlab/email/message/in_product_marketing/helper.rb'
-    - 'lib/gitlab/email/message/in_product_marketing/verify.rb'
     - 'lib/gitlab/exceptions_app.rb'
     - 'lib/gitlab/github_import/importer/pull_request_merged_by_importer.rb'
     - 'lib/gitlab/github_import/importer/single_endpoint_issue_events_importer.rb'
diff --git a/.rubocop_todo/style/if_unless_modifier.yml b/.rubocop_todo/style/if_unless_modifier.yml
index ef4fca8270dbf..0f271a766b605 100644
--- a/.rubocop_todo/style/if_unless_modifier.yml
+++ b/.rubocop_todo/style/if_unless_modifier.yml
@@ -814,7 +814,6 @@ Style/IfUnlessModifier:
     - 'lib/gitlab/database/transaction/observer.rb'
     - 'lib/gitlab/database/with_lock_retries.rb'
     - 'lib/gitlab/email/handler/service_desk_handler.rb'
-    - 'lib/gitlab/email/message/in_product_marketing/base.rb'
     - 'lib/gitlab/email/message/repository_push.rb'
     - 'lib/gitlab/email/receiver.rb'
     - 'lib/gitlab/email/reply_parser.rb'
diff --git a/.rubocop_todo/style/string_concatenation.yml b/.rubocop_todo/style/string_concatenation.yml
index d899ff9d98fc7..d887a3b391b60 100644
--- a/.rubocop_todo/style/string_concatenation.yml
+++ b/.rubocop_todo/style/string_concatenation.yml
@@ -96,7 +96,6 @@ Style/StringConcatenation:
     - 'lib/gitlab/database/rename_reserved_paths_migration/v1/migration_classes.rb'
     - 'lib/gitlab/database/unidirectional_copy_trigger.rb'
     - 'lib/gitlab/email/handler/service_desk_handler.rb'
-    - 'lib/gitlab/email/message/in_product_marketing/helper.rb'
     - 'lib/gitlab/git.rb'
     - 'lib/gitlab/git/branch.rb'
     - 'lib/gitlab/git/tag.rb'
diff --git a/app/mailers/notify.rb b/app/mailers/notify.rb
index 77d32a55941a3..2f90579a5c259 100644
--- a/app/mailers/notify.rb
+++ b/app/mailers/notify.rb
@@ -22,7 +22,6 @@ class Notify < ApplicationMailer
   include Emails::Groups
   include Emails::Reviews
   include Emails::ServiceDesk
-  include Emails::InProductMarketing
   include Emails::AdminNotification
   include Emails::IdentityVerification
   include Emails::Imports
diff --git a/ee/app/mailers/ee/emails/in_product_marketing.rb b/ee/app/mailers/ee/emails/in_product_marketing.rb
deleted file mode 100644
index 08f6076954a6e..0000000000000
--- a/ee/app/mailers/ee/emails/in_product_marketing.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-# frozen_string_literal: true
-
-module EE
-  module Emails
-    module InProductMarketing
-      def account_validation_email(pipeline, recipient_email)
-        @message = ::Gitlab::Email::Message::AccountValidation.new(pipeline)
-
-        mail_to(to: recipient_email, subject: @message.subject_line)
-      end
-    end
-  end
-end
diff --git a/app/mailers/emails/in_product_marketing.rb b/ee/app/mailers/emails/in_product_marketing.rb
similarity index 79%
rename from app/mailers/emails/in_product_marketing.rb
rename to ee/app/mailers/emails/in_product_marketing.rb
index cbadbe3e124e1..2e40d2adc7191 100644
--- a/app/mailers/emails/in_product_marketing.rb
+++ b/ee/app/mailers/emails/in_product_marketing.rb
@@ -12,6 +12,12 @@ module InProductMarketing
       'X-Mailgun-Tag' => 'marketing'
     }.freeze
 
+    def account_validation_email(pipeline, recipient_email)
+      @message = ::Gitlab::Email::Message::AccountValidation.new(pipeline)
+
+      mail_to(to: recipient_email, subject: @message.subject_line)
+    end
+
     private
 
     def mail_to(to:, subject:)
@@ -32,5 +38,3 @@ def mail_to(to:, subject:)
     end
   end
 end
-
-Emails::InProductMarketing.prepend_mod
diff --git a/ee/lib/gitlab/email/message/account_validation.rb b/ee/lib/gitlab/email/message/account_validation.rb
index fa065941dd665..7baad0acd58cc 100644
--- a/ee/lib/gitlab/email/message/account_validation.rb
+++ b/ee/lib/gitlab/email/message/account_validation.rb
@@ -4,7 +4,7 @@ module Gitlab
   module Email
     module Message
       class AccountValidation
-        include Gitlab::Email::Message::InProductMarketing::Helper
+        include SafeFormatHelper
         include Gitlab::Routing
 
         attr_accessor :pipeline, :format
@@ -23,12 +23,20 @@ def title
         end
 
         def body_line1
-          s_("AccountValidation|In order to use free compute minutes on shared runners, you'll need to validate your account using one of our verification options. If you prefer not to, you can run pipelines by bringing your own runners and disabling shared runners for your project.")
+          s_("AccountValidation|In order to use free compute minutes on shared runners, " \
+             "you'll need to validate your account using one of our verification options. " \
+             "If you prefer not to, you can run pipelines by bringing your own runners and " \
+             "disabling shared runners for your project.")
         end
 
         def body_line2
           format_options = strong_options.merge({ learn_more_link: learn_more_link })
-          s_("AccountValidation|Verification is required to discourage and reduce the abuse on GitLab infrastructure. If you verify with a credit or debit card, %{strong_start}GitLab will not charge your card, it will only be used for validation.%{strong_end} %{learn_more_link}").html_safe % format_options
+          safe_format(
+            s_("AccountValidation|Verification is required to discourage and reduce the abuse on GitLab " \
+               "infrastructure. If you verify with a credit or debit card, %{strong_start}GitLab will not " \
+               "charge your card, it will only be used for validation.%{strong_end} %{learn_more_link}"),
+            format_options
+          )
         end
 
         def cta_text
@@ -65,12 +73,93 @@ def cta2_link
           end
         end
 
+        def unsubscribe
+          parts = Gitlab.com? ? unsubscribe_com : unsubscribe_self_managed(nil)
+
+          case format
+          when :html
+            parts.join(' ')
+          else
+            parts.join("\n#{' ' * 16}")
+          end
+        end
+
+        def footer_links
+          links = [
+            [s_('InProductMarketing|Blog'), 'https://about.gitlab.com/blog'],
+            [s_('InProductMarketing|Twitter'), 'https://twitter.com/gitlab'],
+            [s_('InProductMarketing|Facebook'), 'https://www.facebook.com/gitlab'],
+            [s_('InProductMarketing|YouTube'), 'https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg']
+          ]
+          case format
+          when :html
+            links.map do |text, link|
+              ActionController::Base.helpers.link_to(text, link)
+            end
+          else
+            "| #{links.map { |text, link| [text, link].join(' ') }.join('\n| ')}"
+          end
+        end
+
+        def address
+          safe_format(
+            s_('InProductMarketing|%{strong_start}GitLab Inc.%{strong_end} 268 Bush Street, #350, ' \
+               'San Francisco, CA 94104, USA'),
+            strong_options
+          )
+        end
+
+        private
+
         def learn_more_link
           link(s_('AccountValidation|Learn more.'), 'https://about.gitlab.com/blog/2021/05/17/prevent-crypto-mining-abuse/')
         end
 
-        def unsubscribe
-          unsubscribe_message
+        def unsubscribe_link
+          unsubscribe_url = Gitlab.com? ? '%tag_unsubscribe_url%' : profile_notifications_url
+
+          link(s_('InProductMarketing|unsubscribe'), unsubscribe_url)
+        end
+
+        def unsubscribe_com
+          [
+            s_('InProductMarketing|If you no longer wish to receive marketing emails from us,'),
+            safe_format(
+              s_('InProductMarketing|you may %{unsubscribe_link} at any time.'), unsubscribe_link: unsubscribe_link
+            )
+          ]
+        end
+
+        def unsubscribe_self_managed(preferences_link)
+          [
+            safe_format(
+              s_('InProductMarketing|To opt out of these onboarding emails, %{unsubscribe_link}.'),
+              unsubscribe_link: unsubscribe_link
+            ),
+            safe_format(
+              s_("InProductMarketing|If you don't want to receive marketing emails directly from GitLab, " \
+                 "%{marketing_preference_link}."),
+              marketing_preference_link: preferences_link
+            )
+          ]
+        end
+
+        def strong_options
+          case format
+          when :html
+            { strong_start: '<b>'.html_safe, strong_end: '</b>'.html_safe }
+          else
+            { strong_start: '', strong_end: '' }
+          end
+        end
+
+        def link(text, link)
+          case format
+          when :html
+            ActionController::Base.helpers.link_to text, link
+          else
+            "#{text} (#{link})"
+          end
         end
       end
     end
diff --git a/ee/spec/lib/gitlab/email/message/account_validation_spec.rb b/ee/spec/lib/gitlab/email/message/account_validation_spec.rb
index 3ae34864b87c8..0052d6e43344f 100644
--- a/ee/spec/lib/gitlab/email/message/account_validation_spec.rb
+++ b/ee/spec/lib/gitlab/email/message/account_validation_spec.rb
@@ -2,7 +2,7 @@
 
 require 'spec_helper'
 
-RSpec.describe Gitlab::Email::Message::AccountValidation do
+RSpec.describe Gitlab::Email::Message::AccountValidation, feature_category: :instance_resiliency do
   let_it_be(:namespace) { create(:namespace) }
   let_it_be(:project) { create(:project, :repository, namespace: namespace) }
   let_it_be(:pipeline) { create(:ci_pipeline, project: project) }
@@ -22,5 +22,9 @@
     expect(message.cta2_text).to eq "I'll bring my own runners"
     expect(message.logo_path).to eq 'mailers/in_product_marketing/verify-2.png'
     expect(message.unsubscribe).to include('%tag_unsubscribe_url%')
+    expect(message.cta_link).to include('Validate your account')
+    expect(message.cta2_link).to include('bring my own runners')
+    expect(message.footer_links).to all(match(/Blog|Twitter|Facebook|YouTube/))
+    expect(message.address).to include('GitLab Inc')
   end
 end
diff --git a/ee/spec/mailers/emails/in_product_marketing_spec.rb b/ee/spec/mailers/emails/in_product_marketing_spec.rb
index 4d8e58f0d2495..cfc07441b52a8 100644
--- a/ee/spec/mailers/emails/in_product_marketing_spec.rb
+++ b/ee/spec/mailers/emails/in_product_marketing_spec.rb
@@ -3,12 +3,26 @@
 require 'spec_helper'
 require 'email_spec'
 
-RSpec.describe Emails::InProductMarketing do
+RSpec.describe Emails::InProductMarketing, feature_category: :instance_resiliency do
   include EmailSpec::Matchers
   include Gitlab::Routing.url_helpers
 
   let_it_be(:user) { create(:user) }
 
+  it 'has correct custom headers' do
+    headers = {
+      from: 'GitLab <team@gitlab.com>',
+      reply_to: 'GitLab <team@gitlab.com>',
+      'X-Mailgun-Track' => 'yes',
+      'X-Mailgun-Track-Clicks' => 'yes',
+      'X-Mailgun-Track-Opens' => 'yes',
+      'X-Mailgun-Tag' => 'marketing'
+    }
+
+    expect(described_class::FROM_ADDRESS).to be('GitLab <team@gitlab.com>')
+    expect(described_class::CUSTOM_HEADERS).to eq(headers)
+  end
+
   describe '#account_validation_email' do
     let_it_be(:namespace) { create(:namespace) }
     let_it_be(:project) { create(:project, :repository, namespace: namespace) }
diff --git a/lib/gitlab/email/message/in_product_marketing/helper.rb b/lib/gitlab/email/message/in_product_marketing/helper.rb
deleted file mode 100644
index 0770e5f4d7645..0000000000000
--- a/lib/gitlab/email/message/in_product_marketing/helper.rb
+++ /dev/null
@@ -1,97 +0,0 @@
-# frozen_string_literal: true
-
-module Gitlab
-  module Email
-    module Message
-      module InProductMarketing
-        module Helper
-          include ActionView::Context
-          include ActionView::Helpers::TagHelper
-
-          def footer_links
-            links = [
-              [s_('InProductMarketing|Blog'), 'https://about.gitlab.com/blog'],
-              [s_('InProductMarketing|Twitter'), 'https://twitter.com/gitlab'],
-              [s_('InProductMarketing|Facebook'), 'https://www.facebook.com/gitlab'],
-              [s_('InProductMarketing|YouTube'), 'https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg']
-            ]
-            case format
-            when :html
-              links.map do |text, link|
-                ActionController::Base.helpers.link_to(text, link)
-              end
-            else
-              '| ' + links.map do |text, link|
-                [text, link].join(' ')
-              end.join("\n| ")
-            end
-          end
-
-          def address
-            s_('InProductMarketing|%{strong_start}GitLab Inc.%{strong_end} 268 Bush Street, #350, San Francisco, CA 94104, USA').html_safe % strong_options
-          end
-
-          def unsubscribe_message(self_managed_preferences_link = nil)
-            parts = Gitlab.com? ? unsubscribe_com : unsubscribe_self_managed(self_managed_preferences_link)
-
-            case format
-            when :html
-              parts.join(' ')
-            else
-              parts.join("\n" + ' ' * 16)
-            end
-          end
-
-          private
-
-          def unsubscribe_link
-            unsubscribe_url = Gitlab.com? ? '%tag_unsubscribe_url%' : profile_notifications_url
-
-            link(s_('InProductMarketing|unsubscribe'), unsubscribe_url)
-          end
-
-          def unsubscribe_com
-            [
-              s_('InProductMarketing|If you no longer wish to receive marketing emails from us,'),
-              s_('InProductMarketing|you may %{unsubscribe_link} at any time.') % { unsubscribe_link: unsubscribe_link }
-            ]
-          end
-
-          def unsubscribe_self_managed(preferences_link)
-            [
-              s_('InProductMarketing|To opt out of these onboarding emails, %{unsubscribe_link}.') % { unsubscribe_link: unsubscribe_link },
-              s_("InProductMarketing|If you don't want to receive marketing emails directly from GitLab, %{marketing_preference_link}.") % { marketing_preference_link: preferences_link }
-            ]
-          end
-
-          def strong_options
-            case format
-            when :html
-              { strong_start: '<b>'.html_safe, strong_end: '</b>'.html_safe }
-            else
-              { strong_start: '', strong_end: '' }
-            end
-          end
-
-          def link(text, link)
-            case format
-            when :html
-              ActionController::Base.helpers.link_to text, link
-            else
-              "#{text} (#{link})"
-            end
-          end
-
-          def action_link(text, link)
-            case format
-            when :html
-              ActionController::Base.helpers.link_to text, link, target: '_blank', rel: 'noopener noreferrer'
-            else
-              [text, link].join(' >> ')
-            end
-          end
-        end
-      end
-    end
-  end
-end
diff --git a/spec/lib/gitlab/email/message/in_product_marketing/helper_spec.rb b/spec/lib/gitlab/email/message/in_product_marketing/helper_spec.rb
deleted file mode 100644
index a3c2d1b428e47..0000000000000
--- a/spec/lib/gitlab/email/message/in_product_marketing/helper_spec.rb
+++ /dev/null
@@ -1,75 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Email::Message::InProductMarketing::Helper do
-  describe 'unsubscribe_message' do
-    include Gitlab::Routing
-
-    let(:dummy_class_with_helper) do
-      Class.new do
-        include Gitlab::Email::Message::InProductMarketing::Helper
-        include Gitlab::Routing
-
-        def initialize(format = :html)
-          @format = format
-        end
-
-        def default_url_options
-          {}
-        end
-
-        attr_accessor :format
-      end
-    end
-
-    let(:format) { :html }
-
-    subject(:class_with_helper) { dummy_class_with_helper.new(format) }
-
-    context 'for SaaS', :saas do
-      context 'format is HTML' do
-        it 'returns the correct HTML' do
-          message = "If you no longer wish to receive marketing emails from us, " \
-            "you may <a href=\"%tag_unsubscribe_url%\">unsubscribe</a> at any time."
-          expect(class_with_helper.unsubscribe_message).to match message
-        end
-      end
-
-      context 'format is text' do
-        let(:format) { :text }
-
-        it 'returns the correct string' do
-          message = "If you no longer wish to receive marketing emails from us, " \
-            "you may unsubscribe (%tag_unsubscribe_url%) at any time."
-          expect(class_with_helper.unsubscribe_message.squish).to match message
-        end
-      end
-    end
-
-    context 'self-managed' do
-      context 'format is HTML' do
-        it 'returns the correct HTML' do
-          preferences_link = "http://example.com/preferences"
-          message = "To opt out of these onboarding emails, " \
-            "<a href=\"#{profile_notifications_url}\">unsubscribe</a>. " \
-            "If you don't want to receive marketing emails directly from GitLab, #{preferences_link}."
-          expect(class_with_helper.unsubscribe_message(preferences_link))
-            .to match message
-        end
-      end
-
-      context 'format is text' do
-        let(:format) { :text }
-
-        it 'returns the correct string' do
-          preferences_link = "http://example.com/preferences"
-          message = "To opt out of these onboarding emails, " \
-            "unsubscribe (#{profile_notifications_url}). " \
-            "If you don't want to receive marketing emails directly from GitLab, #{preferences_link}."
-          expect(class_with_helper.unsubscribe_message(preferences_link).squish).to match message
-        end
-      end
-    end
-  end
-end
diff --git a/spec/mailers/emails/in_product_marketing_spec.rb b/spec/mailers/emails/in_product_marketing_spec.rb
deleted file mode 100644
index 23ee21bfb456a..0000000000000
--- a/spec/mailers/emails/in_product_marketing_spec.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Emails::InProductMarketing do
-  it 'has correct custom headers' do
-    expect(described_class::FROM_ADDRESS).to be('GitLab <team@gitlab.com>')
-    expect(described_class::CUSTOM_HEADERS).to eq({
-      from: 'GitLab <team@gitlab.com>',
-      reply_to: 'GitLab <team@gitlab.com>',
-      'X-Mailgun-Track' => 'yes',
-      'X-Mailgun-Track-Clicks' => 'yes',
-      'X-Mailgun-Track-Opens' => 'yes',
-      'X-Mailgun-Tag' => 'marketing'
-    })
-  end
-end
diff --git a/spec/support/rspec_order_todo.yml b/spec/support/rspec_order_todo.yml
index b58a2b4612c08..9458acb11fb6d 100644
--- a/spec/support/rspec_order_todo.yml
+++ b/spec/support/rspec_order_todo.yml
@@ -6242,16 +6242,6 @@
 - './spec/lib/gitlab/email/hook/delivery_metrics_observer_spec.rb'
 - './spec/lib/gitlab/email/hook/disable_email_interceptor_spec.rb'
 - './spec/lib/gitlab/email/hook/smime_signature_interceptor_spec.rb'
-- './spec/lib/gitlab/email/message/in_product_marketing/admin_verify_spec.rb'
-- './spec/lib/gitlab/email/message/in_product_marketing/base_spec.rb'
-- './spec/lib/gitlab/email/message/in_product_marketing/create_spec.rb'
-- './spec/lib/gitlab/email/message/in_product_marketing/helper_spec.rb'
-- './spec/lib/gitlab/email/message/in_product_marketing_spec.rb'
-- './spec/lib/gitlab/email/message/in_product_marketing/team_short_spec.rb'
-- './spec/lib/gitlab/email/message/in_product_marketing/team_spec.rb'
-- './spec/lib/gitlab/email/message/in_product_marketing/trial_short_spec.rb'
-- './spec/lib/gitlab/email/message/in_product_marketing/trial_spec.rb'
-- './spec/lib/gitlab/email/message/in_product_marketing/verify_spec.rb'
 - './spec/lib/gitlab/email/message/repository_push_spec.rb'
 - './spec/lib/gitlab/email/receiver_spec.rb'
 - './spec/lib/gitlab/email/reply_parser_spec.rb'
@@ -7265,7 +7255,6 @@
 - './spec/mailers/emails/admin_notification_spec.rb'
 - './spec/mailers/emails/auto_devops_spec.rb'
 - './spec/mailers/emails/groups_spec.rb'
-- './spec/mailers/emails/in_product_marketing_spec.rb'
 - './spec/mailers/emails/issues_spec.rb'
 - './spec/mailers/emails/merge_requests_spec.rb'
 - './spec/mailers/emails/pages_domains_spec.rb'
-- 
GitLab