Skip to content

Commit 9304da2

Browse files
Fix missing test metadata (#88)
Some tests, e.g. that are defined in separate .sql files, don't have `metadata` specified. dbt-score will break if a test like this is defined in a model or source.
1 parent c5ed67f commit 9304da2

File tree

4 files changed

+27
-14
lines changed

4 files changed

+27
-14
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ and this project adheres to
99
## [Unreleased]
1010

1111
- Add debug mode to help writing new rules. (#91)
12+
- Fix tests without metadata. (#88)
1213

1314
## [0.9.0] - 2024-12-19
1415

src/dbt_score/models.py

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,8 @@ def from_node(cls, test_node: dict[str, Any]) -> "Test":
6363
"""Create a test object from a test node in the manifest."""
6464
return cls(
6565
name=test_node["name"],
66-
type=test_node["test_metadata"]["name"],
67-
kwargs=test_node["test_metadata"].get("kwargs", {}),
66+
type=test_node.get("test_metadata", {}).get("name", "generic"),
67+
kwargs=test_node.get("test_metadata", {}).get("kwargs", {}),
6868
tags=test_node.get("tags", []),
6969
_raw_values=test_node,
7070
)
@@ -141,7 +141,10 @@ def _get_columns(
141141
[
142142
test
143143
for test in test_values
144-
if test["test_metadata"]["kwargs"].get("column_name") == name
144+
if test.get("test_metadata", {})
145+
.get("kwargs", {})
146+
.get("column_name")
147+
== name
145148
],
146149
)
147150
for name, values in node_values.get("columns", {}).items()
@@ -224,7 +227,9 @@ def from_node(
224227
tests=[
225228
Test.from_node(test)
226229
for test in test_values
227-
if not test["test_metadata"]["kwargs"].get("column_name")
230+
if not test.get("test_metadata", {})
231+
.get("kwargs", {})
232+
.get("column_name")
228233
],
229234
depends_on=node_values["depends_on"],
230235
_raw_values=node_values,
@@ -359,7 +364,9 @@ def from_node(
359364
tests=[
360365
Test.from_node(test)
361366
for test in test_values
362-
if not test["test_metadata"]["kwargs"].get("column_name")
367+
if not test.get("test_metadata", {})
368+
.get("kwargs", {})
369+
.get("column_name")
363370
],
364371
_raw_values=node_values,
365372
_raw_test_values=test_values,
@@ -428,20 +435,17 @@ def _reindex_tests(self) -> None:
428435
"""Index tests based on their associated evaluable."""
429436
for node_values in self.raw_nodes.values():
430437
if node_values.get("resource_type") == "test":
431-
# tests for models have a non-null value for `attached_node`
438+
# Tests for models have a non-null value for `attached_node`
432439
if attached_node := node_values.get("attached_node"):
433440
self.tests[attached_node].append(node_values)
434441

435-
# Tests for sources will have a null `attached_node`,
436-
# and a non-empty list for `sources`.
437-
# They need to be attributed to the source id
442+
# Tests for sources or separate tests will have `attached_node` == null.
443+
# They need to be attributed to the node id
438444
# based on the `depends_on` field.
439-
elif node_values.get("sources") and (
440-
source_unique_id := next(
441-
iter(node_values.get("depends_on", {}).get("nodes", [])), None
442-
)
445+
elif node_unique_id := next(
446+
iter(node_values.get("depends_on", {}).get("nodes", [])), None
443447
):
444-
self.tests[source_unique_id].append(node_values)
448+
self.tests[node_unique_id].append(node_values)
445449

446450
def _filter_evaluables(self, select: Iterable[str]) -> None:
447451
"""Filter evaluables like dbt's --select."""

tests/resources/manifest.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,13 @@
125125
"resource_type": "test",
126126
"package_name": "package"
127127
},
128+
"test.package.test4": {
129+
"resource_type": "test",
130+
"depends_on": { "nodes": ["model.package.model1"] },
131+
"name": "test4",
132+
"package_name": "package",
133+
"tags": []
134+
},
128135
"test.package.source_test1": {
129136
"resource_type": "test",
130137
"package_name": "package",

tests/test_models.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ def test_manifest_load(mock_read_text, raw_manifest):
2020
]
2121
)
2222
assert loader.models[0].tests[0].name == "test2"
23+
assert loader.models[0].tests[1].name == "test4"
2324
assert loader.models[0].columns[0].tests[0].name == "test1"
2425

2526
assert len(loader.sources) == len(

0 commit comments

Comments
 (0)