Skip to content

Commit

Permalink
feat(enrollment): view handler for re-enrollment error
Browse files Browse the repository at this point in the history
  • Loading branch information
thekaveman committed Apr 2, 2024
1 parent ede7f7b commit 1cf92fb
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 20 deletions.
1 change: 1 addition & 0 deletions benefits/enrollment/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
# /enrollment
path("", views.index, name="index"),
path("token", views.token, name="token"),
path("reenrollment-error", views.reenrollment_error, name="reenrollment-error"),
path("retry", views.retry, name="retry"),
path("success", views.success, name="success"),
]
26 changes: 18 additions & 8 deletions benefits/enrollment/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,13 @@
from requests.exceptions import HTTPError

from benefits.core import session
from benefits.core.middleware import (
EligibleSessionRequired,
VerifierSessionRequired,
pageview_decorator,
)
from benefits.core.middleware import EligibleSessionRequired, VerifierSessionRequired, pageview_decorator
from benefits.core.views import ROUTE_LOGGED_OUT
from . import analytics, forms

from . import analytics, forms

ROUTE_INDEX = "enrollment:index"
ROUTE_REENROLLMENT_ERROR = "enrollment:reenrollment-error"
ROUTE_RETRY = "enrollment:retry"
ROUTE_SUCCESS = "enrollment:success"
ROUTE_TOKEN = "enrollment:token"
Expand Down Expand Up @@ -203,10 +200,23 @@ def _calculate_expiry(expiration_days):
return expiry_datetime


@decorator_from_middleware(EligibleSessionRequired)
def reenrollment_error(request):
"""View handler for a re-enrollment attempt that is not yet within the re-enrollment window."""
analytics.returned_error(request, "Re-enrollment error")
return TemplateResponse(request, TEMPLATE_REENROLLMENT_ERROR)
eligibility = session.eligibility(request)
verifier = session.verifier(request)

if eligibility.reenrollment_error_template is None:
raise Exception(f"Re-enrollment error with null template on: {eligibility.label}")

if session.logged_in(request) and verifier.auth_provider.supports_sign_out:
# overwrite origin for a logged in user
# if they click the logout button, they are taken to the new route
session.update(request, origin=reverse(ROUTE_LOGGED_OUT))

analytics.returned_error(request, "Re-enrollment error.")

return TemplateResponse(request, eligibility.reenrollment_error_template)


@decorator_from_middleware(EligibleSessionRequired)
Expand Down
1 change: 1 addition & 0 deletions tests/pytest/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@ def model_EligibilityType_supports_expiration(model_EligibilityType):
model_EligibilityType.supports_expiration = True
model_EligibilityType.expiration_days = 365
model_EligibilityType.expiration_reenrollment_days = 14
model_EligibilityType.reenrollment_error_template = "enrollment/reenrollment-error--calfresh.html"
model_EligibilityType.save()

return model_EligibilityType
Expand Down
54 changes: 42 additions & 12 deletions tests/pytest/enrollment/test_views.py
Original file line number Diff line number Diff line change
@@ -1,32 +1,30 @@
from datetime import timedelta
import time
from datetime import timedelta

import pytest
from django.urls import reverse
from django.utils import timezone

from littlepay.api.funding_sources import FundingSourceResponse
from littlepay.api.groups import GroupFundingSourceResponse
from requests import HTTPError
import pytest

import benefits.enrollment.views
from benefits.core.middleware import TEMPLATE_USER_ERROR
from benefits.core.views import ROUTE_LOGGED_OUT
from benefits.enrollment.views import (
ROUTE_INDEX,
ROUTE_TOKEN,
ROUTE_SUCCESS,
ROUTE_REENROLLMENT_ERROR,
ROUTE_RETRY,
TEMPLATE_REENROLLMENT_ERROR,
TEMPLATE_SUCCESS,
ROUTE_SUCCESS,
ROUTE_TOKEN,
TEMPLATE_RETRY,
_get_group_funding_source,
TEMPLATE_SUCCESS,
_calculate_expiry,
_get_group_funding_source,
_is_expired,
_is_within_reenrollment_window,
)

import benefits.enrollment.views


@pytest.fixture
def card_tokenize_form_data():
Expand Down Expand Up @@ -539,7 +537,6 @@ def test_index_eligible_post_valid_form_success_supports_expiration_is_within_re
"mocked_session_agency",
"mocked_session_verifier",
"mocked_session_eligibility",
"model_EligibilityType_supports_expiration",
)
def test_index_eligible_post_valid_form_success_supports_expiration_is_not_expired_yet(
mocker,
Expand All @@ -548,6 +545,7 @@ def test_index_eligible_post_valid_form_success_supports_expiration_is_not_expir
mocked_analytics_module,
mocked_funding_source,
mocked_group_funding_source_with_expiry,
model_EligibilityType_supports_expiration,
):
mock_client_cls = mocker.patch("benefits.enrollment.views.Client")
mock_client = mock_client_cls.return_value
Expand All @@ -563,7 +561,7 @@ def test_index_eligible_post_valid_form_success_supports_expiration_is_not_expir
response = client.post(path, card_tokenize_form_data)

assert response.status_code == 200
assert response.template_name == TEMPLATE_REENROLLMENT_ERROR
assert response.template_name == model_EligibilityType_supports_expiration.reenrollment_error_template
mocked_analytics_module.returned_error.assert_called_once()


Expand Down Expand Up @@ -614,6 +612,38 @@ def test_index_ineligible(client):
assert response.template_name == TEMPLATE_USER_ERROR


@pytest.mark.django_db
def test_reenrollment_error_ineligible(client):
path = reverse(ROUTE_REENROLLMENT_ERROR)

response = client.get(path)

assert response.status_code == 200
assert response.template_name == TEMPLATE_USER_ERROR


@pytest.mark.django_db
@pytest.mark.usefixtures("mocked_session_agency", "mocked_session_verifier", "mocked_session_eligibility")
def test_reenrollment_error_eligibility_no_error_template(client):
path = reverse(ROUTE_REENROLLMENT_ERROR)

with pytest.raises(Exception, match="Re-enrollment error with null template"):
client.get(path)


@pytest.mark.django_db
@pytest.mark.usefixtures("mocked_session_agency", "mocked_session_verifier")
def test_reenrollment_error(client, model_EligibilityType_supports_expiration, mocked_session_eligibility):
mocked_session_eligibility.return_value = model_EligibilityType_supports_expiration

path = reverse(ROUTE_REENROLLMENT_ERROR)

response = client.get(path)

assert response.status_code == 200
assert response.template_name == model_EligibilityType_supports_expiration.reenrollment_error_template


@pytest.mark.django_db
def test_retry_ineligible(client):
path = reverse(ROUTE_RETRY)
Expand Down

0 comments on commit 1cf92fb

Please sign in to comment.