@@ -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
90107async 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+
160194def 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
248306async 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
278363async 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
374476async 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