Skip to content

Commit 14528ca

Browse files
tseaverlukesneeringer
authored andcommitted
Add system tests for all scalar query parameter types. (googleapis#3173)
1 parent e6f6af4 commit 14528ca

File tree

3 files changed

+70
-14
lines changed

3 files changed

+70
-14
lines changed

bigquery/google/cloud/bigquery/_helpers.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,12 @@
2121
from google.cloud._helpers import UTC
2222
from google.cloud._helpers import _date_from_iso8601_date
2323
from google.cloud._helpers import _datetime_from_microseconds
24-
from google.cloud._helpers import _datetime_to_rfc3339
2524
from google.cloud._helpers import _RFC3339_NO_FRACTION
2625
from google.cloud._helpers import _time_from_iso8601_time_naive
2726
from google.cloud._helpers import _to_bytes
2827

28+
_RFC3339_MICROS_NO_ZULU = '%Y-%m-%dT%H:%M:%S.%f'
29+
2930

3031
def _not_null(value, field):
3132
"""Check whether 'value' should be coerced to 'field' type."""
@@ -58,7 +59,7 @@ def _string_from_json(value, _):
5859
def _bytes_from_json(value, field):
5960
"""Base64-decode value"""
6061
if _not_null(value, field):
61-
return base64.decodestring(_to_bytes(value))
62+
return base64.standard_b64decode(_to_bytes(value))
6263

6364

6465
def _timestamp_from_json(value, field):
@@ -143,7 +144,7 @@ def _bool_to_json(value):
143144
def _bytes_to_json(value):
144145
"""Coerce 'value' to an JSON-compatible representation."""
145146
if isinstance(value, bytes):
146-
value = base64.encodestring(value)
147+
value = base64.standard_b64encode(value)
147148
return value
148149

149150

@@ -161,7 +162,7 @@ def _timestamp_to_json(value):
161162
def _datetime_to_json(value):
162163
"""Coerce 'value' to an JSON-compatible representation."""
163164
if isinstance(value, datetime.datetime):
164-
value = _datetime_to_rfc3339(value)
165+
value = value.strftime(_RFC3339_MICROS_NO_ZULU)
165166
return value
166167

167168

bigquery/unit_tests/test__helpers.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -145,15 +145,15 @@ def test_w_base64_encoded_bytes(self):
145145
import base64
146146

147147
expected = b'Wonderful!'
148-
encoded = base64.encodestring(expected)
148+
encoded = base64.standard_b64encode(expected)
149149
coerced = self._call_fut(encoded, object())
150150
self.assertEqual(coerced, expected)
151151

152152
def test_w_base64_encoded_text(self):
153153
import base64
154154

155155
expected = b'Wonderful!'
156-
encoded = base64.encodestring(expected).decode('ascii')
156+
encoded = base64.standard_b64encode(expected).decode('ascii')
157157
coerced = self._call_fut(encoded, object())
158158
self.assertEqual(coerced, expected)
159159

@@ -558,7 +558,7 @@ def test_w_bytes(self):
558558
import base64
559559

560560
source = b'source'
561-
expected = base64.encodestring(source)
561+
expected = base64.standard_b64encode(source)
562562
self.assertEqual(self._call_fut(source), expected)
563563

564564

@@ -621,7 +621,7 @@ def test_w_datetime(self):
621621
from google.cloud._helpers import UTC
622622

623623
when = datetime.datetime(2016, 12, 3, 14, 11, 27, 123456, tzinfo=UTC)
624-
self.assertEqual(self._call_fut(when), '2016-12-03T14:11:27.123456Z')
624+
self.assertEqual(self._call_fut(when), '2016-12-03T14:11:27.123456')
625625

626626

627627
class Test_date_to_json(unittest.TestCase):
@@ -1017,7 +1017,7 @@ def test_to_api_repr_w_datetime_datetime(self):
10171017
'type': 'DATETIME',
10181018
},
10191019
'parameterValue': {
1020-
'value': _datetime_to_rfc3339(now),
1020+
'value': _datetime_to_rfc3339(now)[:-1], # strip trailing 'Z'
10211021
},
10221022
}
10231023
klass = self._get_target_class()

