File: test_paramstyle.py

package info (click to toggle)
pg8000 1.31.5-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 836 kB
  • sloc: python: 8,273; sh: 25; makefile: 9
file content (129 lines) | stat: -rw-r--r-- 3,700 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import pytest

from pg8000.dbapi import convert_paramstyle

#        "(id %% 2) = 0",


@pytest.mark.parametrize(
    "query,statement",
    [
        [
            'SELECT ?, ?, "field_?" FROM t '
            "WHERE a='say ''what?''' AND b=? AND c=E'?\\'test\\'?'",
            'SELECT $1, $2, "field_?" FROM t WHERE '
            "a='say ''what?''' AND b=$3 AND c=E'?\\'test\\'?'",
        ],
        [
            "SELECT ?, ?, * FROM t WHERE a=? AND b='are you ''sure?'",
            "SELECT $1, $2, * FROM t WHERE a=$3 AND b='are you ''sure?'",
        ],
    ],
)
def test_qmark(query, statement):
    args = 1, 2, 3
    new_query, vals = convert_paramstyle("qmark", query, args)
    assert (new_query, vals) == (statement, args)


@pytest.mark.parametrize(
    "query,expected",
    [
        [
            "SELECT sum(x)::decimal(5, 2) :2, :1, * FROM t WHERE a=:3",
            "SELECT sum(x)::decimal(5, 2) $2, $1, * FROM t WHERE a=$3",
        ],
    ],
)
def test_numeric(query, expected):
    args = 1, 2, 3
    new_query, vals = convert_paramstyle("numeric", query, args)
    assert (new_query, vals) == (expected, args)


@pytest.mark.parametrize(
    "query",
    [
        "make_interval(days := 10)",
    ],
)
def test_numeric_unchanged(query):
    args = 1, 2, 3
    new_query, vals = convert_paramstyle("numeric", query, args)
    assert (new_query, vals) == (query, args)


@pytest.mark.parametrize(
    "query,args,expected_query,expected_args",
    [
        [
            "SELECT sum(x)::decimal(5, 2) :f_2, :f1 FROM t WHERE a=:f_2",
            {"f_2": 1, "f1": 2},
            "SELECT sum(x)::decimal(5, 2) $1, $2 FROM t WHERE a=$1",
            (1, 2),
        ],
        ["SELECT $$'$$ = :v", {"v": "'"}, "SELECT $$'$$ = $1", ("'",)],
    ],
)
def test_named(query, args, expected_query, expected_args):
    new_query, vals = convert_paramstyle("named", query, args)
    assert (new_query, vals) == (expected_query, expected_args)


@pytest.mark.parametrize(
    "query,expected",
    [
        [
            "SELECT %s, %s, \"f1_%%\", E'txt_%%' "
            "FROM t WHERE a=%s AND b='75%%' AND c = '%' -- Comment with %",
            "SELECT $1, $2, \"f1_%%\", E'txt_%%' FROM t WHERE a=$3 AND "
            "b='75%%' AND c = '%' -- Comment with %",
        ],
        [
            "SELECT -- Comment\n%s FROM t",
            "SELECT -- Comment\n$1 FROM t",
        ],
    ],
)
def test_format_changed(query, expected):
    args = 1, 2, 3
    new_query, vals = convert_paramstyle("format", query, args)
    assert (new_query, vals) == (expected, args)


@pytest.mark.parametrize(
    "query",
    [
        r"""COMMENT ON TABLE test_schema.comment_test """
        r"""IS 'the test % '' " \ table comment'""",
    ],
)
def test_format_unchanged(query):
    args = 1, 2, 3
    new_query, vals = convert_paramstyle("format", query, args)
    assert (new_query, vals) == (query, args)


def test_py_format():
    args = {"f2": 1, "f1": 2, "f3": 3}

    new_query, vals = convert_paramstyle(
        "pyformat",
        "SELECT %(f2)s, %(f1)s, \"f1_%%\", E'txt_%%' "
        "FROM t WHERE a=%(f2)s AND b='75%%'",
        args,
    )
    expected = "SELECT $1, $2, \"f1_%%\", E'txt_%%' FROM t WHERE a=$1 AND " "b='75%%'"
    assert (new_query, vals) == (expected, (1, 2))


def test_pyformat_format():
    """pyformat should support %s and an array, too:"""
    args = 1, 2, 3
    new_query, vals = convert_paramstyle(
        "pyformat",
        "SELECT %s, %s, \"f1_%%\", E'txt_%%' " "FROM t WHERE a=%s AND b='75%%'",
        args,
    )
    expected = "SELECT $1, $2, \"f1_%%\", E'txt_%%' FROM t WHERE a=$3 AND " "b='75%%'"
    assert (new_query, vals) == (expected, args)