11const assert = require ( 'assert' ) ;
2+ const { promisify } = require ( 'util' ) ;
23const {
34 PutObjectCommand,
5+ PutBucketVersioningCommand,
46 HeadObjectCommand,
57 GetObjectCommand,
8+ ListObjectVersionsCommand,
69} = require ( '@aws-sdk/client-s3' ) ;
710
811const withV4 = require ( '../support/withV4' ) ;
912const BucketUtility = require ( '../../lib/utility/bucket-util' ) ;
13+ const { fakeMetadataArchive, getMetadata, initMetadata } = require ( '../utils/init' ) ;
14+ const fakeMetadataArchivePromise = promisify ( fakeMetadataArchive ) ;
15+ const getMetadataPromise = promisify ( getMetadata ) ;
16+ const initMetadataPromise = promisify ( initMetadata ) ;
1017
1118const objectName = 'someObject' ;
1219const firstPutMetadata = {
@@ -30,6 +37,7 @@ describe('Put object with same key as prior object', () => {
3037 bucketUtil = new BucketUtility ( 'default' , sigCfg ) ;
3138 s3 = bucketUtil . s3 ;
3239 bucketName = await bucketUtil . createRandom ( 1 ) ;
40+ await initMetadataPromise ( ) ;
3341 } ) ;
3442
3543 beforeEach ( async ( ) => {
@@ -66,5 +74,66 @@ describe('Put object with same key as prior object', () => {
6674 const bodyText = await res . Body . transformToString ( ) ;
6775 assert . deepStrictEqual ( bodyText , 'Much different' ) ;
6876 } ) ;
77+
78+ it ( 'should replace archived object in non-versioned bucket' , async ( ) => {
79+ await fakeMetadataArchivePromise ( bucketName , objectName , undefined , {
80+ archiveInfo : { archiveId : 'archive-1' } ,
81+ restoreRequestedAt : new Date ( 0 ) . toISOString ( ) ,
82+ restoreRequestedDays : 5 ,
83+ } ) ;
84+
85+ await s3 . send ( new PutObjectCommand ( {
86+ Bucket : bucketName ,
87+ Key : objectName ,
88+ Body : 'overwrite archived data' ,
89+ Metadata : secondPutMetadata ,
90+ } ) ) ;
91+
92+ const currentMD = await getMetadataPromise ( bucketName , objectName , undefined ) ;
93+ assert . strictEqual ( currentMD . archive , undefined ) ;
94+ } ) ;
95+
96+ it ( 'should preserve archived previous version in versioned bucket' , async ( ) => {
97+ await s3 . send ( new PutBucketVersioningCommand ( {
98+ Bucket : bucketName ,
99+ VersioningConfiguration : { Status : 'Enabled' } ,
100+ } ) ) ;
101+
102+ const firstPutRes = await s3 . send ( new PutObjectCommand ( {
103+ Bucket : bucketName ,
104+ Key : objectName ,
105+ Body : 'versioned first payload' ,
106+ Metadata : firstPutMetadata ,
107+ } ) ) ;
108+
109+ await fakeMetadataArchivePromise ( bucketName , objectName , firstPutRes . VersionId , {
110+ archiveInfo : { archiveId : 'archive-versioned-1' } ,
111+ restoreRequestedAt : new Date ( 0 ) . toISOString ( ) ,
112+ restoreRequestedDays : 5 ,
113+ } ) ;
114+
115+ const secondPutRes = await s3 . send ( new PutObjectCommand ( {
116+ Bucket : bucketName ,
117+ Key : objectName ,
118+ Body : 'versioned second payload' ,
119+ Metadata : secondPutMetadata ,
120+ } ) ) ;
121+
122+ const archivedVersionMD = await getMetadataPromise (
123+ bucketName , objectName , firstPutRes . VersionId ) ;
124+ assert ( archivedVersionMD . archive ) ;
125+ assert ( archivedVersionMD . archive . archiveInfo ) ;
126+
127+ const currentVersionMD = await getMetadataPromise (
128+ bucketName , objectName , secondPutRes . VersionId ) ;
129+ assert . strictEqual ( currentVersionMD . archive , undefined ) ;
130+
131+ const listed = await s3 . send ( new ListObjectVersionsCommand ( {
132+ Bucket : bucketName ,
133+ Prefix : objectName ,
134+ } ) ) ;
135+ const objectVersions = ( listed . Versions || [ ] ) . filter ( v => v . Key === objectName ) ;
136+ assert ( objectVersions . length >= 2 ) ;
137+ } ) ;
69138 } ) ;
70139} ) ;
0 commit comments