Skip to content

Commit 261d947

Browse files
committed
updated upload api test cases
1 parent c771be8 commit 261d947

File tree

1 file changed

+161
-48
lines changed

1 file changed

+161
-48
lines changed

tests/ImageKit/Upload/UploadTest.php

Lines changed: 161 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,14 @@
1010
use GuzzleHttp\Psr7\Utils;
1111
use ImageKit\ImageKit;
1212
use ImageKit\Resource\GuzzleHttpWrapper;
13+
use GuzzleHttp\Handler\MockHandler;
1314
use PHPUnit\Framework\TestCase;
15+
use GuzzleHttp\Client;
16+
use GuzzleHttp\HandlerStack;
17+
use GuzzleHttp\Middleware;
18+
use ImageKit\Constants\Endpoints;
19+
20+
1421
use 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

Comments
 (0)