8000 test: unit test coverage for `parse_utils.py` · MaxxleLLC/python-spanner-django@2e5ba9b · GitHub
[go: up one dir, main page]

Skip to content

Commit 2e5ba9b

Browse files
committed
test: unit test coverage for parse_utils.py
1 parent 301ca84 commit 2e5ba9b

File tree

3 files changed

+98
-52
lines changed

3 files changed

+98
-52
lines changed

google/cloud/spanner_dbapi/parse_utils.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -262,11 +262,18 @@ def parse_insert(insert_sql, params):
262262
if not params:
263263
# Case a) perhaps?
264264
# Check if any %s exists.
265-
pyformat_str_count = after_values_sql.count("%s")
266-
if pyformat_str_count > 0:
267-
raise ProgrammingError(
268-
'no params yet there are %d "%s" tokens' % pyformat_str_count
269-
)
265+
266+
# pyformat_str_count = after_values_sql.count("%s")
267+
# if pyformat_str_count > 0:
268+
# raise ProgrammingError(
269+
# 'no params yet there are %d "%%s" tokens' % pyformat_str_count
270+
# )
271+
for item in after_values_sql:
272+
if item.count("%s") > 0:
273+
raise ProgrammingError(
274+
'no params yet there are %d "%%s" tokens'
275+
% item.count("%s")
276+
)
270277

271278
insert_sql = sanitize_literals_for_upload(insert_sql)
272279
# Confirmed case of:

tests/unit/spanner_dbapi/test_parse_utils.py

Lines changed: 69 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -4,33 +4,19 @@
44
# license that can be found in the LICENSE file or at
55
# https://developers.google.com/open-source/licenses/bsd
66

7-
import datetime
8-
import decimal
9-
from unittest import TestCase
7+
import unittest
108

119
from google.cloud.spanner_v1 import param_types
12-
from google.cloud.spanner_dbapi.exceptions import Error, ProgrammingError
13-
from google.cloud.spanner_dbapi.parse_utils import (
14-
STMT_DDL,
15-
STMT_INSERT,
16-
STMT_NON_UPDATING,
17-
STMT_UPDATING,
18-
DateStr,
19-
TimestampStr,
20-
cast_for_spanner,
21-
classify_stmt,
22-
ensure_where_clause,
23-
escape_name,
24-
get_param_types,
25-
parse_insert,
26-
rows_for_insert_or_update,
27-
sql_pyformat_args_to_spanner,
28-
)
29-
from google.cloud.spanner_dbapi.utils import backtick_unicode
30-
31-
32-
class ParseUtilsTests(TestCase):
10+
11+
12+
class TestParseUtils(unittest.TestCase):
3313
def test_classify_stmt(self):
14+
from google.cloud.spanner_dbapi.parse_utils import STMT_DDL
15+
from google.cloud.spanner_dbapi.parse_utils import STMT_INSERT
16+
from google.cloud.spanner_dbapi.parse_utils import STMT_NON_UPDATING
17+
from google.cloud.spanner_dbapi.parse_utils import STMT_UPDATING
18+
from google.cloud.spanner_dbapi.parse_utils import classify_stmt
19+
3420
cases = (
3521
("SELECT 1", STMT_NON_UPDATING),
3622
("SELECT s.SongName FROM Songs AS s", STMT_NON_UPDATING),
@@ -61,6 +47,12 @@ def test_classify_stmt(self):
6147
self.assertEqual(classify_stmt(query), want_class)
6248

6349
def test_parse_insert(self):
50+
from google.cloud.spanner_dbapi.parse_utils import parse_insert
51+
from google.cloud.spanner_dbapi.exceptions import ProgrammingError
52+
53+
with self.assertRaises(ProgrammingError):
54+
parse_insert("bad-sql", None)
55+
6456
cases = [
6557
(
6658
"INSERT INTO django_migrations (app, name, applied) VALUES (%s, %s, %s)",
@@ -173,6 +165,10 @@ def test_parse_insert(self):
173165
),
174166
]
175167

168+
sql = "INSERT INTO django_migrations (app, name, applied) VALUES (%s, %s, %s)"
169+
with self.assertRaises(ProgrammingError):
170+
parse_insert(sql, None)
171+
176172
for sql, params, want in cases:
177173
with self.subTest(sql=sql):
178174
got = parse_insert(sql, params)
@@ -181,6 +177,9 @@ def test_parse_insert(self):
181177
)
182178

