Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixes #16632: Add testCases property to a test suite source config #16631

Merged
merged 4 commits into from
Jun 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion ingestion/src/metadata/data_quality/source/test_suite.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,10 @@ def _get_test_cases_from_test_suite(
params={"testSuiteId": test_suite.id.root},
)
test_cases = cast(List[TestCase], test_cases) # satisfy type checker

if self.source_config.testCases is not None:
test_cases = [
t for t in test_cases if t.name in self.source_config.testCases
]
return test_cases

return None
Expand Down
Empty file.
96 changes: 96 additions & 0 deletions ingestion/tests/unit/data_quality/source/test_test_suite.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
from unittest.mock import Mock
from uuid import UUID

import pytest

from metadata.data_quality.source.test_suite import TestSuiteSource
from metadata.generated.schema.entity.data.table import Table
from metadata.generated.schema.metadataIngestion.workflow import (
OpenMetadataWorkflowConfig,
)
from metadata.generated.schema.tests.testCase import TestCase
from metadata.generated.schema.tests.testSuite import TestSuite
from metadata.generated.schema.type.entityReference import EntityReference
from metadata.ingestion.ometa.ometa_api import OpenMetadata

MOCK_ENTITY_REFERENCE = EntityReference(
id=str(UUID(int=0)), type="test_suite", name="test_suite"
)


@pytest.mark.parametrize(
"parameters,expected",
[
(
{
"type": "TestSuite",
"entityFullyQualifiedName": "MyTestSuite",
},
["test_case1", "test_case2"],
),
(
{
"type": "TestSuite",
"entityFullyQualifiedName": "MyTestSuite",
"testCases": [
"test_case1",
],
},
["test_case1"],
),
],
)
def test_source_config(parameters, expected, monkeypatch):
workflow_config = {
"source": {
"type": "TestSuite",
"serviceName": "MyTestSuite",
"sourceConfig": {"config": parameters},
"serviceConnection": {
"config": {
"type": "Mysql",
"hostPort": "localhost:3306",
"username": "root",
}
},
},
"workflowConfig": {
"openMetadataServerConfig": {
"hostPort": "localhost:8585",
}
},
}
monkeypatch.setattr(TestSuiteSource, "test_connection", Mock())

mock_metadata = Mock(spec=OpenMetadata)
mock_metadata.get_by_name.return_value = Table(
id=UUID(int=0),
name="test_table",
columns=[],
testSuite=MOCK_ENTITY_REFERENCE,
)
mock_metadata.list_all_entities.return_value = [
TestCase(
name="test_case1",
id=UUID(int=0),
testDefinition=MOCK_ENTITY_REFERENCE,
testSuite=MOCK_ENTITY_REFERENCE,
entityLink="<#E::some::link>",
),
TestCase(
name="test_case2",
id=UUID(int=0),
testDefinition=MOCK_ENTITY_REFERENCE,
testSuite=MOCK_ENTITY_REFERENCE,
entityLink="<#E::some::link>",
),
]
mock_metadata.get_by_id.return_value = TestSuite(
name="test_suite", executable=True, id=UUID(int=0)
)

source = TestSuiteSource(
OpenMetadataWorkflowConfig.parse_obj(workflow_config), mock_metadata
)
test_cases = list(source._iter())[0].right.test_cases
assert [t.name.root for t in test_cases] == expected
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ source:
config:
type: TestSuite
entityFullyQualifiedName: MySQL.default.openmetadata_db.tag_usage
# testCases: ["run_only_this_test_case"] # Optional, if not provided all tests will be executed

processor:
type: "orm-test-runner"
Expand Down
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

do we need to add an isDefault flag to this schema as well. So we can identify the default ingestion pipeline?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

null value resolves the default behavior. its documented in the description. I'd rather avoid adding this field is it has the potential for ambiguity such as:

isDefault: true
testCases: ["what_will_this_do"]

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good. The behavior will be we can have multiple "default" pipelines right?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes. this is the same as current behavior. and as we are doing now we can enforce things on the UI side.

Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,14 @@
"profileSampleType": {
"$ref": "../entity/data/table.json#/definitions/profileSampleType",
"title": "Profile Sample Type"

},
"testCases": {
"description": "List of test cases to be executed on the entity. If null, all test cases will be executed.",
"type": "array",
"items": {
"$ref": "../type/basic.json#/definitions/testCaseEntityName"
},
"default": null
}
},
"required": ["type", "entityFullyQualifiedName"],
Expand Down
Loading