From: Daniele Varrazzo Date: Sun, 1 Aug 2021 23:43:01 +0000 (+0200) Subject: Make sure to store read_only and deferrable values as bool X-Git-Tag: 3.0.dev2~18 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=95782705353b315787cfe2ef2c9a51bae59fa4b1;p=thirdparty%2Fpsycopg.git Make sure to store read_only and deferrable values as bool --- diff --git a/psycopg/psycopg/connection.py b/psycopg/psycopg/connection.py index e57a862a2..633209798 100644 --- a/psycopg/psycopg/connection.py +++ b/psycopg/psycopg/connection.py @@ -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: diff --git a/tests/test_connection.py b/tests/test_connection.py index c7c78cd45..c35d6d9d2 100644 --- a/tests/test_connection.py +++ b/tests/test_connection.py @@ -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 diff --git a/tests/test_connection_async.py b/tests/test_connection_async.py index 0e13dff0d..8e54f4a10 100644 --- a/tests/test_connection_async.py +++ b/tests/test_connection_async.py @@ -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