@@ -38,54 +38,116 @@ describe('services', () => {
3838            } ) ; 
3939        } ) ; 
4040
41-         it ( 'should correctly handle pagination' ,  done  =>  { 
41+         it ( 'should handle an error from getObjectListing' ,  done  =>  { 
42+             const  testError  =  new  Error ( 'listing failed' ) ; 
43+             getObjectListingStub . yields ( testError ) ; 
44+ 
45+             services . findObjectVersionByUploadId ( bucketName ,  objectKey ,  'any-upload-id' ,  log ,  err  =>  { 
46+                 assert . deepStrictEqual ( err ,  testError ) ; 
47+                 sinon . assert . calledOnce ( getObjectListingStub ) ; 
48+                 done ( ) ; 
49+             } ) ; 
50+         } ) ; 
51+ 
52+         it ( 'should return null if no matching version is found' ,  done  =>  { 
53+             getObjectListingStub . yields ( null ,  {  Versions : [ ] ,  IsTruncated : false  } ) ; 
54+ 
55+             services . findObjectVersionByUploadId ( bucketName ,  objectKey ,  'any-upload-id' ,  log ,  ( err ,  foundVersion )  =>  { 
56+                 assert . ifError ( err ) ; 
57+                 sinon . assert . calledOnce ( getObjectListingStub ) ; 
58+                 assert . strictEqual ( foundVersion ,  null ) ; 
59+                 done ( ) ; 
60+             } ) ; 
61+         } ) ; 
62+ 
63+         it ( 'should find a version on the only page of results' ,  done  =>  { 
64+             const  uploadIdToFind  =  'the-correct-upload-id' ; 
65+             const  correctVersionValue  =  {  uploadId : uploadIdToFind ,  data : 'this is it'  } ; 
66+             const  versions  =  [ 
67+                 {  key : objectKey ,  value : {  uploadId : 'some-other-id'  }  } , 
68+                 // Version with a different key but same uploadId to test the key check 
69+                 {  key : 'another-object-key' ,  value : {  uploadId : uploadIdToFind  }  } , 
70+                 {  key : objectKey ,  value : correctVersionValue  } , 
71+             ] ; 
72+             getObjectListingStub . yields ( null ,  {  Versions : versions ,  IsTruncated : false  } ) ; 
73+ 
74+             services . findObjectVersionByUploadId ( bucketName ,  objectKey ,  uploadIdToFind ,  log ,  ( err ,  foundVersion )  =>  { 
75+                 assert . ifError ( err ) ; 
76+                 sinon . assert . calledOnce ( getObjectListingStub ) ; 
77+                 assert . deepStrictEqual ( foundVersion ,  correctVersionValue ) ; 
78+                 done ( ) ; 
79+             } ) ; 
80+         } ) ; 
81+ 
82+         it ( 'should read all pages if a matching version is not found' ,  done  =>  { 
4283            getObjectListingStub . onFirstCall ( ) . yields ( null ,  { 
43-                 Versions : [ ] , 
84+                 Versions : [ {   key :  objectKey ,   value :  {   uploadId :  'id-page-1'   }   } ] , 
4485                IsTruncated : true , 
4586                NextKeyMarker : 'key-marker' , 
4687                NextVersionIdMarker : 'version-marker' , 
4788            } ) ; 
4889            getObjectListingStub . onSecondCall ( ) . yields ( null ,  { 
49-                 Versions : [ ] , 
90+                 Versions : [ {   key :  objectKey ,   value :  {   uploadId :  'id-page-2'   }   } ] , 
5091                IsTruncated : false , 
5192            } ) ; 
5293
53-             services . findObjectVersionByUploadId ( bucketName ,  objectKey ,  'any- upload-id' ,  log ,  err  =>  { 
94+             services . findObjectVersionByUploadId ( bucketName ,  objectKey ,  'non-existent- upload-id' ,  log ,  ( err ,   foundVersion )  =>  { 
5495                assert . ifError ( err ) ; 
5596                sinon . assert . calledTwice ( getObjectListingStub ) ; 
5697
5798                const  secondCallParams  =  getObjectListingStub . getCall ( 1 ) . args [ 1 ] ; 
5899                assert . strictEqual ( secondCallParams . keyMarker ,  'key-marker' ) ; 
59100                assert . strictEqual ( secondCallParams . versionIdMarker ,  'version-marker' ) ; 
101+                 assert . strictEqual ( foundVersion ,  null ) ; 
60102                done ( ) ; 
61103            } ) ; 
62104        } ) ; 
63105
64-         it ( 'should handle error from getObjectListing' ,  done  =>  { 
65-             const  testError  =  new  Error ( 'listing failed' ) ; 
66-             getObjectListingStub . yields ( testError ) ; 
106+         it ( 'should find a version on the first page of many and stop listing' ,  done  =>  { 
107+             const  uploadIdToFind  =  'the-correct-upload-id' ; 
108+             const  correctVersionValue  =  {  uploadId : uploadIdToFind ,  data : 'this is it'  } ; 
109+             const  versions  =  [ {  key : objectKey ,  value : correctVersionValue  } ] ; 
110+             
111+             getObjectListingStub . onFirstCall ( ) . yields ( null ,  { 
112+                 Versions : versions , 
113+                 IsTruncated : true , 
114+                 NextKeyMarker : 'key-marker' , 
115+                 NextVersionIdMarker : 'version-marker' , 
116+             } ) ; 
117+             getObjectListingStub . onSecondCall ( ) . yields ( new  Error ( 'should not have been called' ) ) ; 
67118
68-             services . findObjectVersionByUploadId ( bucketName ,  objectKey ,  'any-upload-id' ,  log ,  err  =>  { 
69-                 assert . deepStrictEqual ( err ,   testError ) ; 
119+             services . findObjectVersionByUploadId ( bucketName ,  objectKey ,  uploadIdToFind ,  log ,  ( err ,   foundVersion )  =>  { 
120+                 assert . ifError ( err ) ; 
70121                sinon . assert . calledOnce ( getObjectListingStub ) ; 
122+                 assert . deepStrictEqual ( foundVersion ,  correctVersionValue ) ; 
71123                done ( ) ; 
72124            } ) ; 
73125        } ) ; 
74126
75-         it ( 'should find a version with the matching uploadId ' ,  done  =>  { 
127+         it ( 'should find a version on a subsequent page ' ,  done  =>  { 
76128            const  uploadIdToFind  =  'the-correct-upload-id' ; 
77129            const  correctVersionValue  =  {  uploadId : uploadIdToFind ,  data : 'this is it'  } ; 
78-             const  versions  =  [ 
79-                 {  key : objectKey ,  value : {  uploadId : 'some-other-id'  }  } , 
80-                 // Version with a different key but same uploadId to test the key check 
81-                 {  key : 'another-object-key' ,  value : {  uploadId : uploadIdToFind  }  } , 
82-                 {  key : objectKey ,  value : correctVersionValue  } , 
83-             ] ; 
84-             getObjectListingStub . yields ( null ,  {  Versions : versions ,  IsTruncated : false  } ) ; 
130+             const  secondPageVersions  =  [ {  key : objectKey ,  value : correctVersionValue  } ] ; 
131+ 
132+             getObjectListingStub . onFirstCall ( ) . yields ( null ,  { 
133+                 Versions : [ {  key : objectKey ,  value : {  uploadId : 'some-other-id'  }  } ] , 
134+                 IsTruncated : true , 
135+                 NextKeyMarker : 'key-marker' , 
136+                 NextVersionIdMarker : 'version-marker' , 
137+             } ) ; 
138+             getObjectListingStub . onSecondCall ( ) . yields ( null ,  { 
139+                 Versions : secondPageVersions , 
140+                 IsTruncated : false , 
141+             } ) ; 
85142
86143            services . findObjectVersionByUploadId ( bucketName ,  objectKey ,  uploadIdToFind ,  log ,  ( err ,  foundVersion )  =>  { 
87144                assert . ifError ( err ) ; 
88-                 sinon . assert . calledOnce ( getObjectListingStub ) ; 
145+                 sinon . assert . calledTwice ( getObjectListingStub ) ; 
146+ 
147+                 const  secondCallParams  =  getObjectListingStub . getCall ( 1 ) . args [ 1 ] ; 
148+                 assert . strictEqual ( secondCallParams . keyMarker ,  'key-marker' ) ; 
149+                 assert . strictEqual ( secondCallParams . versionIdMarker ,  'version-marker' ) ; 
150+ 
89151                assert . deepStrictEqual ( foundVersion ,  correctVersionValue ) ; 
90152                done ( ) ; 
91153            } ) ; 
0 commit comments