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 +}