@@ -291,6 +291,85 @@ def test_delete(self):
291291 {},
292292 )])
293293
294+ def _read_row_helper (self , chunks ):
295+ from gcloud ._testing import _Monkey
296+ from gcloud .bigtable ._generated import (
297+ bigtable_service_messages_pb2 as messages_pb2 )
298+ from gcloud .bigtable ._testing import _FakeStub
299+ from gcloud .bigtable .row_data import PartialRowData
300+ from gcloud .bigtable import table as MUT
301+
302+ project_id = 'project-id'
303+ zone = 'zone'
304+ cluster_id = 'cluster-id'
305+ table_id = 'table-id'
306+ timeout_seconds = 596
307+ client = _Client (timeout_seconds = timeout_seconds )
308+ cluster_name = ('projects/' + project_id + '/zones/' + zone +
309+ '/clusters/' + cluster_id )
310+ cluster = _Cluster (cluster_name , client = client )
311+ table = self ._makeOne (table_id , cluster )
312+
313+ # Create request_pb
314+ request_pb = object () # Returned by our mock.
315+ mock_created = []
316+
317+ def mock_create_row_request (table_name , row_key , filter_ ):
318+ mock_created .append ((table_name , row_key , filter_ ))
319+ return request_pb
320+
321+ # Create response_iterator
322+ row_key = b'row-key'
323+ response_pb = messages_pb2 .ReadRowsResponse (row_key = row_key ,
324+ chunks = chunks )
325+ response_iterator = [response_pb ]
326+
327+ # Patch the stub used by the API method.
328+ client ._data_stub = stub = _FakeStub (response_iterator )
329+
330+ # Create expected_result.
331+ if chunks :
332+ expected_result = PartialRowData (row_key )
333+ expected_result ._committed = True
334+ expected_result ._chunks_encountered = True
335+ else :
336+ expected_result = None
337+
338+ # Perform the method and check the result.
339+ filter_obj = object ()
340+ with _Monkey (MUT , _create_row_request = mock_create_row_request ):
341+ result = table .read_row (row_key , filter_ = filter_obj )
342+
343+ self .assertEqual (result , expected_result )
344+ self .assertEqual (stub .method_calls , [(
345+ 'ReadRows' ,
346+ (request_pb , timeout_seconds ),
347+ {},
348+ )])
349+ self .assertEqual (mock_created , [(table .name , row_key , filter_obj )])
350+
351+ def test_read_row (self ):
352+ from gcloud .bigtable ._generated import (
353+ bigtable_service_messages_pb2 as messages_pb2 )
354+
355+ chunk = messages_pb2 .ReadRowsResponse .Chunk (commit_row = True )
356+ chunks = [chunk ]
357+ self ._read_row_helper (chunks )
358+
359+ def test_read_empty_row (self ):
360+ chunks = []
361+ self ._read_row_helper (chunks )
362+
363+ def test_read_row_still_partial (self ):
364+ from gcloud .bigtable ._generated import (
365+ bigtable_service_messages_pb2 as messages_pb2 )
366+
367+ # There is never a "commit row".
368+ chunk = messages_pb2 .ReadRowsResponse .Chunk (reset_row = True )
369+ chunks = [chunk ]
370+ with self .assertRaises (ValueError ):
371+ self ._read_row_helper (chunks )
372+
294373 def test_sample_row_keys (self ):
295374 from gcloud .bigtable ._generated import (
296375 bigtable_service_messages_pb2 as messages_pb2 )
@@ -331,6 +410,128 @@ def test_sample_row_keys(self):
331410 )])
332411
333412
413+ class Test__create_row_request (unittest2 .TestCase ):
414+
415+ def _callFUT (self , table_name , row_key = None , start_key = None , end_key = None ,
416+ filter_ = None , allow_row_interleaving = None , limit = None ):
417+ from gcloud .bigtable .table import _create_row_request
418+ return _create_row_request (
419+ table_name , row_key = row_key , start_key = start_key , end_key = end_key ,
420+ filter_ = filter_ , allow_row_interleaving = allow_row_interleaving ,
421+ limit = limit )
422+
423+ def test_table_name_only (self ):
424+ from gcloud .bigtable ._generated import (
425+ bigtable_service_messages_pb2 as messages_pb2 )
426+
427+ table_name = 'table_name'
428+ result = self ._callFUT (table_name )
429+ expected_result = messages_pb2 .ReadRowsRequest (table_name = table_name )
430+ self .assertEqual (result , expected_result )
431+
432+ def test_row_key_row_range_conflict (self ):
433+ with self .assertRaises (ValueError ):
434+ self ._callFUT (None , row_key = object (), end_key = object ())
435+
436+ def test_row_key (self ):
437+ from gcloud .bigtable ._generated import (
438+ bigtable_service_messages_pb2 as messages_pb2 )
439+
440+ table_name = 'table_name'
441+ row_key = b'row_key'
442+ result = self ._callFUT (table_name , row_key = row_key )
443+ expected_result = messages_pb2 .ReadRowsRequest (
444+ table_name = table_name ,
445+ row_key = row_key ,
446+ )
447+ self .assertEqual (result , expected_result )
448+
449+ def test_row_range_start_key (self ):
450+ from gcloud .bigtable ._generated import bigtable_data_pb2 as data_pb2
451+ from gcloud .bigtable ._generated import (
452+ bigtable_service_messages_pb2 as messages_pb2 )
453+
454+ table_name = 'table_name'
455+ start_key = b'start_key'
456+ result = self ._callFUT (table_name , start_key = start_key )
457+ expected_result = messages_pb2 .ReadRowsRequest (
458+ table_name = table_name ,
459+ row_range = data_pb2 .RowRange (start_key = start_key ),
460+ )
461+ self .assertEqual (result , expected_result )
462+
463+ def test_row_range_end_key (self ):
464+ from gcloud .bigtable ._generated import bigtable_data_pb2 as data_pb2
465+ from gcloud .bigtable ._generated import (
466+ bigtable_service_messages_pb2 as messages_pb2 )
467+
468+ table_name = 'table_name'
469+ end_key = b'end_key'
470+ result = self ._callFUT (table_name , end_key = end_key )
471+ expected_result = messages_pb2 .ReadRowsRequest (
472+ table_name = table_name ,
473+ row_range = data_pb2 .RowRange (end_key = end_key ),
474+ )
475+ self .assertEqual (result , expected_result )
476+
477+ def test_row_range_both_keys (self ):
478+ from gcloud .bigtable ._generated import bigtable_data_pb2 as data_pb2
479+ from gcloud .bigtable ._generated import (
480+ bigtable_service_messages_pb2 as messages_pb2 )
481+
482+ table_name = 'table_name'
483+ start_key = b'start_key'
484+ end_key = b'end_key'
485+ result = self ._callFUT (table_name , start_key = start_key ,
486+ end_key = end_key )
487+ expected_result = messages_pb2 .ReadRowsRequest (
488+ table_name = table_name ,
489+ row_range = data_pb2 .RowRange (start_key = start_key , end_key = end_key ),
490+ )
491+ self .assertEqual (result , expected_result )
492+
493+ def test_with_filter (self ):
494+ from gcloud .bigtable ._generated import (
495+ bigtable_service_messages_pb2 as messages_pb2 )
496+ from gcloud .bigtable .row import RowSampleFilter
497+
498+ table_name = 'table_name'
499+ row_filter = RowSampleFilter (0.33 )
500+ result = self ._callFUT (table_name , filter_ = row_filter )
501+ expected_result = messages_pb2 .ReadRowsRequest (
502+ table_name = table_name ,
503+ filter = row_filter .to_pb (),
504+ )
505+ self .assertEqual (result , expected_result )
506+
507+ def test_with_allow_row_interleaving (self ):
508+ from gcloud .bigtable ._generated import (
509+ bigtable_service_messages_pb2 as messages_pb2 )
510+
511+ table_name = 'table_name'
512+ allow_row_interleaving = True
513+ result = self ._callFUT (table_name ,
514+ allow_row_interleaving = allow_row_interleaving )
515+ expected_result = messages_pb2 .ReadRowsRequest (
516+ table_name = table_name ,
517+ allow_row_interleaving = allow_row_interleaving ,
518+ )
519+ self .assertEqual (result , expected_result )
520+
521+ def test_with_limit (self ):
522+ from gcloud .bigtable ._generated import (
523+ bigtable_service_messages_pb2 as messages_pb2 )
524+
525+ table_name = 'table_name'
526+ limit = 1337
527+ result = self ._callFUT (table_name , limit = limit )
528+ expected_result = messages_pb2 .ReadRowsRequest (
529+ table_name = table_name ,
530+ num_rows_limit = limit ,
531+ )
532+ self .assertEqual (result , expected_result )
533+
534+
334535class _Client (object ):
335536
336537 data_stub = None
0 commit comments