import os import unittest from django import VERSION as DJANGO_VERSION import dj_database_url POSTGIS_URL = "postgis://uf07k1i6d8ia0v:wegauwhgeuioweg@ec2-107-21-253-135.compute-1.amazonaws.com:5431/d8r82722r2kuvn" # Django deprecated the `django.db.backends.postgresql_psycopg2` in 2.0. # https://docs.djangoproject.com/en/2.0/releases/2.0/#id1 EXPECTED_POSTGRES_ENGINE = "django.db.backends.postgresql" if DJANGO_VERSION < (2, 0): EXPECTED_POSTGRES_ENGINE = "django.db.backends.postgresql_psycopg2" class DatabaseTestSuite(unittest.TestCase): def test_postgres_parsing(self): url = "postgres://uf07k1i6d8ia0v:wegauwhgeuioweg@ec2-107-21-253-135.compute-1.amazonaws.com:5431/d8r82722r2kuvn" url = dj_database_url.parse(url) assert url["ENGINE"] == EXPECTED_POSTGRES_ENGINE 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"] == EXPECTED_POSTGRES_ENGINE 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"] == EXPECTED_POSTGRES_ENGINE assert url["HOST"] == "/Users/postgres/RuN" assert url["USER"] == "" assert url["PASSWORD"] == "" 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"] == EXPECTED_POSTGRES_ENGINE 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:wegauwhgeuioweg@ec2-107-21-253-135.compute-1.amazonaws.com:5431/d8r82722r2kuvn?currentSchema=otherschema" url = dj_database_url.parse(url) assert url["ENGINE"] == EXPECTED_POSTGRES_ENGINE 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:%23password@ec2-107-21-253-135.compute-1.amazonaws.com:5431/%23database" url = dj_database_url.parse(url) assert url["ENGINE"] == EXPECTED_POSTGRES_ENGINE 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:wegauwhgeuioweg@ec2-107-21-253-135.compute-1.amazonaws.com: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:wegauwhgeuioweg@ec2-107-21-253-135.compute-1.amazonaws.com: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:wegauwhgeuioweg@ec2-107-21-253-135.compute-1.amazonaws.com: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:wegauwhgeuioweg@ec2-107-21-253-135.compute-1.amazonaws.com: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_cleardb_parsing(self): url = "mysql://bea6eb025ca0d8:69772142@us-cdbr-east.cleardb.com/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): del os.environ["DATABASE_URL"] a = dj_database_url.config() assert not a os.environ[ "DATABASE_URL" ] = "postgres://uf07k1i6d8ia0v:wegauwhgeuioweg@ec2-107-21-253-135.compute-1.amazonaws.com:5431/d8r82722r2kuvn" url = dj_database_url.config() assert url["ENGINE"] == EXPECTED_POSTGRES_ENGINE 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:69772142@us-cdbr-east.cleardb.com/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" os.environ[ "DATABASE_URL" ] = "mysql://bea6eb025ca0d8:69772142@us-cdbr-east.cleardb.com/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:69772142@us-cdbr-east.cleardb.com/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 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) assert url["CONN_MAX_AGE"] == conn_max_age def test_database_url_with_options(self): # Test full options 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() assert url["ENGINE"] == EXPECTED_POSTGRES_ENGINE 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 os.environ[ "DATABASE_URL" ] = "postgres://uf07k1i6d8ia0v:wegauwhgeuioweg@ec2-107-21-253-135.compute-1.amazonaws.com:5431/d8r82722r2kuvn?" url = dj_database_url.config() assert "OPTIONS" not in url def test_mysql_database_url_with_sslca_options(self): 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() 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 os.environ[ "DATABASE_URL" ] = "mysql://uf07k1i6d8ia0v:wegauwhgeuioweg@ec2-107-21-253-135.compute-1.amazonaws.com: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:wegauwhgeuioweg@ec2-107-21-253-135.compute-1.amazonaws.com: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:wegauwhgeuioweg@ec2-107-21-253-135.compute-1.amazonaws.com/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:wegauwhgeuioweg@ec2-107-21-253-135.compute-1.amazonaws.com\\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"] if __name__ == "__main__": unittest.main()