TranslatableTest.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372
  1. <?php
  2. namespace DoctrineExtensions\Translatable;
  3. use Doctrine\Common\Util\Debug;
  4. /**
  5. * These are tests for translatable behavior
  6. *
  7. * @author Gediminas Morkevicius <gediminas.morkevicius@gmail.com>
  8. * @package DoctrineExtensions.Translatable
  9. * @link http://www.gediminasm.org
  10. * @license MIT License (http://www.opensource.org/licenses/mit-license.php)
  11. */
  12. class TranslatableTest extends \PHPUnit_Framework_TestCase
  13. {
  14. private $articleId;
  15. private $translatableListener;
  16. /**
  17. * @var EntityManager
  18. */
  19. private $em;
  20. public function setUp()
  21. {
  22. $config = new \Doctrine\ORM\Configuration();
  23. $config->setMetadataCacheImpl(new \Doctrine\Common\Cache\ArrayCache);
  24. $config->setQueryCacheImpl(new \Doctrine\Common\Cache\ArrayCache);
  25. $config->setProxyDir(__DIR__ . '/temp');
  26. $config->setProxyNamespace('DoctrineExtensions\Translatable\Proxies');
  27. $config->setMetadataDriverImpl($config->newDefaultAnnotationDriver());
  28. $conn = array(
  29. 'driver' => 'pdo_sqlite',
  30. 'memory' => true,
  31. );
  32. //$config->setSQLLogger(new \Doctrine\DBAL\Logging\EchoSQLLogger());
  33. $evm = new \Doctrine\Common\EventManager();
  34. $this->translatableListener = new TranslationListener();
  35. $this->translatableListener->setTranslatableLocale('en_us');
  36. $evm->addEventSubscriber($this->translatableListener);
  37. $this->em = \Doctrine\ORM\EntityManager::create($conn, $config, $evm);
  38. $schemaTool = new \Doctrine\ORM\Tools\SchemaTool($this->em);
  39. $schemaTool->createSchema(array(
  40. $this->em->getClassMetadata('DoctrineExtensions\Translatable\Article'),
  41. $this->em->getClassMetadata('DoctrineExtensions\Translatable\Comment'),
  42. $this->em->getClassMetadata('DoctrineExtensions\Translatable\Entity\Translation'),
  43. ));
  44. }
  45. public function testFixtureGeneratedTranslations()
  46. {
  47. $article = new Article();
  48. $article->setTitle('title in en');
  49. $article->setContent('content in en');
  50. $comment1 = new Comment();
  51. $comment1->setSubject('subject1 in en');
  52. $comment1->setMessage('message1 in en');
  53. $comment2 = new Comment();
  54. $comment2->setSubject('subject2 in en');
  55. $comment2->setMessage('message2 in en');
  56. $article->addComment($comment1);
  57. $article->addComment($comment2);
  58. $this->em->persist($article);
  59. $this->em->persist($comment1);
  60. $this->em->persist($comment2);
  61. $this->em->flush();
  62. $this->articleId = $article->getId();
  63. $this->em->clear();
  64. $repo = $this->em->getRepository('DoctrineExtensions\Translatable\Entity\Translation');
  65. $this->assertTrue($repo instanceof Repository\TranslationRepository);
  66. $article = $this->em->find('DoctrineExtensions\Translatable\Article', $this->articleId);
  67. $this->assertTrue($article instanceof Translatable);
  68. $translations = $repo->findTranslations($article);
  69. $this->assertEquals(count($translations), 1);
  70. $this->assertArrayHasKey('en_us', $translations);
  71. $this->assertArrayHasKey('content', $translations['en_us']);
  72. $this->assertEquals('content in en', $translations['en_us']['content']);
  73. $this->assertArrayHasKey('title', $translations['en_us']);
  74. $this->assertEquals('title in en', $translations['en_us']['title']);
  75. $comments = $article->getComments();
  76. $this->assertEquals(count($comments), 2);
  77. foreach ($comments as $num => $comment) {
  78. $this->assertTrue($comment instanceof Translatable);
  79. $translations = $repo->findTranslations($comment);
  80. $this->assertEquals(count($translations), 1);
  81. $this->assertArrayHasKey('en_us', $translations);
  82. $number = $num + 1;
  83. $this->assertArrayHasKey('subject', $translations['en_us']);
  84. $expected = "subject{$number} in en";
  85. $this->assertEquals($expected, $translations['en_us']['subject']);
  86. $this->assertArrayHasKey('message', $translations['en_us']);
  87. $expected = "message{$number} in en";
  88. $this->assertEquals($expected, $translations['en_us']['message']);
  89. }
  90. // test default locale
  91. $this->translatableListener->setDefaultLocale('en_us');
  92. $article = $this->em->find(
  93. 'DoctrineExtensions\Translatable\Article',
  94. $this->articleId
  95. );
  96. $article->setTranslatableLocale('de_de');
  97. $article->setContent('content in de');
  98. $article->setTitle('title in de');
  99. $this->em->persist($article);
  100. $this->em->flush();
  101. $this->em->clear();
  102. $qb = $this->em->createQueryBuilder();
  103. $qb->select('art')
  104. ->from(get_class($article), 'art')
  105. ->where('art.id = :id');
  106. $q = $qb->getQuery();
  107. $result = $q->execute(
  108. array('id' => $article->getId()),
  109. \Doctrine\ORM\Query::HYDRATE_ARRAY
  110. );
  111. $this->assertEquals(1, count($result));
  112. $this->assertEquals($result[0]['title'], 'title in en');
  113. $this->assertEquals($result[0]['content'], 'content in en');
  114. $repo = $this->em->getRepository('DoctrineExtensions\Translatable\Entity\Translation');
  115. $translations = $repo->findTranslations($article);
  116. $this->assertEquals(count($translations), 2);
  117. $this->assertArrayHasKey('de_de', $translations);
  118. $this->assertArrayHasKey('content', $translations['de_de']);
  119. $this->assertEquals('content in de', $translations['de_de']['content']);
  120. $this->assertArrayHasKey('title', $translations['de_de']);
  121. $this->assertEquals('title in de', $translations['de_de']['title']);
  122. $this->translatableListener->setDefaultLocale('');
  123. // test second translations
  124. $article = $this->em->find(
  125. 'DoctrineExtensions\Translatable\Article',
  126. $this->articleId
  127. );
  128. $this->translatableListener->setDefaultLocale('en_us');
  129. $article->setTranslatableLocale('de_de');
  130. $article->setContent('content in de');
  131. $article->setTitle('title in de');
  132. $comments = $article->getComments();
  133. foreach ($comments as $comment) {
  134. $number = preg_replace("@[^\d]+@", '', $comment->getSubject());
  135. $comment->setTranslatableLocale('de_de');
  136. $comment->setSubject("subject{$number} in de");
  137. $comment->setMessage("message{$number} in de");
  138. $this->em->persist($comment);
  139. }
  140. $this->em->persist($article);
  141. $this->em->flush();
  142. $this->em->clear();
  143. $repo = $this->em->getRepository('DoctrineExtensions\Translatable\Entity\Translation');
  144. $translations = $repo->findTranslations($article);
  145. $this->assertEquals(count($translations), 2);
  146. $this->assertArrayHasKey('de_de', $translations);
  147. $this->assertArrayHasKey('content', $translations['de_de']);
  148. $this->assertEquals('content in de', $translations['de_de']['content']);
  149. $this->assertArrayHasKey('title', $translations['de_de']);
  150. $this->assertEquals('title in de', $translations['de_de']['title']);
  151. $comments = $article->getComments();
  152. $this->assertEquals(count($comments), 2);
  153. foreach ($comments as $comment) {
  154. $this->assertTrue($comment instanceof Translatable);
  155. $translations = $repo->findTranslations($comment);
  156. $this->assertEquals(count($translations), 2);
  157. $this->assertArrayHasKey('de_de', $translations);
  158. $number = preg_replace("@[^\d]+@", '', $comment->getSubject());
  159. $this->assertArrayHasKey('subject', $translations['de_de']);
  160. $expected = "subject{$number} in de";
  161. $this->assertEquals($expected, $translations['de_de']['subject']);
  162. $this->assertArrayHasKey('message', $translations['de_de']);
  163. $expected = "message{$number} in de";
  164. $this->assertEquals($expected, $translations['de_de']['message']);
  165. }
  166. $this->translatableListener->setTranslatableLocale('en_us');
  167. $article = $this->em->find(
  168. 'DoctrineExtensions\Translatable\Article',
  169. $this->articleId
  170. );
  171. $this->assertEquals($article->getTitle(), 'title in en');
  172. $this->assertEquals($article->getContent(), 'content in en');
  173. $comments = $article->getComments();
  174. foreach ($comments as $comment) {
  175. $number = preg_replace("@[^\d]+@", '', $comment->getSubject());
  176. $this->assertEquals($comment->getSubject(), "subject{$number} in en");
  177. $this->assertEquals($comment->getMessage(), "message{$number} in en");
  178. }
  179. }
  180. }
  181. /**
  182. * @Entity
  183. */
  184. class Article implements Translatable
  185. {
  186. /** @Id @GeneratedValue @Column(type="integer") */
  187. private $id;
  188. /**
  189. * @Column(name="title", type="string", length=128)
  190. */
  191. private $title;
  192. /**
  193. * @Column(name="content", type="text")
  194. */
  195. private $content;
  196. /*
  197. * Used locale to override Translation listener`s locale
  198. */
  199. private $_locale;
  200. /**
  201. * @OneToMany(targetEntity="Comment", mappedBy="article")
  202. */
  203. private $comments;
  204. public function getId()
  205. {
  206. return $this->id;
  207. }
  208. public function addComment(Comment $comment)
  209. {
  210. $comment->setArticle($this);
  211. $this->comments[] = $comment;
  212. }
  213. public function getComments()
  214. {
  215. return $this->comments;
  216. }
  217. public function setTitle($title)
  218. {
  219. $this->title = $title;
  220. }
  221. public function getTitle()
  222. {
  223. return $this->title;
  224. }
  225. public function setContent($content)
  226. {
  227. $this->content = $content;
  228. }
  229. public function getContent()
  230. {
  231. return $this->content;
  232. }
  233. public function getTranslatableFields()
  234. {
  235. return array('title', 'content');
  236. }
  237. public function setTranslatableLocale($locale)
  238. {
  239. $this->_locale = $locale;
  240. }
  241. public function getTranslatableLocale()
  242. {
  243. return $this->_locale;
  244. }
  245. }
  246. /**
  247. * @Entity
  248. */
  249. class Comment implements Translatable
  250. {
  251. /** @Id @GeneratedValue @Column(type="integer") */
  252. private $id;
  253. /**
  254. * @Column(name="subject", type="string", length=128)
  255. */
  256. private $subject;
  257. /**
  258. * @Column(name="message", type="text")
  259. */
  260. private $message;
  261. /**
  262. * @ManyToOne(targetEntity="Article", inversedBy="comments")
  263. */
  264. private $article;
  265. /*
  266. * Used locale to override Translation listener`s locale
  267. */
  268. private $_locale;
  269. public function setArticle($article)
  270. {
  271. $this->article = $article;
  272. }
  273. public function getId()
  274. {
  275. return $this->id;
  276. }
  277. public function setSubject($subject)
  278. {
  279. $this->subject = $subject;
  280. }
  281. public function getSubject()
  282. {
  283. return $this->subject;
  284. }
  285. public function setMessage($message)
  286. {
  287. $this->message = $message;
  288. }
  289. public function getMessage()
  290. {
  291. return $this->message;
  292. }
  293. public function getTranslatableFields()
  294. {
  295. return array('subject', 'message');
  296. }
  297. public function setTranslatableLocale($locale)
  298. {
  299. $this->_locale = $locale;
  300. }
  301. public function getTranslatableLocale()
  302. {
  303. return $this->_locale;
  304. }
  305. }