Repository: cal-itp/benefits

Issue:
`Enrollment success`: update copy and spacing

![image](https://github.com/cal-itp/benefits/assets/25497886/dfca4eea-d1d5-448d-8f50-d2ce06b74994)


## Acceptance Criteria

<!-- Remember to consider edge cases -->

- [x] Headline copy has changed 
- [x] Body copy has changed (mentions the transit agency more)
- [x] “You were not charged…” was moved down as its own separate sentence
- [x] Make sure the image is 40px below the heading
- [x] Make sure the spacing between heading and body copy should be 56px
- [x] Spacing is 16px between the body copy and the image



Discussion:
I think this work should happen on top of #1919 as that issue also updates the copy on this page.

Resolving patch:
diff --git a/benefits/core/migrations/0011_move_enrollment_success_template_field.py b/benefits/core/migrations/0011_move_enrollment_success_template_field.py
new file mode 100644
--- /dev/null
+++ b/benefits/core/migrations/0011_move_enrollment_success_template_field.py
@@ -0,0 +1,22 @@
+# Generated by Django 5.0.3 on 2024-05-17 19:49
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ("core", "0010_alter_secret_name_field_blank"),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name="transitagency",
+            name="enrollment_success_template",
+        ),
+        migrations.AddField(
+            model_name="eligibilitytype",
+            name="enrollment_success_template",
+            field=models.TextField(default="enrollment/success.html"),
+        ),
+    ]
diff --git a/benefits/core/models.py b/benefits/core/models.py
--- a/benefits/core/models.py
+++ b/benefits/core/models.py
@@ -116,6 +116,7 @@ class EligibilityType(models.Model):
     expiration_reenrollment_days = models.PositiveSmallIntegerField(null=True, blank=True)
     enrollment_index_template = models.TextField(default="enrollment/index.html")
     reenrollment_error_template = models.TextField(null=True, blank=True)
+    enrollment_success_template = models.TextField(default="enrollment/success.html")
 
     def __str__(self):
         return self.label
@@ -276,7 +277,6 @@ class TransitAgency(models.Model):
     jws_signing_alg = models.TextField()
     index_template = models.TextField()
     eligibility_index_template = models.TextField()
-    enrollment_success_template = models.TextField()
 
     def __str__(self):
         return self.long_name
diff --git a/benefits/enrollment/views.py b/benefits/enrollment/views.py
--- a/benefits/enrollment/views.py
+++ b/benefits/enrollment/views.py
@@ -24,7 +24,6 @@
 ROUTE_TOKEN = "enrollment:token"
 
 TEMPLATE_RETRY = "enrollment/retry.html"
-TEMPLATE_SUCCESS = "enrollment/success.html"
 
 
 logger = logging.getLogger(__name__)
@@ -152,7 +151,7 @@ def success(request):
     request.path = "/enrollment/success"
     session.update(request, origin=reverse(ROUTE_SUCCESS))
 
-    agency = session.agency(request)
+    eligibility = session.eligibility(request)
     verifier = session.verifier(request)
 
     if session.logged_in(request) and verifier.auth_provider.supports_sign_out:
@@ -160,4 +159,4 @@ def success(request):
         # if they click the logout button, they are taken to the new route
         session.update(request, origin=reverse(ROUTE_LOGGED_OUT))
 
-    return TemplateResponse(request, agency.enrollment_success_template)
+    return TemplateResponse(request, eligibility.enrollment_success_template)


Test patch:
diff --git a/tests/pytest/conftest.py b/tests/pytest/conftest.py
--- a/tests/pytest/conftest.py
+++ b/tests/pytest/conftest.py
@@ -100,7 +100,12 @@ def model_AuthProvider_without_verification_no_sign_out(model_AuthProvider):
 
 @pytest.fixture
 def model_EligibilityType():
-    eligibility = EligibilityType.objects.create(name="test", label="Test Eligibility Type", group_id="1234")
+    eligibility = EligibilityType.objects.create(
+        name="test",
+        label="Test Eligibility Type",
+        group_id="1234",
+        enrollment_success_template="enrollment/success.html",
+    )
 
     return eligibility
 
@@ -202,7 +207,6 @@ def model_TransitAgency(model_PemData, model_EligibilityType, model_EligibilityV
         jws_signing_alg="alg",
         index_template="core/agency-index.html",
         eligibility_index_template="eligibility/index.html",
-        enrollment_success_template="enrollment/success.html",
     )
 
     # add many-to-many relationships after creation, need ID on both sides
