@@ -21,6 +21,15 @@ var dataset = 'dataset';
2121var table = 'table' ;
2222var format = 'JSON' ;
2323var schema = 'schema' ;
24+ var jsonArray = [
25+ { name : 'foo' , age : 27 } ,
26+ { name : 'bar' , age : 13 }
27+ ] ;
28+ var validJsonFile = 'validJsonFile' ;
29+ var invalidJsonFile = 'invalidJsonFile' ;
30+ var validJsonString = JSON . stringify ( jsonArray ) ;
31+ var invalidJsonString = 'INVALID' ;
32+ var errorList = [ 'error 1' , 'error 2' ] ;
2433
2534function getSample ( ) {
2635 var tableMocks = [
@@ -44,7 +53,8 @@ function getSample () {
4453 var tableMock = {
4554 export : sinon . stub ( ) . yields ( null , jobMock ) ,
4655 delete : sinon . stub ( ) . yields ( null ) ,
47- import : sinon . stub ( ) . yields ( null , jobMock )
56+ import : sinon . stub ( ) . yields ( null , jobMock ) ,
57+ insert : sinon . stub ( ) . yields ( null , errorList )
4858 } ;
4959 var datasetMock = {
5060 table : sinon . stub ( ) . returns ( tableMock ) ,
@@ -57,11 +67,17 @@ function getSample () {
5767 } ;
5868 var BigQueryMock = sinon . stub ( ) . returns ( bigqueryMock ) ;
5969 var StorageMock = sinon . stub ( ) . returns ( storageMock ) ;
70+ var fsMock = {
71+ readFileSync : sinon . stub ( ) . throws ( new Error ( 'Invalid file.' ) )
72+ } ;
73+ fsMock . readFileSync . withArgs ( validJsonFile ) . returns ( validJsonString ) ;
74+ fsMock . readFileSync . withArgs ( invalidJsonFile ) . returns ( invalidJsonString ) ;
6075
6176 return {
6277 program : proxyquire ( '../tables' , {
6378 '@google-cloud/bigquery' : BigQueryMock ,
6479 '@google-cloud/storage' : StorageMock ,
80+ 'fs' : fsMock ,
6581 yargs : proxyquire ( 'yargs' , { } )
6682 } ) ,
6783 mocks : {
@@ -74,6 +90,7 @@ function getSample () {
7490 table : tableMock ,
7591 bucket : bucketMock ,
7692 dataset : datasetMock ,
93+ fs : fsMock ,
7794 tables : tableMocks
7895 }
7996 } ;
@@ -290,6 +307,45 @@ describe('bigquery:tables', function () {
290307 } ) ;
291308 } ) ;
292309
310+ describe ( 'insertRowsAsStream' , function ( ) {
311+ var options = {
312+ file : file ,
313+ dataset : dataset ,
314+ table : table ,
315+ rows : jsonArray
316+ } ;
317+
318+ it ( 'should stream-insert rows into a table' , function ( ) {
319+ var program = getSample ( ) . program ;
320+ var callback = sinon . stub ( ) ;
321+
322+ program . insertRowsAsStream ( options , callback ) ;
323+ assert . equal ( callback . calledOnce , true ) ;
324+ assert . deepEqual ( callback . firstCall . args , [ null , errorList ] ) ;
325+ } ) ;
326+
327+ it ( 'should handle API errors' , function ( ) {
328+ var example = getSample ( ) ;
329+ var callback = sinon . stub ( ) ;
330+ var error = new Error ( 'error' ) ;
331+ example . mocks . table . insert = sinon . stub ( ) . yields ( error ) ;
332+
333+ example . program . insertRowsAsStream ( options , callback ) ;
334+ assert . equal ( callback . calledOnce , true ) ;
335+ assert . deepEqual ( callback . firstCall . args , [ error ] ) ;
336+ } ) ;
337+
338+ it ( 'should handle (per-row) insert errors' , function ( ) {
339+ var example = getSample ( ) ;
340+ var callback = sinon . stub ( ) ;
341+ example . mocks . table . insert = sinon . stub ( ) . yields ( null , errorList ) ;
342+
343+ example . program . insertRowsAsStream ( options , callback ) ;
344+ assert . equal ( callback . calledOnce , true ) ;
345+ assert . deepEqual ( callback . firstCall . args , [ null , errorList ] ) ;
346+ } ) ;
347+ } ) ;
348+
293349 describe ( 'main' , function ( ) {
294350 it ( 'should call createTable' , function ( ) {
295351 var program = getSample ( ) . program ;
@@ -349,6 +405,19 @@ describe('bigquery:tables', function () {
349405 } ] ) ;
350406 } ) ;
351407
408+ it ( 'should call insertRowsAsStream' , function ( ) {
409+ var program = getSample ( ) . program ;
410+ program . insertRowsAsStream = sinon . stub ( ) ;
411+
412+ program . main ( [ 'insert' , dataset , table , validJsonFile ] ) ;
413+
414+ assert . equal ( program . insertRowsAsStream . calledOnce , true ) ;
415+ assert . deepEqual (
416+ program . insertRowsAsStream . firstCall . args . slice ( 0 , - 1 ) ,
417+ [ { rows : jsonArray , dataset : dataset , table : table } ]
418+ ) ;
419+ } ) ;
420+
352421 it ( 'should recognize --gzip flag' , function ( ) {
353422 var program = getSample ( ) . program ;
354423 program . exportTableToGCS = sinon . stub ( ) ;
@@ -380,5 +449,65 @@ describe('bigquery:tables', function () {
380449 gzip : false
381450 } ] ) ;
382451 } ) ;
452+
453+ describe ( 'insert' , function ( ) {
454+ var options = {
455+ dataset : dataset ,
456+ table : table ,
457+ rows : jsonArray
458+ } ;
459+
460+ it ( 'should accept valid JSON files' , function ( ) {
461+ var program = getSample ( ) . program ;
462+ program . insertRowsAsStream = sinon . stub ( ) ;
463+
464+ program . main ( [ 'insert' , dataset , table , validJsonFile ] ) ;
465+
466+ assert . equal ( program . insertRowsAsStream . calledOnce , true ) ;
467+ assert . deepEqual ( program . insertRowsAsStream . firstCall . args . slice ( 0 , - 1 ) , [ options ] ) ;
468+ } ) ;
469+
470+ it ( 'should reject files with invalid JSON' , function ( ) {
471+ var program = getSample ( ) . program ;
472+ program . insertRowsAsStream = sinon . stub ( ) ;
473+
474+ assert . throws (
475+ function ( ) { program . main ( [ 'insert' , dataset , table , invalidJsonFile ] ) ; } ,
476+ / " j s o n _ o r _ f i l e " \( o r t h e f i l e i t p o i n t s t o \) i s n o t a v a l i d J S O N a r r a y \. /
477+ ) ;
478+ assert . equal ( program . insertRowsAsStream . called , false ) ;
479+ } ) ;
480+
481+ it ( 'should reject invalid file names' , function ( ) {
482+ var program = getSample ( ) . program ;
483+ program . insertRowsAsStream = sinon . stub ( ) ;
484+
485+ assert . throws (
486+ function ( ) { program . main ( [ 'insert' , dataset , table , '' ] ) ; } ,
487+ / " j s o n _ o r _ f i l e " \( o r t h e f i l e i t p o i n t s t o \) i s n o t a v a l i d J S O N a r r a y \. /
488+ ) ;
489+ assert . equal ( program . insertRowsAsStream . called , false ) ;
490+ } ) ;
491+
492+ it ( 'should accept valid JSON strings' , function ( ) {
493+ var program = getSample ( ) . program ;
494+ program . insertRowsAsStream = sinon . stub ( ) ;
495+
496+ program . main ( [ 'insert' , dataset , table , validJsonString ] ) ;
497+ assert . equal ( program . insertRowsAsStream . calledOnce , true ) ;
498+ assert . deepEqual ( program . insertRowsAsStream . firstCall . args . slice ( 0 , - 1 ) , [ options ] ) ;
499+ } ) ;
500+
501+ it ( 'should reject invalid JSON strings' , function ( ) {
502+ var program = getSample ( ) . program ;
503+ program . insertRowsAsStream = sinon . stub ( ) ;
504+
505+ assert . throws (
506+ function ( ) { program . main ( [ 'insert' , dataset , table , invalidJsonString ] ) ; } ,
507+ / " j s o n _ o r _ f i l e " \( o r t h e f i l e i t p o i n t s t o \) i s n o t a v a l i d J S O N a r r a y \. /
508+ ) ;
509+ assert . equal ( program . insertRowsAsStream . called , false ) ;
510+ } ) ;
511+ } ) ;
383512 } ) ;
384513} ) ;
0 commit comments