From d937113199c006df4dc78cb6597b4e1fcfb7b6bc Mon Sep 17 00:00:00 2001 From: Przemek Denkiewicz Date: Mon, 6 Oct 2025 19:07:23 +0200 Subject: [PATCH 1/5] LocalStack Snowflake changes --- dbt-snowflake/pyproject.toml | 2 +- dbt-snowflake/requirements.txt | 238 ++++++++++++++++++++++++++++++++ dbt-snowflake/tests/conftest.py | 12 +- 3 files changed, 246 insertions(+), 6 deletions(-) create mode 100644 dbt-snowflake/requirements.txt diff --git a/dbt-snowflake/pyproject.toml b/dbt-snowflake/pyproject.toml index d2fcbf580f..6ab0a09388 100644 --- a/dbt-snowflake/pyproject.toml +++ b/dbt-snowflake/pyproject.toml @@ -43,7 +43,7 @@ Changelog = "https://github.com/dbt-labs/dbt-adapters/blob/main/dbt-snowflake/CH [tool.pytest.ini_options] testpaths = ["tests/unit", "tests/functional"] -addopts = "-v --color=yes -n auto" +addopts = "-v --color=yes" env_files = ["test.env"] filterwarnings = [ "ignore:datetime.datetime.utcnow:DeprecationWarning", diff --git a/dbt-snowflake/requirements.txt b/dbt-snowflake/requirements.txt new file mode 100644 index 0000000000..d632189b6b --- /dev/null +++ b/dbt-snowflake/requirements.txt @@ -0,0 +1,238 @@ +# +# This file is autogenerated by pip-compile with Python 3.11 +# by the following command: +# +# pip-compile --output-file=requirements.txt pyproject.toml +# +agate==1.9.1 + # via + # dbt-adapters + # dbt-common + # dbt-core + # dbt-snowflake (pyproject.toml) +annotated-types==0.7.0 + # via pydantic +asn1crypto==1.5.1 + # via snowflake-connector-python +attrs==25.3.0 + # via + # jsonschema + # referencing +babel==2.17.0 + # via agate +backports-tarfile==1.2.0 + # via jaraco-context +boto3==1.40.32 + # via snowflake-connector-python +botocore==1.40.32 + # via + # boto3 + # s3transfer + # snowflake-connector-python +certifi==2025.1.31 + # via + # dbt-snowflake (pyproject.toml) + # requests + # snowflake-connector-python +cffi==1.17.1 + # via + # cryptography + # snowflake-connector-python +charset-normalizer==3.4.3 + # via + # requests + # snowflake-connector-python +click==8.2.1 + # via + # dbt-core + # dbt-semantic-interfaces +colorama==0.4.6 + # via dbt-common +cryptography==46.0.0 + # via + # pyopenssl + # snowflake-connector-python +daff==1.4.2 + # via dbt-core +dbt-adapters==1.16.7 + # via + # dbt-core + # dbt-snowflake (pyproject.toml) +dbt-common==1.30.0 + # via + # dbt-adapters + # dbt-core + # dbt-snowflake (pyproject.toml) +dbt-core==1.10.11 + # via dbt-snowflake (pyproject.toml) +dbt-extractor==0.6.0 + # via dbt-core +dbt-protos==1.0.375 + # via + # dbt-adapters + # dbt-common + # dbt-core +dbt-semantic-interfaces==0.9.0 + # via dbt-core +deepdiff==8.6.1 + # via dbt-common +filelock==3.19.1 + # via snowflake-connector-python +idna==3.10 + # via + # requests + # snowflake-connector-python +importlib-metadata==8.7.0 + # via + # dbt-semantic-interfaces + # keyring +isodate==0.6.1 + # via + # agate + # dbt-common +jaraco-classes==3.4.0 + # via keyring +jaraco-context==6.0.1 + # via keyring +jaraco-functools==4.3.0 + # via keyring +jinja2==3.1.6 + # via + # dbt-common + # dbt-core + # dbt-semantic-interfaces +jmespath==1.0.1 + # via + # boto3 + # botocore +jsonschema==4.25.1 + # via + # dbt-common + # dbt-core + # dbt-semantic-interfaces +jsonschema-specifications==2025.9.1 + # via jsonschema +keyring==25.6.0 + # via snowflake-connector-python +leather==0.4.0 + # via agate +markupsafe==3.0.2 + # via jinja2 +mashumaro[msgpack]==3.14 + # via + # dbt-adapters + # dbt-common + # dbt-core +more-itertools==10.8.0 + # via + # dbt-semantic-interfaces + # jaraco-classes + # jaraco-functools +msgpack==1.1.1 + # via mashumaro +networkx==3.5 + # via dbt-core +orderly-set==5.5.0 + # via deepdiff +packaging==25.0 + # via + # dbt-core + # snowflake-connector-python +parsedatetime==2.6 + # via agate +pathspec==0.12.1 + # via + # dbt-common + # dbt-core +platformdirs==4.4.0 + # via snowflake-connector-python +protobuf==6.32.1 + # via + # dbt-adapters + # dbt-common + # dbt-core + # dbt-protos +pycparser==2.23 + # via cffi +pydantic==2.11.9 + # via + # dbt-core + # dbt-semantic-interfaces +pydantic-core==2.33.2 + # via pydantic +pyjwt==2.10.1 + # via snowflake-connector-python +pyopenssl==25.3.0 + # via snowflake-connector-python +python-dateutil==2.9.0.post0 + # via + # botocore + # dbt-common + # dbt-semantic-interfaces +python-slugify==8.0.4 + # via agate +pytimeparse==1.1.8 + # via agate +pytz==2025.2 + # via + # dbt-adapters + # dbt-core + # snowflake-connector-python +pyyaml==6.0.2 + # via + # dbt-core + # dbt-semantic-interfaces +referencing==0.36.2 + # via + # jsonschema + # jsonschema-specifications +requests==2.32.5 + # via + # dbt-common + # dbt-core + # snowflake-connector-python + # snowplow-tracker +rpds-py==0.27.1 + # via + # jsonschema + # referencing +s3transfer==0.14.0 + # via boto3 +six==1.17.0 + # via + # isodate + # python-dateutil +snowflake-connector-python[secure-local-storage]==3.17.3 + # via dbt-snowflake (pyproject.toml) +snowplow-tracker==1.1.0 + # via dbt-core +sortedcontainers==2.4.0 + # via snowflake-connector-python +sqlparse==0.5.3 + # via dbt-core +text-unidecode==1.3 + # via python-slugify +tomlkit==0.13.3 + # via snowflake-connector-python +typing-extensions==4.15.0 + # via + # dbt-adapters + # dbt-common + # dbt-core + # dbt-semantic-interfaces + # mashumaro + # pydantic + # pydantic-core + # pyopenssl + # referencing + # snowflake-connector-python + # snowplow-tracker + # typing-inspection +typing-inspection==0.4.1 + # via pydantic +urllib3==2.5.0 + # via + # botocore + # requests +zipp==3.23.0 + # via importlib-metadata diff --git a/dbt-snowflake/tests/conftest.py b/dbt-snowflake/tests/conftest.py index 2fbdbd5c29..838a4f5f8f 100644 --- a/dbt-snowflake/tests/conftest.py +++ b/dbt-snowflake/tests/conftest.py @@ -13,11 +13,13 @@ def dbt_profile_target(): profile = { "type": "snowflake", "threads": 4, - "account": os.getenv("SNOWFLAKE_TEST_ACCOUNT"), - "user": os.getenv("SNOWFLAKE_TEST_USER"), - "password": os.getenv("SNOWFLAKE_TEST_PASSWORD"), - "database": os.getenv("SNOWFLAKE_TEST_DATABASE"), - "warehouse": os.getenv("SNOWFLAKE_TEST_WAREHOUSE"), + "account": "localstack", + "host": "snowflake.localhost.localstack.cloud", + "port": 4566, + "user": "test", + "password": "test", + "database": "TEST", + "warehouse": "test", } # Optional parameters allow testing against local DEV Snowflake instances. From c4fd4525019c7279c8bb6a3783e1949481ac6d58 Mon Sep 17 00:00:00 2001 From: Przemek Denkiewicz Date: Mon, 13 Oct 2025 16:03:48 +0200 Subject: [PATCH 2/5] skip TestSimpleBigSeedBatched --- .../tests/functional/adapter/simple_seed/test_simple_seed.py | 1 + 1 file changed, 1 insertion(+) diff --git a/dbt-snowflake/tests/functional/adapter/simple_seed/test_simple_seed.py b/dbt-snowflake/tests/functional/adapter/simple_seed/test_simple_seed.py index af28b394db..ec6cf66ed2 100644 --- a/dbt-snowflake/tests/functional/adapter/simple_seed/test_simple_seed.py +++ b/dbt-snowflake/tests/functional/adapter/simple_seed/test_simple_seed.py @@ -4,6 +4,7 @@ from dbt.tests.util import run_dbt +@pytest.mark.skip(reason="Timeout in the CI") class TestSimpleBigSeedBatched(SeedConfigBase): @pytest.fixture(scope="class") def seeds(self): From 838df69f517da9f4f103eaf84c09c4bf96e2b795 Mon Sep 17 00:00:00 2001 From: Przemek Denkiewicz Date: Wed, 17 Dec 2025 14:26:08 +0100 Subject: [PATCH 3/5] Skip some tests and modify TestKeyPairAuth --- dbt-snowflake/tests/functional/auth_tests/test_jwt.py | 1 + dbt-snowflake/tests/functional/auth_tests/test_key_pair.py | 7 +++++-- dbt-snowflake/tests/functional/auth_tests/test_oauth.py | 1 + 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/dbt-snowflake/tests/functional/auth_tests/test_jwt.py b/dbt-snowflake/tests/functional/auth_tests/test_jwt.py index fbe8e20e6f..d843923f28 100644 --- a/dbt-snowflake/tests/functional/auth_tests/test_jwt.py +++ b/dbt-snowflake/tests/functional/auth_tests/test_jwt.py @@ -33,6 +33,7 @@ """ +@pytest.mark.skip(reason="Skipped for LocalStack testing") class TestSnowflakeJWT: """Tests that setting authenticator: jwt allows setting token to a plain JWT that will be passed into the Snowflake connection without modification.""" diff --git a/dbt-snowflake/tests/functional/auth_tests/test_key_pair.py b/dbt-snowflake/tests/functional/auth_tests/test_key_pair.py index 6d3254f336..a2f6660f89 100644 --- a/dbt-snowflake/tests/functional/auth_tests/test_key_pair.py +++ b/dbt-snowflake/tests/functional/auth_tests/test_key_pair.py @@ -7,13 +7,16 @@ class TestKeyPairAuth: @pytest.fixture(scope="class", autouse=True) def dbt_profile_target(self): + private_key_path = os.path.abspath( + os.path.join(os.path.dirname(__file__), "..", "..", "..", "rsa_key.p8") + ) return { "type": "snowflake", "threads": 4, - "account": os.getenv("SNOWFLAKE_TEST_ACCOUNT"), + "account": "localstack", + "host": "snowflake.localhost.localstack.cloud", "user": os.getenv("SNOWFLAKE_TEST_USER"), "private_key": os.getenv("SNOWFLAKE_TEST_PRIVATE_KEY"), - "private_key_passphrase": os.getenv("SNOWFLAKE_TEST_PRIVATE_KEY_PASSPHRASE"), "database": os.getenv("SNOWFLAKE_TEST_DATABASE"), "warehouse": os.getenv("SNOWFLAKE_TEST_WAREHOUSE"), } diff --git a/dbt-snowflake/tests/functional/auth_tests/test_oauth.py b/dbt-snowflake/tests/functional/auth_tests/test_oauth.py index c8986763e2..a5b23b84b0 100644 --- a/dbt-snowflake/tests/functional/auth_tests/test_oauth.py +++ b/dbt-snowflake/tests/functional/auth_tests/test_oauth.py @@ -60,6 +60,7 @@ """ +@pytest.mark.skip(reason="Skipped for LocalStack testing") class TestSnowflakeOauth: @pytest.fixture(scope="class", autouse=True) def dbt_profile_target(self): From 0a8b58d5567acec0a566068bda8494d5f16bd075 Mon Sep 17 00:00:00 2001 From: Przemek Denkiewicz Date: Wed, 17 Dec 2025 14:27:39 +0100 Subject: [PATCH 4/5] Remove unused private_key_path --- dbt-snowflake/tests/functional/auth_tests/test_key_pair.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/dbt-snowflake/tests/functional/auth_tests/test_key_pair.py b/dbt-snowflake/tests/functional/auth_tests/test_key_pair.py index a2f6660f89..24f461c8f8 100644 --- a/dbt-snowflake/tests/functional/auth_tests/test_key_pair.py +++ b/dbt-snowflake/tests/functional/auth_tests/test_key_pair.py @@ -7,9 +7,6 @@ class TestKeyPairAuth: @pytest.fixture(scope="class", autouse=True) def dbt_profile_target(self): - private_key_path = os.path.abspath( - os.path.join(os.path.dirname(__file__), "..", "..", "..", "rsa_key.p8") - ) return { "type": "snowflake", "threads": 4, From 4df08edfa4cd028c4a3acaca78f296ee65612084 Mon Sep 17 00:00:00 2001 From: Przemek Denkiewicz Date: Tue, 24 Feb 2026 18:16:22 +0100 Subject: [PATCH 5/5] use local warehouse --- dbt-snowflake/tests/conftest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dbt-snowflake/tests/conftest.py b/dbt-snowflake/tests/conftest.py index 838a4f5f8f..bec4117d11 100644 --- a/dbt-snowflake/tests/conftest.py +++ b/dbt-snowflake/tests/conftest.py @@ -19,7 +19,7 @@ def dbt_profile_target(): "user": "test", "password": "test", "database": "TEST", - "warehouse": "test", + "warehouse": "LOCAL", } # Optional parameters allow testing against local DEV Snowflake instances.