From d6786742612418a5a7c3161662bf17894a211564 Mon Sep 17 00:00:00 2001 From: Daniele Varrazzo Date: Tue, 27 Sep 2022 09:51:11 +0100 Subject: [PATCH] test: more exhaustive test of difficult names/attrs in composites --- tests/test_rows.py | 13 +++++++++---- tests/types/test_composite.py | 35 ++++++++++++++++++++++++++++++++--- 2 files changed, 41 insertions(+), 7 deletions(-) diff --git a/tests/test_rows.py b/tests/test_rows.py index 600a7e678..5165b8007 100644 --- a/tests/test_rows.py +++ b/tests/test_rows.py @@ -3,6 +3,8 @@ import pytest import psycopg from psycopg import rows +from .utils import eur + def test_tuple_row(conn): conn.row_factory = rows.dict_row @@ -56,11 +58,14 @@ def test_namedtuple_row(conn): assert r2.number == 1 assert not cur.nextset() assert type(r1) is not type(r2) - cur.execute('select 1 as üåäö, 1 as _, 1 as "123"') + + cur.execute(f'select 1 as üåäö, 2 as _, 3 as "123", 4 as "a-b", 5 as "{eur}eur"') (r3,) = cur.fetchall() - assert "üåäö" in r3._fields - assert "f_" in r3._fields - assert "f123" in r3._fields + assert r3.üåäö == 1 + assert r3.f_ == 2 + assert r3.f123 == 3 + assert r3.a_b == 4 + assert r3.f_eur == 5 def test_class_row(conn): diff --git a/tests/types/test_composite.py b/tests/types/test_composite.py index 5a0f437e7..47beecf35 100644 --- a/tests/types/test_composite.py +++ b/tests/types/test_composite.py @@ -353,11 +353,13 @@ def test_invalid_fields_names(conn): assert obj == got -@pytest.mark.parametrize("name", ["a-b", f"{eur}", "order"]) +@pytest.mark.parametrize("name", ["a-b", f"{eur}", "order", "1", "'"]) def test_literal_invalid_name(conn, name): conn.execute("set client_encoding to utf8") - conn.execute(f'create type "{name}" as (foo text)') - info = CompositeInfo.fetch(conn, f'"{name}"') + conn.execute( + sql.SQL("create type {name} as (foo text)").format(name=sql.Identifier(name)) + ) + info = CompositeInfo.fetch(conn, sql.Identifier(name).as_string(conn)) register_composite(info, conn) obj = info.python_type("hello") assert sql.Literal(obj).as_string(conn) == f"'(hello)'::\"{name}\"" @@ -365,3 +367,30 @@ def test_literal_invalid_name(conn, name): got = cur.fetchone()[0] assert got == obj assert type(got) is type(obj) + + +@pytest.mark.parametrize( + "name, attr", + [ + ("a-b", "a_b"), + (f"{eur}", "f_"), + ("üåäö", "üåäö"), + ("order", "order"), + ("1", "f1"), + ], +) +def test_literal_invalid_attr(conn, name, attr): + conn.execute("set client_encoding to utf8") + conn.execute( + sql.SQL("create type test_attr as ({name} text)").format( + name=sql.Identifier(name) + ) + ) + info = CompositeInfo.fetch(conn, "test_attr") + register_composite(info, conn) + obj = info.python_type("hello") + assert getattr(obj, attr) == "hello" + cur = conn.execute(sql.SQL("select {}").format(obj)) + got = cur.fetchone()[0] + assert got == obj + assert type(got) is type(obj) -- 2.47.2