88import numpy as np
99import pandas as pd
1010import pytest
11+ from botocore .exceptions import ClientError
1112
1213from sdv .datasets .demo import (
1314 _download ,
@@ -1365,7 +1366,7 @@ def test__list_objects_raises_when_no_contents_and_dataset_found():
13651366 _list_objects (prefix = 'single_table/mydataset/' , bucket = 'bucket' , client = mock_client )
13661367
13671368
1368- def test_list_objects_raises_when_no_contents_and_no_dataset ():
1369+ def test__list_objects_raises_when_no_contents_and_no_dataset ():
13691370 """Test that `_list_objects` raise a modality-specific error when dataset name is unknown."""
13701371 # Setup
13711372 mock_client = Mock ()
@@ -1380,3 +1381,133 @@ def test_list_objects_raises_when_no_contents_and_no_dataset():
13801381 )
13811382 with pytest .raises (DemoResourceNotFoundError , match = error_msg ):
13821383 _list_objects (prefix = 'single_table/' , bucket = 'bucket' , client = mock_client )
1384+
1385+
1386+ @patch ('sdv.datasets.demo._create_s3_client' )
1387+ def test_download_with_client_error (mock__create_s3_client ):
1388+ """Raise DemoResourceNotFoundError when an AWS ClientError occurs during dataset download."""
1389+ # Setup
1390+ client = Mock ()
1391+ client .get_paginator .side_effect = ClientError (
1392+ error_response = {
1393+ 'Error' : {'Code' : 'AccessDenied' , 'Message' : 'Access Denied' },
1394+ 'ResponseMetadata' : {'HTTPStatusCode' : 403 },
1395+ },
1396+ operation_name = 'ListObjectsV2' ,
1397+ )
1398+ mock__create_s3_client .return_value = client
1399+
1400+ # Run and Assert
1401+ error_msg = (
1402+ "Could not download dataset 'fake_hotels' from bucket 'private_bucket'. "
1403+ 'Make sure the bucket name is correct. If the bucket is private '
1404+ 'make sure to provide your credentials.'
1405+ )
1406+ with pytest .raises (DemoResourceNotFoundError , match = error_msg ):
1407+ download_demo (
1408+ 'single_table' ,
1409+ 'fake_hotels' ,
1410+ None ,
1411+ 'private_bucket' ,
1412+ )
1413+
1414+
1415+ @patch ('sdv.datasets.demo._create_s3_client' )
1416+ def test_get_available_demos_with_client_error (mock__create_s3_client ):
1417+ """Raise `DemoResourceNotFoundError` when an AWS `ClientError` occurs while listing demos."""
1418+ # Setup
1419+ client = Mock ()
1420+ client .get_paginator .side_effect = ClientError (
1421+ error_response = {
1422+ 'Error' : {
1423+ 'Code' : 'AccessDenied' ,
1424+ 'Message' : 'Access Denied' ,
1425+ },
1426+ 'ResponseMetadata' : {
1427+ 'HTTPStatusCode' : 403 ,
1428+ },
1429+ },
1430+ operation_name = 'ListObjectsV2' ,
1431+ )
1432+ mock__create_s3_client .return_value = client
1433+
1434+ # Run and Assert
1435+ error_msg = (
1436+ "Could not list datasets in modality 'single_table' from bucket 'private_bucket'. "
1437+ 'Make sure the bucket name is correct. If the bucket is private '
1438+ 'make sure to provide your credentials.'
1439+ )
1440+
1441+ with pytest .raises (DemoResourceNotFoundError , match = error_msg ):
1442+ get_available_demos (
1443+ modality = 'single_table' ,
1444+ s3_bucket_name = 'private_bucket' ,
1445+ )
1446+
1447+
1448+ @patch ('sdv.datasets.demo._create_s3_client' )
1449+ def test_get_source_with_client_error (mock__create_s3_client ):
1450+ """Raise DemoResourceNotFoundError when an AWS ClientError occurs while fetching SOURCE."""
1451+ # Setup
1452+ client = Mock ()
1453+ client .get_paginator .side_effect = ClientError (
1454+ error_response = {
1455+ 'Error' : {
1456+ 'Code' : 'AccessDenied' ,
1457+ 'Message' : 'Access Denied' ,
1458+ },
1459+ 'ResponseMetadata' : {
1460+ 'HTTPStatusCode' : 403 ,
1461+ },
1462+ },
1463+ operation_name = 'ListObjectsV2' ,
1464+ )
1465+ mock__create_s3_client .return_value = client
1466+
1467+ error_msg = (
1468+ "Could not download dataset 'fake_hotels' from bucket 'private_bucket'. "
1469+ 'Make sure the bucket name is correct. If the bucket is private '
1470+ 'make sure to provide your credentials.'
1471+ )
1472+
1473+ # Run and Assert
1474+ with pytest .raises (DemoResourceNotFoundError , match = error_msg ):
1475+ get_source (
1476+ modality = 'single_table' ,
1477+ dataset_name = 'fake_hotels' ,
1478+ s3_bucket_name = 'private_bucket' ,
1479+ )
1480+
1481+
1482+ @patch ('sdv.datasets.demo._create_s3_client' )
1483+ def test_get_readme_with_client_error (mock__create_s3_client ):
1484+ """Raise `DemoResourceNotFoundError` when an AWS ClientError occurs while fetching README."""
1485+ # Setup
1486+ client = Mock ()
1487+ client .get_paginator .side_effect = ClientError (
1488+ error_response = {
1489+ 'Error' : {
1490+ 'Code' : 'AccessDenied' ,
1491+ 'Message' : 'Access Denied' ,
1492+ },
1493+ 'ResponseMetadata' : {
1494+ 'HTTPStatusCode' : 403 ,
1495+ },
1496+ },
1497+ operation_name = 'ListObjectsV2' ,
1498+ )
1499+ mock__create_s3_client .return_value = client
1500+
1501+ error_msg = (
1502+ "Could not download dataset 'fake_hotels' from bucket 'private_bucket'. "
1503+ 'Make sure the bucket name is correct. If the bucket is private '
1504+ 'make sure to provide your credentials.'
1505+ )
1506+
1507+ # Run and Assert
1508+ with pytest .raises (DemoResourceNotFoundError , match = error_msg ):
1509+ get_readme (
1510+ modality = 'single_table' ,
1511+ dataset_name = 'fake_hotels' ,
1512+ s3_bucket_name = 'private_bucket' ,
1513+ )
0 commit comments