123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204 |
- import urllib.parse
- import pytest
- from reflex.config import DBConfig
- @pytest.mark.parametrize(
- "engine,username,password,host,port,database,expected_url",
- [
- (
- "postgresql",
- "user",
- "pass",
- "localhost",
- 5432,
- "db",
- "postgresql://user:pass@localhost:5432/db",
- ),
- (
- "postgresql",
- "user",
- "pass",
- "localhost",
- None,
- "db",
- "postgresql://user:pass@localhost/db",
- ),
- (
- "postgresql",
- "user",
- None,
- "localhost",
- None,
- "db",
- "postgresql://user@localhost/db",
- ),
- ("postgresql", "user", None, None, None, "db", "postgresql://user@/db"),
- ("postgresql", "user", None, None, 5432, "db", "postgresql://user@/db"),
- (
- "postgresql",
- None,
- None,
- "localhost",
- 5432,
- "db",
- "postgresql://localhost:5432/db",
- ),
- ("sqlite", None, None, None, None, "db.sqlite", "sqlite:///db.sqlite"),
- ],
- )
- def test_get_url(engine, username, password, host, port, database, expected_url):
- """Test generation of URL.
- Args:
- engine: Database engine.
- username: Database username.
- password: Database password.
- host: Database host.
- port: Database port.
- database: Database name.
- expected_url: Expected database URL generated.
- """
- db_config = DBConfig(
- engine=engine,
- username=username,
- password=password,
- host=host,
- port=port,
- database=database,
- )
- assert db_config.get_url() == expected_url
- def test_url_encode():
- """Test username and password are urlencoded when database URL is generated."""
- username = "user@user"
- password = "pass@pass"
- database = "db"
- username_encoded = urllib.parse.quote_plus(username)
- password_encoded = urllib.parse.quote_plus(password)
- engine = "postgresql"
- db_config = DBConfig(
- engine=engine, username=username, password=password, database=database
- )
- assert (
- db_config.get_url()
- == f"{engine}://{username_encoded}:{password_encoded}@/{database}"
- )
- def test_url_encode_database_name():
- """Test database name is not URL encoded."""
- username = "user"
- password = "pass"
- database = "db@prod"
- engine = "postgresql"
- db_config = DBConfig(
- engine=engine, username=username, password=password, database=database
- )
- assert db_config.get_url() == f"{engine}://{username}:{password}@/{database}"
- def test_constructor_sqlite():
- """Test DBConfig.sqlite constructor create the instance correctly."""
- db_config = DBConfig.sqlite(database="app.db")
- assert db_config.engine == "sqlite"
- assert db_config.username == ""
- assert db_config.password == ""
- assert db_config.host == ""
- assert db_config.port is None
- assert db_config.database == "app.db"
- assert db_config.get_url() == "sqlite:///app.db"
- @pytest.mark.parametrize(
- "username,password,host,port,database,expected_url",
- [
- (
- "user",
- "pass",
- "localhost",
- 5432,
- "db",
- "postgresql://user:pass@localhost:5432/db",
- ),
- ("user", "", "localhost", None, "db", "postgresql://user@localhost/db"),
- ("user", "", "", None, "db", "postgresql://user@/db"),
- ("", "", "localhost", 5432, "db", "postgresql://localhost:5432/db"),
- ("", "", "", None, "db", "postgresql:///db"),
- ],
- )
- def test_constructor_postgresql(username, password, host, port, database, expected_url):
- """Test DBConfig.postgresql constructor creates the instance correctly.
- Args:
- username: Database username.
- password: Database password.
- host: Database host.
- port: Database port.
- database: Database name.
- expected_url: Expected database URL generated.
- """
- db_config = DBConfig.postgresql(
- username=username, password=password, host=host, port=port, database=database
- )
- assert db_config.engine == "postgresql"
- assert db_config.username == username
- assert db_config.password == password
- assert db_config.host == host
- assert db_config.port == port
- assert db_config.database == database
- assert db_config.get_url() == expected_url
- @pytest.mark.parametrize(
- "username,password,host,port,database,expected_url",
- [
- (
- "user",
- "pass",
- "localhost",
- 5432,
- "db",
- "postgresql+psycopg2://user:pass@localhost:5432/db",
- ),
- (
- "user",
- "",
- "localhost",
- None,
- "db",
- "postgresql+psycopg2://user@localhost/db",
- ),
- ("user", "", "", None, "db", "postgresql+psycopg2://user@/db"),
- ("", "", "localhost", 5432, "db", "postgresql+psycopg2://localhost:5432/db"),
- ("", "", "", None, "db", "postgresql+psycopg2:///db"),
- ],
- )
- def test_constructor_postgresql_psycopg2(
- username, password, host, port, database, expected_url
- ):
- """Test DBConfig.postgresql_psycopg2 constructor creates the instance correctly.
- Args:
- username: Database username.
- password: Database password.
- host: Database host.
- port: Database port.
- database: Database name.
- expected_url: Expected database URL generated.
- """
- db_config = DBConfig.postgresql_psycopg2(
- username=username, password=password, host=host, port=port, database=database
- )
- assert db_config.engine == "postgresql+psycopg2"
- assert db_config.username == username
- assert db_config.password == password
- assert db_config.host == host
- assert db_config.port == port
- assert db_config.database == database
- assert db_config.get_url() == expected_url
|