diff --git a/tests/pytest/core/test_models.py b/tests/pytest/core/test_models.py
--- a/tests/pytest/core/test_models.py
+++ b/tests/pytest/core/test_models.py
@@ -247,6 +247,13 @@ def test_EligibilityType_enrollment_index_template(model_EligibilityType):
     assert model_EligibilityType.enrollment_index_template == "test/enrollment.html"
 
 
+@pytest.mark.django_db
+def test_EligibilityType_enrollment_success_template():
+    new_eligibility_type = EligibilityType.objects.create()
+
+    assert new_eligibility_type.enrollment_success_template == "enrollment/success.html"
+
+
 class SampleFormClass:
     """A class for testing EligibilityVerifier form references."""
 
diff --git a/tests/pytest/enrollment/test_views.py b/tests/pytest/enrollment/test_views.py
--- a/tests/pytest/enrollment/test_views.py
+++ b/tests/pytest/enrollment/test_views.py
@@ -14,7 +14,6 @@
     ROUTE_RETRY,
     ROUTE_SUCCESS,
     ROUTE_TOKEN,
-    TEMPLATE_SUCCESS,
     TEMPLATE_RETRY,
 )
 
@@ -174,7 +173,7 @@ def test_index_eligible_post_valid_form_customer_already_enrolled(
         funding_source_id=mocked_funding_source.id, group_id=model_EligibilityType.group_id
     )
     assert response.status_code == 200
-    assert response.template_name == TEMPLATE_SUCCESS
+    assert response.template_name == model_EligibilityType.enrollment_success_template
     mocked_analytics_module.returned_success.assert_called_once()
     assert model_EligibilityType.group_id in mocked_analytics_module.returned_success.call_args.args
 
@@ -195,7 +194,7 @@ def test_index_eligible_post_valid_form_success(
         funding_source_id=mocked_funding_source.id, group_id=model_EligibilityType.group_id
     )
     assert response.status_code == 200
-    assert response.template_name == TEMPLATE_SUCCESS
+    assert response.template_name == model_EligibilityType.enrollment_success_template
     mocked_analytics_module.returned_success.assert_called_once()
     assert model_EligibilityType.group_id in mocked_analytics_module.returned_success.call_args.args
 
@@ -286,38 +285,42 @@ def test_success_no_verifier(client):
 
 @pytest.mark.django_db
 @pytest.mark.usefixtures("mocked_session_verifier_auth_required")
-def test_success_authentication_logged_in(mocker, client, model_TransitAgency):
+def test_success_authentication_logged_in(mocker, client, model_TransitAgency, model_EligibilityType):
     mock_session = mocker.patch("benefits.enrollment.views.session")
     mock_session.logged_in.return_value = True
     mock_session.agency.return_value = model_TransitAgency
+    mock_session.eligibility.return_value = model_EligibilityType
 
     path = reverse(ROUTE_SUCCESS)
     response = client.get(path)
 
     assert response.status_code == 200
-    assert response.template_name == TEMPLATE_SUCCESS
+    assert response.template_name == model_EligibilityType.enrollment_success_template
     assert {"origin": reverse(ROUTE_LOGGED_OUT)} in mock_session.update.call_args
 
 
 @pytest.mark.django_db
 @pytest.mark.usefixtures("mocked_session_verifier_auth_required")
-def test_success_authentication_not_logged_in(mocker, client, model_TransitAgency):
+def test_success_authentication_not_logged_in(mocker, client, model_TransitAgency, model_EligibilityType):
     mock_session = mocker.patch("benefits.enrollment.views.session")
     mock_session.logged_in.return_value = False
     mock_session.agency.return_value = model_TransitAgency
+    mock_session.eligibility.return_value = model_EligibilityType
 
     path = reverse(ROUTE_SUCCESS)
     response = client.get(path)
 
     assert response.status_code == 200
-    assert response.template_name == TEMPLATE_SUCCESS
+    assert response.template_name == model_EligibilityType.enrollment_success_template
 
 
 @pytest.mark.django_db
 @pytest.mark.usefixtures("mocked_session_agency", "mocked_session_verifier_auth_not_required")
-def test_success_no_authentication(client):
+def test_success_no_authentication(mocker, client, model_EligibilityType):
+    mock_session = mocker.patch("benefits.enrollment.views.session")
+    mock_session.eligibility.return_value = model_EligibilityType
     path = reverse(ROUTE_SUCCESS)
     response = client.get(path)
 
     assert response.status_code == 200
-    assert response.template_name == TEMPLATE_SUCCESS
+    assert response.template_name == model_EligibilityType.enrollment_success_template