Coverage for benefits/eligibility/views.py: 97%

82 statements  

« prev     ^ index     » next       coverage.py v7.8.0, created at 2025-05-14 01:41 +0000

1""" 

2The eligibility application: view definitions for the eligibility verification flow. 

3""" 

4 

5from django.contrib import messages 

6from django.shortcuts import redirect 

7from django.template.response import TemplateResponse 

8from django.urls import reverse 

9from django.utils.decorators import decorator_from_middleware 

10 

11from benefits.routes import routes 

12from benefits.core import recaptcha, session 

13from benefits.core.middleware import AgencySessionRequired, RecaptchaEnabled, FlowSessionRequired 

14from benefits.core.models import EnrollmentFlow 

15from . import analytics, forms, verify 

16 

17TEMPLATE_CONFIRM = "eligibility/confirm.html" 

18 

19 

20@decorator_from_middleware(AgencySessionRequired) 

21@decorator_from_middleware(RecaptchaEnabled) 

22def index(request): 

23 """View handler for the enrollment flow selection form.""" 

24 agency = session.agency(request) 

25 session.update(request, eligible=False, origin=agency.index_url) 

26 

27 # clear any prior OAuth token as the user is choosing their desired flow 

28 # this may or may not require OAuth, with a different set of scope/claims than what is already stored 

29 session.logout(request) 

30 

31 context = {"form": forms.EnrollmentFlowSelectionForm(agency=agency)} 

32 

33 if request.method == "POST": 

34 form = forms.EnrollmentFlowSelectionForm(data=request.POST, agency=agency) 

35 

36 if form.is_valid(): 

37 flow_id = form.cleaned_data.get("flow") 

38 flow = EnrollmentFlow.objects.get(id=flow_id) 

39 session.update(request, flow=flow) 

40 

41 analytics.selected_flow(request, flow) 

42 

43 eligibility_start = reverse(routes.ELIGIBILITY_START) 

44 response = redirect(eligibility_start) 

45 else: 

46 # form was not valid, allow for correction/resubmission 

47 if recaptcha.has_error(form): 47 ↛ 48line 47 didn't jump to line 48 because the condition on line 47 was never true

48 messages.error(request, "Recaptcha failed. Please try again.") 

49 context["form"] = form 

50 context.update(agency.eligibility_index_context) 

51 response = TemplateResponse(request, "eligibility/index.html", context) 

52 else: 

53 context.update(agency.eligibility_index_context) 

54 response = TemplateResponse(request, "eligibility/index.html", context) 

55 

56 return response 

57 

58 

59@decorator_from_middleware(AgencySessionRequired) 

60@decorator_from_middleware(FlowSessionRequired) 

61def start(request): 

62 """View handler for the eligibility verification getting started screen.""" 

63 session.update(request, eligible=False, origin=reverse(routes.ELIGIBILITY_START)) 

64 

65 flow = session.flow(request) 

66 

67 return TemplateResponse(request, "eligibility/start.html", flow.eligibility_start_context) 

68 

69 

70@decorator_from_middleware(AgencySessionRequired) 

71@decorator_from_middleware(RecaptchaEnabled) 

72@decorator_from_middleware(FlowSessionRequired) 

73def confirm(request): 

74 """View handler for the eligibility verification form.""" 

75 

76 # GET from an already verified user, no need to verify again 

77 if request.method == "GET" and session.eligible(request): 

78 return verified(request) 

79 

80 agency = session.agency(request) 

81 flow = session.flow(request) 

82 

83 form = flow.eligibility_form_instance() 

84 

85 # GET/POST for Eligibility API verification 

86 context = {"form": form} 

87 

88 # GET from an unverified user, present the form 

89 if request.method == "GET": 

90 session.update(request, origin=reverse(routes.ELIGIBILITY_CONFIRM)) 

91 return TemplateResponse(request, TEMPLATE_CONFIRM, context) 

92 # POST form submission, process form data, make Eligibility Verification API call 

93 elif request.method == "POST": 93 ↛ exitline 93 didn't return from function 'confirm' because the condition on line 93 was always true

94 analytics.started_eligibility(request, flow) 

95 

96 form = flow.eligibility_form_instance(data=request.POST) 

97 # form was not valid, allow for correction/resubmission 

98 if not form.is_valid(): 

99 if recaptcha.has_error(form): 

100 messages.error(request, "Recaptcha failed. Please try again.") 

101 context["form"] = form 

102 return TemplateResponse(request, TEMPLATE_CONFIRM, context) 

103 

104 # form is valid, make Eligibility Verification request to get the verified confirmation 

105 is_verified = verify.eligibility_from_api(flow, form, agency) 

106 

107 # form was not valid, allow for correction/resubmission 

108 if is_verified is None: 

109 analytics.returned_error(request, flow, form.errors) 

110 context["form"] = form 

111 return TemplateResponse(request, TEMPLATE_CONFIRM, context) 

112 # no type was verified 

113 elif not is_verified: 

114 return redirect(routes.ELIGIBILITY_UNVERIFIED) 

115 # type was verified 

116 else: 

117 return verified(request) 

118 

119 

120@decorator_from_middleware(AgencySessionRequired) 

121def verified(request): 

122 """View handler for the verified eligibility page.""" 

123 

124 flow = session.flow(request) 

125 analytics.returned_success(request, flow) 

126 

127 session.update(request, eligible=True) 

128 

129 return redirect(routes.ENROLLMENT_INDEX) 

130 

131 

132@decorator_from_middleware(AgencySessionRequired) 

133@decorator_from_middleware(FlowSessionRequired) 

134def unverified(request): 

135 """View handler for the unverified eligibility page.""" 

136 

137 flow = session.flow(request) 

138 

139 analytics.returned_fail(request, flow) 

140 

141 return TemplateResponse(request, "eligibility/unverified.html", flow.eligibility_unverified_context)