Skip to content

Commit 307877c

Browse files
committed
feat: cover data quality APIs
1 parent a0393ce commit 307877c

3 files changed

Lines changed: 99 additions & 0 deletions

File tree

platform-api/src/openmetadata_demo_api/catalog.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,18 @@
7272
"kpi/KpiResource.java",
7373
}
7474
GOVERNANCE_LEAF_FILES = {"governance/WorkflowInstanceStateResource.java"}
75+
DATA_QUALITY_CONNECTION_FILE = "services/connections/TestConnectionDefinitionResource.java"
76+
DATA_QUALITY_PREREQUISITES = {
77+
"createDatabaseService",
78+
"createDatabase",
79+
"createDBSchema",
80+
"createTable",
81+
}
82+
DATA_QUALITY_PHASES = {
83+
"dqtests/TestDefinitionResource.java": "parent-assets",
84+
"dqtests/TestSuiteResource.java": "child-assets",
85+
"dqtests/TestCaseResource.java": "enrichment",
86+
}
7587
CORE_SERVICE_PREREQUISITES = {
7688
"createApiService",
7789
"createDashboardService",
@@ -249,6 +261,8 @@ def _phase(operation: Mapping[str, Any]) -> str:
249261
return "service-management"
250262
if source_file == "types/TypeResource.java":
251263
return "child-assets" if operation["operation_id"] == "addProperty" else "parent-assets"
264+
if source_file.startswith("dqtests/"):
265+
return DATA_QUALITY_PHASES.get(str(source_file), "platform")
252266
operation_text = " ".join(
253267
(
254268
str(operation["operation_id"]),
@@ -394,6 +408,17 @@ def scenarios() -> dict[str, Scenario]:
394408
or operation["operation_id"] == "createDashboardService"
395409
),
396410
),
411+
"data-quality": scenario_from_operations(
412+
"data-quality",
413+
"Data quality definitions, suites, cases, results, resolutions, and connection schemas",
414+
tuple(
415+
operation
416+
for operation in all_operations
417+
if str(operation["source"]["file"]).startswith("dqtests/")
418+
or operation["source"]["file"] == DATA_QUALITY_CONNECTION_FILE
419+
or operation["operation_id"] in DATA_QUALITY_PREREQUISITES
420+
),
421+
),
397422
}
398423

399424

platform-api/src/openmetadata_demo_api/request_fixtures.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,15 @@
7676
"contractExecutionStatus": "Success",
7777
"result": "Dry-run validation passed",
7878
},
79+
"DataQualityReportBatchRequest": {
80+
"requests": [
81+
{
82+
"key": "failed-tests",
83+
"index": "test_case_search_index",
84+
"aggregationQuery": ('{"failed":{"terms":{"field":"testCaseStatus.keyword"}}}'),
85+
}
86+
]
87+
},
7988
"DatabaseProfilerConfig": {"sampleDataCount": 10, "randomizedSample": True},
8089
"DatabaseSchemaProfilerConfig": {
8190
"sampleDataCount": 10,
@@ -245,6 +254,10 @@
245254
"metadata.generated.schema.entity.datacontract.dataContractResult",
246255
"DataContractResult",
247256
),
257+
"DataQualityReportBatchRequest": (
258+
"metadata.generated.schema.tests.dataQualityReportBatchRequest",
259+
"DataQualityReportBatchRequest",
260+
),
248261
"DatabaseProfilerConfig": (
249262
"metadata.generated.schema.entity.data.database",
250263
"DatabaseProfilerConfig",

platform-api/tests/test_runtime.py

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -875,3 +875,64 @@ def test_governance_insight_requests_respect_recorded_validation_boundaries() ->
875875
assert assets_by_model[model_name]["validationNote"].startswith(
876876
"RC1 generated-model defect:"
877877
)
878+
879+
880+
def test_data_quality_scenario_covers_source_routes_and_dependencies() -> None:
881+
connection_file = "services/connections/TestConnectionDefinitionResource.java"
882+
prerequisites = {
883+
"createDatabaseService",
884+
"createDatabase",
885+
"createDBSchema",
886+
"createTable",
887+
}
888+
expected = {
889+
operation["operation_id"]
890+
for operation in load_operations()
891+
if str(operation["source"]["file"]).startswith("dqtests/")
892+
or operation["source"]["file"] == connection_file
893+
}
894+
scenario = scenarios()["data-quality"]
895+
896+
assert {step.operation_id for step in scenario.operation_steps} == expected | prerequisites
897+
assert len(scenario.run()) == len(expected | prerequisites)
898+
assert {
899+
"createTestDefinition",
900+
"createBasicTestSuite",
901+
"createTestCase",
902+
"addTestCaseResult",
903+
"createTestCaseResolutionStatus",
904+
"getDataQualityReportBatch",
905+
"listTestConnectionDefinitions",
906+
} <= expected
907+
ordered = [step.operation_id for step in scenario.ordered_steps()]
908+
for parent, child in (
909+
("createTable", "createTestCase"),
910+
("createTestDefinition", "createTestCase"),
911+
("createBasicTestSuite", "createTestCase"),
912+
("createTestCase", "addTestCaseResult"),
913+
("createTestCase", "createTestCaseResolutionStatus"),
914+
):
915+
assert ordered.index(parent) < ordered.index(child)
916+
917+
918+
def test_data_quality_requests_are_validated_and_placeholder_free() -> None:
919+
scenario = scenarios()["data-quality"]
920+
921+
assert not {
922+
str(value["_model"])
923+
for step in scenario.operation_steps
924+
for value in _nested_mappings(step.request)
925+
if "_model" in value
926+
}
927+
models = {
928+
str(asset["model"]).rsplit(".", 1)[-1]
929+
for asset in load_assets()
930+
if "data-quality" in asset["scenarios"]
931+
}
932+
assert {
933+
"CreateTestDefinitionRequest",
934+
"CreateTestSuiteRequest",
935+
"CreateTestCaseRequest",
936+
"CreateTestCaseResult",
937+
"CreateTestCaseResolutionStatus",
938+
} <= models

0 commit comments

Comments
 (0)