257 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			257 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| """Unit tests for lakeformation-supported APIs."""
 | |
| import boto3
 | |
| import pytest
 | |
| 
 | |
| from botocore.exceptions import ClientError
 | |
| from moto import mock_lakeformation
 | |
| from moto.core import DEFAULT_ACCOUNT_ID
 | |
| 
 | |
| # See our Development Tips on writing tests for hints on how to write good tests:
 | |
| # http://docs.getmoto.org/en/latest/docs/contributing/development_tips/tests.html
 | |
| 
 | |
| 
 | |
| @mock_lakeformation
 | |
| def test_register_resource():
 | |
|     client = boto3.client("lakeformation", region_name="us-east-2")
 | |
|     resp = client.register_resource(
 | |
|         ResourceArn="some arn",
 | |
|     )
 | |
| 
 | |
|     del resp["ResponseMetadata"]
 | |
|     assert resp == {}
 | |
| 
 | |
| 
 | |
| @mock_lakeformation
 | |
| def test_describe_resource():
 | |
|     client = boto3.client("lakeformation", region_name="us-east-2")
 | |
|     client.register_resource(ResourceArn="some arn", RoleArn="role arn")
 | |
| 
 | |
|     resp = client.describe_resource(ResourceArn="some arn")
 | |
| 
 | |
|     assert resp["ResourceInfo"] == {"ResourceArn": "some arn", "RoleArn": "role arn"}
 | |
| 
 | |
| 
 | |
| @mock_lakeformation
 | |
| def test_deregister_resource():
 | |
|     client = boto3.client("lakeformation", region_name="us-east-2")
 | |
|     client.register_resource(ResourceArn="some arn")
 | |
|     client.deregister_resource(ResourceArn="some arn")
 | |
| 
 | |
|     with pytest.raises(ClientError) as exc:
 | |
|         client.describe_resource(ResourceArn="some arn")
 | |
|     err = exc.value.response["Error"]
 | |
|     assert err["Code"] == "EntityNotFoundException"
 | |
| 
 | |
| 
 | |
| @mock_lakeformation
 | |
| def test_list_resources():
 | |
|     client = boto3.client("lakeformation", region_name="us-east-2")
 | |
| 
 | |
|     resp = client.list_resources()
 | |
|     assert resp["ResourceInfoList"] == []
 | |
| 
 | |
|     client.register_resource(ResourceArn="some arn")
 | |
|     client.register_resource(ResourceArn="another arn")
 | |
| 
 | |
|     resp = client.list_resources()
 | |
|     assert len(resp["ResourceInfoList"]) == 2
 | |
| 
 | |
| 
 | |
| @mock_lakeformation
 | |
| def test_data_lake_settings():
 | |
|     client = boto3.client("lakeformation", region_name="us-east-2")
 | |
|     resp = client.get_data_lake_settings()
 | |
|     assert resp["DataLakeSettings"] == {
 | |
|         "DataLakeAdmins": [],
 | |
|         "CreateDatabaseDefaultPermissions": [
 | |
|             {
 | |
|                 "Principal": {"DataLakePrincipalIdentifier": "IAM_ALLOWED_PRINCIPALS"},
 | |
|                 "Permissions": ["ALL"],
 | |
|             }
 | |
|         ],
 | |
|         "CreateTableDefaultPermissions": [
 | |
|             {
 | |
|                 "Principal": {"DataLakePrincipalIdentifier": "IAM_ALLOWED_PRINCIPALS"},
 | |
|                 "Permissions": ["ALL"],
 | |
|             }
 | |
|         ],
 | |
|         "TrustedResourceOwners": [],
 | |
|         "AllowExternalDataFiltering": False,
 | |
|         "ExternalDataFilteringAllowList": [],
 | |
|     }
 | |
| 
 | |
|     settings = {"DataLakeAdmins": [{"DataLakePrincipalIdentifier": "dlpi"}]}
 | |
|     client.put_data_lake_settings(DataLakeSettings=settings)
 | |
| 
 | |
|     resp = client.get_data_lake_settings()
 | |
|     assert resp["DataLakeSettings"] == settings
 | |
