1010use GuzzleHttp \Psr7 \Utils ;
1111use ImageKit \ImageKit ;
1212use ImageKit \Resource \GuzzleHttpWrapper ;
13+ use GuzzleHttp \Handler \MockHandler ;
1314use PHPUnit \Framework \TestCase ;
15+ use GuzzleHttp \Client ;
16+ use GuzzleHttp \HandlerStack ;
17+ use GuzzleHttp \Middleware ;
18+ use ImageKit \Constants \Endpoints ;
19+
20+
1421use function json_encode ;
1522
1623
@@ -57,6 +64,13 @@ private function stubHttpClient($response)
5764 $ doClosure ();
5865 }
5966
67+ private function checkFormData ($ requestBody , $ boundary , $ fieldName , $ fieldValue ) {
68+
69+ $ string = '-- ' .$ boundary .' Content-Disposition: form-data; name=" ' .$ fieldName .'" Content-Length: ' .strlen ($ fieldValue ).' ' .$ fieldValue ;
70+ $ string = substr (json_encode ($ string ),1 ,-1 );
71+
72+ UploadTest::assertStringContainsString ($ string ,$ requestBody );
73+ }
6074
6175 /**
6276 *
@@ -68,7 +82,6 @@ public function testFileUploadIfInvalidUploadParams()
6882
6983 $ response = $ this ->client ->uploadFile (null );
7084
71- // echo json_encode($response->error);
7285 UploadTest::assertNull ($ response ->result );
7386 UploadTest::assertEquals ('Upload API accepts an array of parameters, null passed ' , $ response ->error ->message );
7487 }
@@ -85,7 +98,6 @@ public function testFileUploadIfMissingFileName()
8598
8699 $ response = $ this ->client ->uploadFile ($ fileOptions );
87100
88- // echo json_encode($response->error);
89101 UploadTest::assertNull ($ response ->result );
90102 UploadTest::assertEquals ('Missing fileName parameter for upload ' , $ response ->error ->message );
91103 }
@@ -101,7 +113,6 @@ public function testFileUploadIfMissingFile()
101113
102114 $ response = $ this ->client ->uploadFile ($ fileOptions );
103115
104- // echo json_encode($response->error);
105116 UploadTest::assertNull ($ response ->result );
106117 UploadTest::assertEquals ('Missing file parameter for upload ' , $ response ->error ->message );
107118 }
@@ -142,25 +153,52 @@ public function testFileUploadIfSuccessful()
142153
143154 $ mockBodyResponse = Utils::streamFor (json_encode ($ this ->uploadSuccessResponseObj ));
144155
145- $ this ->stubHttpClient (new Response (200 , ['X-Foo ' => 'Bar ' ], $ mockBodyResponse ));
156+ $ mock = new MockHandler ([
157+ new Response (200 , ['X-Foo ' => 'Bar ' ], $ mockBodyResponse )
158+ ]);
146159
147- $ response = $ this -> client -> uploadFile ( $ fileOptions );
160+ $ handlerStack = HandlerStack:: create ( $ mock );
148161
149- // Request Body Check
150- UploadTest::assertArrayHasKey ('file ' ,$ fileOptions );
151- UploadTest::assertArrayHasKey ('fileName ' ,$ fileOptions );
152- UploadTest::assertIsString ($ fileOptions ['tags ' ]);
153- UploadTest::assertArrayHasKey ('useUniqueFileName ' ,$ fileOptions );
154- UploadTest::assertIsBool ($ fileOptions ['useUniqueFileName ' ]);
155- UploadTest::assertIsBool ($ fileOptions ['isPrivateFile ' ]);
156- UploadTest::assertIsString ($ fileOptions ['responseFields ' ]);
157- UploadTest::assertIsArray ($ fileOptions ['extensions ' ]);
158- UploadTest::assertIsBool ($ fileOptions ['overwriteFile ' ]);
159- UploadTest::assertIsBool ($ fileOptions ['overwriteAITags ' ]);
160- UploadTest::assertIsBool ($ fileOptions ['overwriteTags ' ]);
161- UploadTest::assertIsBool ($ fileOptions ['overwriteCustomMetadata ' ]);
162- UploadTest::assertIsArray ($ fileOptions ['customMetadata ' ]);
162+ $ container = [];
163+ $ history = Middleware::history ($ container );
164+
165+ $ handlerStack ->push ($ history );
166+
167+ $ client = new Client (['handler ' => $ handlerStack ]);
168+
169+ $ requestMultiPart = GuzzleHttpWrapper::getMultipartData ($ fileOptions );
170+ $ client ->request ('POST ' , Endpoints::getUploadFileEndpoint (), [
171+ 'multipart ' =>$ requestMultiPart
172+ ]);
173+
174+ $ requestBody = $ container [0 ]['request ' ]->getBody ();
175+ $ requestHeaders = $ container [0 ]['request ' ]->getHeaders ();
176+ $ boundary = str_replace ("multipart/form-data; boundary= " ,"" ,$ requestHeaders ["Content-Type " ][0 ]);
177+
178+ UploadTest::assertArrayHasKey ("Content-Type " ,$ requestHeaders );
179+ UploadTest::assertStringStartsWith ("multipart/form-data; boundary= " ,$ requestHeaders ['Content-Type ' ][0 ]);
180+
181+ $ stream = Utils::streamFor ($ requestBody );
182+ $ stream = str_replace ('\r\n ' ,' ' ,json_encode ($ stream ->getContents ()));
183+
184+ $ this ->checkFormData ($ stream ,$ boundary ,"file " ,$ fileOptions ['file ' ]);
185+ $ this ->checkFormData ($ stream ,$ boundary ,"fileName " ,$ fileOptions ['fileName ' ]);
186+ $ this ->checkFormData ($ stream ,$ boundary ,"tags " ,implode (', ' ,["abd " , "def " ]));
187+ $ this ->checkFormData ($ stream ,$ boundary ,"isPrivateFile " ,"true " );
188+ $ this ->checkFormData ($ stream ,$ boundary ,"useUniqueFileName " ,"false " );
189+ $ this ->checkFormData ($ stream ,$ boundary ,"responseFields " ,implode (", " , ["tags " , "customMetadata " ]));
190+ $ this ->checkFormData ($ stream ,$ boundary ,"extensions[0][name] " ,"remove-bg " );
191+ $ this ->checkFormData ($ stream ,$ boundary ,"webhookUrl " ,"https://example.com/webhook " );
192+ $ this ->checkFormData ($ stream ,$ boundary ,"overwriteFile " ,"true " );
193+ $ this ->checkFormData ($ stream ,$ boundary ,"overwriteAITags " ,"false " );
194+ $ this ->checkFormData ($ stream ,$ boundary ,"overwriteCustomMetadata " ,"true " );
195+ $ this ->checkFormData ($ stream ,$ boundary ,"customMetadata[SKU] " ,"VS882HJ2JD " );
196+ $ this ->checkFormData ($ stream ,$ boundary ,"customMetadata[price] " ,"599.99 " );
197+
198+ $ this ->stubHttpClient (new Response (200 , ['X-Foo ' => 'Bar ' ], $ mockBodyResponse ));
163199
200+ $ response = $ this ->client ->uploadFile ($ fileOptions );
201+
164202 // Response Check
165203 UploadTest::assertEquals (json_encode ($ this ->uploadSuccessResponseObj ), json_encode ($ response ->result ));
166204 }
@@ -178,17 +216,44 @@ public function testFileUploadMissingUseUniqueFileName()
178216
179217 $ mockBodyResponse = Utils::streamFor (json_encode ($ fileOptions ));
180218
181- $ this ->stubHttpClient (new Response (200 , ['X-Foo ' => 'Bar ' ], $ mockBodyResponse ));
219+ $ mock = new MockHandler ([
220+ new Response (200 , ['X-Foo ' => 'Bar ' ], $ mockBodyResponse )
221+ ]);
182222
183- $ response = $ this -> client -> uploadFile ( $ fileOptions );
223+ $ handlerStack = HandlerStack:: create ( $ mock );
184224
185- // Request Check
186- UploadTest::assertArrayHasKey ('file ' ,$ fileOptions );
187- UploadTest::assertArrayHasKey ('fileName ' ,$ fileOptions );
188- UploadTest::assertIsBool ($ fileOptions ['isPrivateFile ' ]);
225+ $ container = [];
226+ $ history = Middleware::history ($ container );
189227
190- // Response Check
191- UploadTest::assertArrayNotHasKey ('useUniqueFileName ' , (array ) $ response ->result );
228+ $ handlerStack ->push ($ history );
229+
230+ $ client = new Client (['handler ' => $ handlerStack ]);
231+
232+ $ requestMultiPart = GuzzleHttpWrapper::getMultipartData ($ fileOptions );
233+ $ client ->request ('POST ' , Endpoints::getUploadFileEndpoint (), [
234+ 'multipart ' =>$ requestMultiPart
235+ ]);
236+
237+ $ requestBody = $ container [0 ]['request ' ]->getBody ();
238+ $ requestHeaders = $ container [0 ]['request ' ]->getHeaders ();
239+ $ boundary = str_replace ("multipart/form-data; boundary= " ,"" ,$ requestHeaders ["Content-Type " ][0 ]);
240+
241+ UploadTest::assertArrayHasKey ("Content-Type " ,$ requestHeaders );
242+ UploadTest::assertStringStartsWith ("multipart/form-data; boundary= " ,$ requestHeaders ['Content-Type ' ][0 ]);
243+
244+ $ stream = Utils::streamFor ($ requestBody );
245+ $ stream = str_replace ('\r\n ' ,' ' ,json_encode ($ stream ->getContents ()));
246+
247+ $ this ->checkFormData ($ stream ,$ boundary ,"file " ,$ fileOptions ['file ' ]);
248+ $ this ->checkFormData ($ stream ,$ boundary ,"fileName " ,$ fileOptions ['fileName ' ]);
249+ $ this ->checkFormData ($ stream ,$ boundary ,"isPrivateFile " ,"true " );
250+ UploadTest::assertStringNotContainsString ("useUniqueFileName " ,$ stream );
251+
252+ $ mockBodyResponse = Utils::streamFor (json_encode ($ fileOptions ));
253+
254+ $ this ->stubHttpClient (new Response (200 , ['X-Foo ' => 'Bar ' ], $ mockBodyResponse ));
255+
256+ $ response = $ this ->client ->uploadFile ($ fileOptions );
192257 }
193258
194259 /**
@@ -204,20 +269,44 @@ public function testFileUploadMissingIsPrivateFileUseUniqueFileName()
204269
205270 $ mockBodyResponse = Utils::streamFor (json_encode ($ fileOptions ));
206271
207- $ this ->stubHttpClient (new Response (200 , ['X-Foo ' => 'Bar ' ], $ mockBodyResponse ));
272+ $ mock = new MockHandler ([
273+ new Response (200 , ['X-Foo ' => 'Bar ' ], $ mockBodyResponse )
274+ ]);
208275
209- $ response = $ this -> client -> uploadFile ( $ fileOptions );
276+ $ handlerStack = HandlerStack:: create ( $ mock );
210277
211- // Request Body Check
212- UploadTest::assertArrayHasKey ('file ' ,$ fileOptions );
213- UploadTest::assertArrayHasKey ('fileName ' ,$ fileOptions );
214- UploadTest::assertIsString ($ fileOptions ['tags ' ]);
278+ $ container = [];
279+ $ history = Middleware::history ($ container );
215280
216- // Response Check
217- UploadTest::assertArrayNotHasKey ('isPrivateFile ' , (array ) $ response ->result );
218- UploadTest::assertArrayNotHasKey ('useUniqueFileName ' , (array ) $ response ->result );
219- }
281+ $ handlerStack ->push ($ history );
282+
283+ $ client = new Client (['handler ' => $ handlerStack ]);
284+
285+ $ requestMultiPart = GuzzleHttpWrapper::getMultipartData ($ fileOptions );
286+ $ client ->request ('POST ' , Endpoints::getUploadFileEndpoint (), [
287+ 'multipart ' =>$ requestMultiPart
288+ ]);
289+
290+ $ requestBody = $ container [0 ]['request ' ]->getBody ();
291+ $ requestHeaders = $ container [0 ]['request ' ]->getHeaders ();
292+ $ boundary = str_replace ("multipart/form-data; boundary= " ,"" ,$ requestHeaders ["Content-Type " ][0 ]);
293+
294+ UploadTest::assertArrayHasKey ("Content-Type " ,$ requestHeaders );
295+ UploadTest::assertStringStartsWith ("multipart/form-data; boundary= " ,$ requestHeaders ['Content-Type ' ][0 ]);
296+
297+ $ stream = Utils::streamFor ($ requestBody );
298+ $ stream = str_replace ('\r\n ' ,' ' ,json_encode ($ stream ->getContents ()));
220299
300+ $ this ->checkFormData ($ stream ,$ boundary ,"file " ,$ fileOptions ['file ' ]);
301+ $ this ->checkFormData ($ stream ,$ boundary ,"fileName " ,$ fileOptions ['fileName ' ]);
302+ $ this ->checkFormData ($ stream ,$ boundary ,"tags " ,"abd,def " );
303+ UploadTest::assertStringNotContainsString ("isPrivateFile " ,$ stream );
304+ UploadTest::assertStringNotContainsString ("useUniqueFileName " ,$ stream );
305+
306+ $ this ->stubHttpClient (new Response (200 , ['X-Foo ' => 'Bar ' ], $ mockBodyResponse ));
307+
308+ $ response = $ this ->client ->uploadFile ($ fileOptions );
309+ }
221310
222311 /**
223312 *
@@ -231,21 +320,45 @@ public function testFileUploadBareMinimumRequest()
231320
232321 $ mockBodyResponse = Utils::streamFor (json_encode ($ fileOptions ));
233322
234- $ this ->stubHttpClient (new Response (200 , ['X-Foo ' => 'Bar ' ], $ mockBodyResponse ));
323+ $ mock = new MockHandler ([
324+ new Response (200 , ['X-Foo ' => 'Bar ' ], $ mockBodyResponse )
325+ ]);
235326
236- $ response = $ this -> client -> uploadFile ( $ fileOptions );
327+ $ handlerStack = HandlerStack:: create ( $ mock );
237328
329+ $ container = [];
330+ $ history = Middleware::history ($ container );
331+
332+ $ handlerStack ->push ($ history );
238333
239- // Request Body Check
240- UploadTest::assertArrayHasKey ('file ' ,$ fileOptions );
241- UploadTest::assertArrayHasKey ('fileName ' ,$ fileOptions );
334+ $ client = new Client (['handler ' => $ handlerStack ]);
335+
336+ $ requestMultiPart = GuzzleHttpWrapper::getMultipartData ($ fileOptions );
337+ $ client ->request ('POST ' , Endpoints::getUploadFileEndpoint (), [
338+ 'multipart ' =>$ requestMultiPart
339+ ]);
340+
341+ $ requestBody = $ container [0 ]['request ' ]->getBody ();
342+ $ requestHeaders = $ container [0 ]['request ' ]->getHeaders ();
343+ $ boundary = str_replace ("multipart/form-data; boundary= " ,"" ,$ requestHeaders ["Content-Type " ][0 ]);
344+
345+ UploadTest::assertArrayHasKey ("Content-Type " ,$ requestHeaders );
346+ UploadTest::assertStringStartsWith ("multipart/form-data; boundary= " ,$ requestHeaders ['Content-Type ' ][0 ]);
347+
348+ $ stream = Utils::streamFor ($ requestBody );
349+ $ stream = str_replace ('\r\n ' ,' ' ,json_encode ($ stream ->getContents ()));
350+
351+ $ this ->checkFormData ($ stream ,$ boundary ,"file " ,$ fileOptions ['file ' ]);
352+ $ this ->checkFormData ($ stream ,$ boundary ,"fileName " ,$ fileOptions ['fileName ' ]);
353+ UploadTest::assertStringNotContainsString ("tags " ,$ stream );
354+ UploadTest::assertStringNotContainsString ("isPrivateFile " ,$ stream );
355+ UploadTest::assertStringNotContainsString ("useUniqueFileName " ,$ stream );
356+ UploadTest::assertStringNotContainsString ("customCoordinates " ,$ stream );
357+ UploadTest::assertStringNotContainsString ("responseFields " ,$ stream );
358+
359+ $ this ->stubHttpClient (new Response (200 , ['X-Foo ' => 'Bar ' ], $ mockBodyResponse ));
242360
243- // Response Check
244- UploadTest::assertArrayNotHasKey ('tags ' , (array ) $ response ->result );
245- UploadTest::assertArrayNotHasKey ('useUniqueFileName ' , (array ) $ response ->result );
246- UploadTest::assertArrayNotHasKey ('isPrivateFile ' , (array ) $ response ->result );
247- UploadTest::assertArrayNotHasKey ('customCoordinates ' , (array ) $ response ->result );
248- UploadTest::assertArrayNotHasKey ('responseFields ' , (array ) $ response ->result );
361+ $ response = $ this ->client ->uploadFile ($ fileOptions );
249362 }
250363
251364 /**
0 commit comments