Skip to content

Commit

Permalink
feat: add new functional tests from 1.3.0 (#32)
Browse files Browse the repository at this point in the history
  • Loading branch information
tomsej authored Oct 24, 2022
1 parent ad543ec commit 04fa9a7
Show file tree
Hide file tree
Showing 14 changed files with 529 additions and 30 deletions.
104 changes: 98 additions & 6 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,12 +43,12 @@ jobs:

steps:
- name: Check out the repository
uses: actions/checkout@v2
uses: actions/checkout@v3
with:
persist-credentials: false

- name: Set up Python
uses: actions/setup-python@v2
uses: actions/setup-python@v4

- name: Install python dependencies
run: |
Expand All @@ -64,19 +64,111 @@ jobs:
- name: Run pre-commit hooks
run: pre-commit run --all-files --show-diff-on-failure

unit:
name: unit test / python ${{ matrix.python-version }}

runs-on: ubuntu-latest

strategy:
fail-fast: false
matrix:
python-version: [3.7, 3.8, 3.9]

env:
TOXENV: "unit"
PYTEST_ADDOPTS: "-v --color=yes --csv unit_results.csv"

steps:
- name: Check out the repository
uses: actions/checkout@v3
with:
persist-credentials: false

- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}

- name: Install python dependencies
run: |
python -m pip install --user --upgrade pip
python -m pip install tox
python -m pip --version
tox --version
- name: Run tox
run: tox

- name: Get current date
if: always()
id: date
run: echo "date=$(date +'%Y-%m-%dT%H_%M_%S')" >> $GITHUB_OUTPUT #no colons allowed for artifacts

- uses: actions/upload-artifact@v3
if: always()
with:
name: unit_results_${{ matrix.python-version }}-${{ steps.date.outputs.date }}.csv
path: unit_results.csv

functional:
name: functional test / python ${{ matrix.python-version }}

runs-on: ubuntu-latest

strategy:
fail-fast: false
matrix:
python-version: [3.7, 3.8, 3.9]

env:
TOXENV: "functional"
PYTEST_ADDOPTS: "-v --color=yes --csv unit_results.csv"

steps:
- name: Check out the repository
uses: actions/checkout@v3
with:
persist-credentials: false

- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}

- name: Install python dependencies
run: |
python -m pip install --user --upgrade pip
python -m pip install tox
python -m pip --version
tox --version
- name: Run tox
run: tox

- name: Get current date
if: always()
id: date
run: echo "date=$(date +'%Y-%m-%dT%H_%M_%S')" >> $GITHUB_OUTPUT #no colons allowed for artifacts

- uses: actions/upload-artifact@v3
if: always()
with:
name: functional_results_${{ matrix.python-version }}-${{ steps.date.outputs.date }}.csv
path: functional_results.csv

build:
name: build packages

runs-on: ubuntu-latest

steps:
- name: Check out the repository
uses: actions/checkout@v2
uses: actions/checkout@v3
with:
persist-credentials: false

- name: Set up Python
uses: actions/setup-python@v2
uses: actions/setup-python@v4
with:
python-version: 3.8

Expand All @@ -98,7 +190,7 @@ jobs:
run: |
check-wheel-contents dist/*.whl --ignore W002,W007,W008
- uses: actions/upload-artifact@v2
- uses: actions/upload-artifact@v3
with:
name: dist
path: dist/
Expand All @@ -118,7 +210,7 @@ jobs:

steps:
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v2
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}

Expand Down
4 changes: 4 additions & 0 deletions dbt/adapters/duckdb/impl.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,7 @@ def date_function(cls):
@classmethod
def is_cancelable(cls):
return False

def valid_incremental_strategies(self):
"""DuckDB does not currently support MERGE statement."""
return ["append", "delete+insert"]
12 changes: 12 additions & 0 deletions dbt/include/duckdb/macros/adapters.sql
Original file line number Diff line number Diff line change
Expand Up @@ -129,3 +129,15 @@
{% macro duckdb__snapshot_get_time() -%}
{{ current_timestamp() }}::timestamp
{%- endmacro %}

{% macro duckdb__get_incremental_default_sql(arg_dict) %}
{% do return(get_incremental_delete_insert_sql(arg_dict)) %}
{% endmacro %}

{% macro duckdb__get_incremental_delete_insert_sql(arg_dict) %}
{% do return(get_delete_insert_merge_sql(arg_dict["target_relation"].include(database=False), arg_dict["temp_relation"], arg_dict["unique_key"], arg_dict["dest_columns"])) %}
{% endmacro %}

{% macro duckdb__get_incremental_append_sql(arg_dict) %}
{% do return(get_insert_into_sql(arg_dict["target_relation"].include(database=False), arg_dict["temp_relation"], arg_dict["dest_columns"])) %}
{% endmacro %}
7 changes: 5 additions & 2 deletions dev-requirements.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
# install latest changes in dbt-core
git+https://github.com/dbt-labs/dbt-core.git#egg=dbt-core&subdirectory=core
git+https://github.com/dbt-labs/dbt-core.git#egg=dbt-tests-adapter&subdirectory=tests/adapter
# git+https://github.com/dbt-labs/dbt-core.git#egg=dbt-core&subdirectory=core
# git+https://github.com/dbt-labs/dbt-core.git#egg=dbt-tests-adapter&subdirectory=tests/adapter

dbt-tests-adapter==1.3.0

pandas
black==22.3.0
bumpversion
flake8
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ def _dbt_duckdb_version():
packages=find_namespace_packages(include=["dbt", "dbt.*"]),
include_package_data=True,
install_requires=[
"dbt-core~=1.2.0",
"dbt-core~=1.3.0",
"duckdb~=0.5.0",
],
)
40 changes: 40 additions & 0 deletions tests/functional/adapter/test_concurrency.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
from dbt.tests.adapter.concurrency.test_concurrency import (
BaseConcurrency,
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,
)


class TestConcurenncy(BaseConcurrency):
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"])
# There is some error in DuckDB causing the missing email identifier. Please ucomment in futer version of dbt
# 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
99 changes: 99 additions & 0 deletions tests/functional/adapter/test_ephemeral.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
import os
import re

import pytest
from dbt.tests.adapter.ephemeral.test_ephemeral import (
BaseEphemeral,
BaseEphemeralMulti,
ephemeral_errors__base__base_copy_sql,
ephemeral_errors__base__base_sql,
ephemeral_errors__dependent_sql,
models_n__ephemeral_level_two_sql,
models_n__ephemeral_sql,
models_n__root_view_sql,
models_n__source_table_sql,
)
from dbt.tests.util import check_relations_equal, run_dbt


class TestEphemeralMulti(BaseEphemeralMulti):
def test_ephemeral_multi(self, project):
run_dbt(["seed"])
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 "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(BaseEphemeral):
@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 "test_test_ephemeral"."root_view__dbt_tmp" as ('
"with __dbt__cte__ephemeral_level_two as ("
'select * from "main"."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(BaseEphemeral):
@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
7 changes: 7 additions & 0 deletions tests/functional/adapter/test_incremental.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from dbt.tests.adapter.incremental.test_incremental_unique_id import (
BaseIncrementalUniqueKey,
)


class TestBaseIncrementalUniqueKey(BaseIncrementalUniqueKey):
pass
27 changes: 21 additions & 6 deletions tests/functional/adapter/test_utils.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,17 @@
import pytest
from dbt.tests.adapter.utils.base_utils import BaseUtils
from dbt.tests.adapter.utils.test_any_value import BaseAnyValue
from dbt.tests.adapter.utils.test_array_append import BaseArrayAppend
from dbt.tests.adapter.utils.test_array_concat import BaseArrayConcat
from dbt.tests.adapter.utils.test_array_construct import BaseArrayConstruct
from dbt.tests.adapter.utils.test_bool_or import BaseBoolOr
from dbt.tests.adapter.utils.test_cast_bool_to_text import BaseCastBoolToText
from dbt.tests.adapter.utils.test_concat import BaseConcat
from dbt.tests.adapter.utils.test_current_timestamp import BaseCurrentTimestampNaive
from dbt.tests.adapter.utils.test_date_trunc import BaseDateTrunc
from dbt.tests.adapter.utils.test_dateadd import BaseDateAdd
from dbt.tests.adapter.utils.test_datediff import BaseDateDiff
from dbt.tests.adapter.utils.test_date_trunc import BaseDateTrunc
from dbt.tests.adapter.utils.test_escape_single_quotes import (
BaseEscapeSingleQuotesQuote,
)
from dbt.tests.adapter.utils.test_escape_single_quotes import (
BaseEscapeSingleQuotesBackslash,
)
from dbt.tests.adapter.utils.test_except import BaseExcept
from dbt.tests.adapter.utils.test_hash import BaseHash
from dbt.tests.adapter.utils.test_intersect import BaseIntersect
Expand Down Expand Up @@ -105,3 +104,19 @@ class TestSplitPart(BaseSplitPart):

class TestStringLiteral(BaseStringLiteral):
pass


class TestArrayAppend(BaseArrayAppend):
pass


class TestArrayConcat(BaseArrayConcat):
pass


class TestArrayConcat(BaseArrayConstruct):
pass


class TestCurrentTimestamp(BaseCurrentTimestampNaive):
pass
Empty file removed tests/integration/__init__.py
Empty file.
6 changes: 0 additions & 6 deletions tests/integration/test_integration.py

This file was deleted.

Loading

0 comments on commit 04fa9a7

Please sign in to comment.