Skip to content

Commit a5f81c1

Browse files
committed
test(catalog): add tests for column description field
Add comprehensive tests for SqlColumn and CatalogDeclarativeColumn description field including: - Creation with/without description - API conversion (to_api/from_api) - Equality comparison - Integration with CatalogPdmSql risk: nonprod jira: DX-312
1 parent b4de457 commit a5f81c1

1 file changed

Lines changed: 194 additions & 0 deletions

File tree

packages/gooddata-sdk/tests/catalog/test_catalog_data_source.py

Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
CatalogDataSourceRedshift,
2121
CatalogDataSourceSnowflake,
2222
CatalogDataSourceVertica,
23+
CatalogDeclarativeColumn,
2324
CatalogDeclarativeDataSources,
2425
CatalogDeclarativeModel,
2526
CatalogGenerateLdmRequest,
@@ -852,3 +853,196 @@ def test_jdbc_urls_creation(
852853
),
853854
)
854855
assert data_source.url == url
856+
857+
858+
# CQ-1665: Tests for column description field
859+
class TestColumnDescription:
860+
"""Tests for column description field support (CQ-1665).
861+
862+
This feature exposes database column comments/descriptions through the scan model API
863+
and uses them when generating LDM (Logical Data Model).
864+
"""
865+
866+
def test_sql_column_with_description(self):
867+
"""Test that SqlColumn can be created with a description field."""
868+
column = SqlColumn(
869+
name="customer_id",
870+
data_type="INT",
871+
description="Unique identifier for the customer",
872+
)
873+
assert column.name == "customer_id"
874+
assert column.data_type == "INT"
875+
assert column.description == "Unique identifier for the customer"
876+
877+
def test_sql_column_without_description(self):
878+
"""Test that SqlColumn works without description (backward compatibility)."""
879+
column = SqlColumn(name="order_id", data_type="STRING")
880+
assert column.name == "order_id"
881+
assert column.data_type == "STRING"
882+
assert column.description is None
883+
884+
def test_sql_column_with_none_description(self):
885+
"""Test that SqlColumn accepts explicit None description."""
886+
column = SqlColumn(name="product_id", data_type="INT", description=None)
887+
assert column.name == "product_id"
888+
assert column.data_type == "INT"
889+
assert column.description is None
890+
891+
def test_sql_column_with_empty_description(self):
892+
"""Test that SqlColumn accepts empty string description."""
893+
column = SqlColumn(name="price", data_type="NUMERIC", description="")
894+
assert column.name == "price"
895+
assert column.data_type == "NUMERIC"
896+
assert column.description == ""
897+
898+
def test_sql_column_to_api_conversion(self):
899+
"""Test that SqlColumn with description converts to API client correctly."""
900+
column = SqlColumn(
901+
name="amount",
902+
data_type="NUMERIC",
903+
description="Total transaction amount in USD",
904+
)
905+
api_column = column.to_api()
906+
assert api_column.name == "amount"
907+
assert api_column.data_type == "NUMERIC"
908+
assert api_column.description == "Total transaction amount in USD"
909+
910+
def test_sql_column_from_api_conversion(self):
911+
"""Test that SqlColumn with description can be created from API client."""
912+
from gooddata_api_client.model.sql_column import SqlColumn as ApiSqlColumn
913+
914+
api_column = ApiSqlColumn(
915+
name="quantity",
916+
data_type="INT",
917+
description="Number of items purchased",
918+
)
919+
column = SqlColumn.from_api(api_column)
920+
assert column.name == "quantity"
921+
assert column.data_type == "INT"
922+
assert column.description == "Number of items purchased"
923+
924+
def test_sql_column_equality_with_description(self):
925+
"""Test that SqlColumn equality includes description field."""
926+
column1 = SqlColumn(name="id", data_type="INT", description="Primary key")
927+
column2 = SqlColumn(name="id", data_type="INT", description="Primary key")
928+
column3 = SqlColumn(name="id", data_type="INT", description="Different description")
929+
column4 = SqlColumn(name="id", data_type="INT")
930+
931+
assert column1 == column2
932+
assert column1 != column3
933+
assert column1 != column4
934+
935+
def test_catalog_pdm_sql_with_column_descriptions(self):
936+
"""Test that CatalogPdmSql works with columns that have descriptions."""
937+
pdm_sql = CatalogPdmSql(
938+
statement="SELECT * FROM customers",
939+
title="Customers with descriptions",
940+
columns=[
941+
SqlColumn(
942+
name="customer_id",
943+
data_type="INT",
944+
description="Unique customer identifier",
945+
),
946+
SqlColumn(
947+
name="customer_name",
948+
data_type="STRING",
949+
description="Full name of the customer",
950+
),
951+
SqlColumn(
952+
name="email",
953+
data_type="STRING",
954+
# No description - backward compatibility
955+
),
956+
],
957+
)
958+
assert len(pdm_sql.columns) == 3
959+
assert pdm_sql.columns[0].description == "Unique customer identifier"
960+
assert pdm_sql.columns[1].description == "Full name of the customer"
961+
assert pdm_sql.columns[2].description is None
962+
963+
964+
class TestCatalogDeclarativeColumnDescription:
965+
"""Tests for CatalogDeclarativeColumn description field support (CQ-1665).
966+
967+
CatalogDeclarativeColumn represents a column in the Physical Data Model (PDM).
968+
The description field stores the column comment/description from the database.
969+
"""
970+
971+
def test_declarative_column_with_description(self):
972+
"""Test that CatalogDeclarativeColumn can be created with a description."""
973+
column = CatalogDeclarativeColumn(
974+
name="customer_id",
975+
data_type="INT",
976+
description="Unique customer identifier",
977+
is_primary_key=True,
978+
)
979+
assert column.name == "customer_id"
980+
assert column.data_type == "INT"
981+
assert column.description == "Unique customer identifier"
982+
assert column.is_primary_key is True
983+
984+
def test_declarative_column_without_description(self):
985+
"""Test that CatalogDeclarativeColumn works without description (backward compatibility)."""
986+
column = CatalogDeclarativeColumn(
987+
name="order_id",
988+
data_type="STRING",
989+
is_primary_key=False,
990+
)
991+
assert column.name == "order_id"
992+
assert column.data_type == "STRING"
993+
assert column.description is None
994+
assert column.is_primary_key is False
995+
996+
def test_declarative_column_with_all_fields(self):
997+
"""Test CatalogDeclarativeColumn with all fields including description."""
998+
column = CatalogDeclarativeColumn(
999+
name="foreign_key_id",
1000+
data_type="INT",
1001+
description="Reference to parent table",
1002+
is_primary_key=False,
1003+
referenced_table_id="parent_table",
1004+
referenced_table_column="id",
1005+
)
1006+
assert column.name == "foreign_key_id"
1007+
assert column.data_type == "INT"
1008+
assert column.description == "Reference to parent table"
1009+
assert column.is_primary_key is False
1010+
assert column.referenced_table_id == "parent_table"
1011+
assert column.referenced_table_column == "id"
1012+
1013+
def test_declarative_column_to_api_conversion(self):
1014+
"""Test that CatalogDeclarativeColumn with description converts to API client correctly."""
1015+
column = CatalogDeclarativeColumn(
1016+
name="amount",
1017+
data_type="NUMERIC",
1018+
description="Transaction amount in base currency",
1019+
)
1020+
api_column = column.to_api()
1021+
assert api_column.name == "amount"
1022+
assert api_column.data_type == "NUMERIC"
1023+
assert api_column.description == "Transaction amount in base currency"
1024+
1025+
def test_declarative_column_from_api_conversion(self):
1026+
"""Test that CatalogDeclarativeColumn with description can be created from API client."""
1027+
from gooddata_api_client.model.declarative_column import DeclarativeColumn
1028+
1029+
api_column = DeclarativeColumn(
1030+
name="quantity",
1031+
data_type="INT",
1032+
description="Number of items in the order",
1033+
)
1034+
column = CatalogDeclarativeColumn.from_api(api_column)
1035+
assert column.name == "quantity"
1036+
assert column.data_type == "INT"
1037+
assert column.description == "Number of items in the order"
1038+
1039+
def test_declarative_column_equality_with_description(self):
1040+
"""Test that CatalogDeclarativeColumn equality includes description field."""
1041+
column1 = CatalogDeclarativeColumn(name="id", data_type="INT", description="Primary key")
1042+
column2 = CatalogDeclarativeColumn(name="id", data_type="INT", description="Primary key")
1043+
column3 = CatalogDeclarativeColumn(name="id", data_type="INT", description="Different")
1044+
column4 = CatalogDeclarativeColumn(name="id", data_type="INT")
1045+
1046+
assert column1 == column2
1047+
assert column1 != column3
1048+
assert column1 != column4

0 commit comments

Comments
 (0)