@@ -50,7 +50,9 @@ describe('util.submit-addon', () => {
5050 let getPreviousUuidOrUploadXpiStub ;
5151 let postNewAddonStub ;
5252 let putVersionStub ;
53+ let fileFromSyncStub ;
5354 const uploadUuid = '{some-upload-uuid}' ;
55+ const fakeFileFromSync = new File ( [ ] , 'foo.xpi' ) ;
5456
5557 beforeEach ( ( ) => {
5658 statStub = sinon
@@ -61,13 +63,17 @@ describe('util.submit-addon', () => {
6163 . resolves ( uploadUuid ) ;
6264 postNewAddonStub = sinon . stub ( Client . prototype , 'postNewAddon' ) ;
6365 putVersionStub = sinon . stub ( Client . prototype , 'putVersion' ) ;
66+ fileFromSyncStub = sinon
67+ . stub ( Client . prototype , 'fileFromSync' )
68+ . returns ( fakeFileFromSync ) ;
6469 } ) ;
6570
6671 afterEach ( ( ) => {
6772 statStub . restore ( ) ;
6873 getPreviousUuidOrUploadXpiStub . restore ( ) ;
6974 postNewAddonStub . restore ( ) ;
7075 putVersionStub . restore ( ) ;
76+ fileFromSyncStub . restore ( ) ;
7177 } ) ;
7278
7379 const signAddonDefaults = {
@@ -122,6 +128,7 @@ describe('util.submit-addon', () => {
122128 downloadDir,
123129 userAgentString,
124130 } ) ;
131+ sinon . assert . notCalled ( fileFromSyncStub ) ;
125132 } ) ;
126133
127134 it ( 'calls postNewAddon if `id` is undefined' , async ( ) => {
@@ -187,6 +194,42 @@ describe('util.submit-addon', () => {
187194 metaDataJson ,
188195 ) ;
189196 } ) ;
197+
198+ it ( 'includes source data to be patched if versionSource defined for new addon' , async ( ) => {
199+ const versionSource = 'path/to/source/zip' ;
200+ await signAddon ( {
201+ ...signAddonDefaults ,
202+ versionSource,
203+ } ) ;
204+
205+ sinon . assert . calledWith ( fileFromSyncStub , versionSource ) ;
206+ sinon . assert . calledWith (
207+ postNewAddonStub ,
208+ uploadUuid ,
209+ signAddonDefaults . savedIdPath ,
210+ { } ,
211+ { source : fakeFileFromSync } ,
212+ ) ;
213+ } ) ;
214+
215+ it ( 'includes source data to be patched if versionSource defined for new version' , async ( ) => {
216+ const versionSource = 'path/to/source/zip' ;
217+ const id = '@thisID' ;
218+ await signAddon ( {
219+ ...signAddonDefaults ,
220+ versionSource,
221+ id,
222+ } ) ;
223+
224+ sinon . assert . calledWith ( fileFromSyncStub , versionSource ) ;
225+ sinon . assert . calledWith (
226+ putVersionStub ,
227+ uploadUuid ,
228+ id ,
229+ { } ,
230+ { source : fakeFileFromSync } ,
231+ ) ;
232+ } ) ;
190233 } ) ;
191234
192235 describe ( 'Client' , ( ) => {
@@ -738,6 +781,42 @@ describe('util.submit-addon', () => {
738781 } ) ;
739782 } ) ;
740783
784+ describe ( 'doFormDataPatch' , ( ) => {
785+ const addonId = 'some-addon-id' ;
786+ const versionId = 123456 ;
787+ const dataField1 = 'someField' ;
788+ const dataField2 = 'otherField' ;
789+ const data = { dataField1 : 'value' , dataField2 : 0 } ;
790+ const formData = new FormData ( ) ;
791+ formData . append ( dataField1 , data [ dataField1 ] ) ;
792+ formData . append ( dataField2 , data [ dataField2 ] ) ;
793+
794+ it ( 'creates the url from addon and version' , async ( ) => {
795+ const client = new Client ( clientDefaults ) ;
796+ const fetchStub = sinon
797+ . stub ( client , 'fetch' )
798+ . resolves ( new Response ( '' , { ok : true , status : 200 } ) ) ;
799+ await client . doFormDataPatch ( data , addonId , versionId ) ;
800+ const patchUrl = new URL (
801+ `addon/${ addonId } /versions/${ versionId } /` ,
802+ client . apiUrl ,
803+ ) ;
804+
805+ sinon . assert . calledWith ( fetchStub , patchUrl , 'PATCH' , formData ) ;
806+ } ) ;
807+
808+ it ( 'catches and throws for non ok responses' , async ( ) => {
809+ const client = new Client ( clientDefaults ) ;
810+ sinon . stub ( client , 'fetch' ) . resolves ( ) ;
811+ const response = client . doFormDataPatch ( data , addonId , versionId ) ;
812+
813+ assert . isRejected (
814+ response ,
815+ `Uploading ${ dataField1 } ${ dataField2 } failed` ,
816+ ) ;
817+ } ) ;
818+ } ) ;
819+
741820 describe ( 'waitForApproval' , ( ) => {
742821 it ( 'aborts approval wait after timeout' , async ( ) => {
743822 const client = new Client ( {
@@ -902,7 +981,13 @@ describe('util.submit-addon', () => {
902981 [ { body : sampleAddonDetail , status : 200 } ] ,
903982 ) ;
904983 addApprovalMocks ( versionId ) ;
905- await client . postNewAddon ( uploadUuid , idFile , { } , saveIdStub ) ;
984+ await client . postNewAddon (
985+ uploadUuid ,
986+ idFile ,
987+ { } ,
988+ undefined ,
989+ saveIdStub ,
990+ ) ;
906991 sinon . assert . calledWith ( saveIdStub , idFile , sampleAddonDetail . guid ) ;
907992 } ) ;
908993
@@ -920,6 +1005,92 @@ describe('util.submit-addon', () => {
9201005 await client . putVersion ( uploadUuid , `${ addonId } ` , { } ) ;
9211006 } ) ;
9221007
1008+ describe ( 'doFormDataPatch called correctly' , ( ) => {
1009+ const versionPatchData = { source : 'somesource' } ;
1010+ const metaDataJson = { some : 'metadata' } ;
1011+ const newVersionId = 123456 ;
1012+ const editUrl = 'http://some/url' ;
1013+ const stubbedClient = new Client ( clientDefaults ) ;
1014+
1015+ const submitResponse = {
1016+ guid : addonId ,
1017+ version : { id : newVersionId , edit_url : editUrl } ,
1018+ } ;
1019+ sinon
1020+ . stub ( stubbedClient , 'doNewAddonOrVersionSubmit' )
1021+ . resolves ( submitResponse ) ;
1022+ sinon . stub ( stubbedClient , 'doNewAddonSubmit' ) . resolves ( submitResponse ) ;
1023+ sinon . stub ( stubbedClient , 'doAfterSubmit' ) . resolves ( ) ;
1024+
1025+ let doFormDataPatchStub ;
1026+
1027+ before ( ( ) => {
1028+ doFormDataPatchStub = sinon
1029+ . stub ( stubbedClient , 'doFormDataPatch' )
1030+ . resolves ( ) ;
1031+ } ) ;
1032+
1033+ afterEach ( ( ) => {
1034+ doFormDataPatchStub . reset ( ) ;
1035+ } ) ;
1036+
1037+ it ( 'calls doFormDataPatch if versionPatchData is defined for postNewAddon' , async ( ) => {
1038+ const saveIdToFileStub = sinon . stub ( ) . resolves ( ) ;
1039+ const savedIdPath = 'some/saved/id/path' ;
1040+ await stubbedClient . postNewAddon (
1041+ uploadUuid ,
1042+ savedIdPath ,
1043+ metaDataJson ,
1044+ versionPatchData ,
1045+ saveIdToFileStub ,
1046+ ) ;
1047+
1048+ sinon . assert . calledWith (
1049+ doFormDataPatchStub ,
1050+ versionPatchData ,
1051+ addonId ,
1052+ newVersionId ,
1053+ ) ;
1054+ } ) ;
1055+
1056+ it ( 'calls doFormDataPatch if versionPatchData is defined for putVersion' , async ( ) => {
1057+ await stubbedClient . putVersion (
1058+ uploadUuid ,
1059+ addonId ,
1060+ metaDataJson ,
1061+ versionPatchData ,
1062+ ) ;
1063+
1064+ sinon . assert . called ( doFormDataPatchStub ) ;
1065+ sinon . assert . calledWith (
1066+ doFormDataPatchStub ,
1067+ versionPatchData ,
1068+ addonId ,
1069+ newVersionId ,
1070+ ) ;
1071+ } ) ;
1072+
1073+ it ( 'does not call doFormDataPatch is versionPatchData is undefined for postNewAddon' , async ( ) => {
1074+ const saveIdToFileStub = sinon . stub ( ) . resolves ( ) ;
1075+ const savedIdPath = 'some/saved/id/path' ;
1076+ await stubbedClient . postNewAddon (
1077+ uploadUuid ,
1078+ savedIdPath ,
1079+ metaDataJson ,
1080+ undefined ,
1081+ saveIdToFileStub ,
1082+ ) ;
1083+
1084+ sinon . assert . notCalled ( doFormDataPatchStub ) ;
1085+ } ) ;
1086+
1087+ it ( 'does not call doFormDataPatch is versionPatchData is undefined for putVersion' , async ( ) => {
1088+ await stubbedClient . putVersion ( uploadUuid , addonId , metaDataJson ) ;
1089+
1090+ sinon . assert . notCalled ( doFormDataPatchStub ) ;
1091+ } ) ;
1092+ } ) ;
1093+
9231094 describe ( 'doAfterSubmit' , ( ) => {
9241095 const downloadUrl = 'https://a.download/url' ;
9251096 let approvalStub ;
0 commit comments