Compare commits

...

14 Commits

Author SHA1 Message Date
Matthew McKnight
6fe9455bd5 adding a base class to pass along to snowflake 2022-08-30 16:39:31 -05:00
Matthew McKnight
94c3e6bb6c file move 2022-08-30 16:03:31 -05:00
Matthew McKnight
d64b700673 creating a mini feature branch to test snowflake against if we ineherit new ephemeral functional test 2022-08-30 15:52:57 -05:00
Matthew McKnight
656cb394d8 renamed expected_sql to include the test_test_ephemeral style name, organized how models are imported into test classes 2022-08-30 11:29:08 -05:00
Matthew McKnight
76c4952430 Merge branch 'main' of github.com:dbt-labs/dbt into mcknight/convert-020_ephemeral_tests 2022-08-30 10:48:02 -05:00
Matthew McKnight
b3d8e7ca48 directory rename, close on all tests need to fix the test_test_ name change for first two tests and figure out why the new test is calling error instead of skipped in status 2022-08-29 16:47:25 -05:00
Matthew McKnight
2db5c8353a update to expected_sql file 2022-08-29 14:47:33 -05:00
Matthew McKnight
0d7c2bcd71 update to expected_sql file 2022-08-29 14:46:05 -05:00
Matthew McKnight
21c1ef4f37 Merge branch 'main' of github.com:dbt-labs/dbt into mcknight/convert-020_ephemeral_tests 2022-08-29 13:44:35 -05:00
Matthew McKnight
dc76a32879 working on fixing view structure 2022-08-25 12:53:21 -05:00
Matthew McKnight
a77f32f685 added creation and comparison of sql and expected result, seeing issue with extra appended test_ on some and issue with errorhandling regarding expect pass 2022-08-25 12:08:51 -05:00
Matthew McKnight
17f8ef88fc laid out basic flow of tests, need to finish by figuring out how to handle the assertTrue sections and fix error thats occuring 2022-08-24 16:28:51 -05:00
Matthew McKnight
24c908ff67 creating base class to run seed through and pass along to classes to test against 2022-08-24 15:41:33 -05:00
Matthew McKnight
d7e5e68104 init file creation for test_ephemeral conversion 2022-08-22 16:17:52 -05:00
16 changed files with 231 additions and 157 deletions

View File

@@ -1,3 +0,0 @@
{{ config(materialized='ephemeral') }}
select * from {{ this.schema }}.seed

View File

@@ -1,5 +0,0 @@
{{ config(materialized='ephemeral') }}
{{ adapter.invalid_method() }}
select * from {{ ref('base') }}

View File

@@ -1,2 +0,0 @@
-- base copy is an error
select * from {{ref('base_copy')}} where gender = 'Male'

View File

@@ -1,6 +0,0 @@
{{
config(
materialized = "ephemeral",
)
}}
select * from {{ref("ephemeral_level_two")}}

View File

@@ -1,6 +0,0 @@
{{
config(
materialized = "ephemeral",
)
}}
select * from {{ ref('source_table') }}

View File

@@ -1 +0,0 @@
select * from {{ref("ephemeral")}}

View File

@@ -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

View File

@@ -1,3 +0,0 @@
{{ config(materialized='ephemeral') }}
select * from {{ this.schema }}.seed

View File

@@ -1,3 +0,0 @@
{{ config(materialized='ephemeral') }}
select * from {{ ref('base') }}

View File

@@ -1,3 +0,0 @@
{{ config(materialized='ephemeral') }}
select * from {{ ref('base_copy') }} where gender = 'Female'

View File

@@ -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'

View File

@@ -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'

View File

@@ -1,3 +0,0 @@
select * from {{ref('female_only')}}
union all
select * from {{ref('double_dependent')}} where gender = 'Male'

View File

@@ -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)

View 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