Skip to content

Commit 84aebe1

Browse files
committed
ISSUE-345: tests + swagger
1 parent 5239f63 commit 84aebe1

13 files changed

+744
-6
lines changed

src/Identity/Controller/AdminAttributeDefinitionController.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ public function __construct(
7676
new OA\Response(
7777
response: 201,
7878
description: 'Success',
79-
content: new OA\JsonContent(ref: '#/components/schemas/AttributeDefinition')
79+
content: new OA\JsonContent(ref: '#/components/schemas/AdminAttributeDefinition')
8080
),
8181
new OA\Response(
8282
response: 403,
@@ -144,7 +144,7 @@ public function create(Request $request): JsonResponse
144144
new OA\Response(
145145
response: 200,
146146
description: 'Success',
147-
content: new OA\JsonContent(ref: '#/components/schemas/AttributeDefinition')
147+
content: new OA\JsonContent(ref: '#/components/schemas/AdminAttributeDefinition')
148148
),
149149
new OA\Response(
150150
response: 403,
@@ -272,7 +272,7 @@ public function delete(
272272
new OA\Property(
273273
property: 'items',
274274
type: 'array',
275-
items: new OA\Items(ref: '#/components/schemas/AttributeDefinition')
275+
items: new OA\Items(ref: '#/components/schemas/AdminAttributeDefinition')
276276
),
277277
new OA\Property(property: 'pagination', ref: '#/components/schemas/CursorPagination')
278278
],
@@ -326,7 +326,7 @@ public function getPaginated(Request $request): JsonResponse
326326
new OA\Response(
327327
response: 200,
328328
description: 'Success',
329-
content: new OA\JsonContent(ref: '#/components/schemas/AttributeDefinition')
329+
content: new OA\JsonContent(ref: '#/components/schemas/AdminAttributeDefinition')
330330
),
331331
new OA\Response(
332332
response: 403,

src/Identity/Controller/AdminAttributeValueController.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ public function createOrUpdate(
123123

124124
#[Route('/{adminId}/{definitionId}', name: 'delete_admin_attribute', methods: ['DELETE'])]
125125
#[OA\Delete(
126-
path: '/administrators/attribute-values/{admin}/{definitionId}',
126+
path: '/administrators/attribute-values/{adminId}/{definitionId}',
127127
description: 'Deletes a single admin attribute.',
128128
summary: 'Deletes an attribute.',
129129
tags: ['admin-attributes'],
@@ -250,7 +250,7 @@ public function getPaginated(
250250
): JsonResponse {
251251
$this->requireAuthentication($request);
252252
if (!$admin) {
253-
$this->createNotFoundException('Administrator not found.');
253+
throw $this->createNotFoundException('Administrator not found.');
254254
}
255255

256256
$filter = (new AdminAttributeValueFilter())->setAdminId($admin->getId());

src/Identity/OpenApi/SwaggerSchemasResponse.php

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,28 @@
2222
],
2323
type: 'object'
2424
)]
25+
#[OA\Schema(
26+
schema: 'AdminAttributeDefinition',
27+
properties: [
28+
new OA\Property(property: 'id', type: 'integer', example: 1),
29+
new OA\Property(property: 'name', type: 'string', example: 'Country'),
30+
new OA\Property(property: 'type', type: 'string', example: 'checkbox'),
31+
new OA\Property(property: 'list_order', type: 'integer', example: 12),
32+
new OA\Property(property: 'default_value', type: 'string', example: 'United States'),
33+
new OA\Property(property: 'required', type: 'boolean', example: true),
34+
new OA\Property(property: 'table_name', type: 'string', example: 'list_attributes'),
35+
],
36+
type: 'object'
37+
)]
38+
#[OA\Schema(
39+
schema: 'AdminAttributeValue',
40+
properties: [
41+
new OA\Property(property: 'administrator', ref: '#/components/schemas/Administrator'),
42+
new OA\Property(property: 'definition', ref: '#/components/schemas/AttributeDefinition'),
43+
new OA\Property(property: 'value', type: 'string', example: 'United States'),
44+
],
45+
type: 'object'
46+
)]
2547
class SwaggerSchemasResponse
2648
{
2749
}
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpList\RestBundle\Tests\Integration\Identity\Controller;
6+
7+
use PhpList\Core\Domain\Identity\Repository\AdminAttributeDefinitionRepository;
8+
use PhpList\RestBundle\Identity\Controller\AdminAttributeDefinitionController;
9+
use PhpList\RestBundle\Tests\Integration\Common\AbstractTestController;
10+
use PhpList\RestBundle\Tests\Integration\Identity\Fixtures\AdminAttributeDefinitionFixture;
11+
12+
class AdminAttributeDefinitionControllerTest extends AbstractTestController
13+
{
14+
private ?AdminAttributeDefinitionRepository $definitionRepository = null;
15+
16+
protected function setUp(): void
17+
{
18+
parent::setUp();
19+
$this->definitionRepository = self::getContainer()->get(AdminAttributeDefinitionRepository::class);
20+
}
21+
22+
public function testControllerIsAvailableViaContainer(): void
23+
{
24+
self::assertInstanceOf(
25+
AdminAttributeDefinitionController::class,
26+
self::getContainer()->get(AdminAttributeDefinitionController::class)
27+
);
28+
}
29+
30+
public function testCreateAttributeDefinitionWithValidDataReturnsCreated(): void
31+
{
32+
$this->authenticatedJsonRequest('post', '/api/v2/administrators/attributes', [], [], [], json_encode([
33+
'name' => 'Test Attribute',
34+
'type' => 'text',
35+
'order' => 1,
36+
'defaultValue' => 'default',
37+
'required' => true,
38+
'tableName' => 'test_table',
39+
]));
40+
41+
$this->assertHttpCreated();
42+
$data = $this->getDecodedJsonResponseContent();
43+
self::assertSame('Test Attribute', $data['name']);
44+
self::assertSame('text', $data['type']);
45+
self::assertSame(1, $data['list_order']);
46+
self::assertSame('default', $data['default_value']);
47+
self::assertTrue($data['required']);
48+
self::assertSame('test_table', $data['table_name']);
49+
}
50+
51+
public function testUpdateAttributeDefinitionReturnsOk(): void
52+
{
53+
$this->loadFixtures([AdminAttributeDefinitionFixture::class]);
54+
$id = 2;
55+
56+
$this->authenticatedJsonRequest('put', '/api/v2/administrators/attributes/' . $id, [], [], [], json_encode([
57+
'name' => 'Updated Attribute',
58+
'type' => 'checkbox',
59+
'required' => true,
60+
]));
61+
62+
$this->assertHttpOkay();
63+
$data = $this->getDecodedJsonResponseContent();
64+
self::assertSame('Updated Attribute', $data['name']);
65+
self::assertSame('checkbox', $data['type']);
66+
self::assertTrue($data['required']);
67+
}
68+
69+
public function testDeleteAttributeDefinitionReturnsNoContent(): void
70+
{
71+
$this->loadFixtures([AdminAttributeDefinitionFixture::class]);
72+
$id = 3;
73+
74+
$this->authenticatedJsonRequest('delete', '/api/v2/administrators/attributes/' . $id);
75+
$this->assertHttpNoContent();
76+
77+
self::assertNull($this->definitionRepository->find($id));
78+
}
79+
80+
public function testGetPaginatedReturnsOk(): void
81+
{
82+
$this->loadFixtures([AdminAttributeDefinitionFixture::class]);
83+
84+
$this->authenticatedJsonRequest('get', '/api/v2/administrators/attributes');
85+
$this->assertHttpOkay();
86+
$data = $this->getDecodedJsonResponseContent();
87+
self::assertArrayHasKey('items', $data);
88+
self::assertArrayHasKey('pagination', $data);
89+
self::assertGreaterThanOrEqual(2, count($data['items']));
90+
}
91+
92+
public function testGetAttributeDefinitionReturnsData(): void
93+
{
94+
$this->loadFixtures([AdminAttributeDefinitionFixture::class]);
95+
$id = 6;
96+
97+
$this->authenticatedJsonRequest('get', '/api/v2/administrators/attributes/' . $id);
98+
$this->assertHttpOkay();
99+
$data = $this->getDecodedJsonResponseContent();
100+
self::assertSame('Test Get Attribute', $data['name']);
101+
self::assertSame('text', $data['type']);
102+
}
103+
104+
public function testGetAttributeDefinitionNotFound(): void
105+
{
106+
$this->authenticatedJsonRequest('get', '/api/v2/administrators/attributes/999999');
107+
$this->assertHttpNotFound();
108+
}
109+
110+
public function testCreateAttributeDefinitionWithInvalidJsonReturns400(): void
111+
{
112+
$this->authenticatedJsonRequest('post', '/api/v2/administrators/attributes', [], [], [], 'not json');
113+
$this->assertHttpBadRequest();
114+
}
115+
116+
public function testCreateAttributeDefinitionWithMissingFieldsReturns422(): void
117+
{
118+
$this->authenticatedJsonRequest('post', '/api/v2/administrators/attributes', [], [], [], json_encode([]));
119+
$this->assertHttpUnprocessableEntity();
120+
}
121+
122+
public function testUpdateAttributeDefinitionWithInvalidIdReturns404(): void
123+
{
124+
$this->authenticatedJsonRequest('put', '/api/v2/administrators/attributes/999999', [], [], [], json_encode([
125+
'name' => 'Updated Name'
126+
]));
127+
$this->assertHttpNotFound();
128+
}
129+
}
Lines changed: 185 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,185 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpList\RestBundle\Tests\Integration\Identity\Controller;
6+
7+
use PhpList\RestBundle\Identity\Controller\AdminAttributeValueController;
8+
use PhpList\RestBundle\Tests\Integration\Common\AbstractTestController;
9+
use PhpList\RestBundle\Tests\Integration\Identity\Fixtures\AdministratorFixture;
10+
use PhpList\RestBundle\Tests\Integration\Identity\Fixtures\AdminAttributeDefinitionFixture;
11+
use PhpList\RestBundle\Tests\Integration\Identity\Fixtures\AdminAttributeValueFixture;
12+
13+
class AdminAttributeValueControllerTest extends AbstractTestController
14+
{
15+
public function testControllerIsAvailableViaContainer(): void
16+
{
17+
self::assertInstanceOf(
18+
AdminAttributeValueController::class,
19+
self::getContainer()->get(AdminAttributeValueController::class)
20+
);
21+
}
22+
23+
public function testCreateOrUpdateAttributeValueWithValidDataReturnsCreated(): void
24+
{
25+
$this->loadFixtures([AdministratorFixture::class, AdminAttributeDefinitionFixture::class]);
26+
$definitionId = 1;
27+
$adminId = 1;
28+
29+
$this->authenticatedJsonRequest(
30+
'post',
31+
'/api/v2/administrators/attribute-values/' . $adminId . '/' . $definitionId,
32+
[],
33+
[],
34+
[],
35+
json_encode(['value' => 'test value'])
36+
);
37+
38+
$this->assertHttpCreated();
39+
$data = $this->getDecodedJsonResponseContent();
40+
self::assertSame('test value', $data['value']);
41+
self::assertSame($definitionId, $data['definition']['id']);
42+
self::assertSame($adminId, $data['administrator']['id']);
43+
}
44+
45+
public function testUpdateAttributeValueReturnsOk(): void
46+
{
47+
$this->loadFixtures([
48+
AdministratorFixture::class,
49+
AdminAttributeDefinitionFixture::class,
50+
AdminAttributeValueFixture::class
51+
]);
52+
$definitionId = 7;
53+
$adminId = 1;
54+
55+
$this->authenticatedJsonRequest(
56+
'post',
57+
'/api/v2/administrators/attribute-values/' . $adminId . '/' . $definitionId,
58+
[],
59+
[],
60+
[],
61+
json_encode(['value' => 'updated value'])
62+
);
63+
64+
$this->assertHttpCreated();
65+
$data = $this->getDecodedJsonResponseContent();
66+
self::assertSame('updated value', $data['value']);
67+
}
68+
69+
public function testDeleteAttributeValueReturnsNoContent(): void
70+
{
71+
$this->loadFixtures([
72+
AdministratorFixture::class,
73+
AdminAttributeDefinitionFixture::class,
74+
AdminAttributeValueFixture::class
75+
]);
76+
$definitionId = 8;
77+
$adminId = 1;
78+
79+
$this->authenticatedJsonRequest(
80+
'delete',
81+
'/api/v2/administrators/attribute-values/' . $adminId . '/' . $definitionId
82+
);
83+
$this->assertHttpNoContent();
84+
}
85+
86+
public function testGetPaginatedReturnsOk(): void
87+
{
88+
$this->loadFixtures([
89+
AdministratorFixture::class,
90+
AdminAttributeDefinitionFixture::class,
91+
AdminAttributeValueFixture::class
92+
]);
93+
$adminId = 1;
94+
95+
$this->authenticatedJsonRequest('get', '/api/v2/administrators/attribute-values/' . $adminId);
96+
$this->assertHttpOkay();
97+
$data = $this->getDecodedJsonResponseContent();
98+
self::assertArrayHasKey('items', $data);
99+
self::assertArrayHasKey('pagination', $data);
100+
self::assertGreaterThanOrEqual(2, count($data['items']));
101+
}
102+
103+
public function testGetAttributeValueReturnsData(): void
104+
{
105+
$this->loadFixtures([
106+
AdministratorFixture::class,
107+
AdminAttributeDefinitionFixture::class,
108+
AdminAttributeValueFixture::class
109+
]);
110+
$definitionId = 11;
111+
$adminId = 1;
112+
113+
$this->authenticatedJsonRequest(
114+
'get',
115+
'/api/v2/administrators/attribute-values/' . $adminId . '/' . $definitionId
116+
);
117+
$this->assertHttpOkay();
118+
$data = $this->getDecodedJsonResponseContent();
119+
self::assertSame('test get value', $data['value']);
120+
}
121+
122+
public function testGetAttributeValueNotFound(): void
123+
{
124+
$this->loadFixtures([AdministratorFixture::class]);
125+
$adminId = 1;
126+
127+
$this->authenticatedJsonRequest(
128+
'get',
129+
'/api/v2/administrators/attribute-values/' . $adminId . '/999999'
130+
);
131+
$this->assertHttpNotFound();
132+
}
133+
134+
public function testCreateAttributeValueWithInvalidJsonReturns400(): void
135+
{
136+
$this->loadFixtures([
137+
AdministratorFixture::class,
138+
AdminAttributeDefinitionFixture::class
139+
]);
140+
$definitionId = 12;
141+
$adminId = 1;
142+
143+
$this->authenticatedJsonRequest(
144+
'post',
145+
'/api/v2/administrators/attribute-values/' . $adminId . '/' . $definitionId,
146+
[],
147+
[],
148+
[],
149+
'not json'
150+
);
151+
$this->assertHttpBadRequest();
152+
}
153+
154+
public function testCreateAttributeValueWithInvalidDefinitionIdReturns404(): void
155+
{
156+
$this->loadFixtures([AdministratorFixture::class]);
157+
$adminId = 1;
158+
159+
$this->authenticatedJsonRequest(
160+
'post',
161+
'/api/v2/administrators/attribute-values/' . $adminId . '/999999',
162+
[],
163+
[],
164+
[],
165+
json_encode(['value' => 'test value'])
166+
);
167+
$this->assertHttpNotFound();
168+
}
169+
170+
public function testCreateAttributeValueWithInvalidAdminIdReturns404(): void
171+
{
172+
$this->loadFixtures([AdminAttributeDefinitionFixture::class]);
173+
$definitionId = 13;
174+
175+
$this->authenticatedJsonRequest(
176+
'post',
177+
'/api/v2/administrators/attribute-values/999999/' . $definitionId,
178+
[],
179+
[],
180+
[],
181+
json_encode(['value' => 'test value'])
182+
);
183+
$this->assertHttpNotFound();
184+
}
185+
}

0 commit comments

Comments
 (0)