Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-dj-database-url for 
openSUSE:Factory checked in at 2024-01-09 20:49:41
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-dj-database-url (Old)
 and      /work/SRC/openSUSE:Factory/.python-dj-database-url.new.21961 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-dj-database-url"

Tue Jan  9 20:49:41 2024 rev:10 rq:1137636 version:2.1.0

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/python-dj-database-url/python-dj-database-url.changes
    2023-05-09 13:09:11.061680406 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-dj-database-url.new.21961/python-dj-database-url.changes
 2024-01-09 20:50:16.149563476 +0100
@@ -1,0 +2,9 @@
+Mon Jan  8 20:52:51 UTC 2024 - Dirk Müller <[email protected]>
+
+- update to 2.1.0:
+  * fix: parse options with numerical values as int
+- update to 2.0.0:
+  * setup.py: Fix `project_urls` parameter name
+  * Redo as a package to fix mypy issues
+
+-------------------------------------------------------------------

Old:
----
  dj-database-url-1.3.0.tar.gz

New:
----
  dj-database-url-2.1.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-dj-database-url.spec ++++++
--- /var/tmp/diff_new_pack.Jn3vpB/_old  2024-01-09 20:50:16.717584128 +0100
+++ /var/tmp/diff_new_pack.Jn3vpB/_new  2024-01-09 20:50:16.721584273 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package python-dj-database-url
 #
-# Copyright (c) 2023 SUSE LLC
+# Copyright (c) 2024 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -17,7 +17,7 @@
 
 
 Name:           python-dj-database-url
-Version:        1.3.0
+Version:        2.1.0
 Release:        0
 Summary:        Utility to use database URLs in Django applications
 License:        BSD-3-Clause
@@ -67,7 +67,6 @@
 %files %{python_files}
 %license LICENSE
 %doc README.rst
-%{python_sitelib}/dj_database_url.py
+%{python_sitelib}/dj_database_url
 %{python_sitelib}/dj_database_url-%{version}.dist-info
-%pycache_only %{python_sitelib}/__pycache__
 

++++++ dj-database-url-1.3.0.tar.gz -> dj-database-url-2.1.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dj-database-url-1.3.0/MANIFEST.in 
new/dj-database-url-2.1.0/MANIFEST.in
--- old/dj-database-url-1.3.0/MANIFEST.in       2023-03-27 22:56:26.000000000 
+0200
+++ new/dj-database-url-2.1.0/MANIFEST.in       1970-01-01 01:00:00.000000000 
+0100
@@ -1 +0,0 @@
-include py.typed
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dj-database-url-1.3.0/PKG-INFO 
new/dj-database-url-2.1.0/PKG-INFO
--- old/dj-database-url-1.3.0/PKG-INFO  2023-03-27 22:56:35.978649400 +0200
+++ new/dj-database-url-2.1.0/PKG-INFO  2023-08-15 15:12:53.640774700 +0200
@@ -1,10 +1,12 @@
 Metadata-Version: 2.1
 Name: dj-database-url
-Version: 1.3.0
+Version: 2.1.0
 Summary: Use Database URLs in your Django Application.
 Home-page: https://github.com/jazzband/dj-database-url
 Author: Original Author: Kenneth Reitz, Maintained by: JazzBand Community
 License: BSD
