mirror of
https://github.com/dbt-labs/dbt-core
synced 2025-12-18 23:51:28 +00:00
Compare commits
14 Commits
enable-pos
...
test-snowf
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6fe9455bd5 | ||
|
|
94c3e6bb6c | ||
|
|
d64b700673 | ||
|
|
656cb394d8 | ||
|
|
76c4952430 | ||
|
|
b3d8e7ca48 | ||
|
|
2db5c8353a | ||
|
|
0d7c2bcd71 | ||
|
|
21c1ef4f37 | ||
|
|
dc76a32879 | ||
|
|
a77f32f685 | ||
|
|
17f8ef88fc | ||
|
|
24c908ff67 | ||
|
|
d7e5e68104 |
@@ -1,3 +0,0 @@
|
||||
{{ config(materialized='ephemeral') }}
|
||||
|
||||
select * from {{ this.schema }}.seed
|
||||
@@ -1,5 +0,0 @@
|
||||
{{ config(materialized='ephemeral') }}
|
||||
|
||||
{{ adapter.invalid_method() }}
|
||||
|
||||
select * from {{ ref('base') }}
|
||||
@@ -1,2 +0,0 @@
|
||||
-- base copy is an error
|
||||
select * from {{ref('base_copy')}} where gender = 'Male'
|
||||
@@ -1,6 +0,0 @@
|
||||
{{
|
||||
config(
|
||||
materialized = "ephemeral",
|
||||
)
|
||||
}}
|
||||
select * from {{ref("ephemeral_level_two")}}
|
||||
@@ -1,6 +0,0 @@
|
||||
{{
|
||||
config(
|
||||
materialized = "ephemeral",
|
||||
)
|
||||
}}
|
||||
select * from {{ ref('source_table') }}
|
||||
@@ -1 +0,0 @@
|
||||
select * from {{ref("ephemeral")}}
|
||||
@@ -1,12 +0,0 @@
|
||||
{{ config(materialized='table') }}
|
||||
|
||||
with source_data as (
|
||||
|
||||
select 1 as id
|
||||
union all
|
||||
select null as id
|
||||
|
||||
)
|
||||
|
||||
select *
|
||||
from source_data
|
||||
@@ -1,3 +0,0 @@
|
||||
{{ config(materialized='ephemeral') }}
|
||||
|
||||
select * from {{ this.schema }}.seed
|
||||
@@ -1,3 +0,0 @@
|
||||
{{ config(materialized='ephemeral') }}
|
||||
|
||||
select * from {{ ref('base') }}
|
||||
@@ -1,3 +0,0 @@
|
||||
{{ config(materialized='ephemeral') }}
|
||||
|
||||
select * from {{ ref('base_copy') }} where gender = 'Female'
|
||||
@@ -1,5 +0,0 @@
|
||||
|
||||
-- multiple ephemeral refs should share a cte
|
||||
select * from {{ref('base')}} where gender = 'Male'
|
||||
union all
|
||||
select * from {{ref('base')}} where gender = 'Female'
|
||||
@@ -1,6 +0,0 @@
|
||||
|
||||
-- base_copy just pulls from base. Make sure the listed
|
||||
-- graph of CTEs all share the same dbt_cte__base cte
|
||||
select * from {{ref('base')}} where gender = 'Male'
|
||||
union all
|
||||
select * from {{ref('base_copy')}} where gender = 'Female'
|
||||
@@ -1,3 +0,0 @@
|
||||
select * from {{ref('female_only')}}
|
||||
union all
|
||||
select * from {{ref('double_dependent')}} where gender = 'Male'
|
||||
@@ -1,99 +0,0 @@
|
||||
from test.integration.base import DBTIntegrationTest, use_profile
|
||||
import os
|
||||
import re
|
||||
|
||||
|
||||
class TestEphemeralMulti(DBTIntegrationTest):
|
||||
@property
|
||||
def schema(self):
|
||||
return "ephemeral_020"
|
||||
|
||||
@property
|
||||
def models(self):
|
||||
return "models"
|
||||
|
||||
@use_profile('postgres')
|
||||
def test__postgres(self):
|
||||
self.run_sql_file("seed.sql")
|
||||
|
||||
results = self.run_dbt()
|
||||
self.assertEqual(len(results), 3)
|
||||
|
||||
self.assertTablesEqual("seed", "dependent")
|
||||
self.assertTablesEqual("seed", "double_dependent")
|
||||
self.assertTablesEqual("seed", "super_dependent")
|
||||
self.assertTrue(os.path.exists(
|
||||
'./target/run/test/models/double_dependent.sql'))
|
||||
with open('./target/run/test/models/double_dependent.sql', 'r') as fp:
|
||||
sql_file = fp.read()
|
||||
|
||||
sql_file = re.sub(r'\d+', '', sql_file)
|
||||
expected_sql = ('create view "dbt"."test_ephemeral_"."double_dependent__dbt_tmp" as ('
|
||||
'with __dbt__cte__base as ('
|
||||
'select * from test_ephemeral_.seed'
|
||||
'), __dbt__cte__base_copy as ('
|
||||
'select * from __dbt__cte__base'
|
||||
')-- base_copy just pulls from base. Make sure the listed'
|
||||
'-- graph of CTEs all share the same dbt_cte__base cte'
|
||||
"select * from __dbt__cte__base where gender = 'Male'"
|
||||
'union all'
|
||||
"select * from __dbt__cte__base_copy where gender = 'Female'"
|
||||
');')
|
||||
sql_file = "".join(sql_file.split())
|
||||
expected_sql = "".join(expected_sql.split())
|
||||
self.assertEqual(sql_file, expected_sql)
|
||||
|
||||
|
||||
class TestEphemeralNested(DBTIntegrationTest):
|
||||
@property
|
||||
def schema(self):
|
||||
return "ephemeral_020"
|
||||
|
||||
@property
|
||||
def models(self):
|
||||
return "models-n"
|
||||
|
||||
@use_profile('postgres')
|
||||
def test__postgres(self):
|
||||
|
||||
results = self.run_dbt()
|
||||
self.assertEqual(len(results), 2)
|
||||
|
||||
self.assertTrue(os.path.exists(
|
||||
'./target/run/test/models-n/root_view.sql'))
|
||||
|
||||
with open('./target/run/test/models-n/root_view.sql', 'r') as fp:
|
||||
sql_file = fp.read()
|
||||
|
||||
sql_file = re.sub(r'\d+', '', sql_file)
|
||||
expected_sql = (
|
||||
'create view "dbt"."test_ephemeral_"."root_view__dbt_tmp" as ('
|
||||
'with __dbt__cte__ephemeral_level_two as ('
|
||||
'select * from "dbt"."test_ephemeral_"."source_table"'
|
||||
'), __dbt__cte__ephemeral as ('
|
||||
'select * from __dbt__cte__ephemeral_level_two'
|
||||
')select * from __dbt__cte__ephemeral'
|
||||
');')
|
||||
|
||||
sql_file = "".join(sql_file.split())
|
||||
expected_sql = "".join(expected_sql.split())
|
||||
self.assertEqual(sql_file, expected_sql)
|
||||
|
||||
|
||||
class TestEphemeralErrorHandling(DBTIntegrationTest):
|
||||
@property
|
||||
def schema(self):
|
||||
return "ephemeral_020"
|
||||
|
||||
@property
|
||||
def models(self):
|
||||
return "ephemeral-errors"
|
||||
|
||||
@use_profile('postgres')
|
||||
def test__postgres_upstream_error(self):
|
||||
self.run_sql_file("seed.sql")
|
||||
|
||||
results = self.run_dbt(expect_pass=False)
|
||||
self.assertEqual(len(results), 1)
|
||||
self.assertEqual(results[0].status, 'skipped')
|
||||
self.assertIn('Compilation Error', results[0].message)
|
||||
231
tests/adapter/dbt/tests/adapter/ephemeral/test_ephemeral.py
Normal file
231
tests/adapter/dbt/tests/adapter/ephemeral/test_ephemeral.py
Normal file
@@ -0,0 +1,231 @@
|
||||
import pytest
|
||||
import re
|
||||
import os
|
||||
from pathlib import Path
|
||||
from dbt.tests.util import run_dbt, check_relations_equal
|
||||
|
||||
|
||||
models__dependent_sql = """
|
||||
|
||||
-- multiple ephemeral refs should share a cte
|
||||
select * from {{ref('base')}} where gender = 'Male'
|
||||
union all
|
||||
select * from {{ref('base')}} where gender = 'Female'
|
||||
|
||||
"""
|
||||
|
||||
models__double_dependent_sql = """
|
||||
|
||||
-- base_copy just pulls from base. Make sure the listed
|
||||
-- graph of CTEs all share the same dbt_cte__base cte
|
||||
select * from {{ref('base')}} where gender = 'Male'
|
||||
union all
|
||||
select * from {{ref('base_copy')}} where gender = 'Female'
|
||||
|
||||
"""
|
||||
|
||||
models__super_dependent_sql = """
|
||||
select * from {{ref('female_only')}}
|
||||
union all
|
||||
select * from {{ref('double_dependent')}} where gender = 'Male'
|
||||
|
||||
"""
|
||||
|
||||
models__base__female_only_sql = """
|
||||
{{ config(materialized='ephemeral') }}
|
||||
|
||||
select * from {{ ref('base_copy') }} where gender = 'Female'
|
||||
|
||||
"""
|
||||
|
||||
models__base__base_sql = """
|
||||
{{ config(materialized='ephemeral') }}
|
||||
|
||||
select * from {{ this.schema }}.seed
|
||||
|
||||
"""
|
||||
|
||||
models__base__base_copy_sql = """
|
||||
{{ config(materialized='ephemeral') }}
|
||||
|
||||
select * from {{ ref('base') }}
|
||||
|
||||
"""
|
||||
|
||||
ephemeral_errors__dependent_sql = """
|
||||
-- base copy is an error
|
||||
select * from {{ref('base_copy')}} where gender = 'Male'
|
||||
|
||||
"""
|
||||
|
||||
ephemeral_errors__base__base_sql = """
|
||||
{{ config(materialized='ephemeral') }}
|
||||
|
||||
select * from {{ this.schema }}.seed
|
||||
|
||||
"""
|
||||
|
||||
ephemeral_errors__base__base_copy_sql = """
|
||||
{{ config(materialized='ephemeral') }}
|
||||
|
||||
{{ adapter.invalid_method() }}
|
||||
|
||||
select * from {{ ref('base') }}
|
||||
|
||||
"""
|
||||
|
||||
models_n__ephemeral_level_two_sql = """
|
||||
{{
|
||||
config(
|
||||
materialized = "ephemeral",
|
||||
)
|
||||
}}
|
||||
select * from {{ ref('source_table') }}
|
||||
|
||||
"""
|
||||
|
||||
models_n__root_view_sql = """
|
||||
select * from {{ref("ephemeral")}}
|
||||
|
||||
"""
|
||||
|
||||
models_n__ephemeral_sql = """
|
||||
{{
|
||||
config(
|
||||
materialized = "ephemeral",
|
||||
)
|
||||
}}
|
||||
select * from {{ref("ephemeral_level_two")}}
|
||||
|
||||
"""
|
||||
|
||||
models_n__source_table_sql = """
|
||||
{{ config(materialized='table') }}
|
||||
|
||||
with source_data as (
|
||||
|
||||
select 1 as id
|
||||
union all
|
||||
select null as id
|
||||
|
||||
)
|
||||
|
||||
select *
|
||||
from source_data
|
||||
|
||||
"""
|
||||
|
||||
|
||||
@pytest.fixture(scope="class", autouse=True)
|
||||
def setUp(project):
|
||||
project.run_sql_file(project.test_data_dir / Path("seed.sql"))
|
||||
|
||||
|
||||
class BaseEphemeralMulti:
|
||||
@pytest.fixture(scope="class")
|
||||
def models(self):
|
||||
return {
|
||||
"dependent.sql": models__dependent_sql,
|
||||
"double_dependent.sql": models__double_dependent_sql,
|
||||
"super_dependent.sql": models__super_dependent_sql,
|
||||
"base": {
|
||||
"female_only.sql": models__base__female_only_sql,
|
||||
"base.sql": models__base__base_sql,
|
||||
"base_copy.sql": models__base__base_copy_sql,
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
class TestEphemeralMulti:
|
||||
@pytest.fixture(scope="class")
|
||||
def models(self):
|
||||
return {
|
||||
"dependent.sql": models__dependent_sql,
|
||||
"double_dependent.sql": models__double_dependent_sql,
|
||||
"super_dependent.sql": models__super_dependent_sql,
|
||||
"base": {
|
||||
"female_only.sql": models__base__female_only_sql,
|
||||
"base.sql": models__base__base_sql,
|
||||
"base_copy.sql": models__base__base_copy_sql,
|
||||
},
|
||||
}
|
||||
|
||||
def test_ephemeral_multi(self, project):
|
||||
results = run_dbt(["run"])
|
||||
assert len(results) == 3
|
||||
|
||||
check_relations_equal(project.adapter, ["seed", "dependent"])
|
||||
check_relations_equal(project.adapter, ["seed", "double_dependent"])
|
||||
check_relations_equal(project.adapter, ["seed", "super_dependent"])
|
||||
assert os.path.exists("./target/run/test/models/double_dependent.sql")
|
||||
with open("./target/run/test/models/double_dependent.sql", "r") as fp:
|
||||
sql_file = fp.read()
|
||||
|
||||
sql_file = re.sub(r"\d+", "", sql_file)
|
||||
expected_sql = (
|
||||
'create view "dbt"."test_test_ephemeral"."double_dependent__dbt_tmp" as ('
|
||||
"with __dbt__cte__base as ("
|
||||
"select * from test_test_ephemeral.seed"
|
||||
"), __dbt__cte__base_copy as ("
|
||||
"select * from __dbt__cte__base"
|
||||
")-- base_copy just pulls from base. Make sure the listed"
|
||||
"-- graph of CTEs all share the same dbt_cte__base cte"
|
||||
"select * from __dbt__cte__base where gender = 'Male'"
|
||||
"union all"
|
||||
"select * from __dbt__cte__base_copy where gender = 'Female'"
|
||||
");"
|
||||
)
|
||||
sql_file = "".join(sql_file.split())
|
||||
expected_sql = "".join(expected_sql.split())
|
||||
assert sql_file == expected_sql
|
||||
|
||||
|
||||
class TestEphemeralNested:
|
||||
@pytest.fixture(scope="class")
|
||||
def models(self):
|
||||
return {
|
||||
"ephemeral_level_two.sql": models_n__ephemeral_level_two_sql,
|
||||
"root_view.sql": models_n__root_view_sql,
|
||||
"ephemeral.sql": models_n__ephemeral_sql,
|
||||
"source_table.sql": models_n__source_table_sql,
|
||||
}
|
||||
|
||||
def test_ephemeral_nested(self, project):
|
||||
results = run_dbt(["run"])
|
||||
assert len(results) == 2
|
||||
assert os.path.exists("./target/run/test/models/root_view.sql")
|
||||
with open("./target/run/test/models/root_view.sql", "r") as fp:
|
||||
sql_file = fp.read()
|
||||
|
||||
sql_file = re.sub(r"\d+", "", sql_file)
|
||||
expected_sql = (
|
||||
'create view "dbt"."test_test_ephemeral"."root_view__dbt_tmp" as ('
|
||||
"with __dbt__cte__ephemeral_level_two as ("
|
||||
'select * from "dbt"."test_test_ephemeral"."source_table"'
|
||||
"), __dbt__cte__ephemeral as ("
|
||||
"select * from __dbt__cte__ephemeral_level_two"
|
||||
")select * from __dbt__cte__ephemeral"
|
||||
");"
|
||||
)
|
||||
|
||||
sql_file = "".join(sql_file.split())
|
||||
expected_sql = "".join(expected_sql.split())
|
||||
assert sql_file == expected_sql
|
||||
|
||||
|
||||
class TestEphemeralErrorHandling:
|
||||
@pytest.fixture(scope="class")
|
||||
def models(self):
|
||||
return {
|
||||
"dependent.sql": ephemeral_errors__dependent_sql,
|
||||
"base": {
|
||||
"base.sql": ephemeral_errors__base__base_sql,
|
||||
"base_copy.sql": ephemeral_errors__base__base_copy_sql,
|
||||
},
|
||||
}
|
||||
|
||||
def test_ephemeral_error_handling(self, project):
|
||||
results = run_dbt(["run"], expect_pass=False)
|
||||
assert len(results) == 1
|
||||
assert results[0].status == "skipped"
|
||||
assert "Compilation Error" in results[0].message
|
||||
Reference in New Issue
Block a user