Coverage for benefits/oauth/hooks.py: 100%
60 statements
« prev ^ index » next coverage.py v7.16.2, created at 2026-10-08 19:50 +0000
« prev ^ index » next coverage.py v7.16.2, created at 2026-10-08 19:50 +0000
1import sentry_sdk
2from cdt_identity.hooks import DefaultHooks
3from django.shortcuts import redirect
4from django.utils.decorators import decorator_from_middleware, method_decorator
6from benefits.core import session
7from benefits.core.middleware import AgencySessionRequired, FlowSessionRequired
8from benefits.eligibility.views import analytics as eligibility_analytics
9from benefits.routes import routes
11from . import analytics
14class OAuthHooks(DefaultHooks):
15 @classmethod
16 def pre_login(cls, request):
17 super().pre_login(request)
18 analytics.started_sign_in(request)
20 @classmethod
21 def cancel_login(cls, request):
22 super().cancel_login(request)
23 error_code = request.GET.get("error")
24 if error_code == "access_denied":
25 analytics.canceled_sign_in(request)
26 else:
27 error_description = request.GET.get("error_description")
28 analytics.error(request, message=error_description, operation=error_code)
29 return redirect(routes.ELIGIBILITY_UNVERIFIED)
31 @classmethod
32 def pre_logout(cls, request):
33 super().pre_logout(request)
34 analytics.started_sign_out(request)
36 # the user is signed out of the app
37 session.logout(request)
39 @classmethod
40 def post_logout(cls, request):
41 super().post_logout(request)
42 analytics.finished_sign_out(request)
44 origin = session.origin(request)
45 return redirect(origin)
47 @classmethod
48 @method_decorator(
49 [
50 decorator_from_middleware(AgencySessionRequired),
51 decorator_from_middleware(FlowSessionRequired),
52 ]
53 )
54 def claims_verified_eligible(cls, request, claims_request, claims_result):
55 super().claims_verified_eligible(request, claims_request, claims_result)
56 session.update(request, logged_in=True)
57 analytics.finished_sign_in(request)
59 flow = session.flow(request)
60 eligibility_analytics.started_eligibility(request, flow)
62 session.update(request, eligible=True)
63 eligibility_analytics.returned_success(request, flow)
65 return redirect(routes.ENROLLMENT_INDEX)
67 @classmethod
68 @method_decorator(
69 [
70 decorator_from_middleware(AgencySessionRequired),
71 decorator_from_middleware(FlowSessionRequired),
72 ]
73 )
74 def claims_verified_not_eligible(cls, request, claims_request, claims_result):
75 super().claims_verified_not_eligible(request, claims_request, claims_result)
76 session.update(request, logged_in=True)
77 analytics.finished_sign_in(request, error=claims_result.errors)
79 flow = session.flow(request)
80 eligibility_analytics.started_eligibility(request, flow)
82 return redirect(routes.ELIGIBILITY_UNVERIFIED)
84 @classmethod
85 def system_error(cls, request, exception, operation):
86 super().system_error(request, exception, operation)
87 analytics.error(request, message=str(exception), operation=str(operation))
88 sentry_sdk.capture_exception(exception)
89 return redirect(routes.OAUTH_SYSTEM_ERROR)