1
1
from __future__ import annotations
2
2
3
- import pytest
4
- import requests
5
3
from django .conf import settings
4
+ import pytest
6
5
from requests .exceptions import HTTPError
7
6
8
- from dandiapi .api .datacite import DataCiteClient , DANDI_DOI_SETTINGS
7
+ from dandiapi .api .datacite import DataCiteClient
8
+
9
9
10
- # Mock individual HTTP methods for safety
11
10
@pytest .fixture (autouse = True )
12
11
def mock_requests (mocker ):
13
12
"""Mock individual request methods for all tests to prevent actual HTTP calls."""
@@ -31,9 +30,7 @@ def datacite_client():
31
30
32
31
@pytest .fixture
33
32
def datacite_client_unsafe ():
34
- """
35
- Bypass safety feature that prevents API calls to datacite during tests.
36
- """
33
+ """Bypass safety feature that prevents API calls to datacite during tests."""
37
34
client = DataCiteClient ()
38
35
if hasattr (client .create_or_update_doi , '__wrapped__' ):
39
36
client .create_or_update_doi = client .create_or_update_doi .__wrapped__ .__get__ (client )
@@ -96,7 +93,9 @@ def test_generate_doi_data(datacite_client, published_version, mocker):
96
93
assert doi_string == expected_doi
97
94
assert 'doi' in published_version .metadata
98
95
# Make sure metadata is copied, not modified
99
- assert id (published_version .metadata ) != id (datacite_client .generate_doi_data (published_version )[1 ])
96
+ assert id (published_version .metadata ) != id (
97
+ datacite_client .generate_doi_data (published_version )[1 ]
98
+ )
100
99
101
100
# Test Dandiset DOI
102
101
doi_string , payload = datacite_client .generate_doi_data (published_version , version_doi = False )
@@ -123,10 +122,12 @@ def test_create_or_update_doi_not_configured(datacite_client_unsafe, mock_reques
123
122
mock_logger .warning .assert_called_once ()
124
123
125
124
126
- def test_create_or_update_doi_publish_disabled_event_publish (datacite_client_unsafe , mock_requests , mocker ):
125
+ def test_create_or_update_doi_publish_disabled_event_publish (
126
+ datacite_client_unsafe , mock_requests , mocker
127
+ ):
127
128
"""Test create_or_update_doi when DANDI_DOI_PUBLISH is False."""
128
129
mocker .patch .object (datacite_client_unsafe , 'is_configured' , return_value = True )
129
- mocker .patch .object (settings , 'DANDI_DOI_PUBLISH' , False )
130
+ mocker .patch .object (settings , 'DANDI_DOI_PUBLISH' , new = False )
130
131
mock_logger = mocker .patch ('dandiapi.api.datacite.logger' )
131
132
132
133
# Configure mock response
@@ -165,7 +166,7 @@ def test_create_or_update_doi_publish_disabled_event_publish(datacite_client_uns
165
166
def test_create_or_update_doi_new_doi (datacite_client_unsafe , mock_requests , mocker ):
166
167
"""Test creating a new DOI successfully."""
167
168
mocker .patch .object (datacite_client_unsafe , 'is_configured' , return_value = True )
168
- mocker .patch .object (settings , 'DANDI_DOI_PUBLISH' , True )
169
+ mocker .patch .object (settings , 'DANDI_DOI_PUBLISH' , new = True )
169
170
170
171
# Configure mock response
171
172
mock_response = mocker .Mock ()
@@ -191,11 +192,11 @@ def test_create_or_update_doi_new_doi(datacite_client_unsafe, mock_requests, moc
191
192
def test_create_or_update_doi_existing_doi (datacite_client_unsafe , mock_requests , mocker ):
192
193
"""Test updating an existing DOI."""
193
194
mocker .patch .object (datacite_client_unsafe , 'is_configured' , return_value = True )
194
- mocker .patch .object (settings , 'DANDI_DOI_PUBLISH' , True )
195
+ mocker .patch .object (settings , 'DANDI_DOI_PUBLISH' , new = True )
195
196
196
197
# Mock POST to fail with 422 (already exists)
197
198
mock_post_response = mocker .Mock ()
198
- http_error = HTTPError (" DOI already exists" )
199
+ http_error = HTTPError (' DOI already exists' )
199
200
http_error .response = mocker .Mock ()
200
201
http_error .response .status_code = 422
201
202
mock_post_response .raise_for_status .side_effect = http_error
@@ -225,10 +226,10 @@ def test_create_or_update_doi_post_error(datacite_client_unsafe, mock_requests,
225
226
mock_logger = mocker .patch ('dandiapi.api.datacite.logger' )
226
227
227
228
# Mock POST to fail with 400
228
- http_error = HTTPError (" Bad request" )
229
+ http_error = HTTPError (' Bad request' )
229
230
http_error .response = mocker .Mock ()
230
231
http_error .response .status_code = 400
231
- http_error .response .text = " Bad request"
232
+ http_error .response .text = ' Bad request'
232
233
mock_requests .post .side_effect = http_error
233
234
234
235
payload = {'data' : {'attributes' : {'doi' : '10.12345/test' }}}
@@ -250,16 +251,16 @@ def test_create_or_update_doi_put_error(datacite_client_unsafe, mock_requests, m
250
251
251
252
# Mock POST to fail with 422 (already exists)
252
253
mock_post_response = mocker .Mock ()
253
- http_error = HTTPError (" DOI already exists" )
254
+ http_error = HTTPError (' DOI already exists' )
254
255
http_error .response = mocker .Mock ()
255
256
http_error .response .status_code = 422
256
257
mock_post_response .raise_for_status .side_effect = http_error
257
258
mock_requests .post .return_value = mock_post_response
258
259
259
260
# Mock PUT to fail
260
- put_error = HTTPError (" Update failed" )
261
+ put_error = HTTPError (' Update failed' )
261
262
put_error .response = mocker .Mock ()
262
- put_error .response .text = " Update failed"
263
+ put_error .response .text = ' Update failed'
263
264
mock_requests .put .side_effect = put_error
264
265
265
266
payload = {'data' : {'attributes' : {'doi' : '10.12345/test' }}}
@@ -298,9 +299,7 @@ def test_delete_or_hide_doi_draft(datacite_client_unsafe, mock_requests, mocker)
298
299
299
300
# Mock GET to return a draft DOI
300
301
mock_get_response = mocker .Mock ()
301
- mock_get_response .json .return_value = {
302
- 'data' : {'attributes' : {'state' : 'draft' }}
303
- }
302
+ mock_get_response .json .return_value = {'data' : {'attributes' : {'state' : 'draft' }}}
304
303
mock_get_response .raise_for_status = mocker .Mock ()
305
304
mock_requests .get .return_value = mock_get_response
306
305
@@ -324,14 +323,12 @@ def test_delete_or_hide_doi_draft(datacite_client_unsafe, mock_requests, mocker)
324
323
def test_delete_or_hide_doi_findable_publish_enabled (datacite_client_unsafe , mock_requests , mocker ):
325
324
"""Test hiding a findable DOI when DANDI_DOI_PUBLISH is True."""
326
325
mocker .patch .object (datacite_client_unsafe , 'is_configured' , return_value = True )
327
- mocker .patch .object (settings , 'DANDI_DOI_PUBLISH' , True )
326
+ mocker .patch .object (settings , 'DANDI_DOI_PUBLISH' , new = True )
328
327
mock_logger = mocker .patch ('dandiapi.api.datacite.logger' )
329
328
330
329
# Mock GET to return a findable DOI
331
330
mock_get_response = mocker .Mock ()
332
- mock_get_response .json .return_value = {
333
- 'data' : {'attributes' : {'state' : 'findable' }}
334
- }
331
+ mock_get_response .json .return_value = {'data' : {'attributes' : {'state' : 'findable' }}}
335
332
mock_get_response .raise_for_status = mocker .Mock ()
336
333
mock_requests .get .return_value = mock_get_response
337
334
@@ -354,17 +351,17 @@ def test_delete_or_hide_doi_findable_publish_enabled(datacite_client_unsafe, moc
354
351
mock_logger .info .assert_called_once ()
355
352
356
353
357
- def test_delete_or_hide_doi_findable_publish_disabled (datacite_client_unsafe , mock_requests , mocker ):
354
+ def test_delete_or_hide_doi_findable_publish_disabled (
355
+ datacite_client_unsafe , mock_requests , mocker
356
+ ):
358
357
"""Test not hiding a findable DOI when DANDI_DOI_PUBLISH is False."""
359
358
mocker .patch .object (datacite_client_unsafe , 'is_configured' , return_value = True )
360
- mocker .patch .object (settings , 'DANDI_DOI_PUBLISH' , False )
359
+ mocker .patch .object (settings , 'DANDI_DOI_PUBLISH' , new = False )
361
360
mock_logger = mocker .patch ('dandiapi.api.datacite.logger' )
362
361
363
362
# Mock GET to return a findable DOI
364
363
mock_get_response = mocker .Mock ()
365
- mock_get_response .json .return_value = {
366
- 'data' : {'attributes' : {'state' : 'findable' }}
367
- }
364
+ mock_get_response .json .return_value = {'data' : {'attributes' : {'state' : 'findable' }}}
368
365
mock_get_response .raise_for_status = mocker .Mock ()
369
366
mock_requests .get .return_value = mock_get_response
370
367
@@ -384,7 +381,7 @@ def test_delete_or_hide_doi_nonexistent(datacite_client_unsafe, mock_requests, m
384
381
mock_logger = mocker .patch ('dandiapi.api.datacite.logger' )
385
382
386
383
# Mock GET to fail with 404
387
- get_error = HTTPError (" Not found" )
384
+ get_error = HTTPError (' Not found' )
388
385
get_error .response = mocker .Mock ()
389
386
get_error .response .status_code = 404
390
387
mock_requests .get .side_effect = get_error
@@ -405,7 +402,7 @@ def test_delete_or_hide_doi_get_error(datacite_client_unsafe, mock_requests, moc
405
402
mock_logger = mocker .patch ('dandiapi.api.datacite.logger' )
406
403
407
404
# Mock GET to fail with 500
408
- get_error = HTTPError (" Server error" )
405
+ get_error = HTTPError (' Server error' )
409
406
get_error .response = mocker .Mock ()
410
407
get_error .response .status_code = 500
411
408
mock_requests .get .side_effect = get_error
0 commit comments