2024-10-10 21:45:31 +00:00
|
|
|
|
# pyright: reportTypedDictNotRequiredAccess=false
|
|
|
|
|
|
|
2012-06-19 15:09:00 +00:00
|
|
|
|
import os
|
2024-02-29 11:49:25 +00:00
|
|
|
|
import re
|
2012-06-19 15:03:52 +00:00
|
|
|
|
import unittest
|
2022-12-13 09:05:04 +00:00
|
|
|
|
from unittest import mock
|
2024-02-29 11:49:25 +00:00
|
|
|
|
from urllib.parse import uses_netloc
|
2012-06-19 15:03:52 +00:00
|
|
|
|
|
2012-06-19 15:09:00 +00:00
|
|
|
|
import dj_database_url
|
|
|
|
|
|
|
2022-05-04 08:43:30 +00:00
|
|
|
|
POSTGIS_URL = "postgis://uf07k1i6d8ia0v:wegauwhgeuioweg@ec2-107-21-253-135.compute-1.amazonaws.com:5431/d8r82722r2kuvn"
|
2012-06-19 15:09:00 +00:00
|
|
|
|
|
2012-06-19 15:03:52 +00:00
|
|
|
|
|
|
|
|
|
|
class DatabaseTestSuite(unittest.TestCase):
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_postgres_parsing(self) -> None:
|
|
|
|
|
|
url = dj_database_url.parse(
|
|
|
|
|
|
"postgres://uf07k1i6d8ia0v:wegauwhgeuioweg@ec2-107-21-253-135.compute-1.amazonaws.com:5431/d8r82722r2kuvn"
|
|
|
|
|
|
)
|
2012-06-19 15:09:00 +00:00
|
|
|
|
|
2022-09-25 20:49:01 +00:00
|
|
|
|
assert url["ENGINE"] == "django.db.backends.postgresql"
|
2022-05-04 08:43:30 +00:00
|
|
|
|
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
|
2012-06-19 15:09:00 +00:00
|
|
|
|
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_postgres_unix_socket_parsing(self) -> None:
|
|
|
|
|
|
url = dj_database_url.parse(
|
|
|
|
|
|
"postgres://%2Fvar%2Frun%2Fpostgresql/d8r82722r2kuvn"
|
|
|
|
|
|
)
|
2014-02-04 15:18:18 +00:00
|
|
|
|
|
2022-09-25 20:49:01 +00:00
|
|
|
|
assert url["ENGINE"] == "django.db.backends.postgresql"
|
2022-05-04 08:43:30 +00:00
|
|
|
|
assert url["NAME"] == "d8r82722r2kuvn"
|
|
|
|
|
|
assert url["HOST"] == "/var/run/postgresql"
|
|
|
|
|
|
assert url["USER"] == ""
|
|
|
|
|
|
assert url["PASSWORD"] == ""
|
|
|
|
|
|
assert url["PORT"] == ""
|
2014-02-04 15:18:18 +00:00
|
|
|
|
|
2025-02-16 07:53:52 +00:00
|
|
|
|
url = dj_database_url.parse(
|
|
|
|
|
|
"postgres://%2FUsers%2Fpostgres%2FRuN/d8r82722r2kuvn"
|
|
|
|
|
|
)
|
2016-09-28 15:01:57 +00:00
|
|
|
|
|
2022-09-25 20:49:01 +00:00
|
|
|
|
assert url["ENGINE"] == "django.db.backends.postgresql"
|
2022-05-04 08:43:30 +00:00
|
|
|
|
assert url["HOST"] == "/Users/postgres/RuN"
|
|
|
|
|
|
assert url["USER"] == ""
|
|
|
|
|
|
assert url["PASSWORD"] == ""
|
|
|
|
|
|
assert url["PORT"] == ""
|
2016-09-28 15:01:57 +00:00
|
|
|
|
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_postgres_google_cloud_parsing(self) -> None:
|
|
|
|
|
|
url = dj_database_url.parse(
|
|
|
|
|
|
"postgres://uf07k1i6d8ia0v:wegauwhgeuioweg@%2Fcloudsql%2Fproject_id%3Aregion%3Ainstance_id/d8r82722r2kuvn"
|
|
|
|
|
|
)
|
2022-12-12 20:18:02 +00:00
|
|
|
|
|
|
|
|
|
|
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"] == ""
|
|
|
|
|
|
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_ipv6_parsing(self) -> None:
|
|
|
|
|
|
url = dj_database_url.parse(
|
|
|
|
|
|
"postgres://ieRaekei9wilaim7:wegauwhgeuioweg@[2001:db8:1234::1234:5678:90af]:5431/d8r82722r2kuvn"
|
|
|
|
|
|
)
|
2017-01-20 15:06:53 +00:00
|
|
|
|
|
2022-09-25 20:49:01 +00:00
|
|
|
|
assert url["ENGINE"] == "django.db.backends.postgresql"
|
2022-05-04 08:43:30 +00:00
|
|
|
|
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
|
2017-01-20 15:06:53 +00:00
|
|
|
|
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_postgres_search_path_parsing(self) -> None:
|
|
|
|
|
|
url = dj_database_url.parse(
|
|
|
|
|
|
"postgres://uf07k1i6d8ia0v:wegauwhgeuioweg@ec2-107-21-253-135.compute-1.amazonaws.com:5431/d8r82722r2kuvn?currentSchema=otherschema"
|
|
|
|
|
|
)
|
2022-09-25 20:49:01 +00:00
|
|
|
|
assert url["ENGINE"] == "django.db.backends.postgresql"
|
2022-05-04 08:43:30 +00:00
|
|
|
|
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"]
|
2016-02-03 00:07:35 +00:00
|
|
|
|
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_postgres_parsing_with_special_characters(self) -> None:
|
|
|
|
|
|
url = dj_database_url.parse(
|
|
|
|
|
|
"postgres://%23user:%23password@ec2-107-21-253-135.compute-1.amazonaws.com:5431/%23database"
|
|
|
|
|
|
)
|
2014-12-31 16:25:39 +00:00
|
|
|
|
|
2022-09-25 20:49:01 +00:00
|
|
|
|
assert url["ENGINE"] == "django.db.backends.postgresql"
|
2022-05-04 08:43:30 +00:00
|
|
|
|
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
|
2014-12-31 16:25:39 +00:00
|
|
|
|
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_postgres_parsing_with_int_bool_str_query_string(self) -> None:
|
|
|
|
|
|
url = dj_database_url.parse(
|
|
|
|
|
|
"postgres://uf07k1i6d8ia0v:wegauwhgeuioweg@ec2-107-21-253-135.compute-1.amazonaws.com:5431/d8r82722r2kuvn?server_side_binding=true&timeout=20&service=my_service&passfile=.my_pgpass"
|
|
|
|
|
|
)
|
2023-12-09 09:39:35 +00:00
|
|
|
|
|
|
|
|
|
|
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"]["server_side_binding"] is True
|
|
|
|
|
|
assert url["OPTIONS"]["timeout"] == 20
|
|
|
|
|
|
assert url["OPTIONS"]["service"] == "my_service"
|
|
|
|
|
|
assert url["OPTIONS"]["passfile"] == ".my_pgpass"
|
|
|
|
|
|
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_postgis_parsing(self) -> None:
|
|
|
|
|
|
url = dj_database_url.parse(
|
|
|
|
|
|
"postgis://uf07k1i6d8ia0v:wegauwhgeuioweg@ec2-107-21-253-135.compute-1.amazonaws.com:5431/d8r82722r2kuvn"
|
|
|
|
|
|
)
|
2012-06-19 15:21:15 +00:00
|
|
|
|
|
2022-05-04 08:43:30 +00:00
|
|
|
|
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
|
2012-06-19 15:21:15 +00:00
|
|
|
|
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_postgis_search_path_parsing(self) -> None:
|
|
|
|
|
|
url = dj_database_url.parse(
|
|
|
|
|
|
"postgis://uf07k1i6d8ia0v:wegauwhgeuioweg@ec2-107-21-253-135.compute-1.amazonaws.com:5431/d8r82722r2kuvn?currentSchema=otherschema"
|
|
|
|
|
|
)
|
2022-05-04 08:43:30 +00:00
|
|
|
|
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"]
|
2016-12-14 15:45:31 +00:00
|
|
|
|
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_mysql_gis_parsing(self) -> None:
|
|
|
|
|
|
url = dj_database_url.parse(
|
|
|
|
|
|
"mysqlgis://uf07k1i6d8ia0v:wegauwhgeuioweg@ec2-107-21-253-135.compute-1.amazonaws.com:5431/d8r82722r2kuvn"
|
|
|
|
|
|
)
|
2013-09-26 14:39:16 +00:00
|
|
|
|
|
2022-05-04 08:43:30 +00:00
|
|
|
|
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
|
2013-09-26 14:39:16 +00:00
|
|
|
|
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_mysql_connector_parsing(self) -> None:
|
|
|
|
|
|
url = dj_database_url.parse(
|
|
|
|
|
|
"mysql-connector://uf07k1i6d8ia0v:wegauwhgeuioweg@ec2-107-21-253-135.compute-1.amazonaws.com:5431/d8r82722r2kuvn"
|
|
|
|
|
|
)
|
2014-03-28 10:50:25 +00:00
|
|
|
|
|
2022-05-04 08:43:30 +00:00
|
|
|
|
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
|
2014-03-28 10:50:25 +00:00
|
|
|
|
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_config_test_options(self) -> None:
|
2023-01-30 12:19:02 +00:00
|
|
|
|
with mock.patch.dict(
|
|
|
|
|
|
os.environ,
|
|
|
|
|
|
{
|
|
|
|
|
|
"DATABASE_URL": "postgres://uf07k1i6d8ia0v:wegauwhgeuioweg@ec2-107-21-253-135.compute-1.amazonaws.com:5431/d8r82722r2kuvn?"
|
|
|
|
|
|
},
|
|
|
|
|
|
):
|
|
|
|
|
|
test_db_config = {
|
|
|
|
|
|
'NAME': 'mytestdatabase',
|
|
|
|
|
|
}
|
|
|
|
|
|
url = dj_database_url.config(test_options=test_db_config)
|
2022-12-12 14:56:50 +00:00
|
|
|
|
|
|
|
|
|
|
assert url['TEST']['NAME'] == 'mytestdatabase'
|
|
|
|
|
|
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_cleardb_parsing(self) -> None:
|
|
|
|
|
|
url = dj_database_url.parse(
|
|
|
|
|
|
"mysql://bea6eb025ca0d8:69772142@us-cdbr-east.cleardb.com/heroku_97681db3eff7580?reconnect=true"
|
|
|
|
|
|
)
|
2012-06-19 15:03:52 +00:00
|
|
|
|
|
2022-05-04 08:43:30 +00:00
|
|
|
|
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"] == ""
|
2012-06-19 15:03:52 +00:00
|
|
|
|
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_database_url(self) -> None:
|
2023-01-30 12:19:02 +00:00
|
|
|
|
with mock.patch.dict(os.environ, clear=True):
|
|
|
|
|
|
a = dj_database_url.config()
|
2012-06-19 15:23:05 +00:00
|
|
|
|
assert not a
|
|
|
|
|
|
|
2023-01-30 12:19:02 +00:00
|
|
|
|
with mock.patch.dict(
|
|
|
|
|
|
os.environ,
|
|
|
|
|
|
{
|
|
|
|
|
|
"DATABASE_URL": "postgres://uf07k1i6d8ia0v:wegauwhgeuioweg@ec2-107-21-253-135.compute-1.amazonaws.com:5431/d8r82722r2kuvn"
|
|
|
|
|
|
},
|
|
|
|
|
|
):
|
|
|
|
|
|
url = dj_database_url.config()
|
2012-06-19 15:23:05 +00:00
|
|
|
|
|
2022-09-25 20:49:01 +00:00
|
|
|
|
assert url["ENGINE"] == "django.db.backends.postgresql"
|
2022-05-04 08:43:30 +00:00
|
|
|
|
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
|
2012-06-19 15:23:05 +00:00
|
|
|
|
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_empty_sqlite_url(self) -> None:
|
|
|
|
|
|
url = dj_database_url.parse("sqlite://")
|
2013-01-05 10:19:54 +00:00
|
|
|
|
|
2022-05-04 08:43:30 +00:00
|
|
|
|
assert url["ENGINE"] == "django.db.backends.sqlite3"
|
|
|
|
|
|
assert url["NAME"] == ":memory:"
|
2013-01-05 10:19:54 +00:00
|
|
|
|
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_memory_sqlite_url(self) -> None:
|
|
|
|
|
|
url = dj_database_url.parse("sqlite://:memory:")
|
2013-01-05 10:19:54 +00:00
|
|
|
|
|
2022-05-04 08:43:30 +00:00
|
|
|
|
assert url["ENGINE"] == "django.db.backends.sqlite3"
|
|
|
|
|
|
assert url["NAME"] == ":memory:"
|
2013-01-05 10:19:54 +00:00
|
|
|
|
|
2025-04-30 13:13:38 +00:00
|
|
|
|
def test_sqlite_relative_url(self) -> None:
|
2024-02-29 11:49:25 +00:00
|
|
|
|
url = "sqlite:///db.sqlite3"
|
|
|
|
|
|
config = dj_database_url.parse(url)
|
|
|
|
|
|
|
|
|
|
|
|
assert config["ENGINE"] == "django.db.backends.sqlite3"
|
|
|
|
|
|
assert config["NAME"] == "db.sqlite3"
|
|
|
|
|
|
|
2025-04-30 13:13:38 +00:00
|
|
|
|
def test_sqlite_absolute_url(self) -> None:
|
2024-02-29 11:49:25 +00:00
|
|
|
|
# 4 slashes are needed:
|
|
|
|
|
|
# two are part of scheme
|
|
|
|
|
|
# one separates host:port from path
|
|
|
|
|
|
# and the fourth goes to "NAME" value
|
|
|
|
|
|
url = "sqlite:////db.sqlite3"
|
|
|
|
|
|
config = dj_database_url.parse(url)
|
|
|
|
|
|
|
|
|
|
|
|
assert config["ENGINE"] == "django.db.backends.sqlite3"
|
|
|
|
|
|
assert config["NAME"] == "/db.sqlite3"
|
|
|
|
|
|
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_parse_engine_setting(self) -> None:
|
2022-05-04 08:43:30 +00:00
|
|
|
|
engine = "django_mysqlpool.backends.mysqlpool"
|
2025-02-16 07:53:52 +00:00
|
|
|
|
url = dj_database_url.parse(
|
|
|
|
|
|
"mysql://bea6eb025ca0d8:69772142@us-cdbr-east.cleardb.com/heroku_97681db3eff7580?reconnect=true",
|
|
|
|
|
|
engine,
|
|
|
|
|
|
)
|
2013-12-15 16:59:18 +00:00
|
|
|
|
|
2022-05-04 08:43:30 +00:00
|
|
|
|
assert url["ENGINE"] == engine
|
2012-06-19 15:23:05 +00:00
|
|
|
|
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_config_engine_setting(self) -> None:
|
2022-05-04 08:43:30 +00:00
|
|
|
|
engine = "django_mysqlpool.backends.mysqlpool"
|
2023-01-30 12:19:02 +00:00
|
|
|
|
with mock.patch.dict(
|
|
|
|
|
|
os.environ,
|
|
|
|
|
|
{
|
|
|
|
|
|
"DATABASE_URL": "mysql://bea6eb025ca0d8:69772142@us-cdbr-east.cleardb.com/heroku_97681db3eff7580?reconnect=true"
|
|
|
|
|
|
},
|
|
|
|
|
|
):
|
|
|
|
|
|
url = dj_database_url.config(engine=engine)
|
2012-06-19 15:23:05 +00:00
|
|
|
|
|
2022-05-04 08:43:30 +00:00
|
|
|
|
assert url["ENGINE"] == engine
|
2016-02-03 00:07:35 +00:00
|
|
|
|
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_parse_conn_max_age_setting(self) -> None:
|
2015-05-11 05:40:13 +00:00
|
|
|
|
conn_max_age = 600
|
2025-02-16 07:53:52 +00:00
|
|
|
|
url = dj_database_url.parse(
|
|
|
|
|
|
"mysql://bea6eb025ca0d8:69772142@us-cdbr-east.cleardb.com/heroku_97681db3eff7580?reconnect=true",
|
|
|
|
|
|
conn_max_age=conn_max_age,
|
|
|
|
|
|
)
|
2015-05-11 05:40:13 +00:00
|
|
|
|
|
2022-05-04 08:43:30 +00:00
|
|
|
|
assert url["CONN_MAX_AGE"] == conn_max_age
|
2015-05-11 05:40:13 +00:00
|
|
|
|
|
2025-07-11 16:15:05 +00:00
|
|
|
|
def test_config_conn_max_age_setting_none(self) -> None:
|
|
|
|
|
|
conn_max_age = None
|
2023-01-30 12:19:02 +00:00
|
|
|
|
with mock.patch.dict(
|
|
|
|
|
|
os.environ,
|
|
|
|
|
|
{
|
|
|
|
|
|
"DATABASE_URL": "mysql://bea6eb025ca0d8:69772142@us-cdbr-east.cleardb.com/heroku_97681db3eff7580?reconnect=true"
|
|
|
|
|
|
},
|
|
|
|
|
|
):
|
|
|
|
|
|
url = dj_database_url.config(conn_max_age=conn_max_age)
|
2015-05-11 05:40:13 +00:00
|
|
|
|
|
2022-05-04 08:43:30 +00:00
|
|
|
|
assert url["CONN_MAX_AGE"] == conn_max_age
|
2012-06-19 15:03:52 +00:00
|
|
|
|
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_database_url_with_options(self) -> None:
|
2015-05-14 21:52:16 +00:00
|
|
|
|
# Test full options
|
2023-01-30 12:19:02 +00:00
|
|
|
|
with mock.patch.dict(
|
|
|
|
|
|
os.environ,
|
|
|
|
|
|
{
|
|
|
|
|
|
"DATABASE_URL": "postgres://uf07k1i6d8ia0v:wegauwhgeuioweg@ec2-107-21-253-135.compute-1.amazonaws.com:5431/d8r82722r2kuvn?sslrootcert=rds-combined-ca-bundle.pem&sslmode=verify-full"
|
|
|
|
|
|
},
|
|
|
|
|
|
):
|
|
|
|
|
|
url = dj_database_url.config()
|
2015-03-23 20:03:20 +00:00
|
|
|
|
|
2022-09-25 20:49:01 +00:00
|
|
|
|
assert url["ENGINE"] == "django.db.backends.postgresql"
|
2022-05-04 08:43:30 +00:00
|
|
|
|
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",
|
2015-03-23 20:03:20 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2015-05-14 21:52:16 +00:00
|
|
|
|
# Test empty options
|
2023-01-30 12:19:02 +00:00
|
|
|
|
with mock.patch.dict(
|
|
|
|
|
|
os.environ,
|
|
|
|
|
|
{
|
|
|
|
|
|
"DATABASE_URL": "postgres://uf07k1i6d8ia0v:wegauwhgeuioweg@ec2-107-21-253-135.compute-1.amazonaws.com:5431/d8r82722r2kuvn?"
|
|
|
|
|
|
},
|
|
|
|
|
|
):
|
|
|
|
|
|
url = dj_database_url.config()
|
2022-05-04 08:43:30 +00:00
|
|
|
|
assert "OPTIONS" not in url
|
2015-05-14 21:52:16 +00:00
|
|
|
|
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_mysql_database_url_with_sslca_options(self) -> None:
|
2023-01-30 12:19:02 +00:00
|
|
|
|
with mock.patch.dict(
|
|
|
|
|
|
os.environ,
|
|
|
|
|
|
{
|
|
|
|
|
|
"DATABASE_URL": "mysql://uf07k1i6d8ia0v:wegauwhgeuioweg@ec2-107-21-253-135.compute-1.amazonaws.com:3306/d8r82722r2kuvn?ssl-ca=rds-combined-ca-bundle.pem"
|
|
|
|
|
|
},
|
|
|
|
|
|
):
|
|
|
|
|
|
url = dj_database_url.config()
|
2016-04-06 15:46:49 +00:00
|
|
|
|
|
2022-05-04 08:43:30 +00:00
|
|
|
|
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"}}
|
2016-04-06 15:46:49 +00:00
|
|
|
|
|
|
|
|
|
|
# Test empty options
|
2023-01-30 12:19:02 +00:00
|
|
|
|
with mock.patch.dict(
|
|
|
|
|
|
os.environ,
|
|
|
|
|
|
{
|
|
|
|
|
|
"DATABASE_URL": "mysql://uf07k1i6d8ia0v:wegauwhgeuioweg@ec2-107-21-253-135.compute-1.amazonaws.com:3306/d8r82722r2kuvn?"
|
|
|
|
|
|
},
|
|
|
|
|
|
):
|
|
|
|
|
|
url = dj_database_url.config()
|
2022-05-04 08:43:30 +00:00
|
|
|
|
assert "OPTIONS" not in url
|
2015-03-23 20:03:20 +00:00
|
|
|
|
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_oracle_parsing(self) -> None:
|
|
|
|
|
|
url = dj_database_url.parse("oracle://scott:tiger@oraclehost:1521/hr")
|
2014-10-24 18:48:14 +00:00
|
|
|
|
|
2022-05-04 08:43:30 +00:00
|
|
|
|
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"
|
2014-10-24 18:48:14 +00:00
|
|
|
|
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_oracle_gis_parsing(self) -> None:
|
|
|
|
|
|
url = dj_database_url.parse("oraclegis://scott:tiger@oraclehost:1521/hr")
|
2014-10-24 18:48:14 +00:00
|
|
|
|
|
2022-05-04 08:43:30 +00:00
|
|
|
|
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
|
2014-10-24 18:48:14 +00:00
|
|
|
|
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_oracle_dsn_parsing(self) -> None:
|
|
|
|
|
|
url = dj_database_url.parse(
|
2022-05-04 08:43:30 +00:00
|
|
|
|
"oracle://scott:tiger@/"
|
|
|
|
|
|
"(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)"
|
|
|
|
|
|
"(HOST=oraclehost)(PORT=1521)))"
|
|
|
|
|
|
"(CONNECT_DATA=(SID=hr)))"
|
2014-10-24 18:48:14 +00:00
|
|
|
|
)
|
|
|
|
|
|
|
2022-05-04 08:43:30 +00:00
|
|
|
|
assert url["ENGINE"] == "django.db.backends.oracle"
|
|
|
|
|
|
assert url["USER"] == "scott"
|
|
|
|
|
|
assert url["PASSWORD"] == "tiger"
|
|
|
|
|
|
assert url["HOST"] == ""
|
|
|
|
|
|
assert url["PORT"] == ""
|
2014-10-24 18:48:14 +00:00
|
|
|
|
|
|
|
|
|
|
dsn = (
|
2022-05-04 08:43:30 +00:00
|
|
|
|
"(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)"
|
|
|
|
|
|
"(HOST=oraclehost)(PORT=1521)))"
|
|
|
|
|
|
"(CONNECT_DATA=(SID=hr)))"
|
2014-10-24 18:48:14 +00:00
|
|
|
|
)
|
|
|
|
|
|
|
2022-05-04 08:43:30 +00:00
|
|
|
|
assert url["NAME"] == dsn
|
2014-10-24 18:48:14 +00:00
|
|
|
|
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_oracle_tns_parsing(self) -> None:
|
|
|
|
|
|
url = dj_database_url.parse("oracle://scott:tiger@/tnsname")
|
2014-10-24 18:48:14 +00:00
|
|
|
|
|
2022-05-04 08:43:30 +00:00
|
|
|
|
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"] == ""
|
2014-10-24 18:48:14 +00:00
|
|
|
|
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_redshift_parsing(self) -> None:
|
|
|
|
|
|
url = dj_database_url.parse(
|
|
|
|
|
|
"redshift://uf07k1i6d8ia0v:wegauwhgeuioweg@ec2-107-21-253-135.compute-1.amazonaws.com:5439/d8r82722r2kuvn?currentSchema=otherschema"
|
|
|
|
|
|
)
|
2016-10-25 08:25:01 +00:00
|
|
|
|
|
2022-05-04 08:43:30 +00:00
|
|
|
|
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"]
|
2016-10-25 08:25:01 +00:00
|
|
|
|
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_mssql_parsing(self) -> None:
|
|
|
|
|
|
url = dj_database_url.parse(
|
|
|
|
|
|
"mssql://uf07k1i6d8ia0v:wegauwhgeuioweg@ec2-107-21-253-135.compute-1.amazonaws.com/d8r82722r2kuvn?driver=ODBC Driver 13 for SQL Server"
|
|
|
|
|
|
)
|
2017-08-21 09:59:09 +00:00
|
|
|
|
|
2022-05-04 08:43:30 +00:00
|
|
|
|
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"]
|
2017-08-21 09:59:09 +00:00
|
|
|
|
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_mssql_instance_port_parsing(self) -> None:
|
|
|
|
|
|
url = dj_database_url.parse(
|
|
|
|
|
|
"mssql://uf07k1i6d8ia0v:wegauwhgeuioweg@ec2-107-21-253-135.compute-1.amazonaws.com\\insnsnss:12345/d8r82722r2kuvn?driver=ODBC Driver 13 for SQL Server"
|
|
|
|
|
|
)
|
2018-02-07 20:33:10 +00:00
|
|
|
|
|
2022-05-04 08:43:30 +00:00
|
|
|
|
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"]
|
2018-02-07 20:33:10 +00:00
|
|
|
|
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_cockroach(self) -> None:
|
|
|
|
|
|
url = dj_database_url.parse(
|
|
|
|
|
|
"cockroach://testuser:testpass@testhost:26257/cockroach?sslmode=verify-full&sslrootcert=/certs/ca.crt&sslcert=/certs/client.myprojectuser.crt&sslkey=/certs/client.myprojectuser.key"
|
|
|
|
|
|
)
|
2021-06-07 21:50:57 +00:00
|
|
|
|
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
|
2022-05-17 21:14:05 +00:00
|
|
|
|
assert url['OPTIONS']['sslmode'] == 'verify-full'
|
2021-06-07 21:50:57 +00:00
|
|
|
|
assert url['OPTIONS']['sslrootcert'] == '/certs/ca.crt'
|
|
|
|
|
|
assert url['OPTIONS']['sslcert'] == '/certs/client.myprojectuser.crt'
|
|
|
|
|
|
assert url['OPTIONS']['sslkey'] == '/certs/client.myprojectuser.key'
|
|
|
|
|
|
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_mssqlms_parsing(self) -> None:
|
|
|
|
|
|
url = dj_database_url.parse(
|
|
|
|
|
|
"mssqlms://uf07k1i6d8ia0v:wegauwhgeuioweg@ec2-107-21-253-135.compute-1.amazonaws.com/d8r82722r2kuvn?driver=ODBC Driver 13 for SQL Server"
|
|
|
|
|
|
)
|
2022-05-28 20:18:21 +00:00
|
|
|
|
|
|
|
|
|
|
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"]
|
|
|
|
|
|
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_timescale_parsing(self) -> None:
|
|
|
|
|
|
url = dj_database_url.parse(
|
|
|
|
|
|
"timescale://uf07k1i6d8ia0v:wegauwhgeuioweg@ec2-107-21-253-135.compute-1.amazonaws.com:5431/d8r82722r2kuvn"
|
|
|
|
|
|
)
|
2022-07-10 09:16:06 +00:00
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_timescale_unix_socket_parsing(self) -> None:
|
|
|
|
|
|
url = dj_database_url.parse(
|
|
|
|
|
|
"timescale://%2Fvar%2Frun%2Fpostgresql/d8r82722r2kuvn"
|
|
|
|
|
|
)
|
2022-07-10 09:16:06 +00:00
|
|
|
|
|
|
|
|
|
|
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"] == ""
|
|
|
|
|
|
|
2025-02-16 07:53:52 +00:00
|
|
|
|
url = dj_database_url.parse(
|
|
|
|
|
|
"timescale://%2FUsers%2Fpostgres%2FRuN/d8r82722r2kuvn"
|
|
|
|
|
|
)
|
2022-07-10 09:16:06 +00:00
|
|
|
|
|
|
|
|
|
|
assert url["ENGINE"] == "timescale.db.backends.postgresql"
|
|
|
|
|
|
assert url["HOST"] == "/Users/postgres/RuN"
|
|
|
|
|
|
assert url["USER"] == ""
|
|
|
|
|
|
assert url["PASSWORD"] == ""
|
|
|
|
|
|
assert url["PORT"] == ""
|
|
|
|
|
|
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_timescale_ipv6_parsing(self) -> None:
|
|
|
|
|
|
url = dj_database_url.parse(
|
|
|
|
|
|
"timescale://ieRaekei9wilaim7:wegauwhgeuioweg@[2001:db8:1234::1234:5678:90af]:5431/d8r82722r2kuvn"
|
|
|
|
|
|
)
|
2022-07-10 09:16:06 +00:00
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_timescale_search_path_parsing(self) -> None:
|
|
|
|
|
|
url = dj_database_url.parse(
|
|
|
|
|
|
"timescale://uf07k1i6d8ia0v:wegauwhgeuioweg@ec2-107-21-253-135.compute-1.amazonaws.com:5431/d8r82722r2kuvn?currentSchema=otherschema"
|
|
|
|
|
|
)
|
2022-07-10 09:16:06 +00:00
|
|
|
|
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"]
|
|
|
|
|
|
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_timescale_parsing_with_special_characters(self) -> None:
|
|
|
|
|
|
url = dj_database_url.parse(
|
|
|
|
|
|
"timescale://%23user:%23password@ec2-107-21-253-135.compute-1.amazonaws.com:5431/%23database"
|
|
|
|
|
|
)
|
2022-07-10 09:16:06 +00:00
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_timescalegis_parsing(self) -> None:
|
|
|
|
|
|
url = dj_database_url.parse(
|
|
|
|
|
|
"timescalegis://uf07k1i6d8ia0v:wegauwhgeuioweg@ec2-107-21-253-135.compute-1.amazonaws.com:5431/d8r82722r2kuvn"
|
|
|
|
|
|
)
|
2022-07-10 09:16:06 +00:00
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_timescalegis_unix_socket_parsing(self) -> None:
|
|
|
|
|
|
url = dj_database_url.parse(
|
|
|
|
|
|
"timescalegis://%2Fvar%2Frun%2Fpostgresql/d8r82722r2kuvn"
|
|
|
|
|
|
)
|
2022-07-10 09:16:06 +00:00
|
|
|
|
|
|
|
|
|
|
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"] == ""
|
|
|
|
|
|
|
2025-02-16 07:53:52 +00:00
|
|
|
|
url = dj_database_url.parse(
|
|
|
|
|
|
"timescalegis://%2FUsers%2Fpostgres%2FRuN/d8r82722r2kuvn"
|
|
|
|
|
|
)
|
2022-07-10 09:16:06 +00:00
|
|
|
|
|
|
|
|
|
|
assert url["ENGINE"] == "timescale.db.backends.postgis"
|
|
|
|
|
|
assert url["HOST"] == "/Users/postgres/RuN"
|
|
|
|
|
|
assert url["USER"] == ""
|
|
|
|
|
|
assert url["PASSWORD"] == ""
|
|
|
|
|
|
assert url["PORT"] == ""
|
|
|
|
|
|
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_timescalegis_ipv6_parsing(self) -> None:
|
|
|
|
|
|
url = dj_database_url.parse(
|
|
|
|
|
|
"timescalegis://ieRaekei9wilaim7:wegauwhgeuioweg@[2001:db8:1234::1234:5678:90af]:5431/d8r82722r2kuvn"
|
|
|
|
|
|
)
|
2022-07-10 09:16:06 +00:00
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_timescalegis_search_path_parsing(self) -> None:
|
|
|
|
|
|
url = dj_database_url.parse(
|
|
|
|
|
|
"timescalegis://uf07k1i6d8ia0v:wegauwhgeuioweg@ec2-107-21-253-135.compute-1.amazonaws.com:5431/d8r82722r2kuvn?currentSchema=otherschema"
|
|
|
|
|
|
)
|
2022-07-10 09:16:06 +00:00
|
|
|
|
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"]
|
|
|
|
|
|
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_timescalegis_parsing_with_special_characters(self) -> None:
|
|
|
|
|
|
url = dj_database_url.parse(
|
|
|
|
|
|
"timescalegis://%23user:%23password@ec2-107-21-253-135.compute-1.amazonaws.com:5431/%23database"
|
|
|
|
|
|
)
|
2022-07-10 09:16:06 +00:00
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_persistent_connection_variables(self) -> None:
|
2022-12-11 15:38:29 +00:00
|
|
|
|
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
|
|
|
|
|
|
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_sqlite_memory_persistent_connection_variables(self) -> None:
|
2022-12-11 15:38:29 +00:00
|
|
|
|
# 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
|
|
|
|
|
|
|
2022-12-13 09:05:04 +00:00
|
|
|
|
@mock.patch.dict(
|
|
|
|
|
|
os.environ,
|
|
|
|
|
|
{"DATABASE_URL": "postgres://user:password@instance.amazonaws.com:5431/d8r8?"},
|
|
|
|
|
|
)
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_persistent_connection_variables_config(self) -> None:
|
2022-12-13 09:05:04 +00:00
|
|
|
|
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
|
|
|
|
|
|
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_no_env_variable(self) -> None:
|
2023-01-30 12:19:02 +00:00
|
|
|
|
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
|
|
|
|
|
|
|
2025-04-30 13:13:38 +00:00
|
|
|
|
def test_credentials_unquoted__raise_value_error(self) -> None:
|
2024-02-29 11:49:25 +00:00
|
|
|
|
expected_message = (
|
|
|
|
|
|
"This string is not a valid url, possibly because some of its parts "
|
|
|
|
|
|
r"is not properly urllib.parse.quote()'ed."
|
|
|
|
|
|
)
|
|
|
|
|
|
with self.assertRaisesRegex(ValueError, re.escape(expected_message)):
|
|
|
|
|
|
dj_database_url.parse("postgres://user:passw#ord!@localhost/foobar")
|
|
|
|
|
|
|
2025-04-30 13:13:38 +00:00
|
|
|
|
def test_credentials_quoted__ok(self) -> None:
|
2024-02-29 11:49:25 +00:00
|
|
|
|
url = "postgres://user%40domain:p%23ssword!@localhost/foobar"
|
|
|
|
|
|
config = dj_database_url.parse(url)
|
|
|
|
|
|
assert config["USER"] == "user@domain"
|
|
|
|
|
|
assert config["PASSWORD"] == "p#ssword!"
|
|
|
|
|
|
|
2025-04-30 13:13:38 +00:00
|
|
|
|
def test_unknown_scheme__raise_value_error(self) -> None:
|
2024-02-29 11:49:25 +00:00
|
|
|
|
expected_message = (
|
|
|
|
|
|
"Scheme 'unknown-scheme://' is unknown. "
|
|
|
|
|
|
"Did you forget to register custom backend? Following schemes have registered backends:"
|
|
|
|
|
|
)
|
|
|
|
|
|
with self.assertRaisesRegex(ValueError, re.escape(expected_message)):
|
|
|
|
|
|
dj_database_url.parse("unknown-scheme://user:password@localhost/foobar")
|
|
|
|
|
|
|
2025-04-30 13:13:38 +00:00
|
|
|
|
def test_register_multiple_times__no_duplicates_in_uses_netloc(self) -> None:
|
2024-02-29 11:49:25 +00:00
|
|
|
|
# make sure that when register() function is misused,
|
|
|
|
|
|
# it won't pollute urllib.parse.uses_netloc list with duplicates.
|
|
|
|
|
|
# Otherwise, it might cause performance issue if some code assumes that
|
|
|
|
|
|
# that list is short and performs linear search on it.
|
|
|
|
|
|
dj_database_url.register("django.contrib.db.backends.bag_end", "bag-end")
|
|
|
|
|
|
dj_database_url.register("django.contrib.db.backends.bag_end", "bag-end")
|
|
|
|
|
|
assert len(uses_netloc) == len(set(uses_netloc))
|
2022-12-21 08:19:39 +00:00
|
|
|
|
|
2022-12-30 09:44:45 +00:00
|
|
|
|
@mock.patch.dict(
|
|
|
|
|
|
os.environ,
|
|
|
|
|
|
{"DATABASE_URL": "postgres://user:password@instance.amazonaws.com:5431/d8r8?"},
|
|
|
|
|
|
)
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_ssl_require(self) -> None:
|
2022-12-30 09:44:45 +00:00
|
|
|
|
url = dj_database_url.config(ssl_require=True)
|
|
|
|
|
|
assert url["OPTIONS"] == {'sslmode': 'require'}
|
|
|
|
|
|
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_options_int_values(self) -> None:
|
2023-08-15 11:28:05 +00:00
|
|
|
|
"""Ensure that options with integer values are parsed correctly."""
|
|
|
|
|
|
url = dj_database_url.parse(
|
2025-12-19 10:06:17 +00:00
|
|
|
|
"mysql://user:pw@127.0.0.1:15036/db?connect_timeout=3"
|
2023-08-15 11:28:05 +00:00
|
|
|
|
)
|
2025-12-19 10:06:17 +00:00
|
|
|
|
assert url["OPTIONS"] == {'connect_timeout': 3}
|
2023-08-15 11:28:05 +00:00
|
|
|
|
|
2023-11-08 22:21:29 +00:00
|
|
|
|
@mock.patch.dict(
|
|
|
|
|
|
os.environ,
|
|
|
|
|
|
{"DATABASE_URL": "postgres://user:password@instance.amazonaws.com:5431/d8r8?"},
|
|
|
|
|
|
)
|
2025-02-16 07:53:52 +00:00
|
|
|
|
def test_server_side_cursors__config(self) -> None:
|
2023-11-08 22:21:29 +00:00
|
|
|
|
url = dj_database_url.config(disable_server_side_cursors=True)
|
|
|
|
|
|
|
|
|
|
|
|
assert url["DISABLE_SERVER_SIDE_CURSORS"] is True
|
|
|
|
|
|
|
2014-10-24 18:48:14 +00:00
|
|
|
|
|
2022-05-04 08:43:30 +00:00
|
|
|
|
if __name__ == "__main__":
|
2013-01-05 10:19:54 +00:00
|
|
|
|
unittest.main()
|