11const assert = require ( 'assert' ) ;
2+ const sinon = require ( 'sinon' ) ;
23
34const { bucketPut } = require ( '../../../lib/api/bucketPut' ) ;
45const objectPut = require ( '../../../lib/api/objectPut' ) ;
@@ -7,6 +8,7 @@ const { cleanup, DummyRequestLogger, makeAuthInfo } = require('../helpers');
78const mdColdHelper = require ( './utils/metadataMockColdStorage' ) ;
89const DummyRequest = require ( '../DummyRequest' ) ;
910const metadata = require ( '../metadataswitch' ) ;
11+ const metadataUtils = require ( '../../../lib/metadata/metadataUtils' ) ;
1012
1113const log = new DummyRequestLogger ( ) ;
1214const authInfo = makeAuthInfo ( 'accessKey1' ) ;
@@ -157,4 +159,57 @@ describe('restoreObject API', () => {
157159 } ) ;
158160 } ) ;
159161 } ) ;
162+
163+ it ( 'should return NoSuchKey error when object is delete marker without versionId' , done => {
164+ const requestWithoutVersionId = objectRestoreRequest ( objectRestoreXml ) ;
165+ const mockBucket = {
166+ getName : ( ) => bucketName ,
167+ getOwner : ( ) => 'testCanonicalId' ,
168+ } ;
169+ const mockDeleteMarkerMD = mdColdHelper . getDeleteMarkerObjectMD ( ) ;
170+ const stub = sinon . stub ( metadataUtils , 'standardMetadataValidateBucketAndObj' ) ;
171+ stub . callsFake ( ( params , denies , log , callback ) => {
172+ callback ( null , mockBucket , mockDeleteMarkerMD ) ;
173+ } ) ;
174+ objectRestore ( authInfo , requestWithoutVersionId , log , err => {
175+ stub . restore ( ) ;
176+ try {
177+ assert ( err , 'Expected an error' ) ;
178+ assert . strictEqual ( err . is . NoSuchKey , true ) ;
179+ assert . strictEqual ( typeof err . customizeDescription , 'function' ,
180+ 'Error should be from errorInstances which has customizeDescription method' ) ;
181+ done ( ) ;
182+ } catch ( assertionError ) {
183+ done ( assertionError ) ;
184+ }
185+ } ) ;
186+ } ) ;
187+
188+ it ( 'should return MethodNotAllowed error when object is delete marker with versionId' , done => {
189+ const requestWithVersionId = {
190+ ...objectRestoreRequest ( objectRestoreXml ) ,
191+ query : { versionId : 'null' } ,
192+ } ;
193+ const mockBucket = {
194+ getName : ( ) => bucketName ,
195+ getOwner : ( ) => 'testCanonicalId' ,
196+ } ;
197+ const mockDeleteMarkerMD = mdColdHelper . getDeleteMarkerObjectMD ( ) ;
198+ const stub = sinon . stub ( metadataUtils , 'standardMetadataValidateBucketAndObj' ) ;
199+ stub . callsFake ( ( params , denies , log , callback ) => {
200+ callback ( null , mockBucket , mockDeleteMarkerMD ) ;
201+ } ) ;
202+ objectRestore ( authInfo , requestWithVersionId , log , err => {
203+ stub . restore ( ) ;
204+ try {
205+ assert ( err , 'Expected an error' ) ;
206+ assert . strictEqual ( err . is . MethodNotAllowed , true ) ;
207+ assert . strictEqual ( typeof err . customizeDescription , 'function' ,
208+ 'Error should be from errorInstances which has customizeDescription method' ) ;
209+ done ( ) ;
210+ } catch ( assertionError ) {
211+ done ( assertionError ) ;
212+ }
213+ } ) ;
214+ } ) ;
160215} ) ;
0 commit comments