chore: migrate GRACE-Poly anchors to hierarchical dotted naming

Systematic rename of all semantic anchors (#region, [DEF], @RELATION)
across 1400+ files — backend Python, frontend Svelte/TS, specs, docs:
- Flat anchors become Namespace.Module.Entity
- @RELATION references updated to match new anchor paths
- Zero business logic changes
This commit is contained in:
root
2026-07-22 11:48:15 +03:00
parent 34393adf7e
commit 632b730fff
1438 changed files with 17031 additions and 16802 deletions

View File

@@ -1,6 +1,6 @@
# #region Test.DatasetsApi [C:3] [TYPE Module] [SEMANTICS test, datasets, api, metrics, inline-edit]
# @BRIEF Contract tests for dataset endpoints — list+stats, detail+metrics, inline-edit descriptions, map-columns, generate-docs.
# @RELATION BINDS_TO -> [DatasetsApi]
# @RELATION BINDS_TO -> [Api.Datasets.DatasetsApi]
# @TEST_EDGE: missing_env -> 404 when env not found
# @TEST_EDGE: invalid_page -> 400 when page < 1 or page_size > 100
# @TEST_EDGE: external_superset_fail -> 503 when Superset/API fails
@@ -22,7 +22,7 @@ from src.dependencies import (
client = TestClient(app)
# #region mock_user [C:2] [TYPE Function]
# #region Test.DatasetsApi.MockUser [C:2] [TYPE Function]
# @BRIEF Create a mock user with Admin role and all permissions for testing.
def _make_mock_user():
admin_role = MagicMock()
@@ -35,7 +35,8 @@ def _make_mock_user():
return mock_user
# #region mock_deps [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.MockUser
# #region Test.DatasetsApi.MockDeps [C:2] [TYPE Function]
# @BRIEF Provide dependency override fixture for dataset route tests.
# @TEST_FIXTURE: dataset_route_overrides -> INLINE_JSON
@pytest.fixture
@@ -100,7 +101,8 @@ def mock_deps():
app.dependency_overrides.clear()
# #region test_get_datasets_returns_stats [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.MockDeps
# #region Test.DatasetsApi.TestGetDatasetsReturnsStats [C:2] [TYPE Function]
# @BRIEF Verify GET /api/datasets returns stats object with correct counts.
# @TEST_CONTRACT: datasets_list -> datasets with stats payload
# @TEST_SCENARIO: datasets_with_stats -> HTTP 200 returns datasets, stats, and pagination.
@@ -122,7 +124,8 @@ def test_get_datasets_returns_stats(mock_deps):
assert len(data["datasets"]) == 3
# #region test_get_datasets_filter_unmapped [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestGetDatasetsReturnsStats
# #region Test.DatasetsApi.TestGetDatasetsFilterUnmapped [C:2] [TYPE Function]
# @BRIEF Verify server-side filtering by unmapped datasets.
# @TEST_SCENARIO: filter_unmapped -> Only returns datasets with mapped=0.
def test_get_datasets_filter_unmapped(mock_deps):
@@ -139,7 +142,8 @@ def test_get_datasets_filter_unmapped(mock_deps):
assert data["datasets"][0]["table_name"] == "orders"
# #region test_get_datasets_filter_mapped [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestGetDatasetsFilterUnmapped
# #region Test.DatasetsApi.TestGetDatasetsFilterMapped [C:2] [TYPE Function]
# @BRIEF Verify server-side filtering by mapped datasets.
def test_get_datasets_filter_mapped(mock_deps):
response = client.get(
@@ -152,7 +156,8 @@ def test_get_datasets_filter_mapped(mock_deps):
assert data["datasets"][0]["table_name"] == "users"
# #region test_get_datasets_filter_linked [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestGetDatasetsFilterMapped
# #region Test.DatasetsApi.TestGetDatasetsFilterLinked [C:2] [TYPE Function]
# @BRIEF Verify server-side filtering by datasets linked to dashboards.
def test_get_datasets_filter_linked(mock_deps):
response = client.get(
@@ -165,7 +170,8 @@ def test_get_datasets_filter_linked(mock_deps):
assert data["datasets"][0]["table_name"] == "users"
# #region test_get_datasets_filter_all [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestGetDatasetsFilterLinked
# #region Test.DatasetsApi.TestGetDatasetsFilterAll [C:2] [TYPE Function]
# @BRIEF Verify filter=all returns all datasets (same as no filter).
def test_get_datasets_filter_all(mock_deps):
response = client.get(
@@ -176,7 +182,8 @@ def test_get_datasets_filter_all(mock_deps):
assert data["total"] == 3
# #region test_get_dataset_detail_returns_metrics [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestGetDatasetsFilterAll
# #region Test.DatasetsApi.TestGetDatasetDetailReturnsMetrics [C:2] [TYPE Function]
# @BRIEF Verify GET /api/datasets/{id} returns metrics and metric_count.
# @TEST_SCENARIO: detail_with_metrics -> Response includes metrics list and metric_count.
def test_get_dataset_detail_returns_metrics(mock_deps):
@@ -220,7 +227,8 @@ def test_get_dataset_detail_returns_metrics(mock_deps):
assert data["metrics"][0]["expression"] == "COUNT(*)"
# #region test_update_column_description [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestGetDatasetDetailReturnsMetrics
# #region Test.DatasetsApi.TestUpdateColumnDescription [C:2] [TYPE Function]
# @BRIEF Verify PUT /api/datasets/{id}/columns/{col_id}/description saves description.
# @TEST_SCENARIO: save_column_desc -> Saves and returns updated description.
def test_update_column_description(mock_deps):
@@ -257,7 +265,8 @@ def test_update_column_description(mock_deps):
assert update_call[1]["override_columns"] is False
# #region test_update_metric_description [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestUpdateColumnDescription
# #region Test.DatasetsApi.TestUpdateMetricDescription [C:2] [TYPE Function]
# @BRIEF Verify PUT /api/datasets/{id}/metrics/{metric_id}/description saves correctly.
# @TEST_SCENARIO: save_metric_desc -> Saves and returns updated description.
def test_update_metric_description(mock_deps):
@@ -287,7 +296,8 @@ def test_update_metric_description(mock_deps):
assert data["description"] == "Total row count"
# #region test_update_column_description_not_found [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestUpdateMetricDescription
# #region Test.DatasetsApi.TestUpdateColumnDescriptionNotFound [C:2] [TYPE Function]
# @BRIEF Verify 404 when column not found.
def test_update_column_description_not_found(mock_deps):
with patch("src.api.routes.datasets.AsyncSupersetClient") as MockClient:
@@ -310,7 +320,8 @@ def test_update_column_description_not_found(mock_deps):
assert response.status_code == 404
# #region test_update_column_description_validation [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestUpdateColumnDescriptionNotFound
# #region Test.DatasetsApi.TestUpdateColumnDescriptionValidation [C:2] [TYPE Function]
# @BRIEF Verify 400 when description exceeds max length.
def test_update_column_description_validation(mock_deps):
response = client.put(
@@ -320,7 +331,8 @@ def test_update_column_description_validation(mock_deps):
assert response.status_code == 400
# #region test_get_datasets_superset_503 [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestUpdateColumnDescriptionValidation
# #region Test.DatasetsApi.TestGetDatasetsSuperset503 [C:2] [TYPE Function]
# @BRIEF Verify GET /api/datasets returns 503 when Superset/ResourceService throws.
# @TEST_SCENARIO: upstream_superset_failure -> 503 with error detail.
# @TEST_INVARIANT: upstream_failure_503 -> VERIFIED_BY: [superset_failure]
@@ -345,7 +357,8 @@ def test_get_datasets_superset_503(mock_deps):
app.dependency_overrides[get_resource_service] = None
# #region test_update_column_description_superset_502 [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestGetDatasetsSuperset503
# #region Test.DatasetsApi.TestUpdateColumnDescriptionSuperset502 [C:2] [TYPE Function]
# @BRIEF Verify PUT column description returns 502 when SupersetClient.update_dataset throws.
# @TEST_SCENARIO: superset_put_failure -> 502 with error detail.
def test_update_column_description_superset_502(mock_deps):
@@ -374,7 +387,8 @@ def test_update_column_description_superset_502(mock_deps):
assert "Superset" in data.get("detail", "")
# #region test_update_column_description_strips_html [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestUpdateColumnDescriptionSuperset502
# #region Test.DatasetsApi.TestUpdateColumnDescriptionStripsHtml [C:2] [TYPE Function]
# @BRIEF Verify HTML tags are stripped from description before saving.
# @TEST_SCENARIO: html_in_description -> HTML tags stripped, clean text saved.
def test_update_column_description_strips_html(mock_deps):
@@ -409,7 +423,8 @@ def test_update_column_description_strips_html(mock_deps):
assert updated_columns[0]["description"] == "Hello World with alert('xss')"
# #region test_dataset_item_has_metric_count [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestUpdateColumnDescriptionStripsHtml
# #region Test.DatasetsApi.TestDatasetItemHasMetricCount [C:2] [TYPE Function]
# @BRIEF Verify DatasetItem in list response includes metric_count field.
def test_dataset_item_has_metric_count(mock_deps):
response = client.get(
@@ -422,7 +437,8 @@ def test_dataset_item_has_metric_count(mock_deps):
assert isinstance(ds["metric_count"], int)
# #region test_get_dataset_ids [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestDatasetItemHasMetricCount
# #region Test.DatasetsApi.TestGetDatasetIds [C:2] [TYPE Function]
# @BRIEF Verify GET /api/datasets/ids returns list of dataset IDs.
def test_get_dataset_ids(mock_deps):
response = client.get("/api/datasets/ids?env_id=ss-dev")
@@ -434,7 +450,8 @@ def test_get_dataset_ids(mock_deps):
assert 1 in data["dataset_ids"]
# #region test_get_dataset_ids_search [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestGetDatasetIds
# #region Test.DatasetsApi.TestGetDatasetIdsSearch [C:2] [TYPE Function]
# @BRIEF Verify GET /api/datasets/ids with search filter.
def test_get_dataset_ids_search(mock_deps):
response = client.get("/api/datasets/ids?env_id=ss-dev&search=users")
@@ -443,14 +460,16 @@ def test_get_dataset_ids_search(mock_deps):
assert data["dataset_ids"] == [1]
# #region test_get_dataset_ids_env_not_found [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestGetDatasetIdsSearch
# #region Test.DatasetsApi.TestGetDatasetIdsEnvNotFound [C:2] [TYPE Function]
# @BRIEF Verify 404 when env not found.
def test_get_dataset_ids_env_not_found(mock_deps):
response = client.get("/api/datasets/ids?env_id=nonexistent")
assert response.status_code == 404
# #region test_get_dataset_ids_503 [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestGetDatasetIdsEnvNotFound
# #region Test.DatasetsApi.TestGetDatasetIds503 [C:2] [TYPE Function]
# @BRIEF Verify 503 when Superset fails.
def test_get_dataset_ids_503(mock_deps):
from src.dependencies import get_resource_service
@@ -466,28 +485,32 @@ def test_get_dataset_ids_503(mock_deps):
app.dependency_overrides[get_resource_service] = None
# #region test_get_datasets_invalid_page [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestGetDatasetIds503
# #region Test.DatasetsApi.TestGetDatasetsInvalidPage [C:2] [TYPE Function]
# @BRIEF Verify 400 when page < 1.
def test_get_datasets_invalid_page(mock_deps):
response = client.get("/api/datasets?env_id=ss-dev&page=0")
assert response.status_code == 400
# #region test_get_datasets_invalid_page_size [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestGetDatasetsInvalidPage
# #region Test.DatasetsApi.TestGetDatasetsInvalidPageSize [C:2] [TYPE Function]
# @BRIEF Verify 400 when page_size > 100.
def test_get_datasets_invalid_page_size(mock_deps):
response = client.get("/api/datasets?env_id=ss-dev&page_size=200")
assert response.status_code == 400
# #region test_get_datasets_env_not_found [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestGetDatasetsInvalidPageSize
# #region Test.DatasetsApi.TestGetDatasetsEnvNotFound [C:2] [TYPE Function]
# @BRIEF Verify 404 when environment not found.
def test_get_datasets_env_not_found(mock_deps):
response = client.get("/api/datasets?env_id=nonexistent&page=1&page_size=10")
assert response.status_code == 404
# #region test_get_datasets_search_filter [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestGetDatasetsEnvNotFound
# #region Test.DatasetsApi.TestGetDatasetsSearchFilter [C:2] [TYPE Function]
# @BRIEF Verify search filter narrows results.
def test_get_datasets_search_filter(mock_deps):
response = client.get("/api/datasets?env_id=ss-dev&search=users&page=1&page_size=10")
@@ -497,7 +520,8 @@ def test_get_datasets_search_filter(mock_deps):
assert data["datasets"][0]["table_name"] == "users"
# #region test_get_datasets_pagination [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestGetDatasetsSearchFilter
# #region Test.DatasetsApi.TestGetDatasetsPagination [C:2] [TYPE Function]
# @BRIEF Verify pagination works.
def test_get_datasets_pagination(mock_deps):
response = client.get("/api/datasets?env_id=ss-dev&page=1&page_size=2")
@@ -507,7 +531,8 @@ def test_get_datasets_pagination(mock_deps):
assert data["total_pages"] == 2
# #region test_map_columns [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestGetDatasetsPagination
# #region Test.DatasetsApi.TestMapColumns [C:2] [TYPE Function]
# @BRIEF Verify POST /api/datasets/map-columns creates mapping task.
def test_map_columns(mock_deps):
from src.dependencies import get_task_manager
@@ -544,7 +569,8 @@ def test_map_columns(mock_deps):
app.dependency_overrides.pop(has_permission("plugin:mapper", "EXECUTE"), None)
# #region test_map_columns_no_dataset_ids [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestMapColumns
# #region Test.DatasetsApi.TestMapColumnsNoDatasetIds [C:2] [TYPE Function]
# @BRIEF Verify 400 when no dataset IDs provided.
def test_map_columns_no_dataset_ids(mock_deps):
from src.dependencies import has_permission
@@ -560,7 +586,8 @@ def test_map_columns_no_dataset_ids(mock_deps):
app.dependency_overrides.pop(has_permission("plugin:mapper", "EXECUTE"), None)
# #region test_map_columns_invalid_source_type [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestMapColumnsNoDatasetIds
# #region Test.DatasetsApi.TestMapColumnsInvalidSourceType [C:2] [TYPE Function]
# @BRIEF Verify 400 when invalid source type.
def test_map_columns_invalid_source_type(mock_deps):
from src.dependencies import has_permission
@@ -576,7 +603,8 @@ def test_map_columns_invalid_source_type(mock_deps):
app.dependency_overrides.pop(has_permission("plugin:mapper", "EXECUTE"), None)
# #region test_map_columns_missing_database_id [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestMapColumnsInvalidSourceType
# #region Test.DatasetsApi.TestMapColumnsMissingDatabaseId [C:2] [TYPE Function]
# @BRIEF Verify 400 when sqllab source without database_id.
def test_map_columns_missing_database_id(mock_deps):
from src.dependencies import has_permission
@@ -592,7 +620,8 @@ def test_map_columns_missing_database_id(mock_deps):
app.dependency_overrides.pop(has_permission("plugin:mapper", "EXECUTE"), None)
# #region test_map_columns_env_not_found [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestMapColumnsMissingDatabaseId
# #region Test.DatasetsApi.TestMapColumnsEnvNotFound [C:2] [TYPE Function]
# @BRIEF Verify 404 when environment not found.
def test_map_columns_env_not_found(mock_deps):
from src.dependencies import has_permission
@@ -613,7 +642,8 @@ def test_map_columns_env_not_found(mock_deps):
app.dependency_overrides.pop(has_permission("plugin:mapper", "EXECUTE"), None)
# #region test_map_columns_xlsx_source [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestMapColumnsEnvNotFound
# #region Test.DatasetsApi.TestMapColumnsXlsxSource [C:2] [TYPE Function]
# @BRIEF Verify xlsx source type works.
def test_map_columns_xlsx_source(mock_deps):
from src.dependencies import get_task_manager, has_permission
@@ -642,7 +672,8 @@ def test_map_columns_xlsx_source(mock_deps):
app.dependency_overrides.pop(has_permission("plugin:mapper", "EXECUTE"), None)
# #region test_map_columns_503 [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestMapColumnsXlsxSource
# #region Test.DatasetsApi.TestMapColumns503 [C:2] [TYPE Function]
# @BRIEF Verify 503 when task creation fails.
def test_map_columns_503(mock_deps):
from src.dependencies import get_task_manager, has_permission
@@ -668,7 +699,8 @@ def test_map_columns_503(mock_deps):
app.dependency_overrides.pop(has_permission("plugin:mapper", "EXECUTE"), None)
# #region test_generate_docs [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestMapColumns503
# #region Test.DatasetsApi.TestGenerateDocs [C:2] [TYPE Function]
# @BRIEF Verify POST /api/datasets/generate-docs creates doc generation task.
def test_generate_docs(mock_deps):
from src.dependencies import get_task_manager, has_permission
@@ -697,7 +729,8 @@ def test_generate_docs(mock_deps):
app.dependency_overrides.pop(has_permission("plugin:llm_analysis", "EXECUTE"), None)
# #region test_generate_docs_no_dataset_ids [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestGenerateDocs
# #region Test.DatasetsApi.TestGenerateDocsNoDatasetIds [C:2] [TYPE Function]
# @BRIEF Verify 400 when no dataset IDs provided.
def test_generate_docs_no_dataset_ids(mock_deps):
from src.dependencies import has_permission
@@ -713,7 +746,8 @@ def test_generate_docs_no_dataset_ids(mock_deps):
app.dependency_overrides.pop(has_permission("plugin:llm_analysis", "EXECUTE"), None)
# #region test_generate_docs_env_not_found [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestGenerateDocsNoDatasetIds
# #region Test.DatasetsApi.TestGenerateDocsEnvNotFound [C:2] [TYPE Function]
# @BRIEF Verify 404 when environment not found.
def test_generate_docs_env_not_found(mock_deps):
from src.dependencies import has_permission
@@ -729,7 +763,8 @@ def test_generate_docs_env_not_found(mock_deps):
app.dependency_overrides.pop(has_permission("plugin:llm_analysis", "EXECUTE"), None)
# #region test_generate_docs_503 [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestGenerateDocsEnvNotFound
# #region Test.DatasetsApi.TestGenerateDocs503 [C:2] [TYPE Function]
# @BRIEF Verify 503 when task creation fails.
def test_generate_docs_503(mock_deps):
from src.dependencies import get_task_manager, has_permission
@@ -750,7 +785,8 @@ def test_generate_docs_503(mock_deps):
app.dependency_overrides.pop(has_permission("plugin:llm_analysis", "EXECUTE"), None)
# #region test_update_metric_description_not_found [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestGenerateDocs503
# #region Test.DatasetsApi.TestUpdateMetricDescriptionNotFound [C:2] [TYPE Function]
# @BRIEF Verify 404 when metric not found.
def test_update_metric_description_not_found(mock_deps):
with patch("src.api.routes.datasets.AsyncSupersetClient") as MockClient:
@@ -773,7 +809,8 @@ def test_update_metric_description_not_found(mock_deps):
assert response.status_code == 404
# #region test_update_metric_description_validation [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestUpdateMetricDescriptionNotFound
# #region Test.DatasetsApi.TestUpdateMetricDescriptionValidation [C:2] [TYPE Function]
# @BRIEF Verify 400 when description exceeds max length for metric.
def test_update_metric_description_validation(mock_deps):
response = client.put(
@@ -783,7 +820,8 @@ def test_update_metric_description_validation(mock_deps):
assert response.status_code == 400
# #region test_update_metric_description_superset_502_get [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestUpdateMetricDescriptionValidation
# #region Test.DatasetsApi.TestUpdateMetricDescriptionSuperset502Get [C:2] [TYPE Function]
# @BRIEF Verify 502 when Superset GET fails for metric.
def test_update_metric_description_superset_502_get(mock_deps):
with patch("src.api.routes.datasets.AsyncSupersetClient") as MockClient:
@@ -798,7 +836,8 @@ def test_update_metric_description_superset_502_get(mock_deps):
assert response.status_code == 502
# #region test_update_metric_description_superset_502_put [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestUpdateMetricDescriptionSuperset502Get
# #region Test.DatasetsApi.TestUpdateMetricDescriptionSuperset502Put [C:2] [TYPE Function]
# @BRIEF Verify 502 when Superset PUT fails for metric.
def test_update_metric_description_superset_502_put(mock_deps):
with patch("src.api.routes.datasets.AsyncSupersetClient") as MockClient:
@@ -821,7 +860,8 @@ def test_update_metric_description_superset_502_put(mock_deps):
assert response.status_code == 502
# #region test_update_column_description_env_not_found [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestUpdateMetricDescriptionSuperset502Put
# #region Test.DatasetsApi.TestUpdateColumnDescriptionEnvNotFound [C:2] [TYPE Function]
# @BRIEF Verify 404 when environment not found in update_column_description.
def test_update_column_description_env_not_found(mock_deps):
response = client.put(
@@ -831,7 +871,8 @@ def test_update_column_description_env_not_found(mock_deps):
assert response.status_code == 404
# #region test_update_column_description_get_fails [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestUpdateColumnDescriptionEnvNotFound
# #region Test.DatasetsApi.TestUpdateColumnDescriptionGetFails [C:2] [TYPE Function]
# @BRIEF Verify 502 when Superset GET fails in update_column_description.
def test_update_column_description_get_fails(mock_deps):
with patch("src.api.routes.datasets.AsyncSupersetClient") as MockClient:
@@ -846,7 +887,8 @@ def test_update_column_description_get_fails(mock_deps):
assert response.status_code == 502
# #region test_update_column_description_response_without_result_key [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestUpdateColumnDescriptionGetFails
# #region Test.DatasetsApi.TestUpdateColumnDescriptionResponseWithoutResultKey [C:2] [TYPE Function]
# @BRIEF Cover line 562: elif branch when response has no "result" key.
def test_update_column_description_response_without_result_key(mock_deps):
with patch("src.api.routes.datasets.AsyncSupersetClient") as MockClient:
@@ -863,7 +905,8 @@ def test_update_column_description_response_without_result_key(mock_deps):
assert response.status_code == 200
# #region test_update_column_description_dataset_not_found [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestUpdateColumnDescriptionResponseWithoutResultKey
# #region Test.DatasetsApi.TestUpdateColumnDescriptionDatasetNotFound [C:2] [TYPE Function]
# @BRIEF Verify 404 when dataset has no id after GET.
def test_update_column_description_dataset_not_found(mock_deps):
with patch("src.api.routes.datasets.AsyncSupersetClient") as MockClient:
@@ -878,7 +921,8 @@ def test_update_column_description_dataset_not_found(mock_deps):
assert response.status_code == 404
# #region test_update_column_description_unexpected_error [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestUpdateColumnDescriptionDatasetNotFound
# #region Test.DatasetsApi.TestUpdateColumnDescriptionUnexpectedError [C:2] [TYPE Function]
# @BRIEF Verify 500 on unexpected error.
def test_update_column_description_unexpected_error(mock_deps):
with patch("src.api.routes.datasets.AsyncSupersetClient") as MockClient:
@@ -893,7 +937,8 @@ def test_update_column_description_unexpected_error(mock_deps):
assert response.status_code == 502 # Caught by the inner try/except for GET
# #region test_update_metric_description_env_not_found [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestUpdateColumnDescriptionUnexpectedError
# #region Test.DatasetsApi.TestUpdateMetricDescriptionEnvNotFound [C:2] [TYPE Function]
# @BRIEF Verify 404 when env not found for metric update.
def test_update_metric_description_env_not_found(mock_deps):
response = client.put(
@@ -903,7 +948,8 @@ def test_update_metric_description_env_not_found(mock_deps):
assert response.status_code == 404
# #region test_update_metric_description_no_result_key [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestUpdateMetricDescriptionEnvNotFound
# #region Test.DatasetsApi.TestUpdateMetricDescriptionNoResultKey [C:2] [TYPE Function]
# @BRIEF Cover line 650: elif branch when response has no "result" key for metric.
def test_update_metric_description_no_result_key(mock_deps):
with patch("src.api.routes.datasets.AsyncSupersetClient") as MockClient:
@@ -919,7 +965,8 @@ def test_update_metric_description_no_result_key(mock_deps):
assert response.status_code == 200
# #region test_update_metric_description_dataset_not_found [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestUpdateMetricDescriptionNoResultKey
# #region Test.DatasetsApi.TestUpdateMetricDescriptionDatasetNotFound [C:2] [TYPE Function]
# @BRIEF Verify 404 when dataset not found for metric update.
def test_update_metric_description_dataset_not_found(mock_deps):
with patch("src.api.routes.datasets.AsyncSupersetClient") as MockClient:
@@ -934,7 +981,8 @@ def test_update_metric_description_dataset_not_found(mock_deps):
assert response.status_code == 404
# #region test_update_metric_description_unexpected_error [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestUpdateMetricDescriptionDatasetNotFound
# #region Test.DatasetsApi.TestUpdateMetricDescriptionUnexpectedError [C:2] [TYPE Function]
# @BRIEF Verify 500 on unexpected error for metric update.
def test_update_metric_description_unexpected_error(mock_deps):
with patch("src.api.routes.datasets.AsyncSupersetClient") as MockClient:
@@ -949,7 +997,8 @@ def test_update_metric_description_unexpected_error(mock_deps):
assert response.status_code == 502 # Caught by inner try/except for GET
# #region test_update_column_description_type_error [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestUpdateMetricDescriptionUnexpectedError
# #region Test.DatasetsApi.TestUpdateColumnDescriptionTypeError [C:2] [TYPE Function]
# @BRIEF Verify 500 on TypeError in update_column_description (covers lines 597-599).
def test_update_column_description_type_error(mock_deps):
with patch("src.api.routes.datasets.AsyncSupersetClient") as MockClient:
@@ -965,7 +1014,8 @@ def test_update_column_description_type_error(mock_deps):
assert response.status_code == 500
# #region test_update_metric_description_type_error [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestUpdateColumnDescriptionTypeError
# #region Test.DatasetsApi.TestUpdateMetricDescriptionTypeError [C:2] [TYPE Function]
# @BRIEF Verify 500 on TypeError in update_metric_description (covers lines 684-686).
def test_update_metric_description_type_error(mock_deps):
with patch("src.api.routes.datasets.AsyncSupersetClient") as MockClient:
@@ -980,7 +1030,8 @@ def test_update_metric_description_type_error(mock_deps):
assert response.status_code == 500
# #region test_get_dataset_detail_database_object [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestUpdateMetricDescriptionTypeError
# #region Test.DatasetsApi.TestGetDatasetDetailDatabaseObject [C:2] [TYPE Function]
# @BRIEF Verify database field normalization when it's a dict.
def test_get_dataset_detail_database_object(mock_deps):
with patch("src.api.routes.datasets.AsyncSupersetClient") as MockClient:
@@ -1008,7 +1059,8 @@ def test_get_dataset_detail_database_object(mock_deps):
assert data["database"] == "PostgreSQL"
# #region test_get_dataset_detail_503 [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestGetDatasetDetailDatabaseObject
# #region Test.DatasetsApi.TestGetDatasetDetail503 [C:2] [TYPE Function]
# @BRIEF Verify 503 when Superset fails for dataset detail.
def test_get_dataset_detail_503(mock_deps):
with patch("src.api.routes.datasets.AsyncSupersetClient") as MockClient:
@@ -1020,14 +1072,16 @@ def test_get_dataset_detail_503(mock_deps):
assert response.status_code == 503
# #region test_get_dataset_detail_env_not_found [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestGetDatasetDetail503
# #region Test.DatasetsApi.TestGetDatasetDetailEnvNotFound [C:2] [TYPE Function]
# @BRIEF Verify 404 when env not found for dataset detail.
def test_get_dataset_detail_env_not_found(mock_deps):
response = client.get("/api/datasets/1?env_id=nonexistent")
assert response.status_code == 404
# #region test_strip_html_tags_function [C:2] [TYPE Function]
# #endregion Test.DatasetsApi.TestGetDatasetDetailEnvNotFound
# #region Test.DatasetsApi.TestStripHtmlTagsFunction [C:2] [TYPE Function]
# @BRIEF Test _strip_html_tags directly.
def test_strip_html_tags_empty():
from src.api.routes.datasets import _strip_html_tags
@@ -1044,3 +1098,4 @@ def test_strip_html_tags_with_html():
result = _strip_html_tags("<b>bold</b> and <i>italic</i>")
assert result == "bold and italic"
# #endregion Test.DatasetsApi
# #endregion Test.DatasetsApi.TestStripHtmlTagsFunction