Skip to content

Commit

Permalink
feat(analytics): add the extra claims that were verified to analytics
Browse files Browse the repository at this point in the history
  • Loading branch information
lalver1 committed Oct 31, 2024
1 parent c404a88 commit 0f3ec5c
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 7 deletions.
12 changes: 11 additions & 1 deletion benefits/core/session.py
Original file line number Diff line number Diff line change
Expand Up @@ -157,10 +157,20 @@ def oauth_token(request):


def oauth_claims(request):
"""Get the oauth claim from the request's session, or None"""
"""Get the oauth claims from the request's session, or None"""
return request.session.get(_OAUTH_CLAIMS)


def oauth_extra_claims(request, eligibility_claim, oauth_claims):
"""Get the extra oauth claims from the request's session, or None"""
if oauth_claims is not None:
# since .remove works in-place, make a copy
all_claims = oauth_claims[:]
return all_claims.remove(eligibility_claim)
else:
return None


def origin(request):
"""Get the origin for the request's session, or default to the index route."""
return request.session.get(_ORIGIN, reverse(routes.INDEX))
Expand Down
20 changes: 16 additions & 4 deletions benefits/enrollment/analytics.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,18 @@
class ReturnedEnrollmentEvent(core.Event):
"""Analytics event representing the end of transit processor enrollment request."""

def __init__(self, request, status, error=None, enrollment_group=None, enrollment_method=models.EnrollmentMethods.DIGITAL):
def __init__(
self,
request,
status,
error=None,
enrollment_group=None,
enrollment_method=models.EnrollmentMethods.DIGITAL,
extra_claims=None,
):
super().__init__(request, "returned enrollment", enrollment_method)
if str(status).lower() in ("error", "retry", "success"):
self.update_event_properties(status=status, error=error)
self.update_event_properties(status=status, error=error, extra_claims=extra_claims)
if enrollment_group is not None:
self.update_event_properties(enrollment_group=enrollment_group)

Expand All @@ -35,11 +43,15 @@ def returned_retry(request, enrollment_method: str = models.EnrollmentMethods.DI
core.send_event(ReturnedEnrollmentEvent(request, status="retry", enrollment_method=enrollment_method))


def returned_success(request, enrollment_group, enrollment_method: str = models.EnrollmentMethods.DIGITAL):
def returned_success(request, enrollment_group, enrollment_method: str = models.EnrollmentMethods.DIGITAL, extra_claims=None):
"""Send the "returned enrollment" analytics event with a success status."""
core.send_event(
ReturnedEnrollmentEvent(
request, status="success", enrollment_group=enrollment_group, enrollment_method=enrollment_method
request,
status="success",
enrollment_group=enrollment_group,
enrollment_method=enrollment_method,
extra_claims=extra_claims,
)
)

Expand Down
11 changes: 10 additions & 1 deletion benefits/enrollment/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,12 @@ def index(request):
agency = session.agency(request)
flow = session.flow(request)
expiry = session.enrollment_expiry(request)
if session.oauth_extra_claims(request, flow.claims_eligibility_claim, session.oauth_claims(request)):
extra_claims = ", ".join(
session.oauth_extra_claims(request, flow.claims_eligibility_claim, session.oauth_claims(request))
)
else:
extra_claims = ""
event = models.EnrollmentEvent.objects.create(
transit_agency=agency,
enrollment_flow=flow,
Expand All @@ -79,7 +85,10 @@ def index(request):
expiration_datetime=expiry,
)
event.save()
analytics.returned_success(request, flow.group_id)
extra_claims = session.oauth_extra_claims(
request, flow.claims_eligibility_claim, session.oauth_claims(request)
)
analytics.returned_success(request, flow.group_id, extra_claims=extra_claims)
return success(request)

case Status.SYSTEM_ERROR:
Expand Down
20 changes: 19 additions & 1 deletion tests/pytest/enrollment/test_analytics.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,28 @@
import pytest

from benefits.enrollment.analytics import FailedAccessTokenRequestEvent
from benefits.enrollment.analytics import FailedAccessTokenRequestEvent, ReturnedEnrollmentEvent


@pytest.mark.django_db
def test_FailedAccessTokenRequestEvent_sets_status_code(app_request):
event = FailedAccessTokenRequestEvent(app_request, 500)

assert event.event_properties["status_code"] == 500


@pytest.mark.django_db
def test_ReturnedEnrollmentEvent_without_error(app_request, mocker):

key1 = "enrollment_flows"
key2 = "extra_claims"
mock_flow = mocker.Mock()
mock_flow.system_name = "flow_1"
mocker.patch("benefits.core.session.flow", return_value=mock_flow)

mock_claims = ["eligibility_claim", "extra_claim"]
mocker.patch("benefits.core.session.oauth_claims", return_value=mock_claims)

event = ReturnedEnrollmentEvent(app_request, status="success")
assert "error_code" not in event.event_properties
assert key1 in event.event_properties
assert key2 in event.event_properties

0 comments on commit 0f3ec5c

Please sign in to comment.