@@ -5,6 +5,10 @@ import (
5
5
"fmt"
6
6
"testing"
7
7
8
+ "github.com/aws/aws-sdk-go-v2/aws"
9
+ "github.com/aws/aws-sdk-go-v2/service/s3"
10
+ s3types "github.com/aws/aws-sdk-go-v2/service/s3/types"
11
+ "github.com/aws/smithy-go/middleware"
8
12
"github.com/linode/linodego"
9
13
"github.com/stretchr/testify/assert"
10
14
"go.uber.org/mock/gomock"
@@ -397,3 +401,79 @@ func TestDeleteBucket(t *testing.T) {
397
401
})
398
402
}
399
403
}
404
+
405
+ func TestPurgeAllObjects (t * testing.T ) {
406
+ t .Parallel ()
407
+
408
+ tests := []struct {
409
+ name string
410
+ bucketName string
411
+ s3Client * mock.MockS3Client
412
+ forceDelete bool
413
+ expectedError error
414
+ expects func (s3mock * mock.MockS3Client )
415
+ }{
416
+ {
417
+ name : "Success - Successfully purge all objects (versioning enabled)" ,
418
+ bucketName : "test-bucket" ,
419
+ forceDelete : true ,
420
+ expects : func (s3mock * mock.MockS3Client ) {
421
+ s3mock .EXPECT ().GetBucketVersioning (gomock .Any (), gomock .Any ()).Return (& s3.GetBucketVersioningOutput {
422
+ Status : s3types .BucketVersioningStatusEnabled ,
423
+ ResultMetadata : middleware.Metadata {},
424
+ }, nil )
425
+ s3mock .EXPECT ().ListObjectVersions (gomock .Any (), gomock .Any (), gomock .Any ()).Return (& s3.ListObjectVersionsOutput {
426
+ Versions : []s3types.ObjectVersion {
427
+ {Key : aws .String ("object1" ), VersionId : aws .String ("version1" )},
428
+ {Key : aws .String ("object2" ), VersionId : aws .String ("version2" )},
429
+ },
430
+ }, nil )
431
+ s3mock .EXPECT ().DeleteObjects (gomock .Any (), gomock .Any ()).Return (& s3.DeleteObjectsOutput {}, nil )
432
+ },
433
+ },
434
+ {
435
+ name : "Success - Successfully purge all objects" ,
436
+ bucketName : "test-bucket" ,
437
+ forceDelete : true ,
438
+ expects : func (s3mock * mock.MockS3Client ) {
439
+ s3mock .EXPECT ().GetBucketVersioning (gomock .Any (), gomock .Any ()).Return (& s3.GetBucketVersioningOutput {}, nil )
440
+ s3mock .EXPECT ().ListObjectsV2 (gomock .Any (), gomock .Any (), gomock .Any ()).Return (& s3.ListObjectsV2Output {
441
+ Contents : []s3types.Object {
442
+ {Key : aws .String ("object1" )},
443
+ {Key : aws .String ("object2" )},
444
+ },
445
+ }, nil )
446
+ s3mock .EXPECT ().DeleteObjects (gomock .Any (), gomock .Any ()).Return (& s3.DeleteObjectsOutput {}, nil )
447
+ },
448
+ },
449
+ {
450
+ name : "Error - Failed to list objects" ,
451
+ bucketName : "test-bucket" ,
452
+ forceDelete : true ,
453
+ expectedError : fmt .Errorf ("failed to list objects" ),
454
+ expects : func (s3mock * mock.MockS3Client ) {
455
+ s3mock .EXPECT ().GetBucketVersioning (gomock .Any (), gomock .Any ()).Return (& s3.GetBucketVersioningOutput {}, nil )
456
+ s3mock .EXPECT ().ListObjectsV2 (gomock .Any (), gomock .Any (), gomock .Any ()).Return (nil , fmt .Errorf ("failed to list objects" ))
457
+ },
458
+ },
459
+ }
460
+
461
+ for _ , tt := range tests {
462
+ testcase := tt
463
+ t .Run (testcase .name , func (t * testing.T ) {
464
+ t .Parallel ()
465
+
466
+ ctrl := gomock .NewController (t )
467
+ defer ctrl .Finish ()
468
+
469
+ mockS3Client := mock .NewMockS3Client (ctrl )
470
+ testcase .s3Client = mockS3Client
471
+ testcase .expects (mockS3Client )
472
+
473
+ err := PurgeAllObjects (t .Context (), testcase .bucketName , testcase .s3Client , testcase .forceDelete , false )
474
+ if testcase .expectedError != nil {
475
+ assert .ErrorContains (t , err , testcase .expectedError .Error ())
476
+ }
477
+ })
478
+ }
479
+ }
0 commit comments