test_db_config.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. import urllib.parse
  2. import pytest
  3. from reflex.config import DBConfig
  4. @pytest.mark.parametrize(
  5. "engine,username,password,host,port,database,expected_url",
  6. [
  7. (
  8. "postgresql",
  9. "user",
  10. "pass",
  11. "localhost",
  12. 5432,
  13. "db",
  14. "postgresql://user:pass@localhost:5432/db",
  15. ),
  16. (
  17. "postgresql",
  18. "user",
  19. "pass",
  20. "localhost",
  21. None,
  22. "db",
  23. "postgresql://user:pass@localhost/db",
  24. ),
  25. (
  26. "postgresql",
  27. "user",
  28. None,
  29. "localhost",
  30. None,
  31. "db",
  32. "postgresql://user@localhost/db",
  33. ),
  34. ("postgresql", "user", None, None, None, "db", "postgresql://user@/db"),
  35. ("postgresql", "user", None, None, 5432, "db", "postgresql://user@/db"),
  36. (
  37. "postgresql",
  38. None,
  39. None,
  40. "localhost",
  41. 5432,
  42. "db",
  43. "postgresql://localhost:5432/db",
  44. ),
  45. ("sqlite", None, None, None, None, "db.sqlite", "sqlite:///db.sqlite"),
  46. ],
  47. )
  48. def test_get_url(engine, username, password, host, port, database, expected_url):
  49. """Test generation of URL.
  50. Args:
  51. engine: Database engine.
  52. username: Database username.
  53. password: Database password.
  54. host: Database host.
  55. port: Database port.
  56. database: Database name.
  57. expected_url: Expected database URL generated.
  58. """
  59. db_config = DBConfig(
  60. engine=engine,
  61. username=username,
  62. password=password,
  63. host=host,
  64. port=port,
  65. database=database,
  66. )
  67. assert db_config.get_url() == expected_url
  68. def test_url_encode():
  69. """Test username and password are urlencoded when database URL is generated."""
  70. username = "user@user"
  71. password = "pass@pass"
  72. database = "db"
  73. username_encoded = urllib.parse.quote_plus(username)
  74. password_encoded = urllib.parse.quote_plus(password)
  75. engine = "postgresql"
  76. db_config = DBConfig(
  77. engine=engine, username=username, password=password, database=database
  78. )
  79. assert (
  80. db_config.get_url()
  81. == f"{engine}://{username_encoded}:{password_encoded}@/{database}"
  82. )
  83. def test_url_encode_database_name():
  84. """Test database name is not URL encoded."""
  85. username = "user"
  86. password = "pass"
  87. database = "db@prod"
  88. engine = "postgresql"
  89. db_config = DBConfig(
  90. engine=engine, username=username, password=password, database=database
  91. )
  92. assert db_config.get_url() == f"{engine}://{username}:{password}@/{database}"
  93. def test_constructor_sqlite():
  94. """Test DBConfig.sqlite constructor create the instance correctly."""
  95. db_config = DBConfig.sqlite(database="app.db")
  96. assert db_config.engine == "sqlite"
  97. assert db_config.username == ""
  98. assert db_config.password == ""
  99. assert db_config.host == ""
  100. assert db_config.port is None
  101. assert db_config.database == "app.db"
  102. assert db_config.get_url() == "sqlite:///app.db"
  103. @pytest.mark.parametrize(
  104. "username,password,host,port,database,expected_url",
  105. [
  106. (
  107. "user",
  108. "pass",
  109. "localhost",
  110. 5432,
  111. "db",
  112. "postgresql://user:pass@localhost:5432/db",
  113. ),
  114. ("user", "", "localhost", None, "db", "postgresql://user@localhost/db"),
  115. ("user", "", "", None, "db", "postgresql://user@/db"),
  116. ("", "", "localhost", 5432, "db", "postgresql://localhost:5432/db"),
  117. ("", "", "", None, "db", "postgresql:///db"),
  118. ],
  119. )
  120. def test_constructor_postgresql(username, password, host, port, database, expected_url):
  121. """Test DBConfig.postgresql constructor creates the instance correctly.
  122. Args:
  123. username: Database username.
  124. password: Database password.
  125. host: Database host.
  126. port: Database port.
  127. database: Database name.
  128. expected_url: Expected database URL generated.
  129. """
  130. db_config = DBConfig.postgresql(
  131. username=username, password=password, host=host, port=port, database=database
  132. )
  133. assert db_config.engine == "postgresql"
  134. assert db_config.username == username
  135. assert db_config.password == password
  136. assert db_config.host == host
  137. assert db_config.port == port
  138. assert db_config.database == database
  139. assert db_config.get_url() == expected_url
  140. @pytest.mark.parametrize(
  141. "username,password,host,port,database,expected_url",
  142. [
  143. (
  144. "user",
  145. "pass",
  146. "localhost",
  147. 5432,
  148. "db",
  149. "postgresql+psycopg://user:pass@localhost:5432/db",
  150. ),
  151. (
  152. "user",
  153. "",
  154. "localhost",
  155. None,
  156. "db",
  157. "postgresql+psycopg://user@localhost/db",
  158. ),
  159. ("user", "", "", None, "db", "postgresql+psycopg://user@/db"),
  160. ("", "", "localhost", 5432, "db", "postgresql+psycopg://localhost:5432/db"),
  161. ("", "", "", None, "db", "postgresql+psycopg:///db"),
  162. ],
  163. )
  164. def test_constructor_postgresql_psycopg(
  165. username, password, host, port, database, expected_url
  166. ):
  167. """Test DBConfig.postgresql_psycopg constructor creates the instance correctly.
  168. Args:
  169. username: Database username.
  170. password: Database password.
  171. host: Database host.
  172. port: Database port.
  173. database: Database name.
  174. expected_url: Expected database URL generated.
  175. """
  176. db_config = DBConfig.postgresql_psycopg(
  177. username=username, password=password, host=host, port=port, database=database
  178. )
  179. assert db_config.engine == "postgresql+psycopg"
  180. assert db_config.username == username
  181. assert db_config.password == password
  182. assert db_config.host == host
  183. assert db_config.port == port
  184. assert db_config.database == database
  185. assert db_config.get_url() == expected_url