Skip to content

Commit

Permalink
Add support for model versions
Browse files Browse the repository at this point in the history
  • Loading branch information
psousa50 committed Jul 30, 2023
1 parent b421500 commit 9f11746
Show file tree
Hide file tree
Showing 14 changed files with 110 additions and 22 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{% if dbt_unit_testing.version_bigger_or_equal_to("1.5") %}
select * from {{ dbt_unit_testing.ref('model_with_version') }} where a > 0
{% endif %}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{% if dbt_unit_testing.version_bigger_or_equal_to("1.5") %}
select * from {{ dbt_unit_testing.ref('model_with_version', v=1) }} where a > 1
{% endif %}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{% if dbt_unit_testing.version_bigger_or_equal_to("1.5") %}
select * from {{ dbt_unit_testing.ref('model_with_version', version=2) }} where a > 2
{% endif %}

1 change: 1 addition & 0 deletions integration-tests/models/model_with_version_v1.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
select 1 as a
1 change: 1 addition & 0 deletions integration-tests/models/model_with_version_v2.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
select 2 as a
8 changes: 8 additions & 0 deletions integration-tests/models/schema.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
version: 2

models:
- name: model_with_version

versions:
- v: 1
- v: 2
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
{{
config(
tags=['unit-test', 'bigquery', 'snowflake', 'postgres', 'versioned', '1.5.4']
)
}}

{% call dbt_unit_testing.test('model_references_model_with_version', 'latest version') %}
{% call dbt_unit_testing.mock_ref ('model_with_version') %}
select 0 as a
UNION ALL
select 1234 as a
{% endcall %}
{% call dbt_unit_testing.expect() %}
select 1234 as a
{% endcall %}
{% endcall %}

UNION ALL

{% call dbt_unit_testing.test('model_references_model_with_version_1', 'version 1') %}
{% call dbt_unit_testing.mock_ref ('model_with_version', v=1) %}
select 1 as a
UNION ALL
select 1234 as a
{% endcall %}
{% call dbt_unit_testing.expect() %}
select 1234 as a
{% endcall %}
{% endcall %}

UNION ALL

{% call dbt_unit_testing.test('model_references_model_with_version_2', 'version 2') %}
{% call dbt_unit_testing.mock_ref ('model_with_version', version=2) %}
select 2 as a
UNION ALL
select 1234 as a
{% endcall %}
{% call dbt_unit_testing.expect() %}
select 1234 as a
{% endcall %}
{% endcall %}

