Skip to content
Open
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
60 changes: 60 additions & 0 deletions validation/tests/test_validate.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
from importlib.util import module_from_spec, spec_from_file_location
from pathlib import Path


_VALIDATE_PATH = Path(__file__).parents[1] / "validate.py"
_SPEC = spec_from_file_location("ossie_validate", _VALIDATE_PATH)
assert _SPEC is not None and _SPEC.loader is not None
_VALIDATE = module_from_spec(_SPEC)
_SPEC.loader.exec_module(_VALIDATE)

validate_references = _VALIDATE.validate_references


def _document_with_relationship(from_columns: list[str], to_columns: list[str]) -> dict:
return {
"version": "0.2.0.dev0",
"semantic_model": [
{
"name": "m",
"datasets": [
{"name": "orders", "source": "db.s.orders"},
{"name": "customers", "source": "db.s.customers"},
],
"relationships": [
{
"name": "orders_to_customers",
"from": "orders",
"to": "customers",
"from_columns": from_columns,
"to_columns": to_columns,
}
],
}
],
}


def test_validate_references_rejects_mismatched_relationship_column_counts() -> None:
errors = validate_references(
_document_with_relationship(
from_columns=["customer_id", "region_id"],
to_columns=["id"],
)
)

assert errors == [
"[Relationship] Relationship 'orders_to_customers' in model 'm' has "
"2 from_columns but 1 to_columns"
]


def test_validate_references_accepts_matching_relationship_column_counts() -> None:
errors = validate_references(
_document_with_relationship(
from_columns=["customer_id", "region_id"],
to_columns=["id", "region_id"],
)
)

assert errors == []
7 changes: 7 additions & 0 deletions validation/validate.py
Original file line number Diff line number Diff line change
Expand Up @@ -140,11 +140,18 @@ def validate_references(data: dict) -> list[str]:
rel_name = rel.get("name", "<unnamed>")
from_ds = rel.get("from")
to_ds = rel.get("to")
from_columns = rel.get("from_columns") or []
to_columns = rel.get("to_columns") or []

if from_ds and from_ds not in dataset_names:
errors.append(f"[Reference] Relationship '{rel_name}' in model '{model_name}' references unknown dataset '{from_ds}'")
if to_ds and to_ds not in dataset_names:
errors.append(f"[Reference] Relationship '{rel_name}' in model '{model_name}' references unknown dataset '{to_ds}'")
if len(from_columns) != len(to_columns):
errors.append(
f"[Relationship] Relationship '{rel_name}' in model '{model_name}' has "
f"{len(from_columns)} from_columns but {len(to_columns)} to_columns"
)

return errors

Expand Down