@@ -53,7 +53,7 @@ def test_fields_unset(self):
5353 iterator = _MockCancellableIterator ()
5454 streamed = self ._make_one (iterator )
5555 with self .assertRaises (AttributeError ):
56- _ = streamed .fields
56+ streamed .fields
5757
5858 @staticmethod
5959 def _make_scalar_field (name , type_ ):
@@ -243,13 +243,24 @@ def test__merge_chunk_string_w_bytes(self):
243243 self ._make_scalar_field ('image' , 'BYTES' ),
244244 ]
245245 streamed ._metadata = self ._make_result_set_metadata (FIELDS )
246- streamed ._pending_chunk = self ._make_value (u'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAAAAAA6fptVAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA\n ' )
247- chunk = self ._make_value (u'B3RJTUUH4QQGFwsBTL3HMwAAABJpVFh0Q29tbWVudAAAAAAAU0FNUExFMG3E+AAAAApJREFUCNdj\n YAAAAAIAAeIhvDMAAAAASUVORK5CYII=\n ' )
246+ streamed ._pending_chunk = self ._make_value (
247+ u'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAAAAAA'
248+ u'6fptVAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA\n ' ,
249+ )
250+ chunk = self ._make_value (
251+ u'B3RJTUUH4QQGFwsBTL3HMwAAABJpVFh0Q29tbWVudAAAAAAAU0FNUExF'
252+ u'MG3E+AAAAApJREFUCNdj\n YAAAAAIAAeIhvDMAAAAASUVORK5CYII=\n ' ,
253+ )
248254
249255 merged = streamed ._merge_chunk (chunk )
250256
251- self .assertEqual (merged .string_value , u'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAAAAAA6fptVAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA\n B3RJTUUH4QQGFwsBTL3HMwAAABJpVFh0Q29tbWVudAAAAAAAU0FNUExFMG3E+AAAAApJREFUCNdj\n YAAAAAIAAeIhvDMAAAAASUVORK5CYII=\n ' )
252- self .assertIsNone (streamed ._pending_chunk )
257+ self .assertEqual (
258+ merged .string_value ,
259+ u'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAAAAAA6fptVAAAACXBIWXMAAAsTAAAL'
260+ u'EwEAmpwYAAAA\n B3RJTUUH4QQGFwsBTL3HMwAAABJpVFh0Q29tbWVudAAAAAAAU0'
261+ u'FNUExFMG3E+AAAAApJREFUCNdj\n YAAAAAIAAeIhvDMAAAAASUVORK5CYII=\n ' ,
262+ )
263+ self .assertIsNone (streamed ._pending_chunk )
253264
254265 def test__merge_chunk_array_of_bool (self ):
255266 iterator = _MockCancellableIterator ()
@@ -591,6 +602,48 @@ def test_merge_values_partial_and_filled_plus(self):
591602 self .assertEqual (streamed .rows , [VALUES [0 :3 ], VALUES [3 :6 ]])
592603 self .assertEqual (streamed ._current_row , VALUES [6 :])
593604
605+ def test_one_or_none_no_value (self ):
606+ streamed = self ._make_one (_MockCancellableIterator ())
607+ with mock .patch .object (streamed , 'consume_next' ) as consume_next :
608+ consume_next .side_effect = StopIteration
609+ self .assertIsNone (streamed .one_or_none ())
610+
611+ def test_one_or_none_single_value (self ):
612+ streamed = self ._make_one (_MockCancellableIterator ())
613+ streamed ._rows = ['foo' ]
614+ with mock .patch .object (streamed , 'consume_next' ) as consume_next :
615+ consume_next .side_effect = StopIteration
616+ self .assertEqual (streamed .one_or_none (), 'foo' )
617+
618+ def test_one_or_none_multiple_values (self ):
619+ streamed = self ._make_one (_MockCancellableIterator ())
620+ streamed ._rows = ['foo' , 'bar' ]
621+ with self .assertRaises (ValueError ):
622+ streamed .one_or_none ()
623+
624+ def test_one_or_none_consumed_stream (self ):
625+ streamed = self ._make_one (_MockCancellableIterator ())
626+ streamed ._metadata = object ()
627+ with self .assertRaises (RuntimeError ):
628+ streamed .one_or_none ()
629+
630+ def test_one_single_value (self ):
631+ streamed = self ._make_one (_MockCancellableIterator ())
632+ streamed ._rows = ['foo' ]
633+ with mock .patch .object (streamed , 'consume_next' ) as consume_next :
634+ consume_next .side_effect = StopIteration
635+ self .assertEqual (streamed .one (), 'foo' )
636+
637+ def test_one_no_value (self ):
638+ from google .cloud import exceptions
639+
640+ iterator = _MockCancellableIterator (['foo' ])
641+ streamed = self ._make_one (iterator )
642+ with mock .patch .object (streamed , 'consume_next' ) as consume_next :
643+ consume_next .side_effect = StopIteration
644+ with self .assertRaises (exceptions .NotFound ):
645+ streamed .one ()
646+
594647 def test_consume_next_empty (self ):
595648 iterator = _MockCancellableIterator ()
596649 streamed = self ._make_one (iterator )
0 commit comments