| 
 | |
| 
 | |
| @mock_lakeformation
 | |
| def test_list_permissions():
 | |
|     client = boto3.client("lakeformation", region_name="eu-west-2")
 | |
| 
 | |
|     resp = client.grant_permissions(
 | |
|         Principal={"DataLakePrincipalIdentifier": "asdf"},
 | |
|         Resource={"Database": {"Name": "db"}},
 | |
|         Permissions=["ALL"],
 | |
|         PermissionsWithGrantOption=["SELECT"],
 | |
|     )
 | |
| 
 | |
|     del resp["ResponseMetadata"]
 | |
|     assert resp == {}
 | |
| 
 | |
|     # list all
 | |
|     resp = client.list_permissions()
 | |
|     assert resp["PrincipalResourcePermissions"] == [
 | |
|         {
 | |
|             "Principal": {"DataLakePrincipalIdentifier": "asdf"},
 | |
|             "Resource": {"Database": {"Name": "db"}},
 | |
|             "Permissions": ["ALL"],
 | |
|             "PermissionsWithGrantOption": ["SELECT"],
 | |
|         }
 | |
|     ]
 | |
| 
 | |
| 
 | |
| @mock_lakeformation
 | |
| def test_revoke_permissions():
 | |
|     client = boto3.client("lakeformation", region_name="eu-west-2")
 | |
| 
 | |
|     client.grant_permissions(
 | |
|         Principal={"DataLakePrincipalIdentifier": "asdf"},
 | |
|         Resource={"Database": {"Name": "db"}},
 | |
|         Permissions=["SELECT", "ALTER", "DROP"],
 | |
|         PermissionsWithGrantOption=["SELECT", "DROP"],
 | |
|     )
 | |
| 
 | |
|     resp = client.revoke_permissions(
 | |
|         Principal={"DataLakePrincipalIdentifier": "asdf"},
 | |
|         Resource={"Database": {"Name": "db"}},
 | |
|         Permissions=["DROP"],
 | |
|     )
 | |
| 
 | |
|     del resp["ResponseMetadata"]
 | |
|     assert resp == {}
 | |
| 
 | |
|     # list all
 | |
|     resp = client.list_permissions()
 | |
|     assert resp["PrincipalResourcePermissions"] == [
 | |
|         {
 | |
|             "Principal": {"DataLakePrincipalIdentifier": "asdf"},
 | |
|             "Resource": {"Database": {"Name": "db"}},
 | |
|             "Permissions": ["SELECT", "ALTER"],
 | |
|             "PermissionsWithGrantOption": ["SELECT", "DROP"],
 | |
|         }
 | |
|     ]
 | |
| 
 | |
| 
 | |
| @mock_lakeformation
 | |
| def test_lf_tags():
 | |
|     client = boto3.client("lakeformation", region_name="eu-west-2")
 | |
| 
 | |
|     client.create_lf_tag(TagKey="tag1", TagValues=["1a", "1b"])
 | |
|     client.create_lf_tag(TagKey="tag2", TagValues=["2a", "2b"])
 | |
|     client.create_lf_tag(TagKey="tag3", TagValues=["3a", "3b"])
 | |
| 
 | |
|     resp = client.get_lf_tag(TagKey="tag1")
 | |
|     assert resp["CatalogId"] == DEFAULT_ACCOUNT_ID
 | |
|     assert resp["TagKey"] == "tag1"
 | |
|     assert resp["TagValues"] == ["1a", "1b"]
 | |
| 
 | |
|     resp = client.list_lf_tags()
 | |
|     assert len(resp["LFTags"]) == 3
 | |
|     assert {
 | |
|         "CatalogId": DEFAULT_ACCOUNT_ID,
 | |
|         "TagKey": "tag1",
 | |
|         "TagValues": ["1a", "1b"],
 | |
|     } in resp["LFTags"]
 | |
|     assert {
 | |
|         "CatalogId": DEFAULT_ACCOUNT_ID,
 | |
|         "TagKey": "tag2",
 | |
|         "TagValues": ["2a", "2b"],
 | |
|     } in resp["LFTags"]
 | |
