TranslatableDocumentTest.php 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. <?php
  2. namespace Gedmo\Translatable;
  3. use Translatable\Fixture\Document\Article;
  4. /**
  5. * These are tests for Translatable behavior ODM implementation
  6. *
  7. * @author Gediminas Morkevicius <gediminas.morkevicius@gmail.com>
  8. * @package Gedmo.Translatable
  9. * @link http://www.gediminasm.org
  10. * @license MIT License (http://www.opensource.org/licenses/mit-license.php)
  11. */
  12. class TranslatableDocumentTest extends \PHPUnit_Framework_TestCase
  13. {
  14. const TEST_CLASS_ARTICLE = 'Translatable\Fixture\Document\Article';
  15. const TEST_CLASS_TRANSLATION = 'Gedmo\Translatable\Document\Translation';
  16. /**
  17. * @var DocumentManager
  18. */
  19. private $dm;
  20. private $translationListener;
  21. private $articleId;
  22. public function setUp()
  23. {
  24. $config = new \Doctrine\ODM\MongoDB\Configuration();
  25. $config->setProxyDir(__DIR__ . '/Proxy');
  26. $config->setProxyNamespace('Gedmo\Translatable\Proxy');
  27. $config->setHydratorDir(__DIR__ . '/Hydrator');
  28. $config->setHydratorNamespace('Hydrator');
  29. $config->setDefaultDB('gedmo_translatable_tests');
  30. $config->setLoggerCallable(function(array $log) {
  31. print_r($log);
  32. });
  33. $reader = new \Doctrine\Common\Annotations\AnnotationReader();
  34. $reader->setDefaultAnnotationNamespace('Doctrine\ODM\MongoDB\Mapping\\');
  35. $config->setMetadataDriverImpl(
  36. new \Doctrine\ODM\MongoDB\Mapping\Driver\AnnotationDriver(
  37. $reader,
  38. array(
  39. __DIR__ . '/Fixture/Document',
  40. __DIR__ . '/../../../lib/Gedmo/Translatable/Document'
  41. )
  42. )
  43. );
  44. $evm = new \Doctrine\Common\EventManager();
  45. $sluggableListener = new \Gedmo\Sluggable\ODM\MongoDB\SluggableListener();
  46. $evm->addEventSubscriber($sluggableListener);
  47. $this->translationListener = new \Gedmo\Translatable\ODM\MongoDB\TranslationListener();
  48. $evm->addEventSubscriber($this->translationListener);
  49. if (!class_exists('Mongo')) {
  50. $this->markTestSkipped('Missing Mongo extension.');
  51. }
  52. try {
  53. $this->dm = \Doctrine\ODM\MongoDB\DocumentManager::create(
  54. new \Doctrine\MongoDB\Connection(),
  55. $config,
  56. $evm
  57. );
  58. $this->populate();
  59. } catch (\MongoException $e) {
  60. $this->markTestSkipped('Doctrine MongoDB ODM connection problem.');
  61. }
  62. }
  63. public function testTranslation()
  64. {
  65. // test inserted translations
  66. $repo = $this->dm->getRepository(self::TEST_CLASS_ARTICLE);
  67. $article = $repo->findOneByTitle('Title EN');
  68. $transRepo = $this->dm->getRepository(self::TEST_CLASS_TRANSLATION);
  69. $this->assertTrue($transRepo instanceof Document\Repository\TranslationRepository);
  70. $translations = $transRepo->findTranslations($article);
  71. $this->assertEquals(1, count($translations));
  72. $this->assertArrayHasKey('en_us', $translations);
  73. $this->assertArrayHasKey('title', $translations['en_us']);
  74. $this->assertEquals('Title EN', $translations['en_us']['title']);
  75. $this->assertArrayHasKey('code', $translations['en_us']);
  76. $this->assertEquals('Code EN', $translations['en_us']['code']);
  77. $this->assertArrayHasKey('slug', $translations['en_us']);
  78. $this->assertEquals('title-en-code-en', $translations['en_us']['slug']);
  79. // test second translations
  80. $this->translationListener->setTranslatableLocale('de_de');
  81. $article->setTitle('Title DE');
  82. $article->setCode('Code DE');
  83. $this->dm->persist($article);
  84. $this->dm->flush();
  85. $this->dm->clear();
  86. $article = $repo->find($this->articleId);
  87. $translations = $transRepo->findTranslations($article);
  88. $this->assertEquals(2, count($translations));
  89. $this->assertArrayHasKey('de_de', $translations);
  90. $this->assertArrayHasKey('title', $translations['de_de']);
  91. $this->assertEquals('Title DE', $translations['de_de']['title']);
  92. $this->assertArrayHasKey('code', $translations['de_de']);
  93. $this->assertEquals('Code DE', $translations['de_de']['code']);
  94. $this->assertArrayHasKey('slug', $translations['de_de']);
  95. $this->assertEquals('title-de-code-de', $translations['de_de']['slug']);
  96. // test value update
  97. $this->dm->clear();
  98. $this->translationListener->setTranslatableLocale('en_us');
  99. $article = $repo->find($this->articleId);
  100. $this->assertEquals('Title EN', $article->getTitle());
  101. $this->assertEquals('Code EN', $article->getCode());
  102. $this->assertEquals('title-en-code-en', $article->getSlug());
  103. // test translation update
  104. $article->setTitle('Title EN Updated');
  105. $article->setCode('Code EN Updated');
  106. $this->dm->persist($article);
  107. $this->dm->flush();
  108. $this->dm->clear();
  109. $article = $repo->find($this->articleId);
  110. $this->assertEquals('Title EN Updated', $article->getTitle());
  111. $this->assertEquals('Code EN Updated', $article->getCode());
  112. // test removal of translations
  113. $this->dm->remove($article);
  114. $this->dm->flush();
  115. $this->dm->clear();
  116. $article = $repo->find($this->articleId);
  117. $this->assertTrue(is_null($article));
  118. $translations = $transRepo->findTranslationsByObjectId($this->articleId);
  119. $this->assertEquals(0, count($translations));
  120. }
  121. private function populate()
  122. {
  123. $qb = $this->dm->createQueryBuilder(self::TEST_CLASS_ARTICLE);
  124. $q = $qb->remove()
  125. ->getQuery();
  126. $q->execute();
  127. $qb = $this->dm->createQueryBuilder(self::TEST_CLASS_TRANSLATION);
  128. $q = $qb->remove()
  129. ->getQuery();
  130. $q->execute();
  131. $art0 = new Article();
  132. $art0->setTitle('Title EN');
  133. $art0->setCode('Code EN');
  134. $this->dm->persist($art0);
  135. $this->dm->flush();
  136. $this->articleId = $art0->getId();
  137. $this->dm->clear();
  138. }
  139. }