diff --git a/src/Sylius/Bundle/ApiBundle/Resources/config/api_resources/AdminUser.xml b/src/Sylius/Bundle/ApiBundle/Resources/config/api_resources/AdminUser.xml
index 3ad43e702d..2e30c87ad3 100644
--- a/src/Sylius/Bundle/ApiBundle/Resources/config/api_resources/AdminUser.xml
+++ b/src/Sylius/Bundle/ApiBundle/Resources/config/api_resources/AdminUser.xml
@@ -34,9 +34,12 @@
sylius
sylius_user_create
-
+
admin:admin_user:create
+
+ admin:admin_user:read
+
@@ -53,6 +56,9 @@
admin:admin_user:update
+
+ admin:admin_user:read
+
diff --git a/tests/Api/Admin/AdminUsersTest.php b/tests/Api/Admin/AdminUsersTest.php
index 3737c83762..67a0f172ae 100644
--- a/tests/Api/Admin/AdminUsersTest.php
+++ b/tests/Api/Admin/AdminUsersTest.php
@@ -13,12 +13,16 @@ declare(strict_types=1);
namespace Sylius\Tests\Api\Admin;
+use Sylius\Component\Core\Model\AdminUserInterface;
use Sylius\Tests\Api\JsonApiTestCase;
+use Sylius\Tests\Api\Utils\AdminUserLoginTrait;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
final class AdminUsersTest extends JsonApiTestCase
{
+ use AdminUserLoginTrait;
+
/** @test */
public function it_allows_admin_users_to_log_in(): void
{
@@ -54,10 +58,141 @@ final class AdminUsersTest extends JsonApiTestCase
self::CONTENT_TYPE_HEADER,
json_encode([
'email' => 'api@example.com',
- ])
+ ], JSON_THROW_ON_ERROR),
);
$response = $this->client->getResponse();
$this->assertResponseCode($response, Response::HTTP_ACCEPTED);
}
+
+ /** @test */
+ public function it_gets_administrators(): void
+ {
+ $this->loadFixturesFromFiles(['authentication/api_administrator.yaml', 'administrator.yaml']);
+ $header = $this->getLoggedHeader();
+
+ $this->client->request('GET', '/api/v2/admin/administrators', [], [], $header,);
+
+ $this->assertResponse(
+ $this->client->getResponse(),
+ 'admin/administrator/get_administrators_response',
+ Response::HTTP_OK,
+ );
+ }
+
+ /** @test */
+ public function it_gets_an_administrator(): void
+ {
+ $fixtures = $this->loadFixturesFromFiles(['authentication/api_administrator.yaml', 'administrator.yaml']);
+ $header = $this->getLoggedHeader();
+
+ /** @var AdminUserInterface $administrator */
+ $administrator = $fixtures['admin_user_wilhelm'];
+
+ $this->client->request(
+ 'GET',
+ sprintf('/api/v2/admin/administrators/%s', $administrator->getId()),
+ [],
+ [],
+ $header,
+ );
+
+ $this->assertResponse(
+ $this->client->getResponse(),
+ 'admin/administrator/get_administrator_response',
+ Response::HTTP_OK,
+ );
+ }
+
+ /** @test */
+ public function it_creates_an_administrator(): void
+ {
+ $this->loadFixturesFromFile('authentication/api_administrator.yaml');
+ $header = $this->getLoggedHeader();
+
+ $this->client->request(
+ 'POST',
+ '/api/v2/admin/administrators',
+ [],
+ [],
+ $header,
+ json_encode([
+ 'email' => 'j.api@test.com',
+ 'username' => 'johnApi',
+ 'plainPassword' => 'very-secure',
+ 'enabled' => true,
+ 'firstName' => 'John',
+ 'lastName' => 'Api',
+ 'localeCode' => 'ga_IE',
+ ], JSON_THROW_ON_ERROR),
+ );
+
+ $this->assertResponse(
+ $this->client->getResponse(),
+ 'admin/administrator/create_administrator_response',
+ Response::HTTP_CREATED,
+ );
+ }
+
+ /** @test */
+ public function it_updates_an_administrator(): void
+ {
+ $fixtures = $this->loadFixturesFromFiles(['authentication/api_administrator.yaml', 'administrator.yaml']);
+ $header = $this->getLoggedHeader();
+
+ /** @var AdminUserInterface $administrator */
+ $administrator = $fixtures['admin_user_wilhelm'];
+
+ $this->client->request(
+ 'PUT',
+ sprintf('/api/v2/admin/administrators/%s', $administrator->getId()),
+ [],
+ [],
+ $header,
+ json_encode([
+ 'email' => 'j.api@test.com',
+ 'username' => 'johnApi',
+ 'plainPassword' => 'very-secure',
+ 'enabled' => false,
+ 'firstName' => 'John',
+ 'lastName' => 'Api',
+ 'localeCode' => 'ga_IE',
+ ], JSON_THROW_ON_ERROR),
+ );
+
+ $this->assertResponse(
+ $this->client->getResponse(),
+ 'admin/administrator/put_administrator_response',
+ Response::HTTP_OK,
+ );
+ }
+
+ /** @test */
+ public function it_deletes_an_administrator(): void
+ {
+ $fixtures = $this->loadFixturesFromFiles(['authentication/api_administrator.yaml', 'administrator.yaml']);
+ $header = $this->getLoggedHeader();
+
+ /** @var AdminUserInterface $administrator */
+ $administrator = $fixtures['admin_user_wilhelm'];
+
+ $this->client->request(
+ 'DELETE',
+ sprintf('/api/v2/admin/administrators/%s', $administrator->getId()),
+ [],
+ [],
+ $header
+ );
+
+ $this->assertResponseCode($this->client->getResponse(), Response::HTTP_NO_CONTENT);
+ }
+
+ 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/administrator.yaml b/tests/Api/DataFixtures/ORM/administrator.yaml
new file mode 100644
index 0000000000..6ac2fcf651
--- /dev/null
+++ b/tests/Api/DataFixtures/ORM/administrator.yaml
@@ -0,0 +1,8 @@
+Sylius\Component\Core\Model\AdminUser:
+ admin_user_{rich, susie, wilhelm}:
+ plainPassword: sylius
+ roles: [ROLE_API_ACCESS]
+ enabled: true
+ email: "api_\\@admin.com"
+ username:
+ localeCode: en
diff --git a/tests/Api/Responses/Expected/admin/administrator/create_administrator_response.json b/tests/Api/Responses/Expected/admin/administrator/create_administrator_response.json
new file mode 100644
index 0000000000..6c9a133515
--- /dev/null
+++ b/tests/Api/Responses/Expected/admin/administrator/create_administrator_response.json
@@ -0,0 +1,17 @@
+{
+ "@context": "\/api\/v2\/contexts\/Administrator",
+ "@id": "\/api\/v2\/admin\/administrators\/@integer@",
+ "@type": "Administrator",
+ "firstName": "John",
+ "lastName": "Api",
+ "localeCode": "ga_IE",
+ "avatar": null,
+ "id": @integer@,
+ "username": "johnApi",
+ "lastLogin": null,
+ "verifiedAt": null,
+ "email": "j.api@test.com",
+ "createdAt": @date@,
+ "updatedAt": @date@,
+ "enabled": true
+}
diff --git a/tests/Api/Responses/Expected/admin/administrator/get_administrator_response.json b/tests/Api/Responses/Expected/admin/administrator/get_administrator_response.json
new file mode 100644
index 0000000000..86d6010c0b
--- /dev/null
+++ b/tests/Api/Responses/Expected/admin/administrator/get_administrator_response.json
@@ -0,0 +1,17 @@
+{
+ "@context": "\/api\/v2\/contexts\/Administrator",
+ "@id": "\/api\/v2\/admin\/administrators\/@integer@",
+ "@type": "Administrator",
+ "firstName": null,
+ "lastName": null,
+ "localeCode": "en",
+ "avatar": null,
+ "id": @integer@,
+ "username": "wilhelm",
+ "lastLogin": null,
+ "verifiedAt": null,
+ "email": "api_wilhelm@admin.com",
+ "createdAt": @date@,
+ "updatedAt": @date@,
+ "enabled": true
+}
diff --git a/tests/Api/Responses/Expected/admin/administrator/get_administrators_response.json b/tests/Api/Responses/Expected/admin/administrator/get_administrators_response.json
new file mode 100644
index 0000000000..c785b9d29b
--- /dev/null
+++ b/tests/Api/Responses/Expected/admin/administrator/get_administrators_response.json
@@ -0,0 +1,72 @@
+{
+ "@context": "\/api\/v2\/contexts\/Administrator",
+ "@id": "\/api\/v2\/admin\/administrators",
+ "@type": "hydra:Collection",
+ "hydra:member": [
+ {
+ "@id": "\/api\/v2\/admin\/administrators\/@integer@",
+ "@type": "Administrator",
+ "firstName": null,
+ "lastName": null,
+ "localeCode": "en",
+ "avatar": null,
+ "id": @integer@,
+ "username": "rich",
+ "lastLogin": null,
+ "verifiedAt": null,
+ "email": "api_rich@admin.com",
+ "createdAt": @date@,
+ "updatedAt": @date@,
+ "enabled": true
+ },
+ {
+ "@id": "\/api\/v2\/admin\/administrators\/@integer@",
+ "@type": "Administrator",
+ "firstName": null,
+ "lastName": null,
+ "localeCode": "en",
+ "avatar": null,
+ "id": @integer@,
+ "username": "susie",
+ "lastLogin": null,
+ "verifiedAt": null,
+ "email": "api_susie@admin.com",
+ "createdAt": @date@,
+ "updatedAt": @date@,
+ "enabled": true
+ },
+ {
+ "@id": "\/api\/v2\/admin\/administrators\/@integer@",
+ "@type": "Administrator",
+ "firstName": null,
+ "lastName": null,
+ "localeCode": "en",
+ "avatar": null,
+ "id": @integer@,
+ "username": "wilhelm",
+ "lastLogin": null,
+ "verifiedAt": null,
+ "email": "api_wilhelm@admin.com",
+ "createdAt": @date@,
+ "updatedAt": @date@,
+ "enabled": true
+ },
+ {
+ "@id": "\/api\/v2\/admin\/administrators\/@integer@",
+ "@type": "Administrator",
+ "firstName": null,
+ "lastName": null,
+ "localeCode": "en",
+ "avatar": null,
+ "id": @integer@,
+ "username": "sylius",
+ "lastLogin": null,
+ "verifiedAt": null,
+ "email": "api@example.com",
+ "createdAt": @date@,
+ "updatedAt": @date@,
+ "enabled": true
+ }
+ ],
+ "hydra:totalItems": 4
+}
diff --git a/tests/Api/Responses/Expected/admin/administrator/put_administrator_response.json b/tests/Api/Responses/Expected/admin/administrator/put_administrator_response.json
new file mode 100644
index 0000000000..75b74fabff
--- /dev/null
+++ b/tests/Api/Responses/Expected/admin/administrator/put_administrator_response.json
@@ -0,0 +1,17 @@
+{
+ "@context": "\/api\/v2\/contexts\/Administrator",
+ "@id": "\/api\/v2\/admin\/administrators\/@integer@",
+ "@type": "Administrator",
+ "firstName": "John",
+ "lastName": "Api",
+ "localeCode": "ga_IE",
+ "avatar": null,
+ "id": @integer@,
+ "username": "johnApi",
+ "lastLogin": null,
+ "verifiedAt": null,
+ "email": "j.api@test.com",
+ "createdAt": @date@,
+ "updatedAt": @date@,
+ "enabled": false
+}