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 25, 2024
1 parent e56f6a9 commit e145e20
Show file tree
Hide file tree
Showing 4 changed files with 61 additions and 12 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"),
]
28 changes: 22 additions & 6 deletions benefits/enrollment/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,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 @@ -122,6 +119,25 @@ def index(request):
return TemplateResponse(request, eligibility.enrollment_index_template, context)


@decorator_from_middleware(EligibleSessionRequired)
def reenrollment_error(request):
"""View handler for a re-enrollment attempt that is not yet within the re-enrollment window."""
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)
def retry(request):
"""View handler for a recoverable failure condition."""
Expand Down
1 change: 1 addition & 0 deletions tests/pytest/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,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
43 changes: 37 additions & 6 deletions tests/pytest/enrollment/test_views.py
Original file line number Diff line number Diff line change
@@ -1,24 +1,23 @@
import time

import pytest
from django.urls import reverse

from littlepay.api.funding_sources import FundingSourceResponse
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,
ROUTE_SUCCESS,
ROUTE_TOKEN,
TEMPLATE_SUCCESS,
TEMPLATE_RETRY,
)

import benefits.enrollment.views


@pytest.fixture
def card_tokenize_form_data():
Expand Down Expand Up @@ -211,6 +210,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 e145e20

Please sign in to comment.