OpenMetadata/ingestion/tests/unit/profiler/test_validations.py

115 lines
3.5 KiB
Python
Raw Normal View History

# Copyright 2021 Collate
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
# http://www.apache.org/licenses/LICENSE-2.0
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""
Test that we can safely convert to validation
and check results
"""
import pytest
import operator as op
from metadata.orm_profiler.validations.core import to_validation, Validation, ValidationConversionException, validate
from metadata.orm_profiler.validations.grammar import ExpVisitor, parse
visitor = ExpVisitor()
def test_model_conversion():
"""
Check that we can properly convert to a Validation model
"""
raw_validation = parse("count == 100", visitor)[0]
model = to_validation(raw_validation)
assert model == Validation(
metric="COUNT", operator=op.eq, value=100
)
raw_validation = parse("min > something", visitor)[0]
model = to_validation(raw_validation)
assert model == Validation(
metric="MIN", operator=op.gt, value="something"
)
raw_validation = parse("null_ratio < 0.2", visitor)[0]
model = to_validation(raw_validation)
assert model == Validation(
metric="NULLRATIO", operator=op.lt, value=0.2
)
# This validation does not make sense, but we are just checking cases
raw_validation = parse("null_ratio >= 5.4", visitor)[0]
model = to_validation(raw_validation)
assert model == Validation(
metric="NULLRATIO", operator=op.ge, value=5.4
)
def test_model_conversion_exceptions():
"""
Check that we cannot pass malformed data
"""
# No info at all
with pytest.raises(ValidationConversionException):
to_validation({})
# Invalid metric, cannot be found in Registry
with pytest.raises(ValidationConversionException):
to_validation({"metric": "not a valid metric"})
# Missing Operation key
with pytest.raises(ValidationConversionException):
to_validation({"metric": "min"})
# Invalid Operation value
with pytest.raises(ValidationConversionException):
to_validation({"metric": "min", "operation": "invalid operation"})
# Missing value key
with pytest.raises(ValidationConversionException):
to_validation({"metric": "min", "operation": "=="})
# Empty value
with pytest.raises(ValidationConversionException):
to_validation({"metric": "min", "operation": "==", "value": ""})
def test_validate():
"""
Make sure that we are properly flagging validation results
"""
results = {"COUNT": 100}
raw_validation = parse("count == 100", visitor)[0]
validation = to_validation(raw_validation)
assert validate(validation, results).valid
raw_validation = parse("count != 100", visitor)[0]
validation = to_validation(raw_validation)
assert not validate(validation, results).valid
results = {"NULLRATIO": 0.2}
raw_validation = parse("Null_Ratio < 0.3", visitor)[0]
validation = to_validation(raw_validation)
assert validate(validation, results).valid
raw_validation = parse("Null_Ratio >= 0.3", visitor)[0]
validation = to_validation(raw_validation)
assert not validate(validation, results).valid