@@ -1400,3 +1400,86 @@ def test_create_or_update_mongo_connection(client):
14001400 assert sent ["db_type" ] == "mongodb"
14011401 assert sent ["dbpassword" ] == "hunter2"
14021402 assert sent ["replica_set" ] == "rs0"
1403+
1404+
1405+ def _database_connection (database_type : DatabaseType , ** extra ) -> DatabaseConnectionConfig :
1406+ return DatabaseConnectionConfig (
1407+ name = "conn" ,
1408+ host = "mydb.abc123.ap-southeast-2.rds.amazonaws.com" ,
1409+ port = 5432 ,
1410+ database = "db" ,
1411+ user = "user" ,
1412+ password = "secret" ,
1413+ database_type = database_type ,
1414+ ** extra ,
1415+ )
1416+
1417+
1418+ @pytest .mark .parametrize (
1419+ "database_type" ,
1420+ [
1421+ DatabaseType .postgres ,
1422+ DatabaseType .mysql ,
1423+ DatabaseType .mariadb ,
1424+ DatabaseType .oracle ,
1425+ DatabaseType .mssql ,
1426+ DatabaseType .db2_luw ,
1427+ DatabaseType .redshift ,
1428+ ],
1429+ )
1430+ def test_database_connection_sends_tagging_iam_role_for_aws_hosted_engines (database_type ):
1431+ """The engines that can sit behind an RDS, Aurora or Redshift endpoint can carry a tagging role."""
1432+ extra = (
1433+ {"s3_bucket_name" : "bucket" , "s3_redshift_iam_role" : "arn:aws:iam::123456789012:role/redshift-s3" }
1434+ if database_type is DatabaseType .redshift
1435+ else {}
1436+ )
1437+ conn = _database_connection (database_type , iam_role_arn = "arn:aws:iam::119836602066:role/tagger" , ** extra )
1438+
1439+ api_dict = conn .model_dump (exclude_none = True , by_alias = True , mode = "json" )
1440+
1441+ assert api_dict ["iam_role_arn" ] == "arn:aws:iam::119836602066:role/tagger"
1442+
1443+
1444+ @pytest .mark .parametrize (
1445+ "database_type" ,
1446+ [
1447+ DatabaseType .db2i ,
1448+ DatabaseType .informix ,
1449+ DatabaseType .saphana ,
1450+ # The two worth documenting rather than merely covering. `mssql_linked` inherits the field
1451+ # through `MssqlLinkedServerConnectionConfig` and is excluded only by its own enum value;
1452+ # `databricks_lakebase` is AWS-hosted, so it reads like an omission from the taggable set
1453+ # until you know it presents no endpoint tagging can act on.
1454+ DatabaseType .mssql_linked ,
1455+ DatabaseType .databricks_lakebase ,
1456+ ],
1457+ )
1458+ def test_database_connection_omits_tagging_iam_role_for_engines_that_cannot_be_aws_resources (database_type ):
1459+ """Mirrors how `s3_redshift_iam_role` is pruned: the server has no such field on these engines."""
1460+ conn = _database_connection (database_type , iam_role_arn = "arn:aws:iam::119836602066:role/tagger" )
1461+
1462+ api_dict = conn .model_dump (exclude_none = True , by_alias = True , mode = "json" )
1463+
1464+ assert "iam_role_arn" not in api_dict
1465+
1466+
1467+ def test_database_connection_omits_tagging_iam_role_when_unset ():
1468+ conn = _database_connection (DatabaseType .postgres )
1469+
1470+ assert "iam_role_arn" not in conn .model_dump (exclude_none = True , by_alias = True , mode = "json" )
1471+
1472+
1473+ def test_redshift_connection_keeps_its_cluster_s3_role_separate_from_its_tagging_role ():
1474+ """Two ARNs with different meanings: the cluster's own S3 access, and the role DataMasque assumes to tag."""
1475+ conn = _database_connection (
1476+ DatabaseType .redshift ,
1477+ s3_bucket_name = "bucket" ,
1478+ s3_redshift_iam_role = "arn:aws:iam::123456789012:role/redshift-s3" ,
1479+ iam_role_arn = "arn:aws:iam::119836602066:role/tagger" ,
1480+ )
1481+
1482+ api_dict = conn .model_dump (exclude_none = True , by_alias = True , mode = "json" )
1483+
1484+ assert api_dict ["s3_redshift_iam_role" ] == "arn:aws:iam::123456789012:role/redshift-s3"
1485+ assert api_dict ["iam_role_arn" ] == "arn:aws:iam::119836602066:role/tagger"
0 commit comments