test_postgresql.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. # -*- coding:utf-8 -*-
  2. """dw_base.io.db.postgresql 连接工厂 + 查询封装单测(不连真 PG)。"""
  3. import sys
  4. from unittest.mock import MagicMock
  5. import pytest
  6. from dw_base.io.db import postgresql as pgdb
  7. def test_parse_jdbc_url_with_port():
  8. host, port, db = pgdb.parse_jdbc_url('jdbc:postgresql://10.0.0.1:5433/hobby_stocks')
  9. assert host == '10.0.0.1'
  10. assert port == 5433
  11. assert db == 'hobby_stocks'
  12. def test_parse_jdbc_url_default_port():
  13. host, port, db = pgdb.parse_jdbc_url('jdbc:postgresql://pg.example.com/mydb')
  14. assert host == 'pg.example.com'
  15. assert port == 5432
  16. assert db == 'mydb'
  17. def test_parse_jdbc_url_invalid():
  18. with pytest.raises(ValueError, match='无法解析'):
  19. pgdb.parse_jdbc_url('mysql://10.0.0.1:3306/foo')
  20. def test_resolve_returns_conn_params(monkeypatch):
  21. fake_ds = MagicMock()
  22. fake_ds.parse.return_value = {
  23. pgdb.DS_POSTGRE_SQL_JDBC_URL: 'jdbc:postgresql://10.0.0.1:5432/mydb',
  24. 'username': 'u',
  25. 'password': 'p',
  26. }
  27. monkeypatch.setattr(pgdb, '_resolve_datasource', lambda ref: fake_ds)
  28. assert pgdb.resolve('postgresql/prd-hobby') == {
  29. 'host': '10.0.0.1', 'port': 5432, 'database': 'mydb',
  30. 'username': 'u', 'password': 'p',
  31. }
  32. def test_connect_passes_resolved_params(monkeypatch):
  33. monkeypatch.setattr(pgdb, 'resolve', lambda ref: {
  34. 'host': 'h', 'port': 5432, 'database': 'mydb',
  35. 'username': 'u', 'password': 'p',
  36. })
  37. fake_pg8000 = MagicMock()
  38. monkeypatch.setitem(sys.modules, 'pg8000', fake_pg8000)
  39. monkeypatch.setitem(sys.modules, 'pg8000.dbapi', fake_pg8000.dbapi)
  40. pgdb.connect('postgresql/prd-hobby')
  41. fake_pg8000.dbapi.connect.assert_called_once_with(
  42. host='h', port=5432, database='mydb', user='u', password='p',
  43. )
  44. def test_query_with_params():
  45. conn = MagicMock()
  46. cur = conn.cursor.return_value
  47. cur.fetchall.return_value = [(1, 'a'), (2, 'b')]
  48. rows = pgdb.query(conn, 'SELECT 1 WHERE x = %s', ('v',))
  49. assert rows == [(1, 'a'), (2, 'b')]
  50. cur.execute.assert_called_once_with('SELECT 1 WHERE x = %s', ('v',))
  51. cur.close.assert_called_once()
  52. def test_query_without_params():
  53. conn = MagicMock()
  54. cur = conn.cursor.return_value
  55. cur.fetchall.return_value = []
  56. pgdb.query(conn, 'SELECT 1')
  57. cur.execute.assert_called_once_with('SELECT 1')
  58. cur.close.assert_called_once()