]> git.ipfire.org Git - thirdparty/psycopg.git/commitdiff
Make sure to store read_only and deferrable values as bool
authorDaniele Varrazzo <daniele.varrazzo@gmail.com>
Sun, 1 Aug 2021 23:43:01 +0000 (01:43 +0200)
committerDaniele Varrazzo <daniele.varrazzo@gmail.com>
Tue, 3 Aug 2021 10:57:53 +0000 (11:57 +0100)
psycopg/psycopg/connection.py
tests/test_connection.py
tests/test_connection_async.py

index e57a862a22caa42260a65fc186d9a56f26ea4853..633209798a8d42412d214fc638c268cb72e1a3de 100644 (file)
@@ -223,7 +223,7 @@ class BaseConnection(Generic[Row]):
         # Base implementation, not thread safe.
         # Subclasses must call it holding a lock
         self._check_intrans("read_only")
-        self._read_only = value
+        self._read_only = bool(value)
         self._begin_statement = b""
 
     @property
@@ -241,7 +241,7 @@ class BaseConnection(Generic[Row]):
         # Base implementation, not thread safe.
         # Subclasses must call it holding a lock
         self._check_intrans("deferrable")
-        self._deferrable = value
+        self._deferrable = bool(value)
         self._begin_statement = b""
 
     def _check_intrans(self, attribute: str) -> None:
index c7c78cd4558aaaf045a01e16cd8446dae4d7f40f..c35d6d9d2f5e53f241ee802c5f38e35499447b1a 100644 (file)
@@ -260,6 +260,11 @@ def test_autocommit(conn):
     assert cur.execute("select 1").fetchone() == (1,)
     assert conn.pgconn.transaction_status == conn.TransactionStatus.IDLE
 
+    conn.autocommit = ""
+    assert conn.autocommit is False
+    conn.autocommit = "yeah"
+    assert conn.autocommit is True
+
 
 def test_autocommit_connect(dsn):
     conn = Connection.connect(dsn, autocommit=True)
@@ -670,3 +675,18 @@ def test_set_transaction_param_all(conn):
             "select current_setting(%s)", [f"transaction_{guc}"]
         ).fetchone()[0]
         assert tx_values_map[pgval] == value
+
+
+def test_set_transaction_param_strange(conn):
+    for val in ("asdf", 0, 5):
+        with pytest.raises(ValueError):
+            conn.isolation_level = val
+
+    conn.isolation_level = psycopg.IsolationLevel.SERIALIZABLE.value
+    assert conn.isolation_level is psycopg.IsolationLevel.SERIALIZABLE
+
+    conn.read_only = 1
+    assert conn.read_only is True
+
+    conn.deferrable = 0
+    assert conn.deferrable is False
index 0e13dff0d6f8af15798f465744425f2be4421f0f..8e54f4a10d1ce21ab879444e5f43fa89b3c2edbd 100644 (file)
@@ -270,6 +270,11 @@ async def test_autocommit(aconn):
     assert await cur.fetchone() == (1,)
     assert aconn.pgconn.transaction_status == aconn.TransactionStatus.IDLE
 
+    await aconn.set_autocommit("")
+    assert aconn.autocommit is False
+    await aconn.set_autocommit("yeah")
+    assert aconn.autocommit is True
+
 
 async def test_autocommit_connect(dsn):
     aconn = await psycopg.AsyncConnection.connect(dsn, autocommit=True)
@@ -676,3 +681,18 @@ async def test_set_transaction_param_all(aconn):
         )
         pgval = (await cur.fetchone())[0]
         assert tx_values_map[pgval] == value
+
+
+async def test_set_transaction_param_strange(aconn):
+    for val in ("asdf", 0, 5):
+        with pytest.raises(ValueError):
+            await aconn.set_isolation_level(val)
+
+    await aconn.set_isolation_level(psycopg.IsolationLevel.SERIALIZABLE.value)
+    assert aconn.isolation_level is psycopg.IsolationLevel.SERIALIZABLE
+
+    await aconn.set_read_only(1)
+    assert aconn.read_only is True
+
+    await aconn.set_deferrable(0)
+    assert aconn.deferrable is False