183179
def test_parse_insert_invalid(self):
180+
from google.cloud.spanner_dbapi import exceptions
181+
from google.cloud.spanner_dbapi.parse_utils import parse_insert
182+
184183
cases = [
185184
(
186185
"INSERT INTO django_migrations (app, name, applied) VALUES (%s, %s, %s), (%s, %s, %s)",
@@ -202,12 +201,23 @@ def test_parse_insert_invalid(self):
202201
for sql, params, wantException in cases:
203202
with self.subTest(sql=sql):
204203
self.assertRaisesRegex(
205-
ProgrammingError,
204+
exceptions.ProgrammingError,
206205
wantException,
207206
lambda: parse_insert(sql, params),
208207
)
209208

210209
def test_rows_for_insert_or_update(self):
210+
from google.cloud.spanner_dbapi.parse_utils import (
211+
rows_for_insert_or_update,
212+
)
213+
from google.cloud.spanner_dbapi.exceptions import Error
214+
215+
with self.assertRaises(Error):
216+
rows_for_insert_or_update([0], [[]])
217+
218+
with self.assertRaises(Error):
219+
rows_for_insert_or_update([0], None, ["0", "%s"])
220+
211221
cases = [
212222
(
213223
["id", "app", "name"],
@@ -255,6 +265,12 @@ def test_rows_for_insert_or_update(self):
255265
self.assertEqual(got, want)
256266

257267
def test_sql_pyformat_args_to_spanner(self):
268+
import decimal
269+
270+
from google.cloud.spanner_dbapi.parse_utils import (
271+
sql_pyformat_args_to_spanner,
272+
)
273+
258274
cases = [
259275
(
260276
(
@@ -323,6 +339,11 @@ def test_sql_pyformat_args_to_spanner(self):
323339
)
324340

325341
def test_sql_pyformat_args_to_spanner_invalid(self):
342+
from google.cloud.spanner_dbapi import exceptions
343+
from google.cloud.spanner_dbapi.parse_utils import (
344+
sql_pyformat_args_to_spanner,
345+
)
346+
326347
cases = [
327348
(
328349
"SELECT * from t WHERE f1=%s, f2 = %s, f3=%s, extra=%s",
@@ -332,12 +353,28 @@ def test_sql_pyformat_args_to_spanner_invalid(self):
332353
for sql, params in cases:
333354
with self.subTest(sql=sql):
334355
self.assertRaisesRegex(
335-
Error,
356+
exceptions.Error,
336357
"pyformat_args mismatch",
337358
lambda: sql_pyformat_args_to_spanner(sql, params),
338359
)
339360

361+
def test_cast_for_spanner(self):
362+
import decimal
363+
364+
from google.cloud.spanner_dbapi.parse_utils import cast_for_spanner
365+
366+
value = decimal.Decimal(3)
367+
self.assertEqual(cast_for_spanner(value), float(3.0))
368+
self.assertEqual(cast_for_spanner(5), 5)
369+
self.assertEqual(cast_for_spanner("string"), "string")
370+
340371
def test_get_param_types(self):
372+
import datetime
373+
374+
from google.cloud.spanner_dbapi.parse_utils import DateStr
375+
from google.cloud.spanner_dbapi.parse_utils import TimestampStr
376+
from google.cloud.spanner_dbapi.parse_utils import get_param_types
377+
341378
params = {
342379
"a1": 10,
343380
"b1": "string",
@@ -365,15 +402,13 @@ def test_get_param_types(self):
365402
self.assertEqual(got_types, want_types)
366403

367404
def test_get_param_types_none(self):
368-
self.assertEqual(get_param_types(None), None)
405+
from google.cloud.spanner_dbapi.parse_utils import get_param_types
369406

370-
def test_cast_for_spanner(self):
371-
value = decimal.Decimal(3)
372-
self.assertEqual(cast_for_spanner(value), float(3.0))
373-
self.assertEqual(cast_for_spanner(5), 5)
374-
self.assertEqual(cast_for_spanner("string"), "string")
407+
self.assertEqual(get_param_types(None), None)
375408

376409
def test_ensure_where_clause(self):
410+
from google.cloud.spanner_dbapi.parse_utils import ensure_where_clause
411+
377412
cases = [
378413
(
379414
"UPDATE a SET a.b=10 FROM articles a JOIN d c ON a.ai = c.ai WHERE c.ci = 1",
@@ -404,6 +439,8 @@ def test_ensure_where_clause(self):
404439
self.assertEqual(got, want)
405440

406441
def test_escape_name(self):
442+
from google.cloud.spanner_dbapi.parse_utils import escape_name
443+
407444
cases = (
408445
("SELECT", "`SELECT`"),
409446
("dashed-value", "`dashed-value`"),
@@ -415,16 +452,3 @@ def test_escape_name(self):
415452
with self.subTest(name=name):
416453
got = escape_name(name)
417454
self.assertEqual(got, want)
418-
419-
def test_backtick_unicode(self):
420-
cases = [
421-
("SELECT (1) as foo WHERE 1=1", "SELECT (1) as foo WHERE 1=1"),
422-
("SELECT (1) as föö", "SELECT (1) as `föö`"),
423-
("SELECT (1) as `föö`", "SELECT (1) as `föö`"),
424-
("SELECT (1) as `föö` `umläut", "SELECT (1) as `föö` `umläut"),
425-
("SELECT (1) as `föö", "SELECT (1) as `föö"),
426-
]
427-
for sql, want in cases:
428-
with self.subTest(sql=sql):
429-
got = backtick_unicode(sql)
430-
self.assertEqual(got, want)

tests/unit/spanner_dbapi/test_utils.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44
# license that can be found in the LICENSE file or at
55
# https://developers.google.com/open-source/licenses/bsd
66

7-
from unittest import TestCase
7+
import unittest
88

99
from google.cloud.spanner_dbapi.utils import PeekIterator
1010

1111

12-
class UtilsTests(TestCase):
12+
class TestUtils(unittest.TestCase):
1313
def test_PeekIterator(self):
1414
cases = [
1515
("list", [1, 2, 3, 4, 6, 7], [1, 2, 3, 4, 6, 7]),
@@ -51,3 +51,18 @@ def test_peekIterator_nonlist_rows_unconverted(self):
5151
got = list(pi)
5252
want = ["a", "b", "c", "d&quo 1241 t;, "e"]
5353
self.assertEqual(got, want, "Values should be returned unchanged")
54+
55+
def test_backtick_unicode(self):
56+
from google.cloud.spanner_dbapi.utils import backtick_unicode
57+
58+
cases = [
59+
("SELECT (1) as foo WHERE 1=1", "SELECT (1) as foo WHERE 1=1"),
60+
("SELECT (1) as föö", "SELECT (1) as `föö`"),
61+
("SELECT (1) as `föö`", "SELECT (1) as `föö`"),
62+
("SELECT (1) as `föö` `umläut", "SELECT (1) as `föö` `umläut"),
63+
("SELECT (1) as `föö", "SELECT (1) as `föö"),
64+
]
65+
for sql, want in cases:
66+
with self.subTest(sql=sql):
67+
got = backtick_unicode(sql)
68+
self.assertEqual(got, want)

0 commit comments

Comments
 (0)
0