Coverage for benefits/enrollment_switchio/enrollment.py: 99%
58 statements
« prev ^ index » next coverage.py v7.9.1, created at 2025-06-23 18:20 +0000
« prev ^ index » next coverage.py v7.9.1, created at 2025-06-23 18:20 +0000
1from dataclasses import dataclass
2from django.conf import settings
3from django.http import HttpRequest
4from django.urls import reverse
5from requests import HTTPError
7from benefits.enrollment.enrollment import Status
8from benefits.enrollment_switchio.models import SwitchioConfig
9from benefits.routes import routes
10from benefits.enrollment_switchio.api import Client, EshopResponseMode, Registration, RegistrationMode, RegistrationStatus
13@dataclass
14class RegistrationResponse:
15 status: Status
16 registration: Registration
17 exception: Exception = None
18 status_code: int = None
21@dataclass
22class RegistrationStatusResponse:
23 status: Status
24 registration_status: RegistrationStatus
25 exception: Exception = None
26 status_code: int = None
29def request_registration(request, switchio_config) -> RegistrationResponse:
30 try:
31 client = Client(
32 api_url=switchio_config.api_base_url,
33 api_key=switchio_config.api_key,
34 api_secret=switchio_config.api_secret,
35 private_key=switchio_config.private_key_data,
36 client_certificate=switchio_config.client_certificate_data,
37 ca_certificate=switchio_config.ca_certificate_data,
38 )
40 route = reverse(routes.ENROLLMENT_SWITCHIO_INDEX)
41 redirect_url = _generate_redirect_uri(request, route)
43 registration = client.request_registration(
44 eshopRedirectUrl=redirect_url,
45 mode=RegistrationMode.REGISTER,
46 eshopResponseMode=EshopResponseMode.FORM_POST,
47 timeout=settings.REQUESTS_TIMEOUT,
48 )
50 return RegistrationResponse(status=Status.SUCCESS, registration=registration)
51 except Exception as e:
52 exception = e
54 if isinstance(e, HTTPError):
55 status_code = e.response.status_code
57 if status_code >= 500:
58 status = Status.SYSTEM_ERROR
59 else:
60 status = Status.EXCEPTION
61 else:
62 status_code = None
63 status = Status.EXCEPTION
65 return RegistrationResponse(status=status, registration=None, exception=exception, status_code=status_code)
68# copied from https://github.com/Office-of-Digital-Services/django-cdt-identity/blob/main/cdt_identity/views.py#L42-L50
69def _generate_redirect_uri(request: HttpRequest, redirect_path: str):
70 redirect_uri = str(request.build_absolute_uri(redirect_path)).lower()
72 # this is a temporary hack to ensure redirect URIs are HTTPS when the app is deployed
73 # see https://github.com/cal-itp/benefits/issues/442 for more context
74 if not redirect_uri.startswith("http://localhost"): 74 ↛ 77line 74 didn't jump to line 77 because the condition on line 74 was always true
75 redirect_uri = redirect_uri.replace("http://", "https://")
77 return redirect_uri
80def get_registration_status(switchio_config: SwitchioConfig, registration_id: str) -> RegistrationStatusResponse:
81 try:
82 client = Client(
83 api_url=switchio_config.api_base_url,
84 api_key=switchio_config.api_key,
85 api_secret=switchio_config.api_secret,
86 private_key=switchio_config.private_key_data,
87 client_certificate=switchio_config.client_certificate_data,
88 ca_certificate=switchio_config.ca_certificate_data,
89 )
91 registration_status = client.get_registration_status(
92 registration_id=registration_id,
93 timeout=settings.REQUESTS_TIMEOUT,
94 )
96 return RegistrationStatusResponse(status=Status.SUCCESS, registration_status=registration_status, exception=None)
97 except Exception as e:
98 exception = e
100 if isinstance(e, HTTPError):
101 status_code = e.response.status_code
103 if status_code >= 500:
104 status = Status.SYSTEM_ERROR
105 else:
106 status = Status.EXCEPTION
107 else:
108 status_code = None
109 status = Status.EXCEPTION
111 return RegistrationStatusResponse(
112 status=status, registration_status=None, exception=exception, status_code=status_code
113 )