This is an automated email from the ASF dual-hosted git repository.

ash pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/main by this push:
     new 7324400c6b Allow running airflow against sqlite in-memory DB for tests 
(#37144)
7324400c6b is described below

commit 7324400c6b379d22030a6bd54fb14912c1cb291f
Author: Ash Berlin-Taylor <[email protected]>
AuthorDate: Fri Feb 2 13:51:47 2024 +0000

    Allow running airflow against sqlite in-memory DB for tests (#37144)
    
    This makes no sense for production workloads, but it is useful for
    writing tests of Airflow operators etc.
    
    I also moved the warning from configure_vars to convigure_orm so that it
    is checked after local settings have been applied in case that changes
    anything.
---
 airflow/settings.py         | 21 ++++++++++++++-------
 tests/core/test_settings.py | 24 +++++++++++++++++-------
 2 files changed, 31 insertions(+), 14 deletions(-)

diff --git a/airflow/settings.py b/airflow/settings.py
index e533ae97ee..597de84442 100644
--- a/airflow/settings.py
+++ b/airflow/settings.py
@@ -191,13 +191,6 @@ def configure_vars():
     global PLUGINS_FOLDER
     global DONOT_MODIFY_HANDLERS
     SQL_ALCHEMY_CONN = conf.get("database", "SQL_ALCHEMY_CONN")
-    if SQL_ALCHEMY_CONN.startswith("sqlite") and not 
SQL_ALCHEMY_CONN.startswith("sqlite:////"):
-        from airflow.exceptions import AirflowConfigException
-
-        raise AirflowConfigException(
-            f"Cannot use relative path: `{SQL_ALCHEMY_CONN}` to connect to 
sqlite. "
-            "Please use absolute path such as `sqlite:////tmp/airflow.db`."
-        )
 
     DAGS_FOLDER = os.path.expanduser(conf.get("core", "DAGS_FOLDER"))
 
@@ -231,6 +224,20 @@ def configure_orm(disable_connection_pool=False, 
pool_class=None):
     """Configure ORM using SQLAlchemy."""
     from airflow.utils.log.secrets_masker import mask_secret
 
+    if (
+        SQL_ALCHEMY_CONN
+        and SQL_ALCHEMY_CONN.startswith("sqlite")
+        and not SQL_ALCHEMY_CONN.startswith("sqlite:////")
+        # In memory is not useful for production, but useful for writing tests 
against Airflow for extensions
+        and SQL_ALCHEMY_CONN != "sqlite://"
+    ):
+        from airflow.exceptions import AirflowConfigException
+
+        raise AirflowConfigException(
+            f"Cannot use relative path: `{SQL_ALCHEMY_CONN}` to connect to 
sqlite. "
+            "Please use absolute path such as `sqlite:////tmp/airflow.db`."
+        )
+
     global Session
     global engine
     if os.environ.get("_AIRFLOW_SKIP_DB_TESTS") == "true":
diff --git a/tests/core/test_settings.py b/tests/core/test_settings.py
index 79f49b4ef2..55d46cac15 100644
--- a/tests/core/test_settings.py
+++ b/tests/core/test_settings.py
@@ -17,11 +17,12 @@
 # under the License.
 from __future__ import annotations
 
+import contextlib
 import os
 import sys
 import tempfile
 from unittest import mock
-from unittest.mock import MagicMock, call, patch
+from unittest.mock import MagicMock, call
 
 import pytest
 
@@ -216,11 +217,20 @@ class TestUpdatedConfigNames:
         assert session_lifetime_config == default_timeout_minutes
 
 
-def test_sqlite_relative_path():
[email protected](
+    ["value", "expectation"],
+    [
+        (
+            "sqlite:///./relative_path.db",
+            pytest.raises(AirflowConfigException, match=r"Cannot use relative 
path:"),
+        ),
+        # Should not raise an exception
+        ("sqlite://", contextlib.nullcontext()),
+    ],
+)
+def test_sqlite_relative_path(monkeypatch, value, expectation):
     from airflow import settings
 
-    with patch("airflow.settings.conf.get") as conf_get_mock:
-        conf_get_mock.return_value = "sqlite:///./relative_path.db"
-        with pytest.raises(AirflowConfigException) as exc:
-            settings.configure_vars()
-        assert "Cannot use relative path:" in str(exc.value)
+    monkeypatch.setattr(settings, "SQL_ALCHEMY_CONN", value)
+    with expectation:
+        settings.configure_orm()

Reply via email to