@@ -171,9 +171,7 @@ describe('admin.machineLearning', () => {
171
171
} ) ;
172
172
173
173
it ( 'sets tags for a model' , ( ) => {
174
- // TODO(ifielker): Uncomment & replace when BE change lands.
175
- // const ORIGINAL_TAGS = ['tag-node-update-1'];
176
- const ORIGINAL_TAGS : string [ ] = [ ] ;
174
+ const ORIGINAL_TAGS = [ 'tag-node-update-1' ] ;
177
175
const NEW_TAGS = [ 'tag-node-update-2' , 'tag-node-update-3' ] ;
178
176
179
177
return createTemporaryModel ( {
@@ -192,7 +190,7 @@ describe('admin.machineLearning', () => {
192
190
} ) ;
193
191
194
192
it ( 'updates the tflite file' , ( ) => {
195
- Promise . all ( [
193
+ return Promise . all ( [
196
194
createTemporaryModel ( ) ,
197
195
uploadModelToGcs ( 'model1.tflite' , 'valid_model.tflite' ) ] )
198
196
. then ( ( [ model , fileName ] ) => {
@@ -324,6 +322,120 @@ describe('admin.machineLearning', () => {
324
322
} ) ;
325
323
} ) ;
326
324
325
+ describe ( 'listModels()' , ( ) => {
326
+ let model1 : admin . machineLearning . Model ;
327
+ let model2 : admin . machineLearning . Model ;
328
+ let model3 : admin . machineLearning . Model ;
329
+
330
+ before ( ( ) => {
331
+ return Promise . all ( [
332
+ admin . machineLearning ( ) . createModel ( {
333
+ displayName : 'node-integration-list1' ,
334
+ tags : [ 'node-integration-tag-1' ] ,
335
+ } ) ,
336
+ admin . machineLearning ( ) . createModel ( {
337
+ displayName : 'node-integration-list2' ,
338
+ tags : [ 'node-integration-tag-1' ] ,
339
+ } ) ,
340
+ admin . machineLearning ( ) . createModel ( {
341
+ displayName : 'node-integration-list3' ,
342
+ tags : [ 'node-integration-tag-1' ] ,
343
+ } ) ] )
344
+ . then ( ( [ m1 , m2 , m3 ] : admin . machineLearning . Model [ ] ) => {
345
+ model1 = m1 ;
346
+ model2 = m2 ;
347
+ model3 = m3 ;
348
+ } ) ;
349
+ } ) ;
350
+
351
+ after ( ( ) => {
352
+ return Promise . all ( [
353
+ admin . machineLearning ( ) . deleteModel ( model1 . modelId ) ,
354
+ admin . machineLearning ( ) . deleteModel ( model2 . modelId ) ,
355
+ admin . machineLearning ( ) . deleteModel ( model3 . modelId ) ,
356
+ ] ) ;
357
+ } ) ;
358
+
359
+ it ( 'resolves with a list of models' , ( ) => {
360
+ return admin . machineLearning ( ) . listModels ( { pageSize : 100 } )
361
+ . then ( ( modelList ) => {
362
+ expect ( modelList . models . length ) . to . be . at . least ( 2 ) ;
363
+ expect ( modelList . models ) . to . deep . include ( model1 ) ;
364
+ expect ( modelList . models ) . to . deep . include ( model2 ) ;
365
+ expect ( modelList . pageToken ) . to . be . empty ;
366
+ } ) ;
367
+ } ) ;
368
+
369
+ it ( 'respects page size' , ( ) => {
370
+ return admin . machineLearning ( ) . listModels ( { pageSize : 2 } )
371
+ . then ( ( modelList ) => {
372
+ expect ( modelList . models . length ) . to . equal ( 2 ) ;
373
+ expect ( modelList . pageToken ) . not . to . be . empty ;
374
+ } ) ;
375
+ } ) ;
376
+
377
+ it ( 'filters by exact displayName' , ( ) => {
378
+ return admin . machineLearning ( ) . listModels ( { filter : 'displayName=node-integration-list1' } )
379
+ . then ( ( modelList ) => {
380
+ expect ( modelList . models . length ) . to . equal ( 1 ) ;
381
+ expect ( modelList . models [ 0 ] ) . to . deep . equal ( model1 ) ;
382
+ expect ( modelList . pageToken ) . to . be . empty ;
383
+ } ) ;
384
+ } ) ;
385
+
386
+ it ( 'filters by displayName prefix' , ( ) => {
387
+ return admin . machineLearning ( ) . listModels ( { filter : 'displayName:node-integration-list*' , pageSize : 100 } )
388
+ . then ( ( modelList ) => {
389
+ expect ( modelList . models . length ) . to . be . at . least ( 3 ) ;
390
+ expect ( modelList . models ) . to . deep . include ( model1 ) ;
391
+ expect ( modelList . models ) . to . deep . include ( model2 ) ;
392
+ expect ( modelList . models ) . to . deep . include ( model3 ) ;
393
+ expect ( modelList . pageToken ) . to . be . empty ;
394
+ } ) ;
395
+ } ) ;
396
+
397
+ it ( 'filters by tag' , ( ) => {
398
+ return admin . machineLearning ( ) . listModels ( { filter : 'tags:node-integration-tag-1' , pageSize : 100 } )
399
+ . then ( ( modelList ) => {
400
+ expect ( modelList . models . length ) . to . be . at . least ( 3 ) ;
401
+ expect ( modelList . models ) . to . deep . include ( model1 ) ;
402
+ expect ( modelList . models ) . to . deep . include ( model2 ) ;
403
+ expect ( modelList . models ) . to . deep . include ( model3 ) ;
404
+ expect ( modelList . pageToken ) . to . be . empty ;
405
+ } ) ;
406
+ } ) ;
407
+
408
+ it ( 'handles pageTokens properly' , ( ) => {
409
+ return admin . machineLearning ( ) . listModels ( { filter : 'displayName:node-integration-list*' , pageSize : 2 } )
410
+ . then ( ( modelList ) => {
411
+ expect ( modelList . models . length ) . to . equal ( 2 ) ;
412
+ expect ( modelList . pageToken ) . not . to . be . empty ;
413
+ return admin . machineLearning ( ) . listModels ( {
414
+ filter : 'displayName:node-integration-list*' ,
415
+ pageSize : 2 ,
416
+ pageToken : modelList . pageToken } )
417
+ . then ( ( modelList2 ) => {
418
+ expect ( modelList2 . models . length ) . to . be . at . least ( 1 ) ;
419
+ expect ( modelList2 . pageToken ) . to . be . empty ;
420
+ } ) ;
421
+ } ) ;
422
+ } ) ;
423
+
424
+ it ( 'successfully returns an empty list of models' , ( ) => {
425
+ return admin . machineLearning ( ) . listModels ( { filter : 'displayName=non-existing-model' } )
426
+ . then ( ( modelList ) => {
427
+ expect ( modelList . models . length ) . to . equal ( 0 ) ;
428
+ expect ( modelList . pageToken ) . to . be . empty ;
429
+ } ) ;
430
+ } ) ;
431
+
432
+ it ( 'rejects with invalid argument if the filter is invalid' , ( ) => {
433
+ return admin . machineLearning ( ) . listModels ( { filter : 'invalidFilterItem=foo' } )
434
+ . should . eventually . be . rejected . and . have . property (
435
+ 'code' , 'machine-learning/invalid-argument' ) ;
436
+ } ) ;
437
+ } ) ;
438
+
327
439
describe ( 'deleteModel()' , ( ) => {
328
440
it ( 'rejects with not-found when the Model does not exist' , ( ) => {
329
441
const nonExistingName = '00000000' ;
0 commit comments