Skip to content

Commit 7137e1d

Browse files
authored
Better error handling NCBI down (#377)
* better error handling NCBI down * fix test * return 503 if NCBI fails * fix test
1 parent 0e1b35b commit 7137e1d

File tree

3 files changed

+26
-5
lines changed

3 files changed

+26
-5
lines changed

src/opencloning/ncbi_requests.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@
99

1010
async def async_get(url, headers, params=None) -> Response:
1111
async with get_http_client() as client:
12-
return await client.get(url, headers=headers, params=params, timeout=20.0)
12+
resp = await client.get(url, headers=headers, params=params, timeout=20.0)
13+
if resp.status_code == 500:
14+
raise HTTPException(503, 'NCBI is down, try again later')
15+
return resp
1316

1417

1518
# TODO: this does not return old assembly accessions, see https://github.com/ncbi/datasets/issues/380#issuecomment-2231142816
@@ -120,9 +123,9 @@ async def get_genbank_sequence(sequence_accession, start=None, end=None, strand=
120123
elif resp.status_code == 400:
121124
raise HTTPException(404, 'wrong sequence accession')
122125
elif resp.status_code == 503:
123-
raise HTTPException(503, 'NCBI returned an error')
126+
raise HTTPException(503, 'NCBI returned an internal server error')
124127
else:
125-
raise HTTPException(500, 'NCBI returned an unexpected error')
128+
raise HTTPException(503, 'NCBI returned an unexpected error')
126129

127130

128131
def validate_coordinates_pre_request(start, end, strand):

tests/test_endpoints_external_import.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -936,6 +936,18 @@ def test_exceptions(self):
936936
response = client.post('/genome_coordinates', json=viral_source.model_dump())
937937
self.assertStatusCode(response.status_code, 400)
938938

939+
def test_ncbi_down(self):
940+
correct_source = GenomeCoordinatesSource.model_validate(
941+
request_examples.genome_region_examples['full']['value']
942+
)
943+
with respx.mock:
944+
respx.get(
945+
'https://api.ncbi.nlm.nih.gov/datasets/v2alpha/genome/accession/GCF_000002945.2/annotation_report'
946+
).mock(return_value=httpx.Response(500, text='NCBI is down'))
947+
response = client.post('/genome_coordinates', json=correct_source.model_dump())
948+
self.assertEqual(response.status_code, 503)
949+
self.assertIn('NCBI is down', response.json()['detail'])
950+
939951

940952
class SEVASourceTest(unittest.TestCase):
941953
def test_seva_url(self):

tests/test_ncbi_requests.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,18 @@ async def test_get_genbank_sequence_subset(self):
1717
with pytest.raises(HTTPException) as e:
1818
await ncbi_requests.get_genbank_sequence('blah', 1, 10, 1)
1919
assert e.value.status_code == 503
20-
assert e.value.detail == 'NCBI returned an error'
20+
assert e.value.detail == 'NCBI returned an internal server error'
2121

2222
respx.get('https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi').respond(500, text='')
2323
with pytest.raises(HTTPException) as e:
2424
await ncbi_requests.get_genbank_sequence('blah', 1, 10, 1)
25-
assert e.value.status_code == 500
25+
assert e.value.status_code == 503
26+
assert e.value.detail == 'NCBI is down, try again later'
27+
28+
respx.get('https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi').respond(504, text='')
29+
with pytest.raises(HTTPException) as e:
30+
await ncbi_requests.get_genbank_sequence('blah', 1, 10, 1)
31+
assert e.value.status_code == 503
2632
assert e.value.detail == 'NCBI returned an unexpected error'
2733

2834
async def test_get_annotations_from_query(self):

0 commit comments

Comments
 (0)