+Project-URL: GitHub, https://github.com/jazzband/dj-database-url/
+Project-URL: Release log, 
https://github.com/jazzband/dj-database-url/blob/master/CHANGELOG.md
 Platform: any
 Classifier: Environment :: Web Environment
 Classifier: Framework :: Django
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dj-database-url-1.3.0/dj_database_url/__init__.py 
new/dj-database-url-2.1.0/dj_database_url/__init__.py
--- old/dj-database-url-1.3.0/dj_database_url/__init__.py       1970-01-01 
01:00:00.000000000 +0100
+++ new/dj-database-url-2.1.0/dj_database_url/__init__.py       2023-08-15 
15:12:39.000000000 +0200
@@ -0,0 +1,187 @@
+import logging
+import os
+import urllib.parse as urlparse
+from typing import Any, Dict, Optional, Union
+
+from typing_extensions import TypedDict
+
+DEFAULT_ENV = "DATABASE_URL"
+
+SCHEMES = {
+    "postgres": "django.db.backends.postgresql",
+    "postgresql": "django.db.backends.postgresql",
+    "pgsql": "django.db.backends.postgresql",
+    "postgis": "django.contrib.gis.db.backends.postgis",
+    "mysql": "django.db.backends.mysql",
+    "mysql2": "django.db.backends.mysql",
+    "mysqlgis": "django.contrib.gis.db.backends.mysql",
+    "mysql-connector": "mysql.connector.django",
+    "mssql": "sql_server.pyodbc",
+    "mssqlms": "mssql",
+    "spatialite": "django.contrib.gis.db.backends.spatialite",
+    "sqlite": "django.db.backends.sqlite3",
+    "oracle": "django.db.backends.oracle",
+    "oraclegis": "django.contrib.gis.db.backends.oracle",
+    "redshift": "django_redshift_backend",
+    "cockroach": "django_cockroachdb",
+    "timescale": "timescale.db.backends.postgresql",
+    "timescalegis": "timescale.db.backends.postgis",
+}
+
+# Register database schemes in URLs.
+for key in SCHEMES.keys():
+    urlparse.uses_netloc.append(key)
+
+
+# From https://docs.djangoproject.com/en/4.0/ref/settings/#databases
+class DBConfig(TypedDict, total=False):
+    ATOMIC_REQUESTS: bool
+    AUTOCOMMIT: bool
+    CONN_MAX_AGE: Optional[int]
+    CONN_HEALTH_CHECKS: bool
+    DISABLE_SERVER_SIDE_CURSORS: bool
+    ENGINE: str
+    HOST: str
+    NAME: str
+    OPTIONS: Optional[Dict[str, Any]]
+    PASSWORD: str
+    PORT: Union[str, int]
+    TEST: Dict[str, Any]
+    TIME_ZONE: str
+    USER: str
+
+
+def config(
+    env: str = DEFAULT_ENV,
+    default: Optional[str] = None,
+    engine: Optional[str] = None,
+    conn_max_age: Optional[int] = 0,
+    conn_health_checks: bool = False,
+    ssl_require: bool = False,
+    test_options: Optional[Dict] = None,
+) -> DBConfig:
+    """Returns configured DATABASE dictionary from DATABASE_URL."""
+    s = os.environ.get(env, default)
+
+    if s is None:
+        logging.warning(
+            "No %s environment variable set, and so no databases setup" % env
+        )
+
+    if s:
+        return parse(
+            s, engine, conn_max_age, conn_health_checks, ssl_require, 
test_options
+        )
+
+    return {}
+
+
+def parse(
+    url: str,
+    engine: Optional[str] = None,
+    conn_max_age: Optional[int] = 0,
+    conn_health_checks: bool = False,
+    ssl_require: bool = False,
+    test_options: Optional[dict] = None,
+) -> DBConfig:
+    """Parses a database URL."""
+    if url == "sqlite://:memory:":
+        # this is a special case, because if we pass this URL into
+        # urlparse, urlparse will choke trying to interpret "memory"
+        # as a port number
+        return {"ENGINE": SCHEMES["sqlite"], "NAME": ":memory:"}
+        # note: no other settings are required for sqlite
+
+    # otherwise parse the url as normal
+    parsed_config: DBConfig = {}
+
+    if test_options is None:
+        test_options = {}
+
+    spliturl = urlparse.urlsplit(url)
+
+    # Split query strings from path.
+    path = spliturl.path[1:]
+    query = urlparse.parse_qs(spliturl.query)
+
+    # If we are using sqlite and we have no path, then assume we
+    # want an in-memory database (this is the behaviour of sqlalchemy)
+    if spliturl.scheme == "sqlite" and path == "":
+        path = ":memory:"
+
+    # Handle postgres percent-encoded paths.
+    hostname = spliturl.hostname or ""
+    if "%" in hostname:
+        # Switch to url.netloc to avoid lower cased paths
+        hostname = spliturl.netloc
+        if "@" in hostname:
+            hostname = hostname.rsplit("@", 1)[1]
+        # Use URL Parse library to decode % encodes
+        hostname = urlparse.unquote(hostname)
+
+    # Lookup specified engine.
+    if engine is None:
+        engine = SCHEMES.get(spliturl.scheme)
+        if engine is None:
+            raise ValueError(
+                "No support for '%s'. We support: %s"
+                % (spliturl.scheme, ", ".join(sorted(SCHEMES.keys())))
+            )
+
+    port = (
+        str(spliturl.port)
+        if spliturl.port
+        and engine in (SCHEMES["oracle"], SCHEMES["mssql"], SCHEMES["mssqlms"])
+        else spliturl.port
+    )
+
+    # Update with environment configuration.
+    parsed_config.update(
+        {
+            "NAME": urlparse.unquote(path or ""),
+            "USER": urlparse.unquote(spliturl.username or ""),
+            "PASSWORD": urlparse.unquote(spliturl.password or ""),
+            "HOST": hostname,
+            "PORT": port or "",
+            "CONN_MAX_AGE": conn_max_age,
+            "CONN_HEALTH_CHECKS": conn_health_checks,
+            "ENGINE": engine,
+        }
+    )
+    if test_options:
+        parsed_config.update(
+            {
+                'TEST': test_options,
+            }
+        )
+
+    # Pass the query string into OPTIONS.
+    options: Dict[str, Any] = {}
+    for key, values in query.items():
+        if spliturl.scheme == "mysql" and key == "ssl-ca":
+            options["ssl"] = {"ca": values[-1]}
+            continue
+
+        try:
+            options[key] = int(values[-1])
+        except (TypeError, ValueError):
+            options[key] = values[-1]
+
+    if ssl_require:
+        options["sslmode"] = "require"
+
+    # Support for Postgres Schema URLs
+    if "currentSchema" in options and engine in (
+        "django.contrib.gis.db.backends.postgis",
+        "django.db.backends.postgresql_psycopg2",
+        "django.db.backends.postgresql",
+        "django_redshift_backend",
+        "timescale.db.backends.postgresql",
+        "timescale.db.backends.postgis",
+    ):
+        options["options"] = "-c 
search_path={0}".format(options.pop("currentSchema"))
+
+    if options:
+        parsed_config["OPTIONS"] = options
+
+    return parsed_config
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/dj-database-url-1.3.0/dj_database_url.egg-info/PKG-INFO 
new/dj-database-url-2.1.0/dj_database_url.egg-info/PKG-INFO
--- old/dj-database-url-1.3.0/dj_database_url.egg-info/PKG-INFO 2023-03-27 
22:56:35.000000000 +0200
+++ new/dj-database-url-2.1.0/dj_database_url.egg-info/PKG-INFO 2023-08-15 
15:12:53.000000000 +0200
@@ -1,10 +1,12 @@
 Metadata-Version: 2.1
 Name: dj-database-url
-Version: 1.3.0
+Version: 2.1.0
 Summary: Use Database URLs in your Django Application.
 Home-page: https://github.com/jazzband/dj-database-url
 Author: Original Author: Kenneth Reitz, Maintained by: JazzBand Community
 License: BSD
+Project-URL: GitHub, https://github.com/jazzband/dj-database-url/
+Project-URL: Release log, 
https://github.com/jazzband/dj-database-url/blob/master/CHANGELOG.md
 Platform: any
 Classifier: Environment :: Web Environment
 Classifier: Framework :: Django
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/dj-database-url-1.3.0/dj_database_url.egg-info/SOURCES.txt 
new/dj-database-url-2.1.0/dj_database_url.egg-info/SOURCES.txt
--- old/dj-database-url-1.3.0/dj_database_url.egg-info/SOURCES.txt      
2023-03-27 22:56:35.000000000 +0200
+++ new/dj-database-url-2.1.0/dj_database_url.egg-info/SOURCES.txt      
2023-08-15 15:12:53.000000000 +0200
@@ -1,13 +1,12 @@
 LICENSE
-MANIFEST.in
 README.rst
-dj_database_url.py
-py.typed
 pyproject.toml
 setup.py
+dj_database_url/__init__.py
+dj_database_url/py.typed
 dj_database_url.egg-info/PKG-INFO
 dj_database_url.egg-info/SOURCES.txt
 dj_database_url.egg-info/dependency_links.txt
-dj_database_url.egg-info/not-zip-safe
 dj_database_url.egg-info/requires.txt
