[Unit] Product Options Improvements (#16707)

| Q               | A
|-----------------|-----
| Branch?         | api-platform-3<!-- see the comment below -->
| Bug fix?        | no
| New feature?    | no
| BC breaks?      | no
| Deprecations? | no <!-- don't forget to update the UPGRADE-*.md file
-->
| Related tickets | https://github.com/Sylius/Sylius/pull/16684
| License         | MIT

<!--
 - Bug fixes must be submitted against the 1.13 branch
 - Features and deprecations must be submitted against the 1.14 branch
- Features, removing deprecations and BC breaks must be submitted
against the 2.0 branch
 - Make sure that the correct base branch is set

To be sure you are not breaking any Backward Compatibilities, check the
documentation:

https://docs.sylius.com/en/latest/book/organization/backward-compatibility-promise.html
-->
This commit is contained in:
Karol 2024-08-14 14:03:44 +02:00 committed by GitHub
commit fdf18d5ef7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 77 additions and 87 deletions

View file

@ -16,16 +16,22 @@ namespace Sylius\Tests\Api\Admin;
use Sylius\Component\Product\Model\ProductOptionInterface;
use Sylius\Component\Product\Model\ProductOptionValueInterface;
use Sylius\Tests\Api\JsonApiTestCase;
use Sylius\Tests\Api\Utils\AdminUserLoginTrait;
use Symfony\Component\HttpFoundation\Response;
final class ProductOptionsTest extends JsonApiTestCase
{
use AdminUserLoginTrait;
protected function setUp(): void
{
parent::setUp();
$this->setUpAdminContext();
}
/** @test */
public function it_gets_a_product_option(): void
{
$this->setUpDefaultGetHeaders();
$fixtures = $this->loadFixturesFromFiles([
'authentication/api_administrator.yaml',
'channel.yaml',
@ -35,55 +41,40 @@ final class ProductOptionsTest extends JsonApiTestCase
/** @var ProductOptionInterface $productOption */
$productOption = $fixtures['product_option_color'];
$this->client->request(
method: 'GET',
uri: sprintf('/api/v2/admin/product-options/%s', $productOption->getCode()),
server: $this->headerBuilder()->withJsonLdAccept()->withAdminUserAuthorization('api@example.com')->build(),
);
$this->requestGet(sprintf('/api/v2/admin/product-options/%s', $productOption->getCode()));
$this->assertResponse(
$this->client->getResponse(),
'admin/product_option/get_product_option',
Response::HTTP_OK,
);
$this->assertResponseSuccessful('admin/product_option/get_product_option');
}
/** @test */
public function it_gets_product_options(): void
{
$this->setUpDefaultGetHeaders();
$this->loadFixturesFromFiles([
'authentication/api_administrator.yaml',
'channel.yaml',
'product/product_option.yaml',
]);
$this->client->request(
method: 'GET',
uri: '/api/v2/admin/product-options',
server: $this->headerBuilder()->withJsonLdAccept()->withAdminUserAuthorization('api@example.com')->build(),
);
$this->requestGet('/api/v2/admin/product-options');
$this->assertResponse(
$this->client->getResponse(),
'admin/product_option/get_product_options',
Response::HTTP_OK,
);
$this->assertResponseSuccessful('admin/product_option/get_product_options');
}
/** @test */
public function it_creates_a_product_option(): void
{
$this->setUpDefaultPostHeaders();
$this->loadFixturesFromFiles([
'authentication/api_administrator.yaml',
'channel.yaml',
]);
$header = array_merge($this->logInAdminUser('api@example.com'), self::CONTENT_TYPE_HEADER);
$this->client->request(
method: 'POST',
$this->requestPost(
uri: '/api/v2/admin/product-options',
server: $header,
content: json_encode([
body: [
'code' => 'NEW_COLOR',
'translations' => [
'en_US' => [
@ -101,37 +92,29 @@ final class ProductOptionsTest extends JsonApiTestCase
],
],
'position' => 9,
], \JSON_THROW_ON_ERROR),
],
);
$this->assertResponse(
$this->client->getResponse(),
'admin/product_option/post_product_option_response',
Response::HTTP_CREATED,
);
$this->assertResponseCreated('admin/product_option/post_product_option_response');
}
/** @test */
public function it_does_not_allow_to_create_a_product_option_with_invalid_data(): void
{
$this->setUpDefaultPostHeaders();
$this->loadFixturesFromFiles([
'authentication/api_administrator.yaml',
'channel.yaml',
]);
$header = array_merge($this->logInAdminUser('api@example.com'), self::CONTENT_TYPE_HEADER);
$this->client->request(
method: 'POST',
$this->requestPost(
uri: '/api/v2/admin/product-options',
server: $header,
content: json_encode([
body: [
'values' => [
[
'translations' => [
],
],
['translations' => []],
],
], \JSON_THROW_ON_ERROR),
],
);
$this->assertResponseViolations(
@ -160,21 +143,20 @@ final class ProductOptionsTest extends JsonApiTestCase
/** @test */
public function it_updates_a_product_option(): void
{
$this->setUpDefaultPutHeaders();
$fixtures = $this->loadFixturesFromFiles([
'authentication/api_administrator.yaml',
'channel.yaml',
'product/product_option.yaml',
]);
$header = array_merge($this->logInAdminUser('api@example.com'), self::CONTENT_TYPE_HEADER);
/** @var ProductOptionInterface $productOption */
$productOption = $fixtures['product_option_color'];
$this->client->request(
method: 'PUT',
$this->requestPut(
uri: sprintf('/api/v2/admin/product-options/%s', $productOption->getCode()),
server: $header,
content: json_encode([
body: [
'values' => [
[
'code' => 'CHANGED_COLOR',
@ -186,58 +168,52 @@ final class ProductOptionsTest extends JsonApiTestCase
],
],
'position' => 9,
], \JSON_THROW_ON_ERROR),
],
);
$this->assertResponse(
$this->client->getResponse(),
'admin/product_option/put_product_option_response',
Response::HTTP_OK,
);
$this->assertResponseSuccessful('admin/product_option/put_product_option_response');
}
/** @test */
public function it_does_not_update_a_product_option_with_duplicate_locale_translation(): void
{
$this->setUpDefaultPutHeaders();
$fixtures = $this->loadFixturesFromFiles([
'authentication/api_administrator.yaml',
'channel.yaml',
'product/product_option.yaml',
]);
$header = array_merge($this->logInAdminUser('api@example.com'), self::CONTENT_TYPE_HEADER);
/** @var ProductOptionInterface $productOption */
$productOption = $fixtures['product_option_color'];
$this->client->request(
method: 'PUT',
$this->requestPut(
uri: sprintf('/api/v2/admin/product-options/%s', $productOption->getCode()),
server: $header,
content: json_encode([
body: [
'translations' => [
'en_US' => [
'name' => 'New Color',
],
],
], \JSON_THROW_ON_ERROR),
],
);
$this->assertResponse(
$this->client->getResponse(),
$this->assertResponseUnprocessableEntity(
'admin/product_option/put_product_option_with_duplicate_locale_translation',
Response::HTTP_UNPROCESSABLE_ENTITY,
);
}
/** @test */
public function it_does_not_update_a_product_option_value_with_duplicate_locale_translation(): void
{
$this->setUpDefaultPutHeaders();
$fixtures = $this->loadFixturesFromFiles([
'authentication/api_administrator.yaml',
'channel.yaml',
'product/product_option.yaml',
]);
$header = array_merge($this->logInAdminUser('api@example.com'), self::CONTENT_TYPE_HEADER);
/** @var ProductOptionInterface $productOption */
$productOption = $fixtures['product_option_color'];
@ -246,11 +222,9 @@ final class ProductOptionsTest extends JsonApiTestCase
$productOptionCode = $productOption->getCode();
$this->client->request(
method: 'PUT',
uri: '/api/v2/admin/product-options/' . $productOptionCode,
server: $header,
content: json_encode([
$this->requestPut(
uri: sprintf('/api/v2/admin/product-options/%s', $productOptionCode),
body: [
'values' => [
[
'@id' => sprintf('/api/v2/admin/product-options/%s/values/%s', $productOptionCode, $productOptionValue->getCode()),
@ -261,19 +235,17 @@ final class ProductOptionsTest extends JsonApiTestCase
],
],
],
], \JSON_THROW_ON_ERROR),
],
);
$this->assertResponse(
$this->client->getResponse(),
'admin/product_option/put_product_option_value_with_duplicate_locale_translation',
Response::HTTP_UNPROCESSABLE_ENTITY,
);
$this->assertResponseUnprocessableEntity('admin/product_option/put_product_option_value_with_duplicate_locale_translation');
}
/** @test */
public function it_deletes_a_product_option(): void
{
$this->setUpDefaultDeleteHeaders();
$fixtures = $this->loadFixturesFromFiles([
'authentication/api_administrator.yaml',
'channel.yaml',
@ -283,11 +255,7 @@ final class ProductOptionsTest extends JsonApiTestCase
/** @var ProductOptionInterface $productOption */
$productOption = $fixtures['product_option_color'];
$this->client->request(
method: 'DELETE',
uri: sprintf('/api/v2/admin/product-options/%s', $productOption->getCode()),
server: $this->headerBuilder()->withJsonLdAccept()->withAdminUserAuthorization('api@example.com')->build(),
);
$this->requestDelete(sprintf('/api/v2/admin/product-options/%s', $productOption->getCode()));
$this->assertResponseCode($this->client->getResponse(), Response::HTTP_NO_CONTENT);
}

View file

@ -38,6 +38,9 @@ abstract class JsonApiTestCase extends BaseJsonApiTestCase
/** @var array <string, string> */
private array $defaultPostHeaders = [];
/** @var array <string, string> */
private array $defaultPutHeaders = [];
/** @var array <string, string> */
private array $defaultPatchHeaders = [];
@ -76,6 +79,14 @@ abstract class JsonApiTestCase extends BaseJsonApiTestCase
];
}
protected function setUpDefaultPutHeaders(): void
{
$this->defaultPutHeaders = [
'HTTP_ACCEPT' => 'application/ld+json',
'CONTENT_TYPE' => 'application/ld+json',
];
}
protected function setUpDefaultPatchHeaders(): void
{
$this->defaultPatchHeaders = [
@ -143,6 +154,20 @@ abstract class JsonApiTestCase extends BaseJsonApiTestCase
return $this->request('POST', $uri, $queryParameters, $headers, $body);
}
/**
* @param array<string, array<string>|string> $queryParameters
* @param array<string, string> $headers
* @param array<string, mixed> $body
*/
protected function requestPut(string $uri, ?array $body = null, array $queryParameters = [], array $headers = []): Crawler
{
if (!empty($this->defaultPutHeaders)) {
$headers = array_merge($this->defaultPutHeaders, $headers);
}
return $this->request('PUT', $uri, $queryParameters, $headers, $body);
}
/**
* @param array<string, array<string>|string> $queryParameters
* @param array<string, string> $headers

View file

@ -20,15 +20,12 @@ final class ProductOptionsTest extends JsonApiTestCase
/** @test */
public function it_returns_product_option(): void
{
$this->setUpDefaultGetHeaders();
$this->loadFixturesFromFile('product/product_with_many_locales.yaml');
$this->client->request(
method: 'GET',
uri: '/api/v2/shop/product-options/COLOR',
server: self::CONTENT_TYPE_HEADER,
);
$response = $this->client->getResponse();
$this->requestGet('/api/v2/shop/product-options/COLOR');
$this->assertResponse($response, 'shop/product_option/get_product_option');
$this->assertResponseSuccessful( 'shop/product_option/get_product_option');
}
}