Skip to content

Commit 924c3cf

Browse files
committed
Add tests
1 parent 0afd4c4 commit 924c3cf

File tree

5 files changed

+62
-11
lines changed

5 files changed

+62
-11
lines changed

Diff for: src/Configuration.php

+16-9
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,14 @@
99

1010
final readonly class Configuration
1111
{
12+
/**
13+
* @var list<class-string<\ArrayAccess<string, mixed>>>
14+
*/
15+
public array $arrayAccessClasses;
16+
17+
/**
18+
* @param list<class-string<\ArrayAccess<string, mixed>>> $arrayAccessClasses classes with unknown properties, implemeting ArrayAccess
19+
*/
1220
public function __construct(
1321
/**
1422
* Class prefix used to prefix the class name of the generated mappers.
@@ -39,17 +47,16 @@ public function __construct(
3947
* Does the mapper should throw an exception if the target is read-only.
4048
*/
4149
public bool $allowReadOnlyTargetToPopulate = false,
42-
/**
43-
* Classes with unknown properties, implemeting ArrayAccess.
44-
*
45-
* @var list<class-string<\ArrayAccess<string, mixed>>> $arrayAccessClasses
46-
*/
47-
public array $arrayAccessClasses = [],
50+
array $arrayAccessClasses = [],
4851
) {
49-
$this->arrayAccessClasses[] = \ArrayObject::class;
52+
$arrayAccessClasses[] = \ArrayObject::class;
53+
54+
// Classes provided by the mongodb extension and mongodb/mongodb package
5055
if (class_exists(Document::class, false)) {
51-
$this->arrayAccessClasses[] = Document::class;
52-
$this->arrayAccessClasses[] = BSONDocument::class;
56+
$arrayAccessClasses[] = Document::class;
57+
$arrayAccessClasses[] = BSONDocument::class;
5358
}
59+
60+
$this->arrayAccessClasses = $arrayAccessClasses;
5461
}
5562
}

Diff for: src/Symfony/Bundle/DependencyInjection/AutoMapperExtension.php

+1
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ public function load(array $configs, ContainerBuilder $container): void
6565
->setArgument('$autoRegister', $config['auto_register'])
6666
->setArgument('$mapPrivateProperties', $config['map_private_properties'])
6767
->setArgument('$allowReadOnlyTargetToPopulate', $config['allow_readonly_target_to_populate'])
68+
->setArgument('$arrayAccessClasses', $config['array_access_classes'])
6869
;
6970

7071
$container->registerForAutoconfiguration(PropertyTransformerInterface::class)->addTag('automapper.property_transformer');

Diff for: src/Symfony/Bundle/DependencyInjection/Configuration.php

+8
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,14 @@ public function getConfigTreeBuilder(): TreeBuilder
3131
->booleanNode('check_attributes')->defaultTrue()->end()
3232
->booleanNode('auto_register')->defaultTrue()->end()
3333
->booleanNode('map_private_properties')->defaultTrue()->end()
34+
->arrayNode('array_access_classes')
35+
->scalarPrototype()
36+
->validate()
37+
->ifTrue(fn ($className) => !is_subclass_of($className, \ArrayAccess::class))
38+
->thenInvalid('Class %s does not implement "ArrayAccess"')
39+
->end()
40+
->end()
41+
->end()
3442
->booleanNode('allow_readonly_target_to_populate')->defaultFalse()->end()
3543
->arrayNode('normalizer')
3644
->children()

Diff for: tests/AutoMapperTest.php

+35
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,41 @@ public function testAutoMapperStdObjectToStdObject(): void
210210
self::assertEquals($user, $userStd);
211211
}
212212

213+
public function testAutoMapperFromArrayObject(): void
214+
{
215+
$this->buildAutoMapper(mapPrivatePropertiesAndMethod: true);
216+
217+
$user = new \ArrayObject(['id' => 1]);
218+
219+
/** @var Fixtures\UserDTO $userDto */
220+
$userDto = $this->autoMapper->map($user, Fixtures\UserDTO::class);
221+
222+
self::assertInstanceOf(Fixtures\UserDTO::class, $userDto);
223+
self::assertEquals(1, $userDto->id);
224+
}
225+
226+
public function testAutoMapperToArrayObject(): void
227+
{
228+
$userDto = new Fixtures\UserDTO();
229+
$userDto->id = 1;
230+
231+
$user = $this->autoMapper->map($userDto, \ArrayObject::class);
232+
233+
self::assertInstanceOf(\ArrayObject::class, $user);
234+
self::assertEquals(1, $user['id']);
235+
}
236+
237+
public function testAutoMapperArrayObjectToArrayObject(): void
238+
{
239+
$user = new \ArrayObject(['id' => 1, 'nested' => new \ArrayObject(['id' => 2])]);
240+
$userStd = $this->autoMapper->map($user, \ArrayObject::class);
241+
242+
self::assertInstanceOf(\ArrayObject::class, $userStd);
243+
self::assertNotSame($user, $userStd);
244+
self::assertNotSame($user['nested'], $userStd['nested']);
245+
self::assertEquals($user, $userStd);
246+
}
247+
213248
public function testNotReadable(): void
214249
{
215250
$this->buildAutoMapper(classPrefix: 'CustomDateTime_');

Diff for: tools/phpstan/phpstan.neon

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ parameters:
22
level: max
33
paths:
44
- ../../src/
5-
6-
tmpDir: cache
75
scanFiles:
86
- stubs/mongodb.php
97

8+
tmpDir: cache
9+
1010
ignoreErrors:
1111
- "#Instantiated class fromIteratorToArray not found#"
1212
- "#Instantiated class toArray not found#"

0 commit comments

Comments
 (0)