From 043d54d6a4235e47cdc9b10c662afaecb7ae9e9a Mon Sep 17 00:00:00 2001 From: "tien.xuan.vo" Date: Sat, 16 Sep 2023 17:25:03 +0700 Subject: [PATCH] Use static multipart's boundary --- .../tests/Service/HttpClientServiceTest.php | 13 ++++++++----- .../pacts/multipartConsumer-multipartProvider.json | 2 +- src/PhpPact/Consumer/Model/Body/Multipart.php | 7 ++++++- .../Interaction/Body/AbstractBodyRegistry.php | 4 ++-- 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/example/multipart/consumer/tests/Service/HttpClientServiceTest.php b/example/multipart/consumer/tests/Service/HttpClientServiceTest.php index 6fff0d460..18e7b278a 100644 --- a/example/multipart/consumer/tests/Service/HttpClientServiceTest.php +++ b/example/multipart/consumer/tests/Service/HttpClientServiceTest.php @@ -33,11 +33,14 @@ public function testUpdateUserProfile() \json_encode($matcher->like('Bearer eyJhbGciOiJIUzI1NiIXVCJ9')) ], ]) - ->setBody(new Multipart([ - new Part(__DIR__ . '/../_resource/full_name.txt', 'full_name', 'text/plain'), - new Part(__DIR__ . '/../_resource/image.jpg', 'profile_image', in_array(php_uname('m'), ['AMD64', 'arm64']) ? 'application/octet-stream' : 'image/jpeg'), - new Part(__DIR__ . '/../_resource/note.txt', 'personal_note', 'text/plain'), - ])); + ->setBody(new Multipart( + [ + new Part(__DIR__ . '/../_resource/full_name.txt', 'full_name', 'text/plain'), + new Part(__DIR__ . '/../_resource/image.jpg', 'profile_image', in_array(php_uname('m'), ['AMD64', 'arm64']) ? 'application/octet-stream' : 'image/jpeg'), + new Part(__DIR__ . '/../_resource/note.txt', 'personal_note', 'text/plain'), + ], + 'ktJmeYHbkTSa1jxD' + )); $response = new ProviderResponse(); $response diff --git a/example/multipart/pacts/multipartConsumer-multipartProvider.json b/example/multipart/pacts/multipartConsumer-multipartProvider.json index 4f517af16..69e198d33 100644 --- a/example/multipart/pacts/multipartConsumer-multipartProvider.json +++ b/example/multipart/pacts/multipartConsumer-multipartProvider.json @@ -11,7 +11,7 @@ } ], "request": { - "body": "LS1rdEptZVlIYmtUU2ExanhEDQpDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9ImZ1bGxfbmFtZSI7IGZpbGVuYW1lPSJwYWN0dmZhU1JiIg0KQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0NCg0KQ29sdGVuIFppZW1hbm4NCi0ta3RKbWVZSGJrVFNhMWp4RA0KQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPSJwcm9maWxlX2ltYWdlIjsgZmlsZW5hbWU9ImltYWdlLmpwZyINCkNvbnRlbnQtVHlwZTogaW1hZ2UvanBlZw0KDQr/2P/gABBKRklGAAEBAAABAAEAAP/bAEMAAwICAgICAwICAgMDAwMEBgQEBAQECAYGBQYJCAoKCQgJCQoMDwwKCw4LCQkNEQ0ODxAQERAKDBITEhATDxAQEP/AAAsIAAwADAEBEQD/xAAWAAEBAQAAAAAAAAAAAAAAAAAEAAX/xAAiEAACAQMDBQEAAAAAAAAAAAABAwIEERIABSEGEyIjQRT/2gAIAQEAAD8AUa1jdqVVShOmTKYY4qW1MC0syis3jITyjExBiBjYXHkDq209MlLCjqqe3HuEMp5TknGYsCR7QJA2BysOSR80euY9O3L3oOymKamrAkqWFjOEGFfERLtgyIAyvb7fnWAmoqnMqR+6tV26lsPRWOTGXmTfGEhEHn4AOBxr/9kNCi0ta3RKbWVZSGJrVFNhMWp4RA0KQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPSJwZXJzb25hbF9ub3RlIjsgZmlsZW5hbWU9InBhY3Q3OU1jT1QiDQpDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbQ0KDQp0ZXN0aW5nDQotLWt0Sm1lWUhia1RTYTFqeEQtLQ0K", + "body": "LS1rdEptZVlIYmtUU2ExanhEDQpDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9ImZ1bGxfbmFtZSI7IGZpbGVuYW1lPSJmdWxsX25hbWUudHh0Ig0KQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluDQoNCkNvbHRlbiBaaWVtYW5uDQotLWt0Sm1lWUhia1RTYTFqeEQNCkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT0icHJvZmlsZV9pbWFnZSI7IGZpbGVuYW1lPSJpbWFnZS5qcGciDQpDb250ZW50LVR5cGU6IGltYWdlL2pwZWcNCg0K/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/wAALCAAMAAwBAREA/8QAFgABAQEAAAAAAAAAAAAAAAAABAAF/8QAIhAAAgEDAwUBAAAAAAAAAAAAAQMCBBESAAUhBhMiI0EU/9oACAEBAAA/AFGtY3alVUoTpkymGOKltTAtLMorN4yE8oxMQYgY2Fx5A6ttPTJSwo6qntx7hDKeU5JxmLAke0CQNgcrDkkfNHrmPTty96DspimpqwJKlhYzhBhXxES7YMiAMr2+351gJqKpzKkfurVdupbD0Vjkxl5k3xhIRB5+ADgca//ZDQotLWt0Sm1lWUhia1RTYTFqeEQNCkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT0icGVyc29uYWxfbm90ZSI7IGZpbGVuYW1lPSJub3RlLnR4dCINCkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbg0KDQp0ZXN0aW5nDQotLWt0Sm1lWUhia1RTYTFqeEQtLQ0K", "headers": { "Accept": "application/json", "Authorization": "Bearer eyJhbGciOiJIUzI1NiIXVCJ9", diff --git a/src/PhpPact/Consumer/Model/Body/Multipart.php b/src/PhpPact/Consumer/Model/Body/Multipart.php index 0a2d1ce0d..fde72186a 100644 --- a/src/PhpPact/Consumer/Model/Body/Multipart.php +++ b/src/PhpPact/Consumer/Model/Body/Multipart.php @@ -7,7 +7,7 @@ class Multipart /** * @param array $parts */ - public function __construct(private array $parts) + public function __construct(private array $parts, private string $boundary) { $this->setParts($parts); } @@ -39,4 +39,9 @@ public function addPart(Part $part): self return $this; } + + public function getBoundary(): string + { + return $this->boundary; + } } diff --git a/src/PhpPact/Consumer/Registry/Interaction/Body/AbstractBodyRegistry.php b/src/PhpPact/Consumer/Registry/Interaction/Body/AbstractBodyRegistry.php index bd82093ef..2bb5d9209 100644 --- a/src/PhpPact/Consumer/Registry/Interaction/Body/AbstractBodyRegistry.php +++ b/src/PhpPact/Consumer/Registry/Interaction/Body/AbstractBodyRegistry.php @@ -28,8 +28,8 @@ public function withBody(Text|Binary|Multipart $body): void Text::class => $this->client->call('pactffi_with_body', $this->interactionRegistry->getId(), $this->getPart(), $body->getContentType(), $body->getContents()), Multipart::class => array_reduce( $body->getParts(), - function (bool $success, Part $part) { - $result = $this->client->call('pactffi_with_multipart_file', $this->interactionRegistry->getId(), $this->getPart(), $part->getContentType(), $part->getPath(), $part->getName()); + function (bool $success, Part $part) use ($body) { + $result = $this->client->call('pactffi_with_multipart_file_v2', $this->interactionRegistry->getId(), $this->getPart(), $part->getContentType(), $part->getPath(), $part->getName(), $body->getBoundary()); if ($result->failed instanceof CData) { throw new PartNotAddedException(FFI::string($result->failed)); }