|
1 | 1 | # (C) 2026 GoodData Corporation |
2 | 2 | from __future__ import annotations |
3 | 3 |
|
| 4 | +from pathlib import Path |
| 5 | + |
4 | 6 | from gooddata_sdk import ( |
5 | 7 | CatalogCreatePipeTableRequest, |
6 | 8 | CatalogDatabaseInstance, |
7 | 9 | CatalogPipeTable, |
8 | 10 | CatalogPipeTableSummary, |
9 | 11 | CatalogProvisionDatabaseInstanceRequest, |
10 | 12 | CatalogServiceInfo, |
| 13 | + GoodDataSdk, |
11 | 14 | ) |
12 | 15 | from gooddata_sdk.catalog.data_source.entity_model.data_source import CatalogDataSourceAiLakehouse |
| 16 | +from tests_support.vcrpy_utils import get_vcr |
| 17 | + |
| 18 | +from .conftest import safe_delete |
| 19 | + |
| 20 | +gd_vcr = get_vcr() |
| 21 | + |
| 22 | +_current_dir = Path(__file__).parent.absolute() |
| 23 | +_fixtures_dir = _current_dir / "fixtures" / "ai_lake" |
| 24 | + |
| 25 | +_TEST_INSTANCE_ID = "test-instance" |
| 26 | +_TEST_TABLE_NAME = "test_pipe_table" |
13 | 27 |
|
14 | 28 |
|
15 | 29 | class TestCatalogDatabaseInstance: |
@@ -142,3 +156,80 @@ def test_ailakehouse_type(self): |
142 | 156 | ) |
143 | 157 | assert ds.type == "AILAKEHOUSE" |
144 | 158 | assert ds.schema == "" |
| 159 | + |
| 160 | + |
| 161 | +# --------------------------------------------------------------------------- |
| 162 | +# Integration tests — cassettes recorded against a live GoodData backend. |
| 163 | +# Run with OVERWRITE=1 to record; subsequent runs replay from cassette. |
| 164 | +# --------------------------------------------------------------------------- |
| 165 | + |
| 166 | + |
| 167 | +@gd_vcr.use_cassette(str(_fixtures_dir / "list_database_instances.yaml")) |
| 168 | +def test_list_database_instances(test_config): |
| 169 | + sdk = GoodDataSdk.create(host_=test_config["host"], token_=test_config["token"]) |
| 170 | + instances = sdk.catalog_ai_lake.list_database_instances() |
| 171 | + assert isinstance(instances, list) |
| 172 | + for instance in instances: |
| 173 | + assert isinstance(instance, CatalogDatabaseInstance) |
| 174 | + assert instance.id |
| 175 | + assert instance.name |
| 176 | + |
| 177 | + |
| 178 | +@gd_vcr.use_cassette(str(_fixtures_dir / "provision_get_deprovision_database_instance.yaml")) |
| 179 | +def test_provision_get_deprovision_database_instance(test_config): |
| 180 | + sdk = GoodDataSdk.create(host_=test_config["host"], token_=test_config["token"]) |
| 181 | + request = CatalogProvisionDatabaseInstanceRequest(name=_TEST_INSTANCE_ID) |
| 182 | + try: |
| 183 | + sdk.catalog_ai_lake.provision_database_instance(request) |
| 184 | + instance = sdk.catalog_ai_lake.get_database_instance(_TEST_INSTANCE_ID) |
| 185 | + assert isinstance(instance, CatalogDatabaseInstance) |
| 186 | + assert instance.name == _TEST_INSTANCE_ID |
| 187 | + finally: |
| 188 | + safe_delete(sdk.catalog_ai_lake.deprovision_database_instance, _TEST_INSTANCE_ID) |
| 189 | + |
| 190 | + |
| 191 | +@gd_vcr.use_cassette(str(_fixtures_dir / "list_pipe_tables.yaml")) |
| 192 | +def test_list_pipe_tables(test_config): |
| 193 | + sdk = GoodDataSdk.create(host_=test_config["host"], token_=test_config["token"]) |
| 194 | + instances = sdk.catalog_ai_lake.list_database_instances() |
| 195 | + if not instances: |
| 196 | + return |
| 197 | + instance_id = instances[0].id |
| 198 | + pipe_tables = sdk.catalog_ai_lake.list_pipe_tables(instance_id) |
| 199 | + assert isinstance(pipe_tables, list) |
| 200 | + for pt in pipe_tables: |
| 201 | + assert isinstance(pt, CatalogPipeTableSummary) |
| 202 | + assert pt.table_name |
| 203 | + |
| 204 | + |
| 205 | +@gd_vcr.use_cassette(str(_fixtures_dir / "create_get_delete_pipe_table.yaml")) |
| 206 | +def test_create_get_delete_pipe_table(test_config): |
| 207 | + sdk = GoodDataSdk.create(host_=test_config["host"], token_=test_config["token"]) |
| 208 | + instances = sdk.catalog_ai_lake.list_database_instances() |
| 209 | + assert instances, "Need at least one database instance to test pipe table operations" |
| 210 | + instance_id = instances[0].id |
| 211 | + request = CatalogCreatePipeTableRequest( |
| 212 | + path_prefix="test/data/", |
| 213 | + source_storage_name="test-storage", |
| 214 | + table_name=_TEST_TABLE_NAME, |
| 215 | + ) |
| 216 | + try: |
| 217 | + sdk.catalog_ai_lake.create_pipe_table(instance_id, request) |
| 218 | + table = sdk.catalog_ai_lake.get_pipe_table(instance_id, _TEST_TABLE_NAME) |
| 219 | + assert isinstance(table, CatalogPipeTable) |
| 220 | + assert table.table_name == _TEST_TABLE_NAME |
| 221 | + pipe_tables = sdk.catalog_ai_lake.list_pipe_tables(instance_id) |
| 222 | + table_names = [pt.table_name for pt in pipe_tables] |
| 223 | + assert _TEST_TABLE_NAME in table_names |
| 224 | + finally: |
| 225 | + safe_delete(sdk.catalog_ai_lake.delete_pipe_table, instance_id, _TEST_TABLE_NAME) |
| 226 | + |
| 227 | + |
| 228 | +@gd_vcr.use_cassette(str(_fixtures_dir / "list_services.yaml")) |
| 229 | +def test_list_services(test_config): |
| 230 | + sdk = GoodDataSdk.create(host_=test_config["host"], token_=test_config["token"]) |
| 231 | + services = sdk.catalog_ai_lake.list_services() |
| 232 | + assert isinstance(services, list) |
| 233 | + for svc in services: |
| 234 | + assert isinstance(svc, CatalogServiceInfo) |
| 235 | + assert svc.name |
0 commit comments