-dj_database_url.egg-info/top_level.txt
\ No newline at end of file
+dj_database_url.egg-info/top_level.txt
+tests/test_dj_database_url.py
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/dj-database-url-1.3.0/dj_database_url.egg-info/not-zip-safe 
new/dj-database-url-2.1.0/dj_database_url.egg-info/not-zip-safe
--- old/dj-database-url-1.3.0/dj_database_url.egg-info/not-zip-safe     
2023-03-27 22:56:35.000000000 +0200
+++ new/dj-database-url-2.1.0/dj_database_url.egg-info/not-zip-safe     
1970-01-01 01:00:00.000000000 +0100
@@ -1 +0,0 @@
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dj-database-url-1.3.0/dj_database_url.py 
new/dj-database-url-2.1.0/dj_database_url.py
--- old/dj-database-url-1.3.0/dj_database_url.py        2023-03-27 
22:56:26.000000000 +0200
+++ new/dj-database-url-2.1.0/dj_database_url.py        1970-01-01 
01:00:00.000000000 +0100
@@ -1,184 +0,0 @@
-import logging
-import os
-import urllib.parse as urlparse
-from typing import Any, Dict, Optional, Union
-
-from typing_extensions import TypedDict
-
-DEFAULT_ENV = "DATABASE_URL"
-
-SCHEMES = {
-    "postgres": "django.db.backends.postgresql",
-    "postgresql": "django.db.backends.postgresql",
-    "pgsql": "django.db.backends.postgresql",
-    "postgis": "django.contrib.gis.db.backends.postgis",
-    "mysql": "django.db.backends.mysql",
-    "mysql2": "django.db.backends.mysql",
-    "mysqlgis": "django.contrib.gis.db.backends.mysql",
-    "mysql-connector": "mysql.connector.django",
-    "mssql": "sql_server.pyodbc",
-    "mssqlms": "mssql",
-    "spatialite": "django.contrib.gis.db.backends.spatialite",
-    "sqlite": "django.db.backends.sqlite3",
-    "oracle": "django.db.backends.oracle",
-    "oraclegis": "django.contrib.gis.db.backends.oracle",
-    "redshift": "django_redshift_backend",
-    "cockroach": "django_cockroachdb",
-    "timescale": "timescale.db.backends.postgresql",
-    "timescalegis": "timescale.db.backends.postgis",
-}
-
-# Register database schemes in URLs.
-for key in SCHEMES.keys():
-    urlparse.uses_netloc.append(key)
-
-
-# From https://docs.djangoproject.com/en/4.0/ref/settings/#databases
-class DBConfig(TypedDict, total=False):
-    ATOMIC_REQUESTS: bool
-    AUTOCOMMIT: bool
-    CONN_MAX_AGE: Optional[int]
-    CONN_HEALTH_CHECKS: bool
-    DISABLE_SERVER_SIDE_CURSORS: bool
-    ENGINE: str
-    HOST: str
-    NAME: str
-    OPTIONS: Optional[Dict[str, Any]]
-    PASSWORD: str
-    PORT: Union[str, int]
-    TEST: Dict[str, Any]
-    TIME_ZONE: str
-    USER: str
-
-
-def config(
-    env: str = DEFAULT_ENV,
-    default: Optional[str] = None,
-    engine: Optional[str] = None,
-    conn_max_age: Optional[int] = 0,
-    conn_health_checks: bool = False,
-    ssl_require: bool = False,
-    test_options: Optional[Dict] = None,
-) -> DBConfig:
-    """Returns configured DATABASE dictionary from DATABASE_URL."""
-    s = os.environ.get(env, default)
-
-    if s is None:
-        logging.warning(
-            "No %s environment variable set, and so no databases setup" % env
-        )
-
-    if s:
-        return parse(
-            s, engine, conn_max_age, conn_health_checks, ssl_require, 
test_options
-        )
-
-    return {}
-
-
-def parse(
-    url: str,
-    engine: Optional[str] = None,
-    conn_max_age: Optional[int] = 0,
-    conn_health_checks: bool = False,
-    ssl_require: bool = False,
-    test_options: Optional[dict] = None,
-) -> DBConfig:
-    """Parses a database URL."""
-    if url == "sqlite://:memory:":
-        # this is a special case, because if we pass this URL into
-        # urlparse, urlparse will choke trying to interpret "memory"
-        # as a port number
-        return {"ENGINE": SCHEMES["sqlite"], "NAME": ":memory:"}
-        # note: no other settings are required for sqlite
-
-    # otherwise parse the url as normal
-    parsed_config: DBConfig = {}
-
-    if test_options is None:
-        test_options = {}
-
-    spliturl = urlparse.urlsplit(url)
-
-    # Split query strings from path.
-    path = spliturl.path[1:]
-    query = urlparse.parse_qs(spliturl.query)
-
-    # If we are using sqlite and we have no path, then assume we
-    # want an in-memory database (this is the behaviour of sqlalchemy)
-    if spliturl.scheme == "sqlite" and path == "":
-        path = ":memory:"
-
-    # Handle postgres percent-encoded paths.
-    hostname = spliturl.hostname or ""
-    if "%" in hostname:
-        # Switch to url.netloc to avoid lower cased paths
-        hostname = spliturl.netloc
-        if "@" in hostname:
-            hostname = hostname.rsplit("@", 1)[1]
-        # Use URL Parse library to decode % encodes
-        hostname = urlparse.unquote(hostname)
-
-    # Lookup specified engine.
-    if engine is None:
-        engine = SCHEMES.get(spliturl.scheme)
-        if engine is None:
-            raise ValueError(
-                "No support for '%s'. We support: %s"
-                % (spliturl.scheme, ", ".join(sorted(SCHEMES.keys())))
-            )
-
-    port = (
-        str(spliturl.port)
-        if spliturl.port
-        and engine in (SCHEMES["oracle"], SCHEMES["mssql"], SCHEMES["mssqlms"])
-        else spliturl.port
-    )
-
-    # Update with environment configuration.
-    parsed_config.update(
-        {
-            "NAME": urlparse.unquote(path or ""),
-            "USER": urlparse.unquote(spliturl.username or ""),
-            "PASSWORD": urlparse.unquote(spliturl.password or ""),
-            "HOST": hostname,
-            "PORT": port or "",
-            "CONN_MAX_AGE": conn_max_age,
-            "CONN_HEALTH_CHECKS": conn_health_checks,
-            "ENGINE": engine,
-        }
-    )
-    if test_options:
-        parsed_config.update(
-            {
-                'TEST': test_options,
-            }
-        )
-
-    # Pass the query string into OPTIONS.
-    options: Dict[str, Any] = {}
-    for key, values in query.items():
-        if spliturl.scheme == "mysql" and key == "ssl-ca":
-            options["ssl"] = {"ca": values[-1]}
-            continue
-
-        options[key] = values[-1]
-
-    if ssl_require:
-        options["sslmode"] = "require"
-
-    # Support for Postgres Schema URLs
-    if "currentSchema" in options and engine in (
-        "django.contrib.gis.db.backends.postgis",
-        "django.db.backends.postgresql_psycopg2",
-        "django.db.backends.postgresql",
-        "django_redshift_backend",
-        "timescale.db.backends.postgresql",
-        "timescale.db.backends.postgis",
-    ):
-        options["options"] = "-c 
search_path={0}".format(options.pop("currentSchema"))
-
-    if options:
-        parsed_config["OPTIONS"] = options
-
-    return parsed_config
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dj-database-url-1.3.0/setup.py 
new/dj-database-url-2.1.0/setup.py
--- old/dj-database-url-1.3.0/setup.py  2023-03-27 22:56:26.000000000 +0200
+++ new/dj-database-url-2.1.0/setup.py  2023-08-15 15:12:39.000000000 +0200
@@ -6,19 +6,21 @@
 
 setup(
     name="dj-database-url",
-    version="1.3.0",
+    version="2.1.0",
     url="https://github.com/jazzband/dj-database-url";,
     license="BSD",
     author="Original Author: Kenneth Reitz, Maintained by: JazzBand Community",
     description="Use Database URLs in your Django Application.",
     long_description=readme,
     long_description_content_type="text/x-rst",
-    py_modules=["dj_database_url"],
+    packages=["dj_database_url"],
     install_requires=["Django>=3.2", "typing_extensions >= 3.10.0.0"],
-    zip_safe=False,
     include_package_data=True,
+    package_data={
+        "dj_database_url": ["py.typed"],
+    },
     platforms="any",
-    project_links={
+    project_urls={
         "GitHub": "https://github.com/jazzband/dj-database-url/";,
         "Release log": (
             
"https://github.com/jazzband/dj-database-url/blob/master/CHANGELOG.md";
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/dj-database-url-1.3.0/tests/test_dj_database_url.py 
new/dj-database-url-2.1.0/tests/test_dj_database_url.py
--- old/dj-database-url-1.3.0/tests/test_dj_database_url.py     1970-01-01 
01:00:00.000000000 +0100
+++ new/dj-database-url-2.1.0/tests/test_dj_database_url.py     2023-08-15 
15:12:39.000000000 +0200
@@ -0,0 +1,597 @@
+import os
+import unittest
+from unittest import mock
+
+import dj_database_url
+
+POSTGIS_URL = 
"postgis://uf07k1i6d8ia0v:[email protected]:5431/d8r82722r2kuvn"
+
+
+class DatabaseTestSuite(unittest.TestCase):
+    def test_postgres_parsing(self):
+        url = 
"postgres://uf07k1i6d8ia0v:[email protected]:5431/d8r82722r2kuvn"
+        url = dj_database_url.parse(url)
+
+        assert url["ENGINE"] == "django.db.backends.postgresql"
+        assert url["NAME"] == "d8r82722r2kuvn"
+        assert url["HOST"] == "ec2-107-21-253-135.compute-1.amazonaws.com"
+        assert url["USER"] == "uf07k1i6d8ia0v"
+        assert url["PASSWORD"] == "wegauwhgeuioweg"
+        assert url["PORT"] == 5431
+
+    def test_postgres_unix_socket_parsing(self):
+        url = "postgres://%2Fvar%2Frun%2Fpostgresql/d8r82722r2kuvn"
+        url = dj_database_url.parse(url)
+
+        assert url["ENGINE"] == "django.db.backends.postgresql"
+        assert url["NAME"] == "d8r82722r2kuvn"
+        assert url["HOST"] == "/var/run/postgresql"
+        assert url["USER"] == ""
+        assert url["PASSWORD"] == ""
+        assert url["PORT"] == ""
+
+        url = "postgres://%2FUsers%2Fpostgres%2FRuN/d8r82722r2kuvn"
+        url = dj_database_url.parse(url)
+
+        assert url["ENGINE"] == "django.db.backends.postgresql"
+        assert url["HOST"] == "/Users/postgres/RuN"
+        assert url["USER"] == ""
+        assert url["PASSWORD"] == ""
+        assert url["PORT"] == ""
+
+    def test_postgres_google_cloud_parsing(self):
+        url = 
"postgres://uf07k1i6d8ia0v:wegauwhgeuioweg@%2Fcloudsql%2Fproject_id%3Aregion%3Ainstance_id/d8r82722r2kuvn"
+        url = dj_database_url.parse(url)
+
+        assert url["ENGINE"] == "django.db.backends.postgresql"
+        assert url["NAME"] == "d8r82722r2kuvn"
+        assert url["HOST"] == "/cloudsql/project_id:region:instance_id"
+        assert url["USER"] == "uf07k1i6d8ia0v"
+        assert url["PASSWORD"] == "wegauwhgeuioweg"
+        assert url["PORT"] == ""
+
+    def test_ipv6_parsing(self):
+        url = 
"postgres://ieRaekei9wilaim7:wegauwhgeuioweg@[2001:db8:1234::1234:5678:90af]:5431/d8r82722r2kuvn"
+        url = dj_database_url.parse(url)
+
+        assert url["ENGINE"] == "django.db.backends.postgresql"
+        assert url["NAME"] == "d8r82722r2kuvn"
+        assert url["HOST"] == "2001:db8:1234::1234:5678:90af"
+        assert url["USER"] == "ieRaekei9wilaim7"
+        assert url["PASSWORD"] == "wegauwhgeuioweg"
+        assert url["PORT"] == 5431
+
+    def test_postgres_search_path_parsing(self):
+        url = 
"postgres://uf07k1i6d8ia0v:[email protected]:5431/d8r82722r2kuvn?currentSchema=otherschema"
+        url = dj_database_url.parse(url)
+        assert url["ENGINE"] == "django.db.backends.postgresql"
+        assert url["NAME"] == "d8r82722r2kuvn"
+        assert url["HOST"] == "ec2-107-21-253-135.compute-1.amazonaws.com"
+        assert url["USER"] == "uf07k1i6d8ia0v"
+        assert url["PASSWORD"] == "wegauwhgeuioweg"
+        assert url["PORT"] == 5431
+        assert url["OPTIONS"]["options"] == "-c search_path=otherschema"
+        assert "currentSchema" not in url["OPTIONS"]
+
+    def test_postgres_parsing_with_special_characters(self):
+        url = 
"postgres://%23user:%[email protected]:5431/%23database"
+        url = dj_database_url.parse(url)
+
+        assert url["ENGINE"] == "django.db.backends.postgresql"
+        assert url["NAME"] == "#database"
+        assert url["HOST"] == "ec2-107-21-253-135.compute-1.amazonaws.com"
+        assert url["USER"] == "#user"
+        assert url["PASSWORD"] == "#password"
+        assert url["PORT"] == 5431
+
+    def test_postgis_parsing(self):
+        url = 
"postgis://uf07k1i6d8ia0v:[email protected]:5431/d8r82722r2kuvn"
+        url = dj_database_url.parse(url)
+
+        assert url["ENGINE"] == "django.contrib.gis.db.backends.postgis"
+        assert url["NAME"] == "d8r82722r2kuvn"
+        assert url["HOST"] == "ec2-107-21-253-135.compute-1.amazonaws.com"
+        assert url["USER"] == "uf07k1i6d8ia0v"
+        assert url["PASSWORD"] == "wegauwhgeuioweg"
+        assert url["PORT"] == 5431
+
+    def test_postgis_search_path_parsing(self):
+        url = 
"postgis://uf07k1i6d8ia0v:[email protected]:5431/d8r82722r2kuvn?currentSchema=otherschema"
+        url = dj_database_url.parse(url)
+        assert url["ENGINE"] == "django.contrib.gis.db.backends.postgis"
+        assert url["NAME"] == "d8r82722r2kuvn"
+        assert url["HOST"] == "ec2-107-21-253-135.compute-1.amazonaws.com"
+        assert url["USER"] == "uf07k1i6d8ia0v"
+        assert url["PASSWORD"] == "wegauwhgeuioweg"
+        assert url["PORT"] == 5431
+        assert url["OPTIONS"]["options"] == "-c search_path=otherschema"
+        assert "currentSchema" not in url["OPTIONS"]
+
+    def test_mysql_gis_parsing(self):
+        url = 
"mysqlgis://uf07k1i6d8ia0v:[email protected]:5431/d8r82722r2kuvn"
+        url = dj_database_url.parse(url)
+
+        assert url["ENGINE"] == "django.contrib.gis.db.backends.mysql"
+        assert url["NAME"] == "d8r82722r2kuvn"
+        assert url["HOST"] == "ec2-107-21-253-135.compute-1.amazonaws.com"
+        assert url["USER"] == "uf07k1i6d8ia0v"
+        assert url["PASSWORD"] == "wegauwhgeuioweg"
+        assert url["PORT"] == 5431
+
+    def test_mysql_connector_parsing(self):
+        url = 
"mysql-connector://uf07k1i6d8ia0v:[email protected]:5431/d8r82722r2kuvn"
+        url = dj_database_url.parse(url)
+
+        assert url["ENGINE"] == "mysql.connector.django"
+        assert url["NAME"] == "d8r82722r2kuvn"
+        assert url["HOST"] == "ec2-107-21-253-135.compute-1.amazonaws.com"
+        assert url["USER"] == "uf07k1i6d8ia0v"
+        assert url["PASSWORD"] == "wegauwhgeuioweg"
+        assert url["PORT"] == 5431
+
+    def test_config_test_options(self):
+        with mock.patch.dict(
+            os.environ,
+            {
+                "DATABASE_URL": 
"postgres://uf07k1i6d8ia0v:[email protected]:5431/d8r82722r2kuvn?"
+            },
+        ):
+            test_db_config = {
+                'NAME': 'mytestdatabase',
+            }
+            url = dj_database_url.config(test_options=test_db_config)
+
+        assert url['TEST']['NAME'] == 'mytestdatabase'
+
+    def test_cleardb_parsing(self):
+        url = 
"mysql://bea6eb025ca0d8:[email protected]/heroku_97681db3eff7580?reconnect=true"
+        url = dj_database_url.parse(url)
+
+        assert url["ENGINE"] == "django.db.backends.mysql"
+        assert url["NAME"] == "heroku_97681db3eff7580"
+        assert url["HOST"] == "us-cdbr-east.cleardb.com"
+        assert url["USER"] == "bea6eb025ca0d8"
+        assert url["PASSWORD"] == "69772142"
+        assert url["PORT"] == ""
+
+    def test_database_url(self):
+        with mock.patch.dict(os.environ, clear=True):
+            a = dj_database_url.config()
+        assert not a
+
+        with mock.patch.dict(
+            os.environ,
+            {
+                "DATABASE_URL": 
"postgres://uf07k1i6d8ia0v:[email protected]:5431/d8r82722r2kuvn"
+            },
+        ):
+            url = dj_database_url.config()
+
+        assert url["ENGINE"] == "django.db.backends.postgresql"
+        assert url["NAME"] == "d8r82722r2kuvn"
+        assert url["HOST"] == "ec2-107-21-253-135.compute-1.amazonaws.com"
+        assert url["USER"] == "uf07k1i6d8ia0v"
+        assert url["PASSWORD"] == "wegauwhgeuioweg"
+        assert url["PORT"] == 5431
+
+    def test_empty_sqlite_url(self):
+        url = "sqlite://"
+        url = dj_database_url.parse(url)
+
+        assert url["ENGINE"] == "django.db.backends.sqlite3"
+        assert url["NAME"] == ":memory:"
+
+    def test_memory_sqlite_url(self):
+        url = "sqlite://:memory:"
+        url = dj_database_url.parse(url)
+
+        assert url["ENGINE"] == "django.db.backends.sqlite3"
+        assert url["NAME"] == ":memory:"
+
+    def test_parse_engine_setting(self):
+        engine = "django_mysqlpool.backends.mysqlpool"
+        url = 
"mysql://bea6eb025ca0d8:[email protected]/heroku_97681db3eff7580?reconnect=true"
+        url = dj_database_url.parse(url, engine)
+
+        assert url["ENGINE"] == engine
+
+    def test_config_engine_setting(self):
+        engine = "django_mysqlpool.backends.mysqlpool"
+        with mock.patch.dict(
+            os.environ,
+            {
+                "DATABASE_URL": 
"mysql://bea6eb025ca0d8:[email protected]/heroku_97681db3eff7580?reconnect=true"
+            },
+        ):
+            url = dj_database_url.config(engine=engine)
+
+        assert url["ENGINE"] == engine
+
+    def test_parse_conn_max_age_setting(self):
+        conn_max_age = 600
+        url = 
"mysql://bea6eb025ca0d8:[email protected]/heroku_97681db3eff7580?reconnect=true"
+        url = dj_database_url.parse(url, conn_max_age=conn_max_age)
+
+        assert url["CONN_MAX_AGE"] == conn_max_age
+
+    def test_config_conn_max_age_setting(self):
+        conn_max_age = 600
+        with mock.patch.dict(
+            os.environ,
+            {
+                "DATABASE_URL": 
"mysql://bea6eb025ca0d8:[email protected]/heroku_97681db3eff7580?reconnect=true"
+            },
+        ):
+            url = dj_database_url.config(conn_max_age=conn_max_age)
+
+        assert url["CONN_MAX_AGE"] == conn_max_age
+
+    def test_database_url_with_options(self):
+        # Test full options
+        with mock.patch.dict(
+            os.environ,
+            {
+                "DATABASE_URL": 
"postgres://uf07k1i6d8ia0v:[email protected]:5431/d8r82722r2kuvn?sslrootcert=rds-combined-ca-bundle.pem&sslmode=verify-full"
+            },
+        ):
+            url = dj_database_url.config()
+
+        assert url["ENGINE"] == "django.db.backends.postgresql"
+        assert url["NAME"] == "d8r82722r2kuvn"
+        assert url["HOST"] == "ec2-107-21-253-135.compute-1.amazonaws.com"
+        assert url["USER"] == "uf07k1i6d8ia0v"
+        assert url["PASSWORD"] == "wegauwhgeuioweg"
+        assert url["PORT"] == 5431
+        assert url["OPTIONS"] == {
+            "sslrootcert": "rds-combined-ca-bundle.pem",
+            "sslmode": "verify-full",
+        }
+
+        # Test empty options
+        with mock.patch.dict(
+            os.environ,
+            {
+                "DATABASE_URL": 
"postgres://uf07k1i6d8ia0v:[email protected]:5431/d8r82722r2kuvn?"
+            },
+        ):
+            url = dj_database_url.config()
+        assert "OPTIONS" not in url
+
+    def test_mysql_database_url_with_sslca_options(self):
+        with mock.patch.dict(
+            os.environ,
+            {
+                "DATABASE_URL": 
"mysql://uf07k1i6d8ia0v:[email protected]:3306/d8r82722r2kuvn?ssl-ca=rds-combined-ca-bundle.pem"
+            },
+        ):
+            url = dj_database_url.config()
+
+        assert url["ENGINE"] == "django.db.backends.mysql"
+        assert url["NAME"] == "d8r82722r2kuvn"
+        assert url["HOST"] == "ec2-107-21-253-135.compute-1.amazonaws.com"
+        assert url["USER"] == "uf07k1i6d8ia0v"
+        assert url["PASSWORD"] == "wegauwhgeuioweg"
+        assert url["PORT"] == 3306
+        assert url["OPTIONS"] == {"ssl": {"ca": "rds-combined-ca-bundle.pem"}}
+
+        # Test empty options
+        with mock.patch.dict(
+            os.environ,
+            {
+                "DATABASE_URL": 
"mysql://uf07k1i6d8ia0v:[email protected]:3306/d8r82722r2kuvn?"
+            },
+        ):
+            url = dj_database_url.config()
+        assert "OPTIONS" not in url
+
+    def test_oracle_parsing(self):
+        url = "oracle://scott:tiger@oraclehost:1521/hr"
+        url = dj_database_url.parse(url)
+
+        assert url["ENGINE"] == "django.db.backends.oracle"
+        assert url["NAME"] == "hr"
+        assert url["HOST"] == "oraclehost"
+        assert url["USER"] == "scott"
+        assert url["PASSWORD"] == "tiger"
+        assert url["PORT"] == "1521"
+
+    def test_oracle_gis_parsing(self):
+        url = "oraclegis://scott:tiger@oraclehost:1521/hr"
+        url = dj_database_url.parse(url)
+
+        assert url["ENGINE"] == "django.contrib.gis.db.backends.oracle"
+        assert url["NAME"] == "hr"
+        assert url["HOST"] == "oraclehost"
+        assert url["USER"] == "scott"
+        assert url["PASSWORD"] == "tiger"
+        assert url["PORT"] == 1521
+
+    def test_oracle_dsn_parsing(self):
+        url = (
+            "oracle://scott:tiger@/"
+            "(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)"
+            "(HOST=oraclehost)(PORT=1521)))"
+            "(CONNECT_DATA=(SID=hr)))"
+        )
+        url = dj_database_url.parse(url)
+
+        assert url["ENGINE"] == "django.db.backends.oracle"
+        assert url["USER"] == "scott"
+        assert url["PASSWORD"] == "tiger"
+        assert url["HOST"] == ""
+        assert url["PORT"] == ""
+
+        dsn = (
+            "(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)"
+            "(HOST=oraclehost)(PORT=1521)))"
+            "(CONNECT_DATA=(SID=hr)))"
+        )
+
+        assert url["NAME"] == dsn
+
+    def test_oracle_tns_parsing(self):
+        url = "oracle://scott:tiger@/tnsname"
+        url = dj_database_url.parse(url)
+
+        assert url["ENGINE"] == "django.db.backends.oracle"
+        assert url["USER"] == "scott"
+        assert url["PASSWORD"] == "tiger"
+        assert url["NAME"] == "tnsname"
+        assert url["HOST"] == ""
+        assert url["PORT"] == ""
+
+    def test_redshift_parsing(self):
+        url = 
"redshift://uf07k1i6d8ia0v:[email protected]:5439/d8r82722r2kuvn?currentSchema=otherschema"
+        url = dj_database_url.parse(url)
+
+        assert url["ENGINE"] == "django_redshift_backend"
+        assert url["NAME"] == "d8r82722r2kuvn"
+        assert url["HOST"] == "ec2-107-21-253-135.compute-1.amazonaws.com"
+        assert url["USER"] == "uf07k1i6d8ia0v"
+        assert url["PASSWORD"] == "wegauwhgeuioweg"
+        assert url["PORT"] == 5439
+        assert url["OPTIONS"]["options"] == "-c search_path=otherschema"
+        assert "currentSchema" not in url["OPTIONS"]
+
+    def test_mssql_parsing(self):
+        url = 
"mssql://uf07k1i6d8ia0v:[email protected]/d8r82722r2kuvn?driver=ODBC
 Driver 13 for SQL Server"
+        url = dj_database_url.parse(url)
+
+        assert url["ENGINE"] == "sql_server.pyodbc"
+        assert url["NAME"] == "d8r82722r2kuvn"
+        assert url["HOST"] == "ec2-107-21-253-135.compute-1.amazonaws.com"
+        assert url["USER"] == "uf07k1i6d8ia0v"
+        assert url["PASSWORD"] == "wegauwhgeuioweg"
+        assert url["PORT"] == ""
+        assert url["OPTIONS"]["driver"] == "ODBC Driver 13 for SQL Server"
+        assert "currentSchema" not in url["OPTIONS"]
+
+    def test_mssql_instance_port_parsing(self):
+        url = 
"mssql://uf07k1i6d8ia0v:[email protected]\\insnsnss:12345/d8r82722r2kuvn?driver=ODBC
 Driver 13 for SQL Server"
+        url = dj_database_url.parse(url)
+
+        assert url["ENGINE"] == "sql_server.pyodbc"
+        assert url["NAME"] == "d8r82722r2kuvn"
+        assert url["HOST"] == 
"ec2-107-21-253-135.compute-1.amazonaws.com\\insnsnss"
+        assert url["USER"] == "uf07k1i6d8ia0v"
+        assert url["PASSWORD"] == "wegauwhgeuioweg"
+        assert url["PORT"] == "12345"
+        assert url["OPTIONS"]["driver"] == "ODBC Driver 13 for SQL Server"
+        assert "currentSchema" not in url["OPTIONS"]
+
+    def test_cockroach(self):
+        url = 
"cockroach://testuser:testpass@testhost:26257/cockroach?sslmode=verify-full&sslrootcert=/certs/ca.crt&sslcert=/certs/client.myprojectuser.crt&sslkey=/certs/client.myprojectuser.key"
+        url = dj_database_url.parse(url)
+        assert url['ENGINE'] == 'django_cockroachdb'
+        assert url['NAME'] == 'cockroach'
+        assert url['HOST'] == 'testhost'
+        assert url['USER'] == 'testuser'
+        assert url['PASSWORD'] == 'testpass'
+        assert url['PORT'] == 26257
+        assert url['OPTIONS']['sslmode'] == 'verify-full'
+        assert url['OPTIONS']['sslrootcert'] == '/certs/ca.crt'
+        assert url['OPTIONS']['sslcert'] == '/certs/client.myprojectuser.crt'
+        assert url['OPTIONS']['sslkey'] == '/certs/client.myprojectuser.key'
+
+    def test_mssqlms_parsing(self):
+        url = 
"mssqlms://uf07k1i6d8ia0v:[email protected]/d8r82722r2kuvn?driver=ODBC
 Driver 13 for SQL Server"
+        url = dj_database_url.parse(url)
+
+        assert url["ENGINE"] == "mssql"
+        assert url["NAME"] == "d8r82722r2kuvn"
+        assert url["HOST"] == "ec2-107-21-253-135.compute-1.amazonaws.com"
+        assert url["USER"] == "uf07k1i6d8ia0v"
+        assert url["PASSWORD"] == "wegauwhgeuioweg"
+        assert url["PORT"] == ""
+        assert url["OPTIONS"]["driver"] == "ODBC Driver 13 for SQL Server"
+        assert "currentSchema" not in url["OPTIONS"]
+
+    def test_timescale_parsing(self):
+        url = 
"timescale://uf07k1i6d8ia0v:[email protected]:5431/d8r82722r2kuvn"
+        url = dj_database_url.parse(url)
+
+        assert url["ENGINE"] == "timescale.db.backends.postgresql"
+        assert url["NAME"] == "d8r82722r2kuvn"
+        assert url["HOST"] == "ec2-107-21-253-135.compute-1.amazonaws.com"
+        assert url["USER"] == "uf07k1i6d8ia0v"
+        assert url["PASSWORD"] == "wegauwhgeuioweg"
+        assert url["PORT"] == 5431
+
+    def test_timescale_unix_socket_parsing(self):
+        url = "timescale://%2Fvar%2Frun%2Fpostgresql/d8r82722r2kuvn"
+        url = dj_database_url.parse(url)
+
+        assert url["ENGINE"] == "timescale.db.backends.postgresql"
+        assert url["NAME"] == "d8r82722r2kuvn"
+        assert url["HOST"] == "/var/run/postgresql"
+        assert url["USER"] == ""
+        assert url["PASSWORD"] == ""
+        assert url["PORT"] == ""
+
+        url = "timescale://%2FUsers%2Fpostgres%2FRuN/d8r82722r2kuvn"
+        url = dj_database_url.parse(url)
+
+        assert url["ENGINE"] == "timescale.db.backends.postgresql"
+        assert url["HOST"] == "/Users/postgres/RuN"
+        assert url["USER"] == ""
+        assert url["PASSWORD"] == ""
+        assert url["PORT"] == ""
+
+    def test_timescale_ipv6_parsing(self):
+        url = 
"timescale://ieRaekei9wilaim7:wegauwhgeuioweg@[2001:db8:1234::1234:5678:90af]:5431/d8r82722r2kuvn"
+        url = dj_database_url.parse(url)
+
+        assert url["ENGINE"] == "timescale.db.backends.postgresql"
+        assert url["NAME"] == "d8r82722r2kuvn"
+        assert url["HOST"] == "2001:db8:1234::1234:5678:90af"
+        assert url["USER"] == "ieRaekei9wilaim7"
+        assert url["PASSWORD"] == "wegauwhgeuioweg"
+        assert url["PORT"] == 5431
+
+    def test_timescale_search_path_parsing(self):
+        url = 
"timescale://uf07k1i6d8ia0v:[email protected]:5431/d8r82722r2kuvn?currentSchema=otherschema"
+        url = dj_database_url.parse(url)
+        assert url["ENGINE"] == "timescale.db.backends.postgresql"
+        assert url["NAME"] == "d8r82722r2kuvn"
+        assert url["HOST"] == "ec2-107-21-253-135.compute-1.amazonaws.com"
+        assert url["USER"] == "uf07k1i6d8ia0v"
+        assert url["PASSWORD"] == "wegauwhgeuioweg"
+        assert url["PORT"] == 5431
+        assert url["OPTIONS"]["options"] == "-c search_path=otherschema"
+        assert "currentSchema" not in url["OPTIONS"]
+
+    def test_timescale_parsing_with_special_characters(self):
+        url = 
"timescale://%23user:%[email protected]:5431/%23database"
+        url = dj_database_url.parse(url)
+
+        assert url["ENGINE"] == "timescale.db.backends.postgresql"
+        assert url["NAME"] == "#database"
+        assert url["HOST"] == "ec2-107-21-253-135.compute-1.amazonaws.com"
+        assert url["USER"] == "#user"
+        assert url["PASSWORD"] == "#password"
+        assert url["PORT"] == 5431
+
+    def test_timescalegis_parsing(self):
+        url = 
"timescalegis://uf07k1i6d8ia0v:[email protected]:5431/d8r82722r2kuvn"
+        url = dj_database_url.parse(url)
+
+        assert url["ENGINE"] == "timescale.db.backends.postgis"
+        assert url["NAME"] == "d8r82722r2kuvn"
+        assert url["HOST"] == "ec2-107-21-253-135.compute-1.amazonaws.com"
+        assert url["USER"] == "uf07k1i6d8ia0v"
+        assert url["PASSWORD"] == "wegauwhgeuioweg"
+        assert url["PORT"] == 5431
+
+    def test_timescalegis_unix_socket_parsing(self):
+        url = "timescalegis://%2Fvar%2Frun%2Fpostgresql/d8r82722r2kuvn"
+        url = dj_database_url.parse(url)
+
+        assert url["ENGINE"] == "timescale.db.backends.postgis"
+        assert url["NAME"] == "d8r82722r2kuvn"
+        assert url["HOST"] == "/var/run/postgresql"
+        assert url["USER"] == ""
+        assert url["PASSWORD"] == ""
+        assert url["PORT"] == ""
+
+        url = "timescalegis://%2FUsers%2Fpostgres%2FRuN/d8r82722r2kuvn"
+        url = dj_database_url.parse(url)
+
+        assert url["ENGINE"] == "timescale.db.backends.postgis"
+        assert url["HOST"] == "/Users/postgres/RuN"
+        assert url["USER"] == ""
+        assert url["PASSWORD"] == ""
+        assert url["PORT"] == ""
+
+    def test_timescalegis_ipv6_parsing(self):
+        url = 
"timescalegis://ieRaekei9wilaim7:wegauwhgeuioweg@[2001:db8:1234::1234:5678:90af]:5431/d8r82722r2kuvn"
+        url = dj_database_url.parse(url)
+
+        assert url["ENGINE"] == "timescale.db.backends.postgis"
+        assert url["NAME"] == "d8r82722r2kuvn"
+        assert url["HOST"] == "2001:db8:1234::1234:5678:90af"
+        assert url["USER"] == "ieRaekei9wilaim7"
+        assert url["PASSWORD"] == "wegauwhgeuioweg"
+        assert url["PORT"] == 5431
+
+    def test_timescalegis_search_path_parsing(self):
+        url = 
"timescalegis://uf07k1i6d8ia0v:[email protected]:5431/d8r82722r2kuvn?currentSchema=otherschema"
+        url = dj_database_url.parse(url)
+        assert url["ENGINE"] == "timescale.db.backends.postgis"
+        assert url["NAME"] == "d8r82722r2kuvn"
+        assert url["HOST"] == "ec2-107-21-253-135.compute-1.amazonaws.com"
+        assert url["USER"] == "uf07k1i6d8ia0v"
+        assert url["PASSWORD"] == "wegauwhgeuioweg"
+        assert url["PORT"] == 5431
+        assert url["OPTIONS"]["options"] == "-c search_path=otherschema"
+        assert "currentSchema" not in url["OPTIONS"]
+
+    def test_timescalegis_parsing_with_special_characters(self):
+        url = 
"timescalegis://%23user:%[email protected]:5431/%23database"
+        url = dj_database_url.parse(url)
+
+        assert url["ENGINE"] == "timescale.db.backends.postgis"
+        assert url["NAME"] == "#database"
+        assert url["HOST"] == "ec2-107-21-253-135.compute-1.amazonaws.com"
+        assert url["USER"] == "#user"
+        assert url["PASSWORD"] == "#password"
+        assert url["PORT"] == 5431
+
+    def test_persistent_connection_variables(self):
+        url = dj_database_url.parse(
+            "sqlite://myfile.db", conn_max_age=600, conn_health_checks=True
+        )
+
+        assert url["CONN_MAX_AGE"] == 600
+        assert url["CONN_HEALTH_CHECKS"] is True
+
+    def test_sqlite_memory_persistent_connection_variables(self):
+        # memory sqlite ignores connection.close(), so persistent connection
+        # variables aren’t required
+        url = dj_database_url.parse(
+            "sqlite://:memory:", conn_max_age=600, conn_health_checks=True
+        )
+
+        assert "CONN_MAX_AGE" not in url
+        assert "CONN_HEALTH_CHECKS" not in url
+
+    @mock.patch.dict(
+        os.environ,
+        {"DATABASE_URL": 
"postgres://user:[email protected]:5431/d8r8?"},
+    )
+    def test_persistent_connection_variables_config(self):
+        url = dj_database_url.config(conn_max_age=600, conn_health_checks=True)
+
+        assert url["CONN_MAX_AGE"] == 600
+        assert url["CONN_HEALTH_CHECKS"] is True
+
+    def test_no_env_variable(self):
+        with self.assertLogs() as cm:
+            with mock.patch.dict(os.environ, clear=True):
+                url = dj_database_url.config()
+            assert url == {}, url
+        assert cm.output == [
+            'WARNING:root:No DATABASE_URL environment variable set, and so no 
databases setup'
+        ], cm.output
+
+    def test_bad_url_parsing(self):
+        with self.assertRaisesRegex(ValueError, "No support for 'foo'. We 
support: "):
+            dj_database_url.parse("foo://bar")
+
+    @mock.patch.dict(
+        os.environ,
+        {"DATABASE_URL": 
"postgres://user:[email protected]:5431/d8r8?"},
+    )
+    def test_ssl_require(self):
+        url = dj_database_url.config(ssl_require=True)
+        assert url["OPTIONS"] == {'sslmode': 'require'}
+
+    def test_options_int_values(self):
+        """Ensure that options with integer values are parsed correctly."""
+        url = dj_database_url.parse(
+            "mysql://user:[email protected]:15036/db?connect_timout=3"
+        )
+        assert url["OPTIONS"] == {'connect_timout': 3}
+
+
+if __name__ == "__main__":
+    unittest.main()

Reply via email to