Skip to content

Commit a0f42c3

Browse files
committed
Add test for property hooks.
1 parent d540f73 commit a0f42c3

File tree

2 files changed

+76
-1
lines changed

2 files changed

+76
-1
lines changed

tests/Tests/Models/PropertyHooks/User.php

+14-1
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,21 @@
22
// phpcs:ignoreFile
33
namespace Doctrine\Tests\Models\PropertyHooks;
44

5-
use DateTime;
5+
use Doctrine\DBAL\Types\Types;
6+
use Doctrine\ORM\Mapping\Column;
7+
use Doctrine\ORM\Mapping\Entity;
8+
use Doctrine\ORM\Mapping\GeneratedValue;
9+
use Doctrine\ORM\Mapping\Id;
10+
use Doctrine\ORM\Mapping\Table;
611

12+
#[Entity]
13+
#[Table(name: 'property_hooks_user')]
714
class User
815
{
16+
#[Id, GeneratedValue, Column(type: Types::INTEGER)]
17+
public ?int $id;
18+
19+
#[Column(type: Types::STRING)]
920
public string $first {
1021
set {
1122
if (strlen($value) === 0) {
@@ -15,6 +26,7 @@ class User
1526
}
1627
}
1728

29+
#[Column(type: Types::STRING)]
1830
public string $last {
1931
set {
2032
if (strlen($value) === 0) {
@@ -34,6 +46,7 @@ class User
3446
}
3547
}
3648

49+
#[Column(type: Types::STRING)]
3750
public string $language = 'de' {
3851
// Override the "read" action with arbitrary logic.
3952
get => strtoupper($this->language);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
<?php
2+
3+
namespace Doctrine\Tests\ORM\Functional;
4+
5+
use Doctrine\Tests\Models\PropertyHooks\User;
6+
use Doctrine\Tests\OrmFunctionalTestCase;
7+
use PHPUnit\Framework\Attributes\RequiresPhp;
8+
9+
#[RequiresPhp('>= 8.4.0')]
10+
class PropertyHooksTest extends OrmFunctionalTestCase
11+
{
12+
protected function setUp(): void
13+
{
14+
parent::setUp();
15+
16+
$this->createSchemaForModels(
17+
User::class,
18+
);
19+
}
20+
21+
public function testMapPropertyHooks(): void
22+
{
23+
$user = new User();
24+
$user->fullName = 'John Doe';
25+
$user->language = 'EN';
26+
27+
$this->_em->persist($user);
28+
$this->_em->flush();
29+
$this->_em->clear();
30+
31+
$user = $this->_em->find(User::class, $user->id);
32+
33+
self::assertEquals('John', $user->first);
34+
self::assertEquals('Doe', $user->last);
35+
self::assertEquals('John Doe', $user->fullName);
36+
self::assertEquals('EN', $user->language, 'The property hook uppercases the language.');
37+
38+
$language = $this->_em->createQuery('SELECT u.language FROM ' . User::class . ' u WHERE u.id = :id')
39+
->setParameter('id', $user->id)
40+
->getSingleScalarResult();
41+
42+
$this->assertEquals('en', $language, 'Selecting a field from DQL does not go through the property hook, accessing raw data.');
43+
}
44+
45+
public function testTriggerLazyLoadingWhenAccessingPropertyHooks(): void
46+
{
47+
$user = new User();
48+
$user->fullName = 'Ludwig von Beethoven';
49+
$user->language = 'DE';
50+
51+
$this->_em->persist($user);
52+
$this->_em->flush();
53+
$this->_em->clear();
54+
55+
$user = $this->_em->getReference(User::class, $user->id);
56+
57+
self::assertEquals('John', $user->first);
58+
self::assertEquals('Doe', $user->last);
59+
self::assertEquals('John Doe', $user->fullName);
60+
self::assertEquals('EN', $user->language, 'The property hook uppercases the language.');
61+
}
62+
}

0 commit comments

Comments
 (0)