@@ -2,6 +2,7 @@ const assert = require('assert');
22const http = require ( 'http' ) ;
33const { GCP } = require ( '../../../../../lib/storage/data/external/GCP' ) ;
44const { ListObjectsCommand, ListObjectVersionsCommand } = require ( '@aws-sdk/client-s3' ) ;
5+ const MpuHelper = require ( '../../../../../lib/storage/data/external/GCP/GcpApis/mpuHelper' ) ;
56
67const httpPort = 8888 ;
78
@@ -492,3 +493,113 @@ describe('GcpService helper behavior', () => {
492493 } ) ;
493494 } ) ;
494495} ) ;
496+
497+ describe ( 'GcpService mpu helper behavior' , ( ) => {
498+ describe ( 'removeParts' , ( ) => {
499+ it ( 'should list versions via send(ListObjectVersionsCommand) and delete each version' , done => {
500+ const service = {
501+ _maxConcurrent : 10 ,
502+ send : jest . fn ( )
503+ . mockImplementationOnce ( command => {
504+ // page 1 (truncated)
505+ assert ( command instanceof ListObjectVersionsCommand ) ;
506+ assert . deepStrictEqual ( command . input , {
507+ Bucket : 'mpu-bucket' ,
508+ Prefix : 'pfx/' ,
509+ KeyMarker : undefined ,
510+ VersionIdMarker : undefined ,
511+ } ) ;
512+ return Promise . resolve ( {
513+ IsTruncated : true ,
514+ NextKeyMarker : 'k2' ,
515+ NextVersionIdMarker : 'v2' ,
516+ Versions : [
517+ { Key : 'a' , VersionId : '1' } ,
518+ ] ,
519+ } ) ;
520+ } )
521+ . mockImplementationOnce ( command => {
522+ // page 2 (final)
523+ assert ( command instanceof ListObjectVersionsCommand ) ;
524+ assert . deepStrictEqual ( command . input , {
525+ Bucket : 'mpu-bucket' ,
526+ Prefix : 'pfx/' ,
527+ KeyMarker : 'k2' ,
528+ VersionIdMarker : 'v2' ,
529+ } ) ;
530+ return Promise . resolve ( {
531+ IsTruncated : false ,
532+ NextKeyMarker : undefined ,
533+ NextVersionIdMarker : undefined ,
534+ Versions : [
535+ { Key : 'b' , VersionId : '2' } ,
536+ { Key : 'c' , VersionId : '3' } ,
537+ ] ,
538+ } ) ;
539+ } ) ,
540+ deleteObject : jest . fn ( ( params , cb ) => cb ( null ) ) ,
541+ } ;
542+
543+ const helper = new MpuHelper ( service ) ;
544+ helper . removeParts ( { MPU : 'mpu-bucket' , Prefix : 'pfx/' } , err => {
545+ assert . ifError ( err ) ;
546+ expect ( service . send ) . toHaveBeenCalledTimes ( 2 ) ;
547+ expect ( service . deleteObject ) . toHaveBeenCalledTimes ( 3 ) ;
548+ expect ( service . deleteObject ) . toHaveBeenNthCalledWith ( 1 , {
549+ Bucket : 'mpu-bucket' ,
550+ Key : 'a' ,
551+ VersionId : '1' ,
552+ } , expect . any ( Function ) ) ;
553+ done ( ) ;
554+ } ) ;
555+ } ) ;
556+
557+ it ( 'should ignore NoSuchKey errors during delete' , done => {
558+ const service = {
559+ _maxConcurrent : 10 ,
560+ send : jest . fn ( ) . mockResolvedValue ( {
561+ IsTruncated : false ,
562+ Versions : [
563+ { Key : 'a' , VersionId : '1' } ,
564+ { Key : 'b' , VersionId : '2' } ,
565+ ] ,
566+ } ) ,
567+ deleteObject : jest . fn ( ( params , cb ) => {
568+ if ( params . Key === 'a' ) {
569+ const err = new Error ( 'gone' ) ;
570+ err . name = 'NoSuchKey' ;
571+ return cb ( err ) ;
572+ }
573+ return cb ( null ) ;
574+ } ) ,
575+ } ;
576+
577+ const helper = new MpuHelper ( service ) ;
578+ helper . removeParts ( { MPU : 'mpu-bucket' , Prefix : 'pfx/' } , err => {
579+ assert . ifError ( err ) ;
580+ expect ( service . send ) . toHaveBeenCalledTimes ( 1 ) ;
581+ expect ( service . deleteObject ) . toHaveBeenCalledTimes ( 2 ) ;
582+ done ( ) ;
583+ } ) ;
584+ } ) ;
585+
586+ it ( 'should return error when send(ListObjectVersionsCommand) rejects' , done => {
587+ const listObjectVersionsError = new Error ( 'send(ListObjectVersionsCommand) failed' ) ;
588+ const service = {
589+ _maxConcurrent : 10 ,
590+ send : jest . fn ( command => {
591+ assert ( command instanceof ListObjectVersionsCommand ) ;
592+ return Promise . reject ( listObjectVersionsError ) ;
593+ } ) ,
594+ deleteObject : jest . fn ( ) ,
595+ } ;
596+
597+ const helper = new MpuHelper ( service ) ;
598+ helper . removeParts ( { MPU : 'mpu-bucket' , Prefix : 'pfx/' } , err => {
599+ assert . strictEqual ( err , listObjectVersionsError ) ;
600+ expect ( service . deleteObject ) . not . toHaveBeenCalled ( ) ;
601+ done ( ) ;
602+ } ) ;
603+ } ) ;
604+ } ) ;
605+ } ) ;
0 commit comments