mirror of
https://github.com/open-metadata/OpenMetadata.git
synced 2025-11-01 11:09:14 +00:00
115 lines
3.5 KiB
Python
115 lines
3.5 KiB
Python
|
|
# 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
|