diff --git a/src/Sylius/Bundle/ApiBundle/Resources/config/api_resources/ShippingCategory.xml b/src/Sylius/Bundle/ApiBundle/Resources/config/api_resources/ShippingCategory.xml
index f1b2f48bbc..ed8d0f675a 100644
--- a/src/Sylius/Bundle/ApiBundle/Resources/config/api_resources/ShippingCategory.xml
+++ b/src/Sylius/Bundle/ApiBundle/Resources/config/api_resources/ShippingCategory.xml
@@ -33,6 +33,9 @@
admin:shipping_category:create
+
+ admin:shipping_category:read
+
@@ -49,6 +52,9 @@
admin:shipping_category:update
+
+ admin:shipping_category:read
+
diff --git a/src/Sylius/Bundle/ApiBundle/Resources/config/serialization/ShippingCategory.xml b/src/Sylius/Bundle/ApiBundle/Resources/config/serialization/ShippingCategory.xml
index b24784b976..b560733692 100644
--- a/src/Sylius/Bundle/ApiBundle/Resources/config/serialization/ShippingCategory.xml
+++ b/src/Sylius/Bundle/ApiBundle/Resources/config/serialization/ShippingCategory.xml
@@ -16,9 +16,6 @@
xsi:schemaLocation="http://symfony.com/schema/dic/serializer-mapping https://symfony.com/schema/dic/serializer-mapping/serializer-mapping-1.0.xsd"
>
-
- admin:shipping_category:read
-
admin:shipping_category:read
admin:shipping_category:create
diff --git a/tests/Api/Admin/ShippingCategoriesTest.php b/tests/Api/Admin/ShippingCategoriesTest.php
new file mode 100644
index 0000000000..15ce7d01d5
--- /dev/null
+++ b/tests/Api/Admin/ShippingCategoriesTest.php
@@ -0,0 +1,131 @@
+loadFixturesFromFiles(['authentication/api_administrator.yaml', 'shipping_category.yaml']);
+ $header = $this->getLoggedHeader();
+
+ /** @var ShippingCategoryInterface $shippingCategory */
+ $shippingCategory = $fixtures['shipping_category_special'];
+
+ $this->client->request(
+ 'GET',
+ sprintf('/api/v2/admin/shipping-categories/%s', $shippingCategory->getCode()),
+ [],
+ [],
+ $header,
+ );
+
+ $this->assertResponse(
+ $this->client->getResponse(),
+ 'admin/shipping_category/get_shipping_category_response',
+ Response::HTTP_OK,
+ );
+ }
+
+ /** @test */
+ public function it_gets_shipping_categories(): void
+ {
+ $this->loadFixturesFromFiles(['authentication/api_administrator.yaml', 'shipping_category.yaml']);
+ $header = $this->getLoggedHeader();
+
+ $this->client->request(
+ 'GET',
+ '/api/v2/admin/shipping-categories',
+ [],
+ [],
+ $header,
+ );
+
+ $this->assertResponse(
+ $this->client->getResponse(),
+ 'admin/shipping_category/get_shipping_categories_response',
+ Response::HTTP_OK,
+ );
+ }
+
+ /** @test */
+ public function it_creates_a_shipping_category(): void
+ {
+ $this->loadFixturesFromFiles(['authentication/api_administrator.yaml']);
+ $header = $this->getLoggedHeader();
+
+ $this->client->request(
+ 'POST',
+ '/api/v2/admin/shipping-categories',
+ [],
+ [],
+ $header,
+ json_encode([
+ 'code' => 'ultra',
+ 'name' => 'Ultra',
+ ], JSON_THROW_ON_ERROR),
+ );
+
+ $this->assertResponse(
+ $this->client->getResponse(),
+ 'admin/shipping_category/post_shipping_category_response',
+ Response::HTTP_CREATED,
+ );
+ }
+
+ /** @test */
+ public function it_updates_an_existing_shipping_category(): void
+ {
+ $fixtures = $this->loadFixturesFromFiles(['authentication/api_administrator.yaml', 'shipping_category.yaml']);
+
+ /** @var ShippingCategoryInterface $shippingCategory */
+ $shippingCategory = $fixtures['shipping_category_default'];
+
+ $header = $this->getLoggedHeader();
+
+ $this->client->request(
+ 'PUT',
+ '/api/v2/admin/shipping-categories/' . $shippingCategory->getCode(),
+ [],
+ [],
+ $header,
+ json_encode([
+ 'name' => 'Not so default',
+ ], JSON_THROW_ON_ERROR),
+ );
+
+ $this->assertResponse(
+ $this->client->getResponse(),
+ 'admin/shipping_category/put_shipping_category_response',
+ Response::HTTP_OK,
+ );
+ }
+
+ private function getLoggedHeader(): array
+ {
+ $token = $this->logInAdminUser('api@example.com');
+ $authorizationHeader = self::$kernel->getContainer()->getParameter('sylius.api.authorization_header');
+ $header['HTTP_' . $authorizationHeader] = 'Bearer ' . $token;
+
+ return array_merge($header, self::CONTENT_TYPE_HEADER);
+ }
+}
diff --git a/tests/Api/DataFixtures/ORM/shipping_category.yaml b/tests/Api/DataFixtures/ORM/shipping_category.yaml
new file mode 100644
index 0000000000..851dae9627
--- /dev/null
+++ b/tests/Api/DataFixtures/ORM/shipping_category.yaml
@@ -0,0 +1,8 @@
+Sylius\Component\Shipping\Model\ShippingCategory:
+ shipping_category_default:
+ code: 'default'
+ name: 'Default'
+ shipping_category_special:
+ code: 'special'
+ name: 'Special'
+ description: 'For special care'
diff --git a/tests/Api/Responses/Expected/admin/shipping_category/get_shipping_categories_response.json b/tests/Api/Responses/Expected/admin/shipping_category/get_shipping_categories_response.json
new file mode 100644
index 0000000000..2c827a17d6
--- /dev/null
+++ b/tests/Api/Responses/Expected/admin/shipping_category/get_shipping_categories_response.json
@@ -0,0 +1,26 @@
+{
+ "@context": "\/api\/v2\/contexts\/ShippingCategory",
+ "@id": "\/api\/v2\/admin\/shipping-categories",
+ "@type": "hydra:Collection",
+ "hydra:member": [
+ {
+ "@id": "\/api\/v2\/admin\/shipping-categories\/default",
+ "@type": "ShippingCategory",
+ "code": "default",
+ "name": "Default",
+ "description": null,
+ "createdAt": @date@,
+ "updatedAt": @date@
+ },
+ {
+ "@id": "\/api\/v2\/admin\/shipping-categories\/special",
+ "@type": "ShippingCategory",
+ "code": "special",
+ "name": "Special",
+ "description": "For special care",
+ "createdAt": @date@,
+ "updatedAt": @date@
+ }
+ ],
+ "hydra:totalItems": 2
+}
diff --git a/tests/Api/Responses/Expected/admin/shipping_category/get_shipping_category_response.json b/tests/Api/Responses/Expected/admin/shipping_category/get_shipping_category_response.json
new file mode 100644
index 0000000000..fdab8f0f01
--- /dev/null
+++ b/tests/Api/Responses/Expected/admin/shipping_category/get_shipping_category_response.json
@@ -0,0 +1,10 @@
+{
+ "@context": "\/api\/v2\/contexts\/ShippingCategory",
+ "@id": "\/api\/v2\/admin\/shipping-categories\/special",
+ "@type": "ShippingCategory",
+ "code": "special",
+ "name": "Special",
+ "description": "For special care",
+ "createdAt": @date@,
+ "updatedAt": @date@
+}
diff --git a/tests/Api/Responses/Expected/admin/shipping_category/post_shipping_category_response.json b/tests/Api/Responses/Expected/admin/shipping_category/post_shipping_category_response.json
new file mode 100644
index 0000000000..2e9d919df6
--- /dev/null
+++ b/tests/Api/Responses/Expected/admin/shipping_category/post_shipping_category_response.json
@@ -0,0 +1,10 @@
+{
+ "@context": "\/api\/v2\/contexts\/ShippingCategory",
+ "@id": "\/api\/v2\/admin\/shipping-categories\/ultra",
+ "@type": "ShippingCategory",
+ "code": "ultra",
+ "name": "Ultra",
+ "description": null,
+ "createdAt": @date@,
+ "updatedAt": @date@
+}
diff --git a/tests/Api/Responses/Expected/admin/shipping_category/put_shipping_category_response.json b/tests/Api/Responses/Expected/admin/shipping_category/put_shipping_category_response.json
new file mode 100644
index 0000000000..2c63a30345
--- /dev/null
+++ b/tests/Api/Responses/Expected/admin/shipping_category/put_shipping_category_response.json
@@ -0,0 +1,10 @@
+{
+ "@context": "\/api\/v2\/contexts\/ShippingCategory",
+ "@id": "\/api\/v2\/admin\/shipping-categories\/default",
+ "@type": "ShippingCategory",
+ "code": "default",
+ "name": "Not so default",
+ "description": null,
+ "createdAt": @date@,
+ "updatedAt": @date@
+}