Skip to content

Commit

Permalink
[Backport 1.4.latest] Set relation_name in tests at compile time (#6978)
Browse files Browse the repository at this point in the history
* Set relation_name in tests at compile time (#6949)

(cherry picked from commit 480e0e5)

* Tweak artifact test

---------

Co-authored-by: Gerda Shank <[email protected]>
  • Loading branch information
github-actions[bot] and gshank authored Feb 14, 2023
1 parent 03f6655 commit 16cb498
Show file tree
Hide file tree
Showing 4 changed files with 67 additions and 0 deletions.
6 changes: 6 additions & 0 deletions .changes/unreleased/Fixes-20230210-194157.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
kind: Fixes
body: Set relation_name in test nodes at compile time
time: 2023-02-10T19:41:57.386766-05:00
custom:
Author: gshank
Issue: "6930"
12 changes: 12 additions & 0 deletions core/dbt/compilation.py
Original file line number Diff line number Diff line change
Expand Up @@ -378,6 +378,18 @@ def _compile_node(
node,
)

# relation_name is set at parse time, except for tests without store_failures,
# but cli param can turn on store_failures, so we set here.
if (
node.resource_type == NodeType.Test
and node.relation_name is None
and node.is_relational
):
adapter = get_adapter(self.config)
relation_cls = adapter.Relation
relation_name = str(relation_cls.create_from(self.config, node))
node.relation_name = relation_name

node.compiled = True

return node
Expand Down
48 changes: 48 additions & 0 deletions tests/functional/artifacts/test_artifact_fields.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import pytest
from dbt.tests.util import run_dbt, get_manifest, get_artifact

# This is a place to put specific tests for contents of artifacts that we
# don't want to bother putting in the big artifact output test, which is
# hard to update.

my_model_sql = "select 1 as fun"

schema_yml = """
version: 2
models:
- name: my_model
columns:
- name: fun
tests:
- not_null
"""


class TestRelationNameInTests:
@pytest.fixture(scope="class")
def models(self):
return {
"my_model.sql": my_model_sql,
"schema.yml": schema_yml,
}

def test_relation_name_in_tests(self, project):
results = run_dbt(["run"])
assert len(results) == 1
manifest = get_manifest(project.project_root)
test_id = "test.test.not_null_my_model_fun.bf3b032a01"
assert test_id in manifest.nodes
assert manifest.nodes[test_id].relation_name is None

results = run_dbt(["test", "--store-failures"])
assert len(results) == 1
# The relation_name for tests with previously generated manifest and
# store_failures passed in on the command line, will be in the manifest.json
# but not in the parsed manifest.
manifest = get_manifest(project.project_root)
assert manifest.nodes[test_id].relation_name is None
manifest_json = get_artifact(project.project_root, "target", "manifest.json")
assert test_id in manifest_json["nodes"]
relation_name = manifest_json["nodes"][test_id]["relation_name"]
assert relation_name
assert '"not_null_my_model_fun"' in relation_name
1 change: 1 addition & 0 deletions tests/functional/artifacts/test_artifacts.py
Original file line number Diff line number Diff line change
Expand Up @@ -428,6 +428,7 @@ def verify_run_results(project, expected_run_results, start_time, run_results_sc
class BaseVerifyProject:
@pytest.fixture(scope="class", autouse=True)
def setup(self, project):
dbt.flags.STORE_FAILURES = False
alternate_schema_name = project.test_schema + "_test"
project.create_test_schema(schema_name=alternate_schema_name)
os.environ["DBT_ENV_CUSTOM_ENV_env_key"] = "env_value"
Expand Down

0 comments on commit 16cb498

Please sign in to comment.