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

1import sentry_sdk 

2from cdt_identity.hooks import DefaultHooks 

3from django.shortcuts import redirect 

4from django.utils.decorators import decorator_from_middleware, method_decorator 

5 

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 

10 

11from . import analytics 

12 

13 

14class OAuthHooks(DefaultHooks): 

15 @classmethod 

16 def pre_login(cls, request): 

17 super().pre_login(request) 

18 analytics.started_sign_in(request) 

19 

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) 

30 

31 @classmethod 

32 def pre_logout(cls, request): 

33 super().pre_logout(request) 

34 analytics.started_sign_out(request) 

35 

36 # the user is signed out of the app 

37 session.logout(request) 

38 

39 @classmethod 

40 def post_logout(cls, request): 

41 super().post_logout(request) 

42 analytics.finished_sign_out(request) 

43 

44 origin = session.origin(request) 

45 return redirect(origin) 

46 

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) 

58 

59 flow = session.flow(request) 

60 eligibility_analytics.started_eligibility(request, flow) 

61 

62 session.update(request, eligible=True) 

63 eligibility_analytics.returned_success(request, flow) 

64 

65 return redirect(routes.ENROLLMENT_INDEX) 

66 

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) 

78 

79 flow = session.flow(request) 

80 eligibility_analytics.started_eligibility(request, flow) 

81 

82 return redirect(routes.ELIGIBILITY_UNVERIFIED) 

83 

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)