Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 84aebe1

Browse files
committedMay 18, 2025·
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+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
id,name,type,list_order,default_value,required,table_name
2+
1,"Test Attribute","text",1,"default",1,"test_table"
3+
2,"Original Attribute","text",2,"",0,""
4+
3,"To Be Deleted","text",3,"",0,""
5+
4,"Attribute 1","text",4,"",0,""
6+
5,"Attribute 2","text",5,"",0,""
7+
6,"Test Get Attribute","text",6,"",0,""
8+
7,"Update Test Attribute","text",7,"",0,""
9+
8,"Delete Test Attribute","text",8,"",0,""
10+
9,"Paginated Test 1","text",9,"",0,""
11+
10,"Paginated Test 2","text",10,"",0,""
12+
11,"Get Test Attribute","text",11,"",0,""
13+
12,"Invalid JSON Test","text",12,"",0,""
14+
13,"Invalid Admin Test","text",13,"",0,""
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpList\RestBundle\Tests\Integration\Identity\Fixtures;
6+
7+
use Doctrine\Bundle\FixturesBundle\Fixture;
8+
use Doctrine\Persistence\ObjectManager;
9+
use PhpList\Core\Domain\Identity\Model\AdminAttributeDefinition;
10+
use PhpList\Core\TestingSupport\Traits\ModelTestTrait;
11+
use RuntimeException;
12+
13+
class AdminAttributeDefinitionFixture extends Fixture
14+
{
15+
use ModelTestTrait;
16+
17+
public function load(ObjectManager $manager): void
18+
{
19+
$csvFile = __DIR__ . '/AdminAttributeDefinition.csv';
20+
21+
if (!file_exists($csvFile)) {
22+
throw new RuntimeException(sprintf('Fixture file "%s" not found.', $csvFile));
23+
}
24+
25+
$handle = fopen($csvFile, 'r');
26+
if ($handle === false) {
27+
throw new RuntimeException(sprintf('Could not open fixture file "%s".', $csvFile));
28+
}
29+
30+
$headers = fgetcsv($handle);
31+
32+
do {
33+
$data = fgetcsv($handle);
34+
if ($data === false) {
35+
break;
36+
}
37+
$row = array_combine($headers, $data);
38+
39+
$definition = new AdminAttributeDefinition($row['name']);
40+
$this->setSubjectId($definition, (int)$row['id']);
41+
$definition->setType($row['type']);
42+
$definition->setListOrder((int)$row['list_order']);
43+
$definition->setDefaultValue($row['default_value']);
44+
$definition->setRequired((bool)$row['required']);
45+
$definition->setTableName($row['table_name']);
46+
47+
$manager->persist($definition);
48+
} while (true);
49+
50+
fclose($handle);
51+
}
52+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
admin_id,definition_id,value
2+
1,1,"test value"
3+
1,7,"original value"
4+
1,8,"to be deleted"
5+
1,9,"value 1"
6+
1,10,"value 2"
7+
1,11,"test get value"
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpList\RestBundle\Tests\Integration\Identity\Fixtures;
6+
7+
use Doctrine\Bundle\FixturesBundle\Fixture;
8+
use Doctrine\Common\DataFixtures\DependentFixtureInterface;
9+
use Doctrine\Persistence\ObjectManager;
10+
use PhpList\Core\Domain\Identity\Model\Administrator;
11+
use PhpList\Core\Domain\Identity\Model\AdminAttributeDefinition;
12+
use PhpList\Core\Domain\Identity\Model\AdminAttributeValue;
13+
use PhpList\Core\TestingSupport\Traits\ModelTestTrait;
14+
use RuntimeException;
15+
16+
class AdminAttributeValueFixture extends Fixture implements DependentFixtureInterface
17+
{
18+
use ModelTestTrait;
19+
20+
public function load(ObjectManager $manager): void
21+
{
22+
$csvFile = __DIR__ . '/AdminAttributeValue.csv';
23+
24+
if (!file_exists($csvFile)) {
25+
throw new RuntimeException(sprintf('Fixture file "%s" not found.', $csvFile));
26+
}
27+
28+
$handle = fopen($csvFile, 'r');
29+
if ($handle === false) {
30+
throw new RuntimeException(sprintf('Could not open fixture file "%s".', $csvFile));
31+
}
32+
33+
$headers = fgetcsv($handle);
34+
$adminRepository = $manager->getRepository(Administrator::class);
35+
$definitionRepository = $manager->getRepository(AdminAttributeDefinition::class);
36+
37+
do {
38+
$data = fgetcsv($handle);
39+
if ($data === false) {
40+
break;
41+
}
42+
$row = array_combine($headers, $data);
43+
44+
$admin = $adminRepository->find($row['admin_id']);
45+
if ($admin === null) {
46+
throw new RuntimeException(sprintf('Administrator with ID %d not found.', $row['admin_id']));
47+
}
48+
49+
$definition = $definitionRepository->find($row['definition_id']);
50+
if ($definition === null) {
51+
throw new RuntimeException(
52+
sprintf('AdminAttributeDefinition with ID %d not found.', $row['definition_id'])
53+
);
54+
}
55+
56+
$value = new AdminAttributeValue($definition, $admin);
57+
$value->setValue($row['value']);
58+
59+
$manager->persist($value);
60+
} while (true);
61+
62+
fclose($handle);
63+
}
64+
65+
public function getDependencies(): array
66+
{
67+
return [
68+
AdministratorFixture::class,
69+
AdminAttributeDefinitionFixture::class,
70+
];
71+
}
72+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpList\RestBundle\Tests\Unit\Identity\Request;
6+
7+
use PhpList\Core\Domain\Identity\Model\Dto\AdminAttributeDefinitionDto;
8+
use PhpList\RestBundle\Identity\Request\CreateAttributeDefinitionRequest;
9+
use PHPUnit\Framework\TestCase;
10+
11+
class CreateAttributeDefinitionRequestTest extends TestCase
12+
{
13+
public function testGetDtoReturnsCorrectDto(): void
14+
{
15+
$request = new CreateAttributeDefinitionRequest();
16+
$request->name = 'Test Attribute';
17+
$request->type = 'text';
18+
$request->order = 5;
19+
$request->defaultValue = 'default';
20+
$request->required = true;
21+
$request->tableName = 'test_table';
22+
23+
$dto = $request->getDto();
24+
25+
$this->assertInstanceOf(AdminAttributeDefinitionDto::class, $dto);
26+
$this->assertEquals('Test Attribute', $dto->name);
27+
$this->assertEquals('text', $dto->type);
28+
$this->assertEquals(5, $dto->listOrder);
29+
$this->assertEquals('default', $dto->defaultValue);
30+
$this->assertTrue($dto->required);
31+
$this->assertEquals('test_table', $dto->tableName);
32+
}
33+
34+
public function testGetDtoWithDefaultValues(): void
35+
{
36+
$request = new CreateAttributeDefinitionRequest();
37+
$request->name = 'Test Attribute';
38+
39+
$dto = $request->getDto();
40+
41+
$this->assertInstanceOf(AdminAttributeDefinitionDto::class, $dto);
42+
$this->assertEquals('Test Attribute', $dto->name);
43+
$this->assertNull($dto->type);
44+
$this->assertNull($dto->listOrder);
45+
$this->assertNull($dto->defaultValue);
46+
$this->assertFalse($dto->required);
47+
$this->assertNull($dto->tableName);
48+
}
49+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpList\RestBundle\Tests\Unit\Identity\Request;
6+
7+
use PhpList\Core\Domain\Identity\Model\Dto\AdminAttributeDefinitionDto;
8+
use PhpList\RestBundle\Identity\Request\UpdateAttributeDefinitionRequest;
9+
use PHPUnit\Framework\TestCase;
10+
11+
class UpdateAttributeDefinitionRequestTest extends TestCase
12+
{
13+
public function testGetDtoReturnsCorrectDto(): void
14+
{
15+
$request = new UpdateAttributeDefinitionRequest();
16+
$request->name = 'Updated Attribute';
17+
$request->type = 'checkbox';
18+
$request->order = 10;
19+
$request->defaultValue = 'updated_default';
20+
$request->required = true;
21+
$request->tableName = 'updated_table';
22+
23+
$dto = $request->getDto();
24+
25+
$this->assertInstanceOf(AdminAttributeDefinitionDto::class, $dto);
26+
$this->assertEquals('Updated Attribute', $dto->name);
27+
$this->assertEquals('checkbox', $dto->type);
28+
$this->assertEquals(10, $dto->listOrder);
29+
$this->assertEquals('updated_default', $dto->defaultValue);
30+
$this->assertTrue($dto->required);
31+
$this->assertEquals('updated_table', $dto->tableName);
32+
}
33+
34+
public function testGetDtoWithDefaultValues(): void
35+
{
36+
$request = new UpdateAttributeDefinitionRequest();
37+
$request->name = 'Updated Attribute';
38+
39+
$dto = $request->getDto();
40+
41+
$this->assertInstanceOf(AdminAttributeDefinitionDto::class, $dto);
42+
$this->assertEquals('Updated Attribute', $dto->name);
43+
$this->assertNull($dto->type);
44+
$this->assertNull($dto->listOrder);
45+
$this->assertNull($dto->defaultValue);
46+
$this->assertFalse($dto->required);
47+
$this->assertNull($dto->tableName);
48+
}
49+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpList\RestBundle\Tests\Unit\Identity\Serializer;
6+
7+
use PhpList\Core\Domain\Identity\Model\AdminAttributeDefinition;
8+
use PhpList\RestBundle\Identity\Serializer\AdminAttributeDefinitionNormalizer;
9+
use PHPUnit\Framework\TestCase;
10+
11+
class AdminAttributeDefinitionNormalizerTest extends TestCase
12+
{
13+
public function testNormalizeReturnsExpectedArray(): void
14+
{
15+
$definition = $this->createMock(AdminAttributeDefinition::class);
16+
$definition->method('getId')->willReturn(123);
17+
$definition->method('getName')->willReturn('test_attribute');
18+
$definition->method('getType')->willReturn('text');
19+
$definition->method('getListOrder')->willReturn(5);
20+
$definition->method('getDefaultValue')->willReturn('default');
21+
$definition->method('isRequired')->willReturn(true);
22+
$definition->method('getTableName')->willReturn('test_table');
23+
24+
$normalizer = new AdminAttributeDefinitionNormalizer();
25+
$data = $normalizer->normalize($definition);
26+
27+
$this->assertIsArray($data);
28+
$this->assertEquals([
29+
'id' => 123,
30+
'name' => 'test_attribute',
31+
'type' => 'text',
32+
'list_order' => 5,
33+
'default_value' => 'default',
34+
'required' => true,
35+
'table_name' => 'test_table',
36+
], $data);
37+
}
38+
39+
public function testNormalizeWithInvalidObjectReturnsEmptyArray(): void
40+
{
41+
$normalizer = new AdminAttributeDefinitionNormalizer();
42+
$data = $normalizer->normalize(new \stdClass());
43+
44+
$this->assertIsArray($data);
45+
$this->assertEmpty($data);
46+
}
47+
48+
public function testSupportsNormalization(): void
49+
{
50+
$normalizer = new AdminAttributeDefinitionNormalizer();
51+
52+
$definition = $this->createMock(AdminAttributeDefinition::class);
53+
$this->assertTrue($normalizer->supportsNormalization($definition));
54+
$this->assertFalse($normalizer->supportsNormalization(new \stdClass()));
55+
}
56+
}
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpList\RestBundle\Tests\Unit\Identity\Serializer;
6+
7+
use PhpList\Core\Domain\Identity\Model\AdminAttributeDefinition;
8+
use PhpList\Core\Domain\Identity\Model\AdminAttributeValue;
9+
use PhpList\Core\Domain\Identity\Model\Administrator;
10+
use PhpList\RestBundle\Identity\Serializer\AdminAttributeDefinitionNormalizer;
11+
use PhpList\RestBundle\Identity\Serializer\AdminAttributeValueNormalizer;
12+
use PhpList\RestBundle\Identity\Serializer\AdministratorNormalizer;
13+
use PHPUnit\Framework\MockObject\MockObject;
14+
use PHPUnit\Framework\TestCase;
15+
16+
class AdminAttributeValueNormalizerTest extends TestCase
17+
{
18+
private AdminAttributeValueNormalizer $normalizer;
19+
/**
20+
* @var AdministratorNormalizer&MockObject
21+
* @method array normalize($object, string $format = null, array $context = [])
22+
*/
23+
private AdministratorNormalizer $adminNormalizer;
24+
25+
/**
26+
* @var AdminAttributeDefinitionNormalizer&MockObject
27+
* @method array normalize($object, string $format = null, array $context = [])
28+
*/
29+
private AdminAttributeDefinitionNormalizer $definitionNormalizer;
30+
31+
protected function setUp(): void
32+
{
33+
$this->adminNormalizer = $this->createMock(AdministratorNormalizer::class);
34+
$this->definitionNormalizer = $this->createMock(AdminAttributeDefinitionNormalizer::class);
35+
$this->normalizer = new AdminAttributeValueNormalizer(
36+
$this->definitionNormalizer,
37+
$this->adminNormalizer
38+
);
39+
}
40+
41+
public function testNormalizeReturnsExpectedArray(): void
42+
{
43+
$admin = $this->createMock(Administrator::class);
44+
$definition = $this->createMock(AdminAttributeDefinition::class);
45+
$definition->method('getDefaultValue')->willReturn('default_value');
46+
47+
$attributeValue = $this->createMock(AdminAttributeValue::class);
48+
$attributeValue->method('getAdministrator')->willReturn($admin);
49+
$attributeValue->method('getAttributeDefinition')->willReturn($definition);
50+
$attributeValue->method('getValue')->willReturn('test_value');
51+
52+
$this->adminNormalizer->method('normalize')->willReturn(['id' => 1, 'login_name' => 'admin']);
53+
$this->definitionNormalizer->method('normalize')->willReturn(['id' => 2, 'name' => 'test_attribute']);
54+
55+
$data = $this->normalizer->normalize($attributeValue);
56+
57+
$this->assertIsArray($data);
58+
$this->assertEquals([
59+
'administrator' => ['id' => 1, 'login_name' => 'admin'],
60+
'definition' => ['id' => 2, 'name' => 'test_attribute'],
61+
'value' => 'test_value',
62+
], $data);
63+
}
64+
65+
public function testNormalizeUsesDefaultValueWhenValueIsNull(): void
66+
{
67+
$admin = $this->createMock(Administrator::class);
68+
$definition = $this->createMock(AdminAttributeDefinition::class);
69+
$definition->method('getDefaultValue')->willReturn('default_value');
70+
71+
$attributeValue = $this->createMock(AdminAttributeValue::class);
72+
$attributeValue->method('getAdministrator')->willReturn($admin);
73+
$attributeValue->method('getAttributeDefinition')->willReturn($definition);
74+
$attributeValue->method('getValue')->willReturn(null);
75+
76+
$this->adminNormalizer->method('normalize')->willReturn(['id' => 1, 'login_name' => 'admin']);
77+
$this->definitionNormalizer->method('normalize')->willReturn(['id' => 2, 'name' => 'test_attribute']);
78+
79+
$data = $this->normalizer->normalize($attributeValue);
80+
81+
$this->assertIsArray($data);
82+
$this->assertEquals([
83+
'administrator' => ['id' => 1, 'login_name' => 'admin'],
84+
'definition' => ['id' => 2, 'name' => 'test_attribute'],
85+
'value' => 'default_value',
86+
], $data);
87+
}
88+
89+
public function testNormalizeWithInvalidObjectReturnsEmptyArray(): void
90+
{
91+
$data = $this->normalizer->normalize(new \stdClass());
92+
93+
$this->assertIsArray($data);
94+
$this->assertEmpty($data);
95+
}
96+
97+
public function testSupportsNormalization(): void
98+
{
99+
$attributeValue = $this->createMock(AdminAttributeValue::class);
100+
$this->assertTrue($this->normalizer->supportsNormalization($attributeValue));
101+
$this->assertFalse($this->normalizer->supportsNormalization(new \stdClass()));
102+
}
103+
}

0 commit comments

Comments
 (0)
Please sign in to comment.