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

1from dataclasses import dataclass 

2from django.conf import settings 

3from django.http import HttpRequest 

4from django.urls import reverse 

5from requests import HTTPError 

6 

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 

11 

12 

13@dataclass 

14class RegistrationResponse: 

15 status: Status 

16 registration: Registration 

17 exception: Exception = None 

18 status_code: int = None 

19 

20 

21@dataclass 

22class RegistrationStatusResponse: 

23 status: Status 

24 registration_status: RegistrationStatus 

25 exception: Exception = None 

26 status_code: int = None 

27 

28 

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 ) 

39 

40 route = reverse(routes.ENROLLMENT_SWITCHIO_INDEX) 

41 redirect_url = _generate_redirect_uri(request, route) 

42 

43 registration = client.request_registration( 

44 eshopRedirectUrl=redirect_url, 

45 mode=RegistrationMode.REGISTER, 

46 eshopResponseMode=EshopResponseMode.FORM_POST, 

47 timeout=settings.REQUESTS_TIMEOUT, 

48 ) 

49 

50 return RegistrationResponse(status=Status.SUCCESS, registration=registration) 

51 except Exception as e: 

52 exception = e 

53 

54 if isinstance(e, HTTPError): 

55 status_code = e.response.status_code 

56 

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 

64 

65 return RegistrationResponse(status=status, registration=None, exception=exception, status_code=status_code) 

66 

67 

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() 

71 

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://") 

76 

77 return redirect_uri 

78 

79 

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 ) 

90 

91 registration_status = client.get_registration_status( 

92 registration_id=registration_id, 

93 timeout=settings.REQUESTS_TIMEOUT, 

94 ) 

95 

96 return RegistrationStatusResponse(status=Status.SUCCESS, registration_status=registration_status, exception=None) 

97 except Exception as e: 

98 exception = e 

99 

100 if isinstance(e, HTTPError): 

101 status_code = e.response.status_code 

102 

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 

110 

111 return RegistrationStatusResponse( 

112 status=status, registration_status=None, exception=exception, status_code=status_code 

113 )