mirror of
https://github.com/Sylius/Sylius.git
synced 2026-07-14 09:02:12 +00:00
[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:
commit
fdf18d5ef7
3 changed files with 77 additions and 87 deletions
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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');
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue