Skip to content

Commit f62400b

Browse files
committed
tests(webhdfs): add missing tests
1 parent 234295a commit f62400b

1 file changed

Lines changed: 113 additions & 0 deletions

File tree

tests/test_provider_webhdfs.py

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,23 @@ async def test_do_filestatus_success(mock_provider, fake_request):
8686
assert file_status["type"] == "FILE"
8787

8888

89+
@pytest.mark.asyncio
90+
async def test_do_filestatus_missing_filestatus(mock_provider, fake_request):
91+
mock_response = AsyncMock()
92+
mock_response.status_code = 200
93+
mock_response.raise_for_status = MagicMock()
94+
mock_response.json = MagicMock(return_value={"FileStatus": {}})
95+
96+
mock_provider.client.get.return_value = mock_response
97+
98+
status, data = await mock_provider._do_filestatus(
99+
fake_request, DAVPath("/test.txt")
100+
)
101+
102+
assert status == 200
103+
assert data == {}
104+
105+
89106
@pytest.mark.asyncio
90107
async def test_do_get_file(mock_provider, fake_request):
91108
fake_status = {
@@ -157,6 +174,23 @@ async def test_do_delete_not_found(mock_provider, fake_request):
157174
assert result == 404
158175

159176

177+
@pytest.mark.asyncio
178+
async def test_do_delete_http_error(mock_provider, fake_request):
179+
mock_provider._precheck_source = AsyncMock(return_value=(True, True, False))
180+
181+
mock_response = AsyncMock()
182+
mock_response.raise_for_status = MagicMock(
183+
side_effect=httpx.HTTPStatusError(
184+
"error", request=MagicMock(), response=MagicMock(status_code=500)
185+
)
186+
)
187+
188+
mock_provider.client.delete.return_value = mock_response
189+
190+
response = await mock_provider._do_delete(fake_request)
191+
assert response == 424
192+
193+
160194
def test_get_url():
161195
root = WebHDFSProvider(
162196
config=Config(),
@@ -244,6 +278,30 @@ async def test_do_get_collection(mock_provider, fake_request):
244278
assert response_content_range is None
245279

246280

281+
@pytest.mark.asyncio
282+
async def test_do_get_invalid_range(mock_provider, fake_request):
283+
fake_status = {
284+
"type": "FILE",
285+
"length": 100,
286+
"modificationTime": 0,
287+
}
288+
289+
mock_provider._get_dav_property_d0 = AsyncMock(
290+
return_value=(
291+
200,
292+
await mock_provider._create_dav_property_obj(
293+
fake_request, DAVPath("/file.txt"), fake_status
294+
),
295+
)
296+
)
297+
298+
fake_request.ranges = [DAVRequestRange(DAVRangeType.RANGE, 200, 300, 100)]
299+
300+
status, _, _, _ = await mock_provider._do_get(fake_request)
301+
302+
assert status in (200, 416)
303+
304+
247305
@pytest.mark.asyncio
248306
async def test_dav_response_data_generator(mock_provider, fake_request):
249307
async def fake_aiter_bytes():
@@ -274,6 +332,33 @@ async def fake_aiter_bytes():
274332
assert result == [(b"chunk1", True), (b"chunk2", False)]
275333

276334

335+
@pytest.mark.asyncio
336+
async def test_dav_response_generator_empty(mock_provider, fake_request):
337+
async def fake_aiter():
338+
if False:
339+
yield b""
340+
341+
fake_response = MagicMock()
342+
fake_response.aiter_bytes = fake_aiter
343+
fake_response.raise_for_status = MagicMock()
344+
345+
class AsyncContextManager:
346+
async def __aenter__(self):
347+
return fake_response
348+
349+
async def __aexit__(self, exc_type, exc_val, exc_tb):
350+
return None
351+
352+
mock_provider.client.stream = MagicMock(return_value=AsyncContextManager())
353+
354+
gen = mock_provider._dav_response_data_generator(
355+
fake_request, DAVPath("/file.txt"), None, None
356+
)
357+
358+
result = [chunk async for chunk, more in gen]
359+
assert result == [None]
360+
361+
277362
@pytest.mark.asyncio
278363
async def test_do_put(mock_provider, fake_request):
279364
mock_response = MagicMock()
@@ -370,6 +455,23 @@ async def test_do_propfind(mock_provider, fake_request):
370455
assert resp_val.extra_not_found == exp_val.extra_not_found
371456

372457

458+
@pytest.mark.asyncio
459+
async def test_do_propfind_with_extra_keys(mock_provider, fake_request):
460+
fake_request.propfind_only_fetch_basic = False
461+
fake_request.propfind_extra_keys = ["custom:key"]
462+
463+
mock_response = AsyncMock()
464+
mock_response.status_code = 200
465+
mock_response.raise_for_status = MagicMock()
466+
mock_response.json = MagicMock(return_value={"FileStatus": {}})
467+
468+
mock_provider.client.get.return_value = mock_response
469+
470+
result = await mock_provider._do_propfind(fake_request)
471+
472+
assert isinstance(result, dict)
473+
474+
373475
@pytest.mark.asyncio
374476
async def test_do_head(mock_provider, fake_request):
375477
mock_response = MagicMock()
@@ -410,3 +512,14 @@ async def test_do_move(mock_provider, fake_request):
410512
response = await mock_provider._do_move(fake_request)
411513

412514
assert response == 204
515+
516+
517+
@pytest.mark.asyncio
518+
async def test_do_move_destination_exists_no_overwrite(mock_provider, fake_request):
519+
fake_request.overwrite = False
520+
521+
mock_provider._precheck_destination = AsyncMock(return_value=(True, True, True))
522+
523+
result = await mock_provider._do_move(fake_request)
524+
525+
assert result == 403

0 commit comments

Comments
 (0)