@@ -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