system_tests/bigquery.py

Lines changed: 60 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -538,17 +538,32 @@ def test_sync_query_w_standard_sql_types(self):
538538
from google.cloud.bigquery._helpers import ArrayQueryParameter
539539
from google.cloud.bigquery._helpers import ScalarQueryParameter
540540
from google.cloud.bigquery._helpers import StructQueryParameter
541-
naive = datetime.datetime(2016, 12, 5, 12, 41, 9)
542-
stamp = '%s %s' % (naive.date().isoformat(), naive.time().isoformat())
543-
zoned = naive.replace(tzinfo=UTC)
544-
zoned_param = ScalarQueryParameter(
545-
name='zoned', type_='TIMESTAMP', value=zoned)
546541
question = 'What is the answer to life, the universe, and everything?'
547542
question_param = ScalarQueryParameter(
548543
name='question', type_='STRING', value=question)
549544
answer = 42
550545
answer_param = ScalarQueryParameter(
551546
name='answer', type_='INT64', value=answer)
547+
pi = 3.1415926
548+
pi_param = ScalarQueryParameter(
549+
name='pi', type_='FLOAT64', value=pi)
550+
truthy = True
551+
truthy_param = ScalarQueryParameter(
552+
name='truthy', type_='BOOL', value=truthy)
553+
beef = b'DEADBEEF'
554+
beef_param = ScalarQueryParameter(
555+
name='beef', type_='BYTES', value=beef)
556+
naive = datetime.datetime(2016, 12, 5, 12, 41, 9)
557+
stamp = '%s %s' % (naive.date().isoformat(), naive.time().isoformat())
558+
naive_param = ScalarQueryParameter(
559+
name='naive', type_='DATETIME', value=naive)
560+
naive_date_param = ScalarQueryParameter(
561+
name='naive_date', type_='DATE', value=naive.date())
562+
naive_time_param = ScalarQueryParameter(
563+
name='naive_time', type_='TIME', value=naive.time())
564+
zoned = naive.replace(tzinfo=UTC)
565+
zoned_param = ScalarQueryParameter(
566+
name='zoned', type_='TIMESTAMP', value=zoned)
552567
array_param = ArrayQueryParameter(
553568
name='array_param', array_type='INT64', values=[1, 2])
554569
struct_param = StructQueryParameter(
@@ -629,6 +644,46 @@ def test_sync_query_w_standard_sql_types(self):
629644
'sql': 'SELECT ARRAY(SELECT STRUCT([1, 2]))',
630645
'expected': [{u'_field_1': [1, 2]}],
631646
},
647+
{
648+
'sql': 'SELECT @question',
649+
'expected': question,
650+
'query_parameters': [question_param],
651+
},
652+
{
653+
'sql': 'SELECT @answer',
654+
'expected': answer,
655+
'query_parameters': [answer_param],
656+
},
657+
{
658+
'sql': 'SELECT @pi',
659+
'expected': pi,
660+
'query_parameters': [pi_param],
661+
},
662+
{
663+
'sql': 'SELECT @truthy',
664+
'expected': truthy,
665+
'query_parameters': [truthy_param],
666+
},
667+
{
668+
'sql': 'SELECT @beef',
669+
'expected': beef,
670+
'query_parameters': [beef_param],
671+
},
672+
{
673+
'sql': 'SELECT @naive',
674+
'expected': naive,
675+
'query_parameters': [naive_param],
676+
},
677+
{
678+
'sql': 'SELECT @naive_date',
679+
'expected': naive.date(),
680+
'query_parameters': [naive_date_param],
681+
},
682+
{
683+
'sql': 'SELECT @naive_time',
684+
'expected': naive.time(),
685+
'query_parameters': [naive_time_param],
686+
},
632687
{
633688
'sql': 'SELECT @zoned',
634689
'expected': zoned,

0 commit comments

Comments
 (0)