|     assert {
 | |
|         "CatalogId": DEFAULT_ACCOUNT_ID,
 | |
|         "TagKey": "tag3",
 | |
|         "TagValues": ["3a", "3b"],
 | |
|     } in resp["LFTags"]
 | |
| 
 | |
|     client.delete_lf_tag(TagKey="tag2")
 | |
| 
 | |
|     resp = client.list_lf_tags()
 | |
|     assert len(resp["LFTags"]) == 2
 | |
|     assert {
 | |
|         "CatalogId": DEFAULT_ACCOUNT_ID,
 | |
|         "TagKey": "tag1",
 | |
|         "TagValues": ["1a", "1b"],
 | |
|     } in resp["LFTags"]
 | |
|     assert {
 | |
|         "CatalogId": DEFAULT_ACCOUNT_ID,
 | |
|         "TagKey": "tag3",
 | |
|         "TagValues": ["3a", "3b"],
 | |
|     } in resp["LFTags"]
 | |
| 
 | |
| 
 | |
| @mock_lakeformation
 | |
| def test_list_data_cells_filter():
 | |
|     client = boto3.client("lakeformation", region_name="eu-west-2")
 | |
| 
 | |
|     resp = client.list_data_cells_filter()
 | |
|     assert resp["DataCellsFilters"] == []
 | |
| 
 | |
| 
 | |
| @mock_lakeformation
 | |
| def test_batch_revoke_permissions():
 | |
|     client = boto3.client("lakeformation", region_name="eu-west-2")
 | |
| 
 | |
|     client.batch_grant_permissions(
 | |
|         Entries=[
 | |
|             {
 | |
|                 "Id": "id1",
 | |
|                 "Principal": {"DataLakePrincipalIdentifier": "id1"},
 | |
|                 "Resource": {"Database": {"Name": "db"}},
 | |
|                 "Permissions": ["SELECT", "ALTER", "DROP"],
 | |
|                 "PermissionsWithGrantOption": ["SELECT", "DROP"],
 | |
|             },
 | |
|             {
 | |
|                 "Id": "id2",
 | |
|                 "Principal": {"DataLakePrincipalIdentifier": "id2"},
 | |
|                 "Resource": {"Database": {"Name": "db"}},
 | |
|                 "Permissions": ["SELECT", "ALTER", "DROP"],
 | |
|                 "PermissionsWithGrantOption": ["SELECT", "DROP"],
 | |
|             },
 | |
|             {
 | |
|                 "Id": "id3",
 | |
|                 "Principal": {"DataLakePrincipalIdentifier": "id3"},
 | |
|                 "Resource": {"Database": {"Name": "db"}},
 | |
|                 "Permissions": ["SELECT", "ALTER", "DROP"],
 | |
|                 "PermissionsWithGrantOption": ["SELECT", "DROP"],
 | |
|             },
 | |
|         ]
 | |
|     )
 | |
| 
 | |
|     resp = client.list_permissions()
 | |
|     assert len(resp["PrincipalResourcePermissions"]) == 3
 | |
| 
 | |
|     client.batch_revoke_permissions(
 | |
|         Entries=[
 | |
|             {
 | |
|                 "Id": "id1",
 | |
|                 "Principal": {"DataLakePrincipalIdentifier": "id2"},
 | |
|                 "Resource": {"Database": {"Name": "db"}},
 | |
|                 "Permissions": ["SELECT", "ALTER", "DROP"],
 | |
|                 "PermissionsWithGrantOption": ["SELECT", "DROP"],
 | |
|             },
 | |
|             {
 | |
|                 "Id": "id2",
 | |
|                 "Principal": {"DataLakePrincipalIdentifier": "id3"},
 | |
|                 "Resource": {"Database": {"Name": "db"}},
 | |
|                 "Permissions": ["SELECT", "ALTER", "DROP"],
 | |
|                 "PermissionsWithGrantOption": ["SELECT", "DROP"],
 | |
|             },
 | |
|         ]
 | |
|     )
 | |
| 
 | |
|     resp = client.list_permissions()
 | |
|     assert len(resp["PrincipalResourcePermissions"]) == 1
 |