Skip to content

Commit

Permalink
refactor: show system enrollment error page if 500 during /token
Browse files Browse the repository at this point in the history
  • Loading branch information
angela-tran committed May 21, 2024
1 parent 1a15409 commit 9f48635
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 2 deletions.
6 changes: 6 additions & 0 deletions benefits/enrollment/templates/enrollment/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,12 @@ <h1 class="pb-lg-8 pb-4">
$.ajax({ dataType: "script", attrs: { nonce: "{{ request.csp_nonce }}"}, url: "{{ card_tokenize_url }}" })
.done(function() {
$.get("{{ access_token_url }}", function(data) {
if (data.redirect) {
// https://stackoverflow.com/a/42469170
// use 'assign' because 'replace' was giving strange Back button behavior
window.location.assign(data.redirect);
}

$(".loading").remove();
// remove invisible and add back visible, so we aren't left with
// a div with an empty class attribute
Expand Down
1 change: 1 addition & 0 deletions benefits/enrollment/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,5 @@
path("reenrollment-error", views.reenrollment_error, name="reenrollment-error"),
path("retry", views.retry, name="retry"),
path("success", views.success, name="success"),
path("error", views.system_error, name="system-error"),
]
17 changes: 15 additions & 2 deletions benefits/enrollment/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
ROUTE_REENROLLMENT_ERROR = "enrollment:reenrollment-error"
ROUTE_RETRY = "enrollment:retry"
ROUTE_SUCCESS = "enrollment:success"
ROUTE_SYSTEM_ERROR = "enrollment:system-error"
ROUTE_TOKEN = "enrollment:token"

TEMPLATE_RETRY = "enrollment/retry.html"
Expand All @@ -44,8 +45,20 @@ def token(request):
audience=payment_processor.audience,
)
client.oauth.ensure_active_token(client.token)
response = client.request_card_tokenization_access()
session.update(request, enrollment_token=response.get("access_token"), enrollment_token_exp=response.get("expires_at"))

try:
response = client.request_card_tokenization_access()
except Exception as e:
if isinstance(e, HTTPError) and e.response.status_code >= 500:
sentry_sdk.capture_exception(e)
data = {"redirect": reverse(ROUTE_SYSTEM_ERROR)}
return JsonResponse(data)
else:
raise e
else:
session.update(
request, enrollment_token=response.get("access_token"), enrollment_token_exp=response.get("expires_at")
)

data = {"token": session.enrollment_token(request)}

Expand Down
26 changes: 26 additions & 0 deletions tests/pytest/enrollment/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
ROUTE_REENROLLMENT_ERROR,
ROUTE_RETRY,
ROUTE_SUCCESS,
ROUTE_SYSTEM_ERROR,
ROUTE_TOKEN,
TEMPLATE_SYSTEM_ERROR,
TEMPLATE_RETRY,
Expand Down Expand Up @@ -102,6 +103,31 @@ def test_token_valid(mocker, client):
assert data["token"] == "enrollment_token"


@pytest.mark.django_db
@pytest.mark.usefixtures("mocked_session_agency", "mocked_session_eligibility")
def test_token_http_error_500(mocker, client):
mocker.patch("benefits.core.session.enrollment_token_valid", return_value=False)

mock_client_cls = mocker.patch("benefits.enrollment.views.Client")
mock_client = mock_client_cls.return_value

mock_error = {"message": "Mock error message"}
mock_error_response = mocker.Mock(status_code=500, **mock_error)
mock_error_response.json.return_value = mock_error
mock_client.request_card_tokenization_access.side_effect = HTTPError(
response=mock_error_response,
)

path = reverse(ROUTE_TOKEN)
response = client.get(path)

assert response.status_code == 200
data = response.json()
assert "token" not in data
assert "redirect" in data
assert data["redirect"] == reverse(ROUTE_SYSTEM_ERROR)


@pytest.mark.django_db
@pytest.mark.usefixtures("mocked_session_agency", "mocked_session_verifier", "mocked_session_eligibility")
def test_index_eligible_get(client, model_EligibilityType):
Expand Down

0 comments on commit 9f48635

Please sign in to comment.