Skip to content

Commit fac2f62

Browse files
authored
[Backport 1.5.latest] Rearrange pp_versioned_models test (#8157)
* Rearrange pp_versioned_models test (#8150) (cherry picked from commit a327131) * Do the equivalent of rename_if_exists
1 parent d39c53d commit fac2f62

File tree

5 files changed

+143
-71
lines changed

5 files changed

+143
-71
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
kind: Under the Hood
2+
body: Refactor flaky test pp_versioned_models
3+
time: 2023-07-19T12:46:11.972481-04:00
4+
custom:
5+
Author: gshank
6+
Issue: "7781"

core/dbt/include/global_project/macros/materializations/models/table/table.sql

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,11 @@
3333

3434
-- cleanup
3535
{% if existing_relation is not none %}
36-
{{ adapter.rename_relation(existing_relation, backup_relation) }}
36+
/* Do the equivalent of rename_if_exists */
37+
{% set existing_relation = load_cached_relation(existing_relation) %}
38+
{% if existing_relation is not none %}
39+
{{ adapter.rename_relation(existing_relation, backup_relation) }}
40+
{% endif %}
3741
{% endif %}
3842

3943
{{ adapter.rename_relation(intermediate_relation, target_relation) }}

core/dbt/include/global_project/macros/materializations/models/view/view.sql

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,11 @@
4545
-- cleanup
4646
-- move the existing view out of the way
4747
{% if existing_relation is not none %}
48-
{{ adapter.rename_relation(existing_relation, backup_relation) }}
48+
/* Do the equivalent of rename_if_exists */
49+
{% set existing_relation = load_cached_relation(existing_relation) %}
50+
{% if existing_relation is not none %}
51+
{{ adapter.rename_relation(existing_relation, backup_relation) }}
52+
{% endif %}
4953
{% endif %}
5054
{{ adapter.rename_relation(intermediate_relation, target_relation) }}
5155

tests/functional/partial_parsing/test_partial_parsing.py

Lines changed: 1 addition & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,6 @@
88
models_schema1_yml,
99
models_schema2_yml,
1010
models_schema2b_yml,
11-
models_versions_schema_yml,
12-
models_versions_defined_in_schema_yml,
13-
models_versions_updated_schema_yml,
1411
model_three_sql,
1512
model_three_modified_sql,
1613
model_four1_sql,
@@ -71,7 +68,7 @@
7168
groups_schema_yml_two_groups_private_orders_invalid_access,
7269
)
7370

74-
from dbt.exceptions import CompilationError, ParsingError, DuplicateVersionedUnversionedError
71+
from dbt.exceptions import CompilationError, ParsingError
7572
from dbt.contracts.files import ParseFileType
7673
from dbt.contracts.results import TestStatus
7774
import re
@@ -302,71 +299,6 @@ def test_pp_models(self, project):
302299
assert model_id not in manifest.disabled
303300

304301

305-
class TestVersionedModels:
306-
@pytest.fixture(scope="class")
307-
def models(self):
308-
return {
309-
"model_one_v1.sql": model_one_sql,
310-
"model_one.sql": model_one_sql,
311-
"model_one_downstream.sql": model_four2_sql,
312-
"schema.yml": models_versions_schema_yml,
313-
}
314-
315-
def test_pp_versioned_models(self, project):
316-
results = run_dbt(["run"])
317-
assert len(results) == 3
318-
319-
manifest = get_manifest(project.project_root)
320-
model_one_node = manifest.nodes["model.test.model_one.v1"]
321-
assert not model_one_node.is_latest_version
322-
model_two_node = manifest.nodes["model.test.model_one.v2"]
323-
assert model_two_node.is_latest_version
324-
# assert unpinned ref points to latest version
325-
model_one_downstream_node = manifest.nodes["model.test.model_one_downstream"]
326-
assert model_one_downstream_node.depends_on.nodes == ["model.test.model_one.v2"]
327-
328-
# update schema.yml block - model_one is now 'defined_in: model_one_different'
329-
rm_file(project.project_root, "models", "model_one.sql")
330-
write_file(model_one_sql, project.project_root, "models", "model_one_different.sql")
331-
write_file(
332-
models_versions_defined_in_schema_yml, project.project_root, "models", "schema.yml"
333-
)
334-
results = run_dbt(["--partial-parse", "run"])
335-
assert len(results) == 3
336-
337-
# update versions schema.yml block - latest_version from 2 to 1
338-
write_file(
339-
models_versions_updated_schema_yml, project.project_root, "models", "schema.yml"
340-
)
341-
results, log_output = run_dbt_and_capture(
342-
["--partial-parse", "--log-format", "json", "run"]
343-
)
344-
assert len(results) == 3
345-
346-
manifest = get_manifest(project.project_root)
347-
model_one_node = manifest.nodes["model.test.model_one.v1"]
348-
assert model_one_node.is_latest_version
349-
model_two_node = manifest.nodes["model.test.model_one.v2"]
350-
assert not model_two_node.is_latest_version
351-
# assert unpinned ref points to latest version
352-
model_one_downstream_node = manifest.nodes["model.test.model_one_downstream"]
353-
assert model_one_downstream_node.depends_on.nodes == ["model.test.model_one.v1"]
354-
# assert unpinned ref to latest-not-max version yields an "FYI" info-level log
355-
assert "UnpinnedRefNewVersionAvailable" in log_output
356-
357-
# update versioned model
358-
write_file(model_two_sql, project.project_root, "models", "model_one_different.sql")
359-
results = run_dbt(["--partial-parse", "run"])
360-
assert len(results) == 3
361-
manifest = get_manifest(project.project_root)
362-
assert len(manifest.nodes) == 3
363-
364-
# create a new model_one in model_one.sql and re-parse
365-
write_file(model_one_sql, project.project_root, "models", "model_one.sql")
366-
with pytest.raises(DuplicateVersionedUnversionedError):
367-
run_dbt(["parse"])
368-
369-
370302
class TestSources:
371303
@pytest.fixture(scope="class")
372304
def models(self):
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
import pytest
2+
import pathlib
3+
from dbt.tests.util import (
4+
run_dbt,
5+
get_manifest,
6+
write_file,
7+
rm_file,
8+
read_file,
9+
)
10+
from dbt.exceptions import DuplicateVersionedUnversionedError
11+
12+
model_one_sql = """
13+
select 1 as fun
14+
"""
15+
16+
model_one_downstream_sql = """
17+
select fun from {{ ref('model_one') }}
18+
"""
19+
20+
models_versions_schema_yml = """
21+
22+
models:
23+
- name: model_one
24+
description: "The first model"
25+
versions:
26+
- v: 1
27+
- v: 2
28+
"""
29+
30+
models_versions_defined_in_schema_yml = """
31+
models:
32+
- name: model_one
33+
description: "The first model"
34+
versions:
35+
- v: 1
36+
- v: 2
37+
defined_in: model_one_different
38+
"""
39+
40+
models_versions_updated_schema_yml = """
41+
models:
42+
- name: model_one
43+
latest_version: 1
44+
description: "The first model"
45+
versions:
46+
- v: 1
47+
- v: 2
48+
defined_in: model_one_different
49+
"""
50+
51+
model_two_sql = """
52+
select 1 as notfun
53+
"""
54+
55+
56+
class TestVersionedModels:
57+
@pytest.fixture(scope="class")
58+
def models(self):
59+
return {
60+
"model_one_v1.sql": model_one_sql,
61+
"model_one.sql": model_one_sql,
62+
"model_one_downstream.sql": model_one_downstream_sql,
63+
"schema.yml": models_versions_schema_yml,
64+
}
65+
66+
def test_pp_versioned_models(self, project):
67+
results = run_dbt(["run"])
68+
assert len(results) == 3
69+
70+
manifest = get_manifest(project.project_root)
71+
model_one_node = manifest.nodes["model.test.model_one.v1"]
72+
assert not model_one_node.is_latest_version
73+
model_two_node = manifest.nodes["model.test.model_one.v2"]
74+
assert model_two_node.is_latest_version
75+
# assert unpinned ref points to latest version
76+
model_one_downstream_node = manifest.nodes["model.test.model_one_downstream"]
77+
assert model_one_downstream_node.depends_on.nodes == ["model.test.model_one.v2"]
78+
79+
# update schema.yml block - model_one is now 'defined_in: model_one_different'
80+
rm_file(project.project_root, "models", "model_one.sql")
81+
write_file(model_one_sql, project.project_root, "models", "model_one_different.sql")
82+
write_file(
83+
models_versions_defined_in_schema_yml, project.project_root, "models", "schema.yml"
84+
)
85+
results = run_dbt(["--partial-parse", "run"])
86+
assert len(results) == 3
87+
88+
# update versions schema.yml block - latest_version from 2 to 1
89+
write_file(
90+
models_versions_updated_schema_yml, project.project_root, "models", "schema.yml"
91+
)
92+
# This is where the test was failings in a CI run with:
93+
# relation \"test..._test_partial_parsing.model_one_downstream\" does not exist
94+
# because in core/dbt/include/global_project/macros/materializations/models/view/view.sql
95+
# "existing_relation" didn't actually exist by the time it gets to the rename of the
96+
# existing relation.
97+
(pathlib.Path(project.project_root) / "log_output").mkdir(parents=True, exist_ok=True)
98+
results = run_dbt(
99+
["--partial-parse", "--log-format-file", "json", "--log-path", "log_output", "run"]
100+
)
101+
assert len(results) == 3
102+
103+
manifest = get_manifest(project.project_root)
104+
model_one_node = manifest.nodes["model.test.model_one.v1"]
105+
assert model_one_node.is_latest_version
106+
model_two_node = manifest.nodes["model.test.model_one.v2"]
107+
assert not model_two_node.is_latest_version
108+
# assert unpinned ref points to latest version
109+
model_one_downstream_node = manifest.nodes["model.test.model_one_downstream"]
110+
assert model_one_downstream_node.depends_on.nodes == ["model.test.model_one.v1"]
111+
112+
# assert unpinned ref to latest-not-max version yields an "FYI" info-level log
113+
log_output = read_file("log_output", "dbt.log").replace("\n", " ").replace("\\n", " ")
114+
assert "UnpinnedRefNewVersionAvailable" in log_output
115+
116+
# update versioned model
117+
write_file(model_two_sql, project.project_root, "models", "model_one_different.sql")
118+
results = run_dbt(["--partial-parse", "run"])
119+
assert len(results) == 3
120+
manifest = get_manifest(project.project_root)
121+
assert len(manifest.nodes) == 3
122+
123+
# create a new model_one in model_one.sql and re-parse
124+
write_file(model_one_sql, project.project_root, "models", "model_one.sql")
125+
with pytest.raises(DuplicateVersionedUnversionedError):
126+
run_dbt(["parse"])

0 commit comments

Comments
 (0)