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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user