11const assert = require ( 'assert' ) ;
2+ const { promisify } = require ( 'util' ) ;
23const {
34 PutObjectCommand,
5+ PutBucketVersioningCommand,
46 HeadObjectCommand,
57 GetObjectCommand,
68} = require ( '@aws-sdk/client-s3' ) ;
79
810const withV4 = require ( '../support/withV4' ) ;
911const BucketUtility = require ( '../../lib/utility/bucket-util' ) ;
12+ const { fakeMetadataArchive, getMetadata, initMetadata } = require ( '../utils/init' ) ;
13+ const fakeMetadataArchivePromise = promisify ( fakeMetadataArchive ) ;
14+ const getMetadataPromise = promisify ( getMetadata ) ;
15+ const initMetadataPromise = promisify ( initMetadata ) ;
1016
1117const objectName = 'someObject' ;
1218const firstPutMetadata = {
@@ -30,6 +36,7 @@ describe('Put object with same key as prior object', () => {
3036 bucketUtil = new BucketUtility ( 'default' , sigCfg ) ;
3137 s3 = bucketUtil . s3 ;
3238 bucketName = await bucketUtil . createRandom ( 1 ) ;
39+ await initMetadataPromise ( ) ;
3340 } ) ;
3441
3542 beforeEach ( async ( ) => {
@@ -66,5 +73,57 @@ describe('Put object with same key as prior object', () => {
6673 const bodyText = await res . Body . transformToString ( ) ;
6774 assert . deepStrictEqual ( bodyText , 'Much different' ) ;
6875 } ) ;
76+
77+ it ( 'should replace archived object in non-versioned bucket' , async ( ) => {
78+ await fakeMetadataArchivePromise ( bucketName , objectName , undefined , {
79+ archiveInfo : { archiveId : 'archive-1' } ,
80+ restoreRequestedAt : new Date ( 0 ) . toISOString ( ) ,
81+ restoreRequestedDays : 5 ,
82+ } ) ;
83+
84+ await s3 . send ( new PutObjectCommand ( {
85+ Bucket : bucketName ,
86+ Key : objectName ,
87+ Body : 'overwrite archived data' ,
88+ Metadata : secondPutMetadata ,
89+ } ) ) ;
90+
91+ const currentMD = await getMetadataPromise ( bucketName , objectName , undefined ) ;
92+ assert . strictEqual ( currentMD . archive , undefined ) ;
93+ } ) ;
94+
95+ it ( 'should overwrite archived current object in versioned bucket' , async ( ) => {
96+ await bucketUtil . empty ( bucketName ) ;
97+
98+ await s3 . send ( new PutBucketVersioningCommand ( {
99+ Bucket : bucketName ,
100+ VersioningConfiguration : { Status : 'Enabled' } ,
101+ } ) ) ;
102+
103+ const firstPutRes = await s3 . send ( new PutObjectCommand ( {
104+ Bucket : bucketName ,
105+ Key : objectName ,
106+ Body : 'versioned first payload' ,
107+ Metadata : firstPutMetadata ,
108+ } ) ) ;
109+ assert ( firstPutRes . VersionId ) ;
110+
111+ await fakeMetadataArchivePromise ( bucketName , objectName , undefined , {
112+ archiveInfo : { archiveId : 'archive-versioned-current' } ,
113+ restoreRequestedAt : new Date ( 0 ) . toISOString ( ) ,
114+ restoreRequestedDays : 5 ,
115+ } ) ;
116+
117+ const secondPutRes = await s3 . send ( new PutObjectCommand ( {
118+ Bucket : bucketName ,
119+ Key : objectName ,
120+ Body : 'versioned second payload' ,
121+ Metadata : secondPutMetadata ,
122+ } ) ) ;
123+ assert ( secondPutRes . VersionId ) ;
124+
125+ const currentVersionMD = await getMetadataPromise ( bucketName , objectName , undefined ) ;
126+ assert . strictEqual ( currentVersionMD . archive , undefined ) ;
127+ } ) ;
69128 } ) ;
70129} ) ;
0 commit comments