2 changes: 2 additions & 0 deletions macros/mock_builders.sql
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,13 @@
{% if model_name is undefined %}
{{ dbt_unit_testing.raise_error('model_name must be provided for mock_ref') }}
{% endif %}
{% set node_version = kwargs["version"] | default(kwargs["v"]) | default(none) %}
{% set mock = {
"type": 'mock',
"resource_type": 'model',
"name": model_name,
"package_name": project_or_package,
"version": node_version,
"options": options,
"input_values": caller(),
}
Expand Down
7 changes: 4 additions & 3 deletions macros/overrides.sql
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
{% macro ref(project_or_package, model_name) %}
{% set project_or_package, model_name = dbt_unit_testing.setup_project_and_model_name(project_or_package, model_name) %}
{% if dbt_unit_testing.running_unit_test() %}
{% set node = {"package_name": project_or_package, "name": model_name} %}
{{ return (dbt_unit_testing.ref_cte_name(node)) }}
{% set node_version = kwargs["version"] | default (kwargs["v"]) %}
{% set node = {"package_name": project_or_package, "name": model_name, "version": node_version} %}
{{ return (dbt_unit_testing.ref_cte_name(node)) }}
{% else %}
{{ return (builtins.ref(project_or_package, model_name)) }}
{{ return (builtins.ref(project_or_package, model_name, **kwargs)) }}
{% endif %}
{% endmacro %}

Expand Down
12 changes: 8 additions & 4 deletions macros/sql_builders.sql
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,15 @@
{% endmacro %}

{% macro ref_cte_name(node) %}
{% if node.project_or_package == model.package_name %}
{{ return (dbt_unit_testing.quote_identifier(node.name)) }}
{% else %}
{{ return (dbt_unit_testing.quote_identifier([node.package_name, node.name] | join("__"))) }}
{% set node = dbt_unit_testing.model_node(node) %}
{% set parts = [node.name] %}
{% if node.package_name != model.package_name %}
{% set parts = [node.package_name] + parts %}
{% endif %}
{% if node.version is not none %}
{% set parts = parts + [node.version] %}
{% endif %}
{{ return (dbt_unit_testing.quote_identifier(parts | join("__"))) }}
{% endmacro %}

{% macro source_cte_name(node) %}
Expand Down
34 changes: 23 additions & 11 deletions macros/utils.sql
Original file line number Diff line number Diff line change
Expand Up @@ -66,19 +66,27 @@
{{ return (graph.nodes[node_id] if node_id in graph.nodes else graph.sources[node_id]) }}
{% endmacro %}

{% macro graph_node_by_prefix (prefix, node) %}
{{ return (graph.nodes[prefix ~ "." ~ node.package_name ~ "." ~ node.name])}}
{% endmacro %}

{% macro model_node (node) %}
{% set node = nil
| default(dbt_unit_testing.graph_node_by_prefix("model", node))
| default(dbt_unit_testing.graph_node_by_prefix("snapshot", node))
| default(dbt_unit_testing.graph_node_by_prefix("seed", node)) %}
{% if not node %}
{{ dbt_unit_testing.raise_error("Node " ~ node.package_name ~ "." ~ node.name ~ " not found.") }}
{% set graph_nodes = graph.nodes.values() |
selectattr('package_name', 'equalto', node.package_name) |
selectattr('name', 'equalto', node.name) |
list %}
{% if graph_nodes | length > 0 %}
{% if node.version is defined and node.version is not none %}
{% set graph_nodes = graph_nodes | selectattr('version', 'equalto', node.version) | list %}
{% else %}
{% set latest_version = graph_nodes[0].latest_version %}
{% if latest_version is defined and latest_version is not none %}
{% set graph_nodes = graph_nodes | selectattr('version', 'equalto', latest_version) | list %}
{% endif %}
{% endif %}
{% endif %}
{{ return (node) }}
{% if graph_nodes | length == 0 %}
{% set node_version = '_v' ~ node.version if node.version is defined and node.version is not none else '' %}
{{ dbt_unit_testing.raise_error("Node " ~ node.package_name ~ "." ~ node.name ~ node_version ~ " not found.") }}
{% endif %}
{% set graph_node = graph_nodes[0] %}
{{ return (graph_node) }}
{% endmacro %}

{% macro source_node(node) %}
Expand Down Expand Up @@ -190,3 +198,7 @@
{% do context.update({test_key: {}}) %}
{% endmacro %}

{% macro version_bigger_or_equal_to(v) %}
{{ return (dbt_version >= v )}}
{% endmacro %}

10 changes: 8 additions & 2 deletions run-integration-tests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,11 @@ if [ -z "$1" ]; then
exit 1
fi

if [ -z "$2" ]; then
echo 'Please provide dbt version'
exit 1
fi

PROFILE=$1

cd integration-tests || exit
Expand All @@ -23,12 +28,13 @@ dbt run-operation macro_with_ref --target "$PROFILE"
# create seeds in the database
dbt seed --target "$PROFILE" --select seeds/real_seeds
# run tests with no database dependency
dbt test --target "$PROFILE" --select tag:unit-test,tag:"$PROFILE" --exclude tag:db-dependency
dbt test --target "$PROFILE" --select tag:unit-test,tag:"$PROFILE" --exclude tag:db-dependency --exclude tag:versioned
dbt test --target "$PROFILE" --select tag:unit-test,tag:"$PROFILE",tag:"$DBT_VERSION" --exclude tag:db-dependency

# create sources in the database
dbt seed --target "$PROFILE" --select seeds/existing_sources
# create models in the database for tests that depends on database models
dbt run --target "$PROFILE" --select tag:add-to-database
dbt run --target "$PROFILE" --select tag:add-to-database

# run tests with database dependency
dbt test --target "$PROFILE" --select tag:unit-test,tag:"$PROFILE",tag:db-dependency
2 changes: 1 addition & 1 deletion run-tests-helper.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ function run_tests() {
local PROFILE=$2

if [ "$PROFILE" == "postgres" ]; then
VERSIONS="1.3.3 1.4.5"
VERSIONS="1.3.4 1.4.6 1.5.4"
elif [ "$PROFILE" == "bigquery" ]; then
VERSIONS="1.3.2"
elif [ "$PROFILE" == "snowflake" ]; then
Expand Down
2 changes: 1 addition & 1 deletion run-tests-on-dbt-version.sh
Original file line number Diff line number Diff line change
Expand Up @@ -33,4 +33,4 @@ pip install "dbt-$PROFILE==$DBT_VERSION"

source "$VENV_FOLDER/bin/activate"

"$SCRIPT_DIR/$TEST_SCRIPT.sh" "$PROFILE"
"$SCRIPT_DIR/$TEST_SCRIPT.sh" "$PROFILE" "$DBT_VERSION"

0 comments on commit 9f11746

Please sign in to comment.