15
15
has_pandas = False
16
16
17
17
import civis
18
- from civis .compat import mock , FileNotFoundError
18
+ from civis .io import _files
19
+ from civis .compat import mock , FileNotFoundError , TemporaryDirectory
19
20
from civis .response import Response
20
21
from civis .base import CivisAPIError
21
22
from civis .resources ._resources import get_api_spec , generate_classes
@@ -343,32 +344,38 @@ def test_file_id_from_run_output_platform_error():
343
344
@pytest .mark .skipif (not has_pandas , reason = "pandas not installed" )
344
345
def test_file_to_dataframe_infer ():
345
346
m_client = mock .Mock ()
347
+ url = 'url'
346
348
m_client .files .get .return_value = Response ({'name' : 'spam.csv' ,
347
- 'file_url' : 'url' })
348
- with mock .patch .object (civis .io ._files .pd , 'read_csv' ) as mock_read_csv :
349
+ 'file_url' : url })
350
+ with mock .patch .object (civis .io ._files .pd , 'read_csv' ,
351
+ autospec = True ) as mock_read_csv :
349
352
civis .io .file_to_dataframe (121 , compression = 'infer' , client = m_client )
350
- assert mock_read_csv .called_once_with ( 121 , compression = 'infer' )
353
+ mock_read_csv .assert_called_once_with ( url , compression = 'infer' )
351
354
352
355
353
356
@pytest .mark .skipif (not has_pandas , reason = "pandas not installed" )
354
357
def test_file_to_dataframe_infer_gzip ():
355
358
m_client = mock .Mock ()
359
+ url = 'url'
356
360
m_client .files .get .return_value = Response ({'name' : 'spam.csv.gz' ,
357
- 'file_url' : 'url' })
358
- with mock .patch .object (civis .io ._files .pd , 'read_csv' ) as mock_read_csv :
361
+ 'file_url' : url })
362
+ with mock .patch .object (civis .io ._files .pd , 'read_csv' ,
363
+ autospec = True ) as mock_read_csv :
359
364
civis .io .file_to_dataframe (121 , compression = 'infer' , client = m_client )
360
- assert mock_read_csv .called_once_with ( 121 , compression = 'gzip' )
365
+ mock_read_csv .assert_called_once_with ( url , compression = 'gzip' )
361
366
362
367
363
368
@pytest .mark .skipif (not has_pandas , reason = "pandas not installed" )
364
369
def test_file_to_dataframe_kwargs ():
365
370
m_client = mock .Mock ()
371
+ url = 'url'
366
372
m_client .files .get .return_value = Response ({'name' : 'spam.csv' ,
367
- 'file_url' : 'url' })
368
- with mock .patch .object (civis .io ._files .pd , 'read_csv' ) as mock_read_csv :
373
+ 'file_url' : url })
374
+ with mock .patch .object (civis .io ._files .pd , 'read_csv' ,
375
+ autospec = True ) as mock_read_csv :
369
376
civis .io .file_to_dataframe (121 , compression = 'special' , client = m_client ,
370
377
delimiter = '|' , nrows = 10 )
371
- assert mock_read_csv .called_once_with ( 121 , compression = 'special' ,
378
+ mock_read_csv .assert_called_once_with ( url , compression = 'special' ,
372
379
delimiter = '|' , nrows = 10 )
373
380
374
381
@@ -383,25 +390,40 @@ def _dump_json(file_id, buf, *args, **kwargs):
383
390
assert out == obj
384
391
385
392
386
- @mock .patch ('civis.io._files._civis_to_file' )
387
- @mock .patch ('%s.open' % __name__ , create = True )
388
- def test_civis_to_file_local (mock_open , mock_civis_to_file_helper ):
389
- # Test that passing a path to civis_to_file opens a file.
390
- civis .io .civis_to_file (123 , "foo" )
391
- mock_open .return_value = mock_file = mock .Mock ()
392
- assert mock_open .called_once_with ("foo" , "wb" )
393
- assert mock_civis_to_file_helper .called_once_with (123 , mock_file )
394
-
395
-
396
- @mock .patch ('civis.io._files._file_to_civis' )
397
- @mock .patch ('%s.open' % __name__ , create = True )
398
- def test_file_to_civis (mock_open , mock_file_to_civis_helper ):
399
- # Test that passing a path to file_to_civis opens a file.
400
- civis .io .file_to_civis ("foo" , "foo_name" )
401
- mock_open .return_value = mock_file = mock .Mock ()
402
- assert mock_open .called_once_with ("foo" , "rb" )
403
- assert mock_file_to_civis_helper .called_once_with (
404
- "foo" , "foo_name" , mock_file )
393
+ @mock .patch .object (_files , 'requests' , autospec = True )
394
+ def test_civis_to_file_local (mock_requests ):
395
+ # Test that a call to civis_to_file uses `requests` to grab the contents
396
+ # of a URL given by the API client and writes it to a file.
397
+ mock_civis = create_client_mock ()
398
+ mock_requests .get .return_value .iter_content .return_value = \
399
+ (l .encode () for l in 'abcdef' )
400
+ with TemporaryDirectory () as tdir :
401
+ fname = os .path .join (tdir , 'testfile' )
402
+ _files .civis_to_file (137 , fname , client = mock_civis )
403
+ with open (fname , 'rt' ) as _fin :
404
+ assert _fin .read () == 'abcdef'
405
+ mock_civis .files .get .assert_called_once_with (137 )
406
+ mock_requests .get .assert_called_once_with (
407
+ mock_civis .files .get .return_value .file_url , stream = True )
408
+
409
+
410
+ @mock .patch .object (_files , 'requests' , autospec = True )
411
+ def test_file_to_civis (mock_requests ):
412
+ # Test that file_to_civis posts a Civis File with the API client
413
+ # and calls `requests.post` on the returned URL.
414
+ mock_civis = create_client_mock ()
415
+ civis_name , expected_id = 'newname' , 137
416
+ mock_civis .files .post .return_value .id = expected_id
417
+ with TemporaryDirectory () as tdir :
418
+ fname = os .path .join (tdir , 'testfile' )
419
+ with open (fname , 'wt' ) as _fout :
420
+ _fout .write ('abcdef' )
421
+ fid = _files .file_to_civis (fname , civis_name , expires_at = None ,
422
+ client = mock_civis )
423
+ assert fid == expected_id
424
+ mock_civis .files .post .assert_called_once_with (civis_name , expires_at = None )
425
+ mock_requests .post .assert_called_once_with (
426
+ mock_civis .files .post .return_value .upload_url , files = mock .ANY )
405
427
406
428
407
429
@pytest .mark .parametrize ("table,expected" , [
0 commit comments