1
+ import json
1
2
import os
3
+ from unittest .mock import MagicMock , patch
4
+
2
5
import pytest
3
6
from tests import utc_date
7
+ import tests
4
8
import turing
5
9
import turing .batch
6
10
import turing .batch .config
7
- from urllib3_mock import Responses
8
11
9
- responses = Responses ("requests.packages.urllib3" )
10
12
data_dir = os .path .join (os .path .dirname (__file__ ), "../testdata/api_responses" )
11
13
12
14
with open (os .path .join (data_dir , "list_jobs_0000.json" )) as f :
18
20
with open (os .path .join (data_dir , "get_job_0000.json" )) as f :
19
21
get_job_0000 = f .read ()
20
22
21
-
22
- @pytest .fixture (scope = "module" , name = "responses" )
23
- def _responses ():
24
- return responses
25
-
26
-
27
- @responses .activate
28
23
@pytest .mark .parametrize (
29
24
"api_response, expected" ,
30
25
[
@@ -62,36 +57,37 @@ def _responses():
62
57
],
63
58
)
64
59
def test_list_jobs (
65
- turing_api , active_project , api_response , expected , use_google_oauth
60
+ turing_api , project , api_response , expected , use_google_oauth , active_project_magic_mock
66
61
):
67
- turing .set_url (turing_api , use_google_oauth )
68
- turing .set_project (active_project .name )
69
-
70
- responses .add (
71
- method = "GET" ,
72
- url = f"/v1/projects/{ active_project .id } /jobs?"
62
+ with patch ("urllib3.PoolManager.request" ) as mock_request :
63
+ turing .set_url (turing_api , use_google_oauth )
64
+
65
+ mock_request .return_value = active_project_magic_mock
66
+ turing .set_project (project .name )
67
+
68
+ mock_response = MagicMock ()
69
+ mock_response .method = "GET"
70
+ mock_response .status = 200
71
+ mock_response .path = f"/v1/projects/{ project .id } /jobs?"
73
72
f"status={ turing .batch .EnsemblingJobStatus .PENDING .value } &"
74
- f"status={ turing .batch .EnsemblingJobStatus .RUNNING .value } " ,
75
- body = api_response ,
76
- match_querystring = True ,
77
- status = 200 ,
78
- content_type = "application/json" ,
79
- )
80
-
81
- actual = turing .batch .EnsemblingJob .list (
82
- status = [
83
- turing .batch .EnsemblingJobStatus .PENDING ,
84
- turing .batch .EnsemblingJobStatus .RUNNING ,
85
- ]
86
- )
87
-
88
- assert len (actual ) == len (expected )
73
+ f"status={ turing .batch .EnsemblingJobStatus .RUNNING .value } "
74
+ mock_response .data = api_response .encode ('utf-8' )
75
+ mock_response .getheader .return_value = 'application/json'
76
+
77
+ mock_request .return_value = mock_response
89
78
90
- for actual , expected in zip (actual , expected ):
91
- assert actual == expected
79
+ actual = turing .batch .EnsemblingJob .list (
80
+ status = [
81
+ turing .batch .EnsemblingJobStatus .PENDING ,
82
+ turing .batch .EnsemblingJobStatus .RUNNING ,
83
+ ]
84
+ )
92
85
86
+ assert len (actual ) == len (expected )
93
87
94
- @responses .activate
88
+ for actual , expected in zip (actual , expected ):
89
+ assert actual == expected
90
+
95
91
@pytest .mark .parametrize (
96
92
"api_response, expected" ,
97
93
[
@@ -112,31 +108,34 @@ def test_list_jobs(
112
108
)
113
109
def test_submit_job (
114
110
turing_api ,
115
- active_project ,
111
+ project ,
116
112
ensembling_job_config ,
117
113
api_response ,
118
114
expected ,
119
115
use_google_oauth ,
116
+ active_project_magic_mock
120
117
):
121
- turing . set_url ( turing_api , use_google_oauth )
122
- turing .set_project ( active_project . name )
118
+ with patch ( "urllib3.PoolManager.request" ) as mock_request :
119
+ turing .set_url ( turing_api , use_google_oauth )
123
120
124
- responses .add (
125
- method = "POST" ,
126
- url = f"/v1/projects/{ active_project .id } /jobs" ,
127
- body = api_response ,
128
- status = 201 ,
129
- content_type = "application/json" ,
130
- )
121
+ mock_request .return_value = active_project_magic_mock
122
+ turing .set_project (project .name )
123
+
124
+ mock_response = MagicMock ()
125
+ mock_response .method = "POST"
126
+ mock_response .status = 201
127
+ mock_response .path = f"/v1/projects/{ project .id } /jobs"
128
+ mock_response .data = api_response .encode ('utf-8' )
129
+ mock_response .getheader .return_value = 'application/json'
131
130
132
- actual = turing .batch .job .EnsemblingJob .submit (
133
- ensembler_id = 2 ,
134
- config = ensembling_job_config ,
135
- )
136
- assert actual == expected
131
+ mock_request .return_value = mock_response
137
132
133
+ actual = turing .batch .job .EnsemblingJob .submit (
134
+ ensembler_id = 2 ,
135
+ config = ensembling_job_config ,
136
+ )
137
+ assert actual == expected
138
138
139
- @responses .activate
140
139
@pytest .mark .parametrize (
141
140
"api_response_get, expected, api_response_refresh, updated" ,
142
141
[
@@ -168,43 +167,46 @@ def test_submit_job(
168
167
)
169
168
def test_fetch_job (
170
169
turing_api ,
171
- active_project ,
170
+ project ,
172
171
api_response_get ,
173
172
expected ,
174
173
api_response_refresh ,
175
174
updated ,
176
175
use_google_oauth ,
176
+ active_project_magic_mock
177
177
):
178
- turing .set_url (turing_api , use_google_oauth )
179
- turing .set_project (active_project .name )
180
-
181
- responses .add (
182
- method = "GET" ,
183
- url = f"/v1/projects/{ active_project .id } /jobs/{ expected .id } " ,
184
- body = api_response_get ,
185
- status = 200 ,
186
- content_type = "application/json" ,
187
- )
188
-
189
- job = turing .batch .EnsemblingJob .get_by_id (expected .id )
178
+ with patch ("urllib3.PoolManager.request" ) as mock_request :
179
+ turing .set_url (turing_api , use_google_oauth )
190
180
191
- assert job == expected
181
+ mock_request .return_value = active_project_magic_mock
182
+ turing .set_project (project .name )
192
183
193
- responses . reset ()
194
- responses . add (
195
- method = "GET" ,
196
- url = f"/v1/projects/{ active_project .id } /jobs/{ expected .id } " ,
197
- body = api_response_refresh ,
198
- status = 200 ,
199
- content_type = "application/json" ,
200
- )
184
+ mock_response = MagicMock ()
185
+ mock_response . method = "GET"
186
+ mock_response . status = 200
187
+ mock_response . path = f"/v1/projects/{ project .id } /jobs/{ expected .id } "
188
+ mock_response . data = api_response_get . encode ( 'utf-8' )
189
+ mock_response . getheader . return_value = 'application/json'
190
+
191
+ mock_request . return_value = mock_response
201
192
202
- job . refresh ( )
193
+ job = turing . batch . EnsemblingJob . get_by_id ( expected . id )
203
194
204
- assert job == updated
195
+ assert job == expected
196
+
197
+ mock_response = MagicMock ()
198
+ mock_response .method = "GET"
199
+ mock_response .status = 200
200
+ mock_response .path = f"/v1/projects/{ project .id } /jobs/{ expected .id } "
201
+ mock_response .data = api_response_refresh .encode ('utf-8' )
202
+ mock_response .getheader .return_value = 'application/json'
203
+
204
+ mock_request .return_value = mock_response
205
205
206
+ job .refresh ()
206
207
207
- @responses .activate
208
+ assert job == updated
209
+
208
210
@pytest .mark .parametrize (
209
211
"job, api_response_delete, api_response_get, expected" ,
210
212
[
@@ -236,34 +238,38 @@ def test_fetch_job(
236
238
)
237
239
def test_terminate_job (
238
240
turing_api ,
239
- active_project ,
241
+ project ,
240
242
job ,
241
243
api_response_delete ,
242
244
api_response_get ,
243
245
expected ,
244
246
use_google_oauth ,
247
+ active_project_magic_mock
245
248
):
246
- turing . set_url ( turing_api , use_google_oauth )
247
- turing .set_project ( active_project . name )
249
+ with patch ( "urllib3.PoolManager.request" ) as mock_request :
250
+ turing .set_url ( turing_api , use_google_oauth )
248
251
249
- responses .add (
250
- method = "DELETE" ,
251
- url = f"/v1/projects/{ active_project .id } /jobs/{ job .id } " ,
252
- body = api_response_delete ,
253
- status = 201 ,
254
- content_type = "application/json" ,
255
- )
252
+ mock_request .return_value = active_project_magic_mock
253
+ turing .set_project (project .name )
256
254
257
- responses .add (
258
- method = "GET" ,
259
- url = f"/v1/projects/{ active_project .id } /jobs/{ job .id } " ,
260
- body = api_response_get ,
261
- status = 200 ,
262
- content_type = "application/json" ,
263
- )
255
+ mock_response_1 = MagicMock ()
256
+ mock_response_1 .method = "DELETE"
257
+ mock_response_1 .status = 201
258
+ mock_response_1 .path = f"/v1/projects/{ project .id } /jobs/{ job .id } "
259
+ mock_response_1 .data = api_response_delete .encode ('utf-8' )
260
+ mock_response_1 .getheader .return_value = 'application/json'
261
+
262
+ mock_response_2 = MagicMock ()
263
+ mock_response_2 .method = "get"
264
+ mock_response_2 .status = 200
265
+ mock_response_2 .path = f"/v1/projects/{ project .id } /jobs/{ job .id } "
266
+ mock_response_2 .data = api_response_get .encode ('utf-8' )
267
+ mock_response_2 .getheader .return_value = 'application/json'
268
+
269
+ mock_request .side_effect = [mock_response_1 , mock_response_2 ]
264
270
265
- assert job != expected
271
+ assert job != expected
266
272
267
- job .terminate ()
273
+ job .terminate ()
268
274
269
- assert job == expected
275
+ assert job == expected
0 commit comments