-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathTranslatableWithObjectDataTest.php
More file actions
122 lines (104 loc) · 6.01 KB
/
TranslatableWithObjectDataTest.php
File metadata and controls
122 lines (104 loc) · 6.01 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
<?php
namespace Webfactory\Bundle\PolyglotBundle\Tests\Functional;
use Doctrine\DBAL\Types\Type;
use Webfactory\Bundle\PolyglotBundle\Doctrine\PersistentTranslatable;
use Webfactory\Bundle\PolyglotBundle\Tests\Fixtures\Entity\TranslatableWithObjectData\ObjectType;
use Webfactory\Bundle\PolyglotBundle\Tests\Fixtures\Entity\TranslatableWithObjectData\TranslatableWithObjectDataTest_Entity;
use Webfactory\Bundle\PolyglotBundle\Tests\Fixtures\Entity\TranslatableWithObjectData\TranslatableWithObjectDataTest_Object;
use Webfactory\Bundle\PolyglotBundle\Tests\Fixtures\Entity\TranslatableWithObjectData\TranslatableWithObjectDataTest_Translation;
/**
* This tests shows that the translatable properties can even be objects.
* Cave: Doctrine change tracking works only for changing objects to new
* instances. It does not compare changed values of objects in "object" type columns.
*/
class TranslatableWithObjectDataTest extends DatabaseFunctionalTestCase
{
protected function setUp(): void
{
parent::setUp();
$typeRegistry = Type::getTypeRegistry();
if (!$typeRegistry->has(ObjectType::TYPE)) {
$typeRegistry->register(ObjectType::TYPE, new ObjectType());
}
self::setupSchema([
TranslatableWithObjectDataTest_Entity::class,
TranslatableWithObjectDataTest_Translation::class,
]);
}
/**
* @test
*/
public function persist_new_data_keeps_entity_values_as_translatable(): void
{
$entity = new TranslatableWithObjectDataTest_Entity();
$entity->data->setTranslation(new TranslatableWithObjectDataTest_Object('text en_GB'));
$entity->data->setTranslation(new TranslatableWithObjectDataTest_Object('text de_DE'), 'de_DE');
$this->entityManager->persist($entity);
$this->entityManager->flush();
self::assertInstanceOf(PersistentTranslatable::class, $entity->data);
self::assertInstanceOf(TranslatableWithObjectDataTest_Object::class, $entity->data->translate('de_DE'));
self::assertSame('text de_DE', $entity->data->translate('de_DE')->text);
self::assertInstanceOf(TranslatableWithObjectDataTest_Object::class, $entity->data->translate('en_GB'));
self::assertSame('text en_GB', $entity->data->translate('en_GB')->text);
}
/**
* @test
*/
public function persist_and_load_new_data_provides_translatables(): void
{
$entity = new TranslatableWithObjectDataTest_Entity();
$entity->data->setTranslation(new TranslatableWithObjectDataTest_Object('text en_GB'));
$entity->data->setTranslation(new TranslatableWithObjectDataTest_Object('text de_DE'), 'de_DE');
$this->entityManager->persist($entity);
$this->entityManager->flush();
$this->entityManager->clear();
$reload = $this->entityManager->find(TranslatableWithObjectDataTest_Entity::class, $entity->id);
self::assertInstanceOf(PersistentTranslatable::class, $reload->data);
self::assertInstanceOf(TranslatableWithObjectDataTest_Object::class, $reload->data->translate('de_DE'));
self::assertSame('text de_DE', $reload->data->translate('de_DE')->text);
self::assertInstanceOf(TranslatableWithObjectDataTest_Object::class, $reload->data->translate('en_GB'));
self::assertSame('text en_GB', $reload->data->translate('en_GB')->text);
}
/**
* @test
*/
public function flushing_updates_keeps_entity_values_as_translatable(): void
{
$entity = new TranslatableWithObjectDataTest_Entity();
$entity->data->setTranslation(new TranslatableWithObjectDataTest_Object('text en_GB'));
$entity->data->setTranslation(new TranslatableWithObjectDataTest_Object('text de_DE'), 'de_DE');
$this->entityManager->persist($entity);
$this->entityManager->flush();
// Doctrine ORM change tracking for objects requires new object instances here
$entity->data->setTranslation(new TranslatableWithObjectDataTest_Object('updated text en_GB'));
$entity->data->setTranslation(new TranslatableWithObjectDataTest_Object('updated text de_DE'), 'de_DE');
$this->entityManager->flush();
self::assertInstanceOf(PersistentTranslatable::class, $entity->data);
self::assertInstanceOf(TranslatableWithObjectDataTest_Object::class, $entity->data->translate('de_DE'));
self::assertSame('updated text de_DE', $entity->data->translate('de_DE')->text);
self::assertInstanceOf(TranslatableWithObjectDataTest_Object::class, $entity->data->translate('en_GB'));
self::assertSame('updated text en_GB', $entity->data->translate('en_GB')->text);
}
/**
* @test
*/
public function flushing_updates_and_reloading_provides_translatables(): void
{
$entity = new TranslatableWithObjectDataTest_Entity();
$entity->data->setTranslation(new TranslatableWithObjectDataTest_Object('text en_GB'));
$entity->data->setTranslation(new TranslatableWithObjectDataTest_Object('text de_DE'), 'de_DE');
$this->entityManager->persist($entity);
$this->entityManager->flush();
// Doctrine ORM change tracking for objects requires new object instances here
$entity->data->setTranslation(new TranslatableWithObjectDataTest_Object('updated text en_GB'));
$entity->data->setTranslation(new TranslatableWithObjectDataTest_Object('updated text de_DE'), 'de_DE');
$this->entityManager->flush();
$this->entityManager->clear();
$reload = $this->entityManager->find(TranslatableWithObjectDataTest_Entity::class, $entity->id);
self::assertInstanceOf(PersistentTranslatable::class, $reload->data);
self::assertInstanceOf(TranslatableWithObjectDataTest_Object::class, $reload->data->translate('de_DE'));
self::assertSame('updated text de_DE', $reload->data->translate('de_DE')->text);
self::assertInstanceOf(TranslatableWithObjectDataTest_Object::class, $reload->data->translate('en_GB'));
self::assertSame('updated text en_GB', $reload->data->translate('en_GB')->text);
}
}