TranslatableSlugTest.php 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. <?php
  2. namespace Gedmo\Sluggable;
  3. use Doctrine\Common\Util\Debug,
  4. Gedmo\Translatable\Translatable,
  5. Gedmo\Translatable\Entity\Translation,
  6. Gedmo\Translatable\TranslationListener,
  7. Sluggable\Fixture\TranslatableArticle,
  8. Sluggable\Fixture\Comment,
  9. Sluggable\Fixture\Page;
  10. /**
  11. * These are tests for translatable behavior
  12. *
  13. * @author Gediminas Morkevicius <gediminas.morkevicius@gmail.com>
  14. * @package Gedmo.Translatable
  15. * @link http://www.gediminasm.org
  16. * @license MIT License (http://www.opensource.org/licenses/mit-license.php)
  17. */
  18. class TranslatableSlugTest extends \PHPUnit_Framework_TestCase
  19. {
  20. private $articleId;
  21. private $em;
  22. private $translationListener;
  23. const TEST_CLASS_ARTICLE = 'Sluggable\Fixture\TranslatableArticle';
  24. const TEST_CLASS_COMMENT = 'Sluggable\Fixture\Comment';
  25. const TEST_CLASS_PAGE = 'Sluggable\Fixture\Page';
  26. const TRANSLATION_CLASS = 'Gedmo\Translatable\Entity\Translation';
  27. public function setUp()
  28. {
  29. $config = new \Doctrine\ORM\Configuration();
  30. $config->setMetadataCacheImpl(new \Doctrine\Common\Cache\ArrayCache);
  31. $config->setQueryCacheImpl(new \Doctrine\Common\Cache\ArrayCache);
  32. $config->setProxyDir(__DIR__ . '/Proxy');
  33. $config->setProxyNamespace('Gedmo\Sluggable\Proxies');
  34. $config->setMetadataDriverImpl($config->newDefaultAnnotationDriver());
  35. $conn = array(
  36. 'driver' => 'pdo_sqlite',
  37. 'memory' => true,
  38. );
  39. //$config->setSQLLogger(new \Doctrine\DBAL\Logging\EchoSQLLogger());
  40. $evm = new \Doctrine\Common\EventManager();
  41. $sluggableListener = new SluggableListener();
  42. $this->translationListener = new TranslationListener();
  43. $this->translationListener->setTranslatableLocale('en_us');
  44. $evm->addEventSubscriber($sluggableListener);
  45. $evm->addEventSubscriber($this->translationListener);
  46. $this->em = \Doctrine\ORM\EntityManager::create($conn, $config, $evm);
  47. $schemaTool = new \Doctrine\ORM\Tools\SchemaTool($this->em);
  48. $schemaTool->dropSchema(array());
  49. $schemaTool->createSchema(array(
  50. $this->em->getClassMetadata(self::TEST_CLASS_ARTICLE),
  51. $this->em->getClassMetadata(self::TEST_CLASS_COMMENT),
  52. $this->em->getClassMetadata(self::TEST_CLASS_PAGE),
  53. $this->em->getClassMetadata(self::TRANSLATION_CLASS)
  54. ));
  55. $article = new TranslatableArticle();
  56. $article->setTitle('the title');
  57. $article->setCode('my code');
  58. $this->em->persist($article);
  59. $this->em->flush();
  60. $this->em->clear();
  61. $this->articleId = $article->getId();
  62. }
  63. public function testSlugAndTranslation()
  64. {
  65. $article = $this->em->find(self::TEST_CLASS_ARTICLE, $this->articleId);
  66. $this->assertTrue($article instanceof Translatable && $article instanceof Sluggable);
  67. $this->assertEquals($article->getSlug(), 'the-title-my-code');
  68. $repo = $this->em->getRepository(self::TRANSLATION_CLASS);
  69. $translations = $repo->findTranslations($article);
  70. $this->assertEquals(count($translations), 1);
  71. $this->assertArrayHasKey('en_us', $translations);
  72. $this->assertEquals(3, count($translations['en_us']));
  73. $this->assertArrayHasKey('code', $translations['en_us']);
  74. $this->assertEquals('my code', $translations['en_us']['code']);
  75. $this->assertArrayHasKey('title', $translations['en_us']);
  76. $this->assertEquals('the title', $translations['en_us']['title']);
  77. $this->assertArrayHasKey('slug', $translations['en_us']);
  78. $this->assertEquals('the-title-my-code', $translations['en_us']['slug']);
  79. $article = $this->em->find(self::TEST_CLASS_ARTICLE, $this->articleId);
  80. $article->setTranslatableLocale('de_de');
  81. $article->setCode('code in de');
  82. $article->setTitle('title in de');
  83. $this->em->persist($article);
  84. $this->em->flush();
  85. $this->em->clear();
  86. $repo = $this->em->getRepository(self::TRANSLATION_CLASS);
  87. $translations = $repo->findTranslations($article);
  88. $this->assertEquals(count($translations), 2);
  89. $this->assertArrayHasKey('de_de', $translations);
  90. $this->assertEquals(3, count($translations['de_de']));
  91. $this->assertArrayHasKey('code', $translations['de_de']);
  92. $this->assertEquals('code in de', $translations['de_de']['code']);
  93. $this->assertArrayHasKey('title', $translations['de_de']);
  94. $this->assertEquals('title in de', $translations['de_de']['title']);
  95. $this->assertArrayHasKey('slug', $translations['de_de']);
  96. $this->assertEquals('title-in-de-code-in-de', $translations['de_de']['slug']);
  97. }
  98. public function testConcurrentChanges()
  99. {
  100. $page = new Page;
  101. $page->setContent('cont test');
  102. $a0Page = new Page;
  103. $a0Page->setContent('bi vv');
  104. $article0 = $this->em->find(self::TEST_CLASS_ARTICLE, $this->articleId);
  105. $article0->setCode('cell');
  106. $article0->setTitle('xx gg');
  107. $a0Page->addArticle($article0);
  108. $a0Comment = new Comment;
  109. $a0Comment->setMessage('the xx message');
  110. $article0->addComment($a0Comment);
  111. $this->em->persist($a0Comment);
  112. $this->em->persist($article0);
  113. $this->em->persist($a0Page);
  114. $article1 = new TranslatableArticle();
  115. $article1->setTitle('art1 test');
  116. $article1->setCode('cd1 test');
  117. $article2 = new TranslatableArticle();
  118. $article2->setTitle('art2 test');
  119. $article2->setCode('cd2 test');
  120. $page->addArticle($article1);
  121. $page->addArticle($article2);
  122. $comment1 = new Comment;
  123. $comment1->setMessage('mes1-test');
  124. $comment2 = new Comment;
  125. $comment2->setMessage('mes2 test');
  126. $article1->addComment($comment1);
  127. $article2->addComment($comment2);
  128. $this->em->persist($page);
  129. $this->em->persist($article1);
  130. $this->em->persist($article2);
  131. $this->em->persist($comment1);
  132. $this->em->persist($comment2);
  133. $this->em->flush();
  134. $this->em->clear();
  135. $this->assertEquals($page->getSlug(), 'Cont_Test');
  136. }
  137. }