Skip to content

Commit

Permalink
dbt-core 1.3 upgrade: New functional adapter tests (#63)
Browse files Browse the repository at this point in the history
### Summary

dbt-core 1.3 upgrade: New functional adapter tests

### Description

Implement:
- BaseIncrementalNotSchemaChange
- BaseTypeBoolean
- BaseCurrentTimestampNaive
- BaseConcurrency

### Related Issue

#45
  • Loading branch information
ArgusLi authored Nov 9, 2022
1 parent b626bb9 commit 3282721
Show file tree
Hide file tree
Showing 11 changed files with 282 additions and 195 deletions.
156 changes: 114 additions & 42 deletions THIRD_PARTY_LICENSES.txt

Large diffs are not rendered by default.

33 changes: 33 additions & 0 deletions tests/fixtures/profiles.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import pytest
from tests.functional.adapter.utils.test_utils import DATALAKE

# This ensures the schema works with our datalake
@pytest.fixture(scope="class")
def unique_schema(request, prefix) -> str:
test_file = request.module.__name__
# We only want the last part of the name
test_file = test_file.split(".")[-1]
unique_schema = f"{prefix}_{test_file}"
return unique_schema


# Override this fixture to set root_path=schema
@pytest.fixture(scope="class")
def dbt_profile_data(unique_schema, dbt_profile_target, profiles_config_update):
profile = {
"config": {"send_anonymous_usage_stats": False},
"test": {
"outputs": {
"default": {},
},
"target": "default",
},
}
target = dbt_profile_target
target["schema"] = unique_schema
target["root_path"] = f"{DATALAKE}.{unique_schema}"
profile["test"]["outputs"]["default"] = target

if profiles_config_update:
profile.update(profiles_config_update)
return profile
32 changes: 1 addition & 31 deletions tests/functional/adapter/basic/test_adapter_methods.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
import pytest
from dbt.tests.adapter.basic.test_adapter_methods import BaseAdapterMethod
from dbt.tests.adapter.basic.test_adapter_methods import models__upstream_sql
from tests.functional.adapter.utils.test_utils import DATALAKE
from tests.fixtures.profiles import unique_schema, dbt_profile_data

models__my_model_sql = """
Expand Down Expand Up @@ -66,36 +66,6 @@ def models(self):
"model_view.sql": models__my_model_sql,
}

@pytest.fixture(scope="class")
def unique_schema(self, request, prefix) -> str:
test_file = request.module.__name__
# We only want the last part of the name
test_file = test_file.split(".")[-1]
unique_schema = f"{DATALAKE}.{prefix}_{test_file}"
return unique_schema

@pytest.fixture(scope="class")
def dbt_profile_data(
self, unique_schema, dbt_profile_target, profiles_config_update
):
profile = {
"config": {"send_anonymous_usage_stats": False},
"test": {
"outputs": {
"default": {},
},
"target": "default",
},
}
target = dbt_profile_target
target["schema"] = unique_schema
target["root_path"] = unique_schema
profile["test"]["outputs"]["default"] = target

if profiles_config_update:
profile.update(profiles_config_update)
return profile

@pytest.fixture(scope="class")
def equal_tables(self):
return ["model_view", "expected_view"]
1 change: 0 additions & 1 deletion tests/functional/adapter/basic/test_docs_generate.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@
schema=var('alternate_schema')
)
}}
select * from {{ ref('seed') }}
"""

Expand Down
33 changes: 4 additions & 29 deletions tests/functional/adapter/basic/test_ephemeral.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,36 +14,11 @@

import pytest
from dbt.tests.adapter.basic.test_ephemeral import BaseEphemeral
from dbt.tests.adapter.ephemeral.test_ephemeral import BaseEphemeralMulti
from tests.functional.adapter.utils.test_utils import DATALAKE
from dbt.tests.util import run_dbt
from tests.fixtures.profiles import unique_schema, dbt_profile_data


class TestEphemeralDremio(BaseEphemeral):
@pytest.fixture(scope="class")
def unique_schema(self, request, prefix) -> str:
test_file = request.module.__name__
# We only want the last part of the name
test_file = test_file.split(".")[-1]
unique_schema = f"{DATALAKE}.{prefix}_{test_file}"
return unique_schema

@pytest.fixture(scope="class")
def dbt_profile_data(
self, unique_schema, dbt_profile_target, profiles_config_update
):
profile = {
"config": {"send_anonymous_usage_stats": False},
"test": {
"outputs": {
"default": {},
},
"target": "default",
},
}
target = dbt_profile_target
target["schema"] = unique_schema
target["root_path"] = unique_schema
profile["test"]["outputs"]["default"] = target

if profiles_config_update:
profile.update(profiles_config_update)
return profile
pass
32 changes: 2 additions & 30 deletions tests/functional/adapter/basic/test_generic_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,36 +14,8 @@

import pytest
from dbt.tests.adapter.basic.test_generic_tests import BaseGenericTests
from tests.functional.adapter.utils.test_utils import DATALAKE
from tests.fixtures.profiles import unique_schema, dbt_profile_data


class TestGenericTestsDremio(BaseGenericTests):
@pytest.fixture(scope="class")
def unique_schema(self, request, prefix) -> str:
test_file = request.module.__name__
# We only want the last part of the name
test_file = test_file.split(".")[-1]
unique_schema = f"{DATALAKE}.{prefix}_{test_file}"
return unique_schema

@pytest.fixture(scope="class")
def dbt_profile_data(
self, unique_schema, dbt_profile_target, profiles_config_update
):
profile = {
"config": {"send_anonymous_usage_stats": False},
"test": {
"outputs": {
"default": {},
},
"target": "default",
},
}
target = dbt_profile_target
target["schema"] = unique_schema
target["root_path"] = unique_schema
profile["test"]["outputs"]["default"] = target

if profiles_config_update:
profile.update(profiles_config_update)
return profile
pass
41 changes: 10 additions & 31 deletions tests/functional/adapter/basic/test_incremental.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,37 +13,16 @@
# limitations under the License.

import pytest
from dbt.tests.adapter.basic.test_incremental import BaseIncremental
from tests.functional.adapter.utils.test_utils import DATALAKE
from dbt.tests.adapter.basic.test_incremental import (
BaseIncremental,
BaseIncrementalNotSchemaChange,
)
from tests.fixtures.profiles import unique_schema, dbt_profile_data


class TestIncrementalDremio(BaseIncremental):
@pytest.fixture(scope="class")
def unique_schema(self, request, prefix) -> str:
test_file = request.module.__name__
# We only want the last part of the name
test_file = test_file.split(".")[-1]
unique_schema = f"{DATALAKE}.{prefix}_{test_file}"
return unique_schema

@pytest.fixture(scope="class")
def dbt_profile_data(
self, unique_schema, dbt_profile_target, profiles_config_update
):
profile = {
"config": {"send_anonymous_usage_stats": False},
"test": {
"outputs": {
"default": {},
},
"target": "default",
},
}
target = dbt_profile_target
target["schema"] = unique_schema
target["root_path"] = unique_schema
profile["test"]["outputs"]["default"] = target

if profiles_config_update:
profile.update(profiles_config_update)
return profile
pass


class TestBaseIncrementalNotSchemaChange(BaseIncrementalNotSchemaChange):
pass
33 changes: 2 additions & 31 deletions tests/functional/adapter/basic/test_singular_ephemeral.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,40 +12,11 @@
# See the License for the specific language governing permissions and
# limitations under the License.

import pytest
from dbt.tests.adapter.basic.test_singular_tests_ephemeral import (
BaseSingularTestsEphemeral,
)
from tests.functional.adapter.utils.test_utils import DATALAKE
from tests.fixtures.profiles import unique_schema, dbt_profile_data


class TestSingularTestsEphemeralDremio(BaseSingularTestsEphemeral):
@pytest.fixture(scope="class")
def unique_schema(self, request, prefix) -> str:
test_file = request.module.__name__
# We only want the last part of the name
test_file = test_file.split(".")[-1]
unique_schema = f"{DATALAKE}.{prefix}_{test_file}"
return unique_schema

@pytest.fixture(scope="class")
def dbt_profile_data(
self, unique_schema, dbt_profile_target, profiles_config_update
):
profile = {
"config": {"send_anonymous_usage_stats": False},
"test": {
"outputs": {
"default": {},
},
"target": "default",
},
}
target = dbt_profile_target
target["schema"] = unique_schema
target["root_path"] = unique_schema
profile["test"]["outputs"]["default"] = target

if profiles_config_update:
profile.update(profiles_config_update)
return profile
pass
102 changes: 102 additions & 0 deletions tests/functional/adapter/test_concurrency.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
import pytest
from dbt.tests.adapter.concurrency.test_concurrency import (
BaseConcurrency,
models__dep_sql,
models__view_with_conflicting_cascade_sql,
models__skip_sql,
seeds__update_csv,
)
from dbt.tests.util import (
check_relations_equal,
check_table_does_not_exist,
rm_file,
run_dbt,
run_dbt_and_capture,
write_file,
)
from tests.fixtures.profiles import unique_schema, dbt_profile_data

models__invalid_sql = """
{{
config(
materialized = "table"
)
}}
select a_field_that_does_not_exist from {{ ref(var('seed_name', 'seed')) }}
"""

models__table_a_sql = """
{{
config(
materialized = "table"
)
}}
select * from {{ ref(var('seed_name', 'seed')) }}
"""

models__table_b_sql = """
{{
config(
materialized = "table"
)
}}
select * from {{ ref(var('seed_name', 'seed')) }}
"""

models__view_model_sql = """
{{
config(
materialized = "view"
)
}}
select * from {{ ref(var('seed_name', 'seed')) }}
"""


class TestConcurrency(BaseConcurrency):
# invalid_sql, table_a_sql, table_b_sql and view_model_sql
# are overriden to ensure the seed file path is correct.
@pytest.fixture(scope="class")
def models(self):
return {
"invalid.sql": models__invalid_sql,
"table_a.sql": models__table_a_sql,
"table_b.sql": models__table_b_sql,
"view_model.sql": models__view_model_sql,
"dep.sql": models__dep_sql,
"view_with_conflicting_cascade.sql": models__view_with_conflicting_cascade_sql,
"skip.sql": models__skip_sql,
}

def test_concurrency(self, project):
run_dbt(["seed", "--select", "seed"])
results = run_dbt(["run"], expect_pass=False)
assert len(results) == 7
check_relations_equal(project.adapter, ["seed", "view_model"])
check_relations_equal(project.adapter, ["seed", "dep"])
check_relations_equal(project.adapter, ["seed", "table_a"])
check_relations_equal(project.adapter, ["seed", "table_b"])
check_table_does_not_exist(project.adapter, "invalid")
check_table_does_not_exist(project.adapter, "skip")

rm_file(project.project_root, "seeds", "seed.csv")
write_file(seeds__update_csv, project.project_root, "seeds", "seed.csv")

results, output = run_dbt_and_capture(["run"], expect_pass=False)
assert len(results) == 7
check_relations_equal(project.adapter, ["seed", "view_model"])
check_relations_equal(project.adapter, ["seed", "dep"])
check_relations_equal(project.adapter, ["seed", "table_a"])
check_relations_equal(project.adapter, ["seed", "table_b"])
check_table_does_not_exist(project.adapter, "invalid")
check_table_does_not_exist(project.adapter, "skip")

assert "PASS=5 WARN=0 ERROR=1 SKIP=1 TOTAL=7" in output
6 changes: 6 additions & 0 deletions tests/functional/adapter/test_data_types.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from dbt.tests.adapter.utils.data_types.test_type_boolean import BaseTypeBoolean
from tests.fixtures.profiles import unique_schema, dbt_profile_data


class TestTypeBoolean(BaseTypeBoolean):
pass
8 changes: 8 additions & 0 deletions tests/functional/adapter/utils/test_current_timestamp.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from dbt.tests.adapter.utils.test_current_timestamp import (
BaseCurrentTimestampNaive,
)
from tests.fixtures.profiles import unique_schema, dbt_profile_data


class TestCurrentTimestampNaive(BaseCurrentTimestampNaive):
pass

0 comments on commit 3282721

Please sign in to comment.