1
- import time
2
-
3
1
import pytest
4
- from authlib .integrations .base_client .errors import UnsupportedTokenTypeError
5
2
from django .urls import reverse
6
3
from requests import HTTPError
7
- from unittest .mock import patch , PropertyMock
8
4
9
5
from benefits .core import models
10
6
from benefits .routes import routes
11
7
import benefits .enrollment .views
12
8
from benefits .enrollment .enrollment import Status
13
- from benefits .enrollment_littlepay .enrollment import CardTokenizationAccessResponse
14
9
from benefits .core .middleware import TEMPLATE_USER_ERROR
15
10
from benefits .enrollment .views import TEMPLATE_SYSTEM_ERROR , TEMPLATE_RETRY
16
11
@@ -35,170 +30,6 @@ def mocked_sentry_sdk_module(mocker):
35
30
return mocker .patch .object (benefits .enrollment .views , "sentry_sdk" )
36
31
37
32
38
- @pytest .mark .django_db
39
- def test_token_ineligible (client ):
40
- path = reverse (routes .ENROLLMENT_TOKEN )
41
-
42
- response = client .get (path )
43
-
44
- assert response .status_code == 200
45
- assert response .template_name == TEMPLATE_USER_ERROR
46
-
47
-
48
- @pytest .mark .django_db
49
- @pytest .mark .usefixtures ("mocked_session_agency" , "mocked_session_eligible" )
50
- def test_token_refresh (mocker , client ):
51
- mocker .patch ("benefits.enrollment_littlepay.session.Session.access_token_valid" , return_value = False )
52
-
53
- mock_token = {}
54
- mock_token ["access_token" ] = "access_token"
55
- mock_token ["expires_at" ] = time .time () + 10000
56
-
57
- mocker .patch (
58
- "benefits.enrollment.views.request_card_tokenization_access" ,
59
- return_value = CardTokenizationAccessResponse (
60
- Status .SUCCESS ,
61
- access_token = mock_token ["access_token" ],
62
- expires_at = mock_token ["expires_at" ],
63
- ),
64
- )
65
-
66
- path = reverse (routes .ENROLLMENT_TOKEN )
67
- response = client .get (path )
68
-
69
- assert response .status_code == 200
70
- data = response .json ()
71
- assert "token" in data
72
- assert data ["token" ] == mock_token ["access_token" ]
73
-
74
-
75
- @pytest .mark .django_db
76
- @pytest .mark .usefixtures ("mocked_session_agency" , "mocked_session_eligible" )
77
- @patch ("benefits.enrollment_littlepay.session.Session.access_token" , new = PropertyMock (return_value = "enrollment_token" ))
78
- def test_token_valid (mocker , client ):
79
- mocker .patch ("benefits.enrollment_littlepay.session.Session.access_token_valid" , return_value = True )
80
-
81
- path = reverse (routes .ENROLLMENT_TOKEN )
82
- response = client .get (path )
83
-
84
- assert response .status_code == 200
85
- data = response .json ()
86
- assert "token" in data
87
- assert data ["token" ] == "enrollment_token"
88
-
89
-
90
- @pytest .mark .django_db
91
- @pytest .mark .usefixtures ("mocked_session_agency" , "mocked_session_eligible" )
92
- def test_token_system_error (mocker , client , mocked_analytics_module , mocked_sentry_sdk_module ):
93
- mocker .patch ("benefits.enrollment_littlepay.session.Session.access_token_valid" , return_value = False )
94
-
95
- mock_error = {"message" : "Mock error message" }
96
- mock_error_response = mocker .Mock (status_code = 500 , ** mock_error )
97
- mock_error_response .json .return_value = mock_error
98
- http_error = HTTPError (response = mock_error_response )
99
-
100
- mocker .patch (
101
- "benefits.enrollment.views.request_card_tokenization_access" ,
102
- return_value = CardTokenizationAccessResponse (
103
- Status .SYSTEM_ERROR , access_token = None , expires_at = None , exception = http_error , status_code = 500
104
- ),
105
- )
106
-
107
- path = reverse (routes .ENROLLMENT_TOKEN )
108
- response = client .get (path )
109
-
110
- assert response .status_code == 200
111
- data = response .json ()
112
- assert "token" not in data
113
- assert "redirect" in data
114
- assert data ["redirect" ] == reverse (routes .ENROLLMENT_SYSTEM_ERROR )
115
- mocked_analytics_module .failed_access_token_request .assert_called_once ()
116
- assert 500 in mocked_analytics_module .failed_access_token_request .call_args .args
117
- mocked_sentry_sdk_module .capture_exception .assert_called_once ()
118
-
119
-
120
- @pytest .mark .django_db
121
- @pytest .mark .usefixtures ("mocked_session_agency" , "mocked_session_eligible" )
122
- def test_token_http_error_400 (mocker , client , mocked_analytics_module , mocked_sentry_sdk_module ):
123
- mocker .patch ("benefits.enrollment_littlepay.session.Session.access_token_valid" , return_value = False )
124
-
125
- mock_error = {"message" : "Mock error message" }
126
- mock_error_response = mocker .Mock (status_code = 400 , ** mock_error )
127
- mock_error_response .json .return_value = mock_error
128
- http_error = HTTPError (response = mock_error_response )
129
-
130
- mocker .patch (
131
- "benefits.enrollment.views.request_card_tokenization_access" ,
132
- return_value = CardTokenizationAccessResponse (
133
- Status .EXCEPTION , access_token = None , expires_at = None , exception = http_error , status_code = 400
134
- ),
135
- )
136
-
137
- path = reverse (routes .ENROLLMENT_TOKEN )
138
- response = client .get (path )
139
-
140
- assert response .status_code == 200
141
- data = response .json ()
142
- assert "token" not in data
143
- assert "redirect" in data
144
- assert data ["redirect" ] == reverse (routes .SERVER_ERROR )
145
- mocked_analytics_module .failed_access_token_request .assert_called_once ()
146
- assert 400 in mocked_analytics_module .failed_access_token_request .call_args .args
147
- mocked_sentry_sdk_module .capture_exception .assert_called_once ()
148
-
149
-
150
- @pytest .mark .django_db
151
- @pytest .mark .usefixtures ("mocked_session_agency" , "mocked_session_eligible" )
152
- def test_token_misconfigured_client_id (mocker , client , mocked_analytics_module , mocked_sentry_sdk_module ):
153
- mocker .patch ("benefits.enrollment_littlepay.session.Session.access_token_valid" , return_value = False )
154
-
155
- exception = UnsupportedTokenTypeError ()
156
-
157
- mocker .patch (
158
- "benefits.enrollment.views.request_card_tokenization_access" ,
159
- return_value = CardTokenizationAccessResponse (
160
- Status .EXCEPTION , access_token = None , expires_at = None , exception = exception , status_code = None
161
- ),
162
- )
163
-
164
- path = reverse (routes .ENROLLMENT_TOKEN )
165
- response = client .get (path )
166
-
167
- assert response .status_code == 200
168
- data = response .json ()
169
- assert "token" not in data
170
- assert "redirect" in data
171
- assert data ["redirect" ] == reverse (routes .SERVER_ERROR )
172
- mocked_analytics_module .failed_access_token_request .assert_called_once ()
173
- mocked_sentry_sdk_module .capture_exception .assert_called_once ()
174
-
175
-
176
- @pytest .mark .django_db
177
- @pytest .mark .usefixtures ("mocked_session_agency" , "mocked_session_eligible" )
178
- def test_token_connection_error (mocker , client , mocked_analytics_module , mocked_sentry_sdk_module ):
179
- mocker .patch ("benefits.enrollment_littlepay.session.Session.access_token_valid" , return_value = False )
180
-
181
- exception = ConnectionError ()
182
-
183
- mocker .patch (
184
- "benefits.enrollment.views.request_card_tokenization_access" ,
185
- return_value = CardTokenizationAccessResponse (
186
- Status .EXCEPTION , access_token = None , expires_at = None , exception = exception , status_code = None
187
- ),
188
- )
189
-
190
- path = reverse (routes .ENROLLMENT_TOKEN )
191
- response = client .get (path )
192
-
193
- assert response .status_code == 200
194
- data = response .json ()
195
- assert "token" not in data
196
- assert "redirect" in data
197
- assert data ["redirect" ] == reverse (routes .SERVER_ERROR )
198
- mocked_analytics_module .failed_access_token_request .assert_called_once ()
199
- mocked_sentry_sdk_module .capture_exception .assert_called_once ()
200
-
201
-
202
33
@pytest .mark .django_db
203
34
@pytest .mark .usefixtures ("mocked_session_agency" , "mocked_session_flow" , "mocked_session_eligible" )
204
35
def test_index_eligible_get (client ):
0 commit comments