TranslateBehaviorTest.php 32 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042
  1. <?php
  2. /**
  3. * TranslateBehaviorTest file
  4. *
  5. * PHP 5
  6. *
  7. * CakePHP(tm) Tests <http://book.cakephp.org/2.0/en/development/testing.html>
  8. * Copyright 2005-2012, Cake Software Foundation, Inc. (http://cakefoundation.org)
  9. *
  10. * Licensed under The MIT License
  11. * Redistributions of files must retain the above copyright notice
  12. *
  13. * @copyright Copyright 2005-2012, Cake Software Foundation, Inc. (http://cakefoundation.org)
  14. * @link http://book.cakephp.org/2.0/en/development/testing.html CakePHP(tm) Tests
  15. * @package Cake.Test.Case.Model.Behavior
  16. * @since CakePHP(tm) v 1.2.0.5669
  17. * @license MIT License (http://www.opensource.org/licenses/mit-license.php)
  18. */
  19. App::uses('Model', 'Model');
  20. App::uses('AppModel', 'Model');
  21. require_once dirname(dirname(__FILE__)) . DS . 'models.php';
  22. /**
  23. * TranslateBehaviorTest class
  24. *
  25. * @package Cake.Test.Case.Model.Behavior
  26. */
  27. class TranslateBehaviorTest extends CakeTestCase {
  28. /**
  29. * autoFixtures property
  30. *
  31. * @var bool false
  32. */
  33. public $autoFixtures = false;
  34. /**
  35. * fixtures property
  36. *
  37. * @var array
  38. */
  39. public $fixtures = array(
  40. 'core.translated_item', 'core.translate', 'core.translate_table',
  41. 'core.translated_article', 'core.translate_article', 'core.user', 'core.comment', 'core.tag', 'core.articles_tag',
  42. 'core.translate_with_prefix'
  43. );
  44. /**
  45. * tearDown method
  46. *
  47. * @return void
  48. */
  49. public function tearDown() {
  50. ClassRegistry::flush();
  51. }
  52. /**
  53. * Test that count queries with conditions get the correct joins
  54. *
  55. * @return void
  56. */
  57. public function testCountWithConditions() {
  58. $this->loadFixtures('Translate', 'TranslatedItem');
  59. $Model = new TranslatedItem();
  60. $Model->locale = 'eng';
  61. $result = $Model->find('count', array(
  62. 'conditions' => array(
  63. 'I18n__content.locale' => 'eng'
  64. )
  65. ));
  66. $this->assertEqual(3, $result);
  67. }
  68. /**
  69. * testTranslateModel method
  70. *
  71. * @return void
  72. */
  73. public function testTranslateModel() {
  74. $this->loadFixtures('TranslateTable', 'Tag', 'TranslatedItem', 'Translate', 'User', 'TranslatedArticle', 'TranslateArticle');
  75. $TestModel = new Tag();
  76. $TestModel->translateTable = 'another_i18n';
  77. $TestModel->Behaviors->attach('Translate', array('title'));
  78. $translateModel = $TestModel->Behaviors->Translate->translateModel($TestModel);
  79. $this->assertEquals('I18nModel', $translateModel->name);
  80. $this->assertEquals('another_i18n', $translateModel->useTable);
  81. $TestModel = new User();
  82. $TestModel->Behaviors->attach('Translate', array('title'));
  83. $translateModel = $TestModel->Behaviors->Translate->translateModel($TestModel);
  84. $this->assertEquals('I18nModel', $translateModel->name);
  85. $this->assertEquals('i18n', $translateModel->useTable);
  86. $TestModel = new TranslatedArticle();
  87. $translateModel = $TestModel->Behaviors->Translate->translateModel($TestModel);
  88. $this->assertEquals('TranslateArticleModel', $translateModel->name);
  89. $this->assertEquals('article_i18n', $translateModel->useTable);
  90. $TestModel = new TranslatedItem();
  91. $translateModel = $TestModel->Behaviors->Translate->translateModel($TestModel);
  92. $this->assertEquals('TranslateTestModel', $translateModel->name);
  93. $this->assertEquals('i18n', $translateModel->useTable);
  94. }
  95. /**
  96. * testLocaleFalsePlain method
  97. *
  98. * @return void
  99. */
  100. public function testLocaleFalsePlain() {
  101. $this->loadFixtures('Translate', 'TranslatedItem', 'User');
  102. $TestModel = new TranslatedItem();
  103. $TestModel->locale = false;
  104. $result = $TestModel->read(null, 1);
  105. $expected = array('TranslatedItem' => array(
  106. 'id' => 1,
  107. 'slug' => 'first_translated',
  108. 'translated_article_id' => 1,
  109. ));
  110. $this->assertEquals($expected, $result);
  111. $result = $TestModel->find('all', array('fields' => array('slug')));
  112. $expected = array(
  113. array('TranslatedItem' => array('slug' => 'first_translated')),
  114. array('TranslatedItem' => array('slug' => 'second_translated')),
  115. array('TranslatedItem' => array('slug' => 'third_translated'))
  116. );
  117. $this->assertEquals($expected, $result);
  118. }
  119. /**
  120. * testLocaleFalseAssociations method
  121. *
  122. * @return void
  123. */
  124. public function testLocaleFalseAssociations() {
  125. $this->loadFixtures('Translate', 'TranslatedItem');
  126. $TestModel = new TranslatedItem();
  127. $TestModel->locale = false;
  128. $TestModel->unbindTranslation();
  129. $translations = array('title' => 'Title', 'content' => 'Content');
  130. $TestModel->bindTranslation($translations, false);
  131. $result = $TestModel->read(null, 1);
  132. $expected = array(
  133. 'TranslatedItem' => array('id' => 1, 'slug' => 'first_translated', 'translated_article_id' => 1),
  134. 'Title' => array(
  135. array('id' => 1, 'locale' => 'eng', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'title', 'content' => 'Title #1'),
  136. array('id' => 3, 'locale' => 'deu', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'title', 'content' => 'Titel #1'),
  137. array('id' => 5, 'locale' => 'cze', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'title', 'content' => 'Titulek #1')
  138. ),
  139. 'Content' => array(
  140. array('id' => 2, 'locale' => 'eng', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'content', 'content' => 'Content #1'),
  141. array('id' => 4, 'locale' => 'deu', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'content', 'content' => 'Inhalt #1'),
  142. array('id' => 6, 'locale' => 'cze', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'content', 'content' => 'Obsah #1')
  143. )
  144. );
  145. $this->assertEquals($expected, $result);
  146. $TestModel->hasMany['Title']['fields'] = $TestModel->hasMany['Content']['fields'] = array('content');
  147. $TestModel->hasMany['Title']['conditions']['locale'] = $TestModel->hasMany['Content']['conditions']['locale'] = 'eng';
  148. $result = $TestModel->find('all', array('fields' => array('TranslatedItem.slug')));
  149. $expected = array(
  150. array(
  151. 'TranslatedItem' => array('id' => 1, 'slug' => 'first_translated'),
  152. 'Title' => array(array('foreign_key' => 1, 'content' => 'Title #1')),
  153. 'Content' => array(array('foreign_key' => 1, 'content' => 'Content #1'))
  154. ),
  155. array(
  156. 'TranslatedItem' => array('id' => 2, 'slug' => 'second_translated'),
  157. 'Title' => array(array('foreign_key' => 2, 'content' => 'Title #2')),
  158. 'Content' => array(array('foreign_key' => 2, 'content' => 'Content #2'))
  159. ),
  160. array(
  161. 'TranslatedItem' => array('id' => 3, 'slug' => 'third_translated'),
  162. 'Title' => array(array('foreign_key' => 3, 'content' => 'Title #3')),
  163. 'Content' => array(array('foreign_key' => 3, 'content' => 'Content #3'))
  164. )
  165. );
  166. $this->assertEquals($expected, $result);
  167. }
  168. /**
  169. * testLocaleSingle method
  170. *
  171. * @return void
  172. */
  173. public function testLocaleSingle() {
  174. $this->loadFixtures('Translate', 'TranslatedItem');
  175. $TestModel = new TranslatedItem();
  176. $TestModel->locale = 'eng';
  177. $result = $TestModel->read(null, 1);
  178. $expected = array(
  179. 'TranslatedItem' => array(
  180. 'id' => 1,
  181. 'slug' => 'first_translated',
  182. 'locale' => 'eng',
  183. 'title' => 'Title #1',
  184. 'content' => 'Content #1',
  185. 'translated_article_id' => 1,
  186. )
  187. );
  188. $this->assertEquals($expected, $result);
  189. $result = $TestModel->find('all');
  190. $expected = array(
  191. array(
  192. 'TranslatedItem' => array(
  193. 'id' => 1,
  194. 'slug' => 'first_translated',
  195. 'locale' => 'eng',
  196. 'title' => 'Title #1',
  197. 'content' => 'Content #1',
  198. 'translated_article_id' => 1,
  199. )
  200. ),
  201. array(
  202. 'TranslatedItem' => array(
  203. 'id' => 2,
  204. 'slug' => 'second_translated',
  205. 'locale' => 'eng',
  206. 'title' => 'Title #2',
  207. 'content' => 'Content #2',
  208. 'translated_article_id' => 1,
  209. )
  210. ),
  211. array(
  212. 'TranslatedItem' => array(
  213. 'id' => 3,
  214. 'slug' => 'third_translated',
  215. 'locale' => 'eng',
  216. 'title' => 'Title #3',
  217. 'content' => 'Content #3',
  218. 'translated_article_id' => 1,
  219. )
  220. )
  221. );
  222. $this->assertEquals($expected, $result);
  223. }
  224. /**
  225. * testLocaleSingleWithConditions method
  226. *
  227. * @return void
  228. */
  229. public function testLocaleSingleWithConditions() {
  230. $this->loadFixtures('Translate', 'TranslatedItem');
  231. $TestModel = new TranslatedItem();
  232. $TestModel->locale = 'eng';
  233. $result = $TestModel->find('all', array('conditions' => array('slug' => 'first_translated')));
  234. $expected = array(
  235. array(
  236. 'TranslatedItem' => array(
  237. 'id' => 1,
  238. 'slug' => 'first_translated',
  239. 'locale' => 'eng',
  240. 'title' => 'Title #1',
  241. 'content' => 'Content #1',
  242. 'translated_article_id' => 1,
  243. )
  244. )
  245. );
  246. $this->assertEquals($expected, $result);
  247. $result = $TestModel->find('all', array('conditions' => "TranslatedItem.slug = 'first_translated'"));
  248. $expected = array(
  249. array(
  250. 'TranslatedItem' => array(
  251. 'id' => 1,
  252. 'slug' => 'first_translated',
  253. 'locale' => 'eng',
  254. 'title' => 'Title #1',
  255. 'content' => 'Content #1',
  256. 'translated_article_id' => 1,
  257. )
  258. )
  259. );
  260. $this->assertEquals($expected, $result);
  261. }
  262. /**
  263. * testLocaleSingleAssociations method
  264. *
  265. * @return void
  266. */
  267. public function testLocaleSingleAssociations() {
  268. $this->loadFixtures('Translate', 'TranslatedItem');
  269. $TestModel = new TranslatedItem();
  270. $TestModel->locale = 'eng';
  271. $TestModel->unbindTranslation();
  272. $translations = array('title' => 'Title', 'content' => 'Content');
  273. $TestModel->bindTranslation($translations, false);
  274. $result = $TestModel->read(null, 1);
  275. $expected = array(
  276. 'TranslatedItem' => array(
  277. 'id' => 1,
  278. 'slug' => 'first_translated',
  279. 'locale' => 'eng',
  280. 'title' => 'Title #1',
  281. 'content' => 'Content #1',
  282. 'translated_article_id' => 1,
  283. ),
  284. 'Title' => array(
  285. array('id' => 1, 'locale' => 'eng', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'title', 'content' => 'Title #1'),
  286. array('id' => 3, 'locale' => 'deu', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'title', 'content' => 'Titel #1'),
  287. array('id' => 5, 'locale' => 'cze', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'title', 'content' => 'Titulek #1')
  288. ),
  289. 'Content' => array(
  290. array('id' => 2, 'locale' => 'eng', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'content', 'content' => 'Content #1'),
  291. array('id' => 4, 'locale' => 'deu', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'content', 'content' => 'Inhalt #1'),
  292. array('id' => 6, 'locale' => 'cze', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'content', 'content' => 'Obsah #1')
  293. )
  294. );
  295. $this->assertEquals($expected, $result);
  296. $TestModel->hasMany['Title']['fields'] = $TestModel->hasMany['Content']['fields'] = array('content');
  297. $TestModel->hasMany['Title']['conditions']['locale'] = $TestModel->hasMany['Content']['conditions']['locale'] = 'eng';
  298. $result = $TestModel->find('all', array('fields' => array('TranslatedItem.title')));
  299. $expected = array(
  300. array(
  301. 'TranslatedItem' => array(
  302. 'id' => 1,
  303. 'locale' => 'eng',
  304. 'title' => 'Title #1',
  305. 'slug' => 'first_translated',
  306. 'translated_article_id' => 1,
  307. ),
  308. 'Title' => array(array('foreign_key' => 1, 'content' => 'Title #1')),
  309. 'Content' => array(array('foreign_key' => 1, 'content' => 'Content #1'))
  310. ),
  311. array(
  312. 'TranslatedItem' => array(
  313. 'id' => 2,
  314. 'locale' => 'eng',
  315. 'title' => 'Title #2',
  316. 'slug' => 'second_translated',
  317. 'translated_article_id' => 1,
  318. ),
  319. 'Title' => array(array('foreign_key' => 2, 'content' => 'Title #2')),
  320. 'Content' => array(array('foreign_key' => 2, 'content' => 'Content #2'))
  321. ),
  322. array(
  323. 'TranslatedItem' => array(
  324. 'id' => 3,
  325. 'locale' => 'eng',
  326. 'title' => 'Title #3',
  327. 'slug' => 'third_translated',
  328. 'translated_article_id' => 1,
  329. ),
  330. 'Title' => array(array('foreign_key' => 3, 'content' => 'Title #3')),
  331. 'Content' => array(array('foreign_key' => 3, 'content' => 'Content #3'))
  332. )
  333. );
  334. $this->assertEquals($expected, $result);
  335. }
  336. /**
  337. * testLocaleMultiple method
  338. *
  339. * @return void
  340. */
  341. public function testLocaleMultiple() {
  342. $this->loadFixtures('Translate', 'TranslatedItem');
  343. $TestModel = new TranslatedItem();
  344. $TestModel->locale = array('deu', 'eng', 'cze');
  345. $result = $TestModel->read(null, 1);
  346. $expected = array(
  347. 'TranslatedItem' => array(
  348. 'id' => 1,
  349. 'slug' => 'first_translated',
  350. 'locale' => 'deu',
  351. 'title' => 'Titel #1',
  352. 'content' => 'Inhalt #1',
  353. 'translated_article_id' => 1,
  354. )
  355. );
  356. $this->assertEquals($expected, $result);
  357. $result = $TestModel->find('all', array('fields' => array('slug', 'title', 'content')));
  358. $expected = array(
  359. array(
  360. 'TranslatedItem' => array(
  361. 'slug' => 'first_translated',
  362. 'locale' => 'deu',
  363. 'content' => 'Inhalt #1',
  364. 'title' => 'Titel #1',
  365. )
  366. ),
  367. array(
  368. 'TranslatedItem' => array(
  369. 'slug' => 'second_translated',
  370. 'locale' => 'deu',
  371. 'title' => 'Titel #2',
  372. 'content' => 'Inhalt #2',
  373. )
  374. ),
  375. array(
  376. 'TranslatedItem' => array(
  377. 'slug' => 'third_translated',
  378. 'locale' => 'deu',
  379. 'title' => 'Titel #3',
  380. 'content' => 'Inhalt #3',
  381. )
  382. )
  383. );
  384. $this->assertEquals($expected, $result);
  385. }
  386. /**
  387. * testMissingTranslation method
  388. *
  389. * @return void
  390. */
  391. public function testMissingTranslation() {
  392. $this->loadFixtures('Translate', 'TranslatedItem');
  393. $TestModel = new TranslatedItem();
  394. $TestModel->locale = 'rus';
  395. $result = $TestModel->read(null, 1);
  396. $this->assertFalse($result);
  397. $TestModel->locale = array('rus');
  398. $result = $TestModel->read(null, 1);
  399. $expected = array(
  400. 'TranslatedItem' => array(
  401. 'id' => 1,
  402. 'slug' => 'first_translated',
  403. 'locale' => 'rus',
  404. 'title' => '',
  405. 'content' => '',
  406. 'translated_article_id' => 1,
  407. )
  408. );
  409. $this->assertEquals($expected, $result);
  410. }
  411. /**
  412. * testTranslatedFindList method
  413. *
  414. * @return void
  415. */
  416. public function testTranslatedFindList() {
  417. $this->loadFixtures('Translate', 'TranslatedItem');
  418. $TestModel = new TranslatedItem();
  419. $TestModel->locale = 'deu';
  420. $TestModel->displayField = 'title';
  421. $result = $TestModel->find('list', array('recursive' => 1));
  422. $expected = array(1 => 'Titel #1', 2 => 'Titel #2', 3 => 'Titel #3');
  423. $this->assertEquals($expected, $result);
  424. // SQL Server trigger an error and stops the page even if the debug = 0
  425. if ($this->db instanceof Sqlserver) {
  426. $debug = Configure::read('debug');
  427. Configure::write('debug', 0);
  428. $result = $TestModel->find('list', array('recursive' => 1, 'callbacks' => false));
  429. $this->assertEquals(array(), $result);
  430. $result = $TestModel->find('list', array('recursive' => 1, 'callbacks' => 'after'));
  431. $this->assertEquals(array(), $result);
  432. Configure::write('debug', $debug);
  433. }
  434. $result = $TestModel->find('list', array('recursive' => 1, 'callbacks' => 'before'));
  435. $expected = array(1 => null, 2 => null, 3 => null);
  436. $this->assertEquals($expected, $result);
  437. }
  438. /**
  439. * testReadSelectedFields method
  440. *
  441. * @return void
  442. */
  443. public function testReadSelectedFields() {
  444. $this->loadFixtures('Translate', 'TranslatedItem');
  445. $TestModel = new TranslatedItem();
  446. $TestModel->locale = 'eng';
  447. $result = $TestModel->find('all', array('fields' => array('slug', 'TranslatedItem.content')));
  448. $expected = array(
  449. array('TranslatedItem' => array('slug' => 'first_translated', 'locale' => 'eng', 'content' => 'Content #1')),
  450. array('TranslatedItem' => array('slug' => 'second_translated', 'locale' => 'eng', 'content' => 'Content #2')),
  451. array('TranslatedItem' => array('slug' => 'third_translated', 'locale' => 'eng', 'content' => 'Content #3'))
  452. );
  453. $this->assertEquals($expected, $result);
  454. $result = $TestModel->find('all', array('fields' => array('TranslatedItem.slug', 'content')));
  455. $this->assertEquals($expected, $result);
  456. $TestModel->locale = array('eng', 'deu', 'cze');
  457. $delete = array(array('locale' => 'deu'), array('field' => 'content', 'locale' => 'eng'));
  458. $I18nModel = ClassRegistry::getObject('TranslateTestModel');
  459. $I18nModel->deleteAll(array('or' => $delete));
  460. $result = $TestModel->find('all', array('fields' => array('title', 'content')));
  461. $expected = array(
  462. array('TranslatedItem' => array('locale' => 'eng', 'title' => 'Title #1', 'content' => 'Obsah #1')),
  463. array('TranslatedItem' => array('locale' => 'eng', 'title' => 'Title #2', 'content' => 'Obsah #2')),
  464. array('TranslatedItem' => array('locale' => 'eng', 'title' => 'Title #3', 'content' => 'Obsah #3'))
  465. );
  466. $this->assertEquals($expected, $result);
  467. }
  468. /**
  469. * testSaveCreate method
  470. *
  471. * @return void
  472. */
  473. public function testSaveCreate() {
  474. $this->loadFixtures('Translate', 'TranslatedItem');
  475. $TestModel = new TranslatedItem();
  476. $TestModel->locale = 'spa';
  477. $data = array(
  478. 'slug' => 'fourth_translated',
  479. 'title' => 'Leyenda #4',
  480. 'content' => 'Contenido #4',
  481. 'translated_article_id' => 1,
  482. );
  483. $TestModel->create($data);
  484. $TestModel->save();
  485. $result = $TestModel->read();
  486. $expected = array('TranslatedItem' => array_merge($data, array('id' => $TestModel->id, 'locale' => 'spa')));
  487. $this->assertEquals($expected, $result);
  488. }
  489. /**
  490. * testSaveUpdate method
  491. *
  492. * @return void
  493. */
  494. public function testSaveUpdate() {
  495. $this->loadFixtures('Translate', 'TranslatedItem');
  496. $TestModel = new TranslatedItem();
  497. $TestModel->locale = 'spa';
  498. $oldData = array('slug' => 'fourth_translated', 'title' => 'Leyenda #4', 'translated_article_id' => 1);
  499. $TestModel->create($oldData);
  500. $TestModel->save();
  501. $id = $TestModel->id;
  502. $newData = array('id' => $id, 'content' => 'Contenido #4');
  503. $TestModel->create($newData);
  504. $TestModel->save();
  505. $result = $TestModel->read(null, $id);
  506. $expected = array('TranslatedItem' => array_merge($oldData, $newData, array('locale' => 'spa')));
  507. $this->assertEquals($expected, $result);
  508. }
  509. /**
  510. * testMultipleCreate method
  511. *
  512. * @return void
  513. */
  514. public function testMultipleCreate() {
  515. $this->loadFixtures('Translate', 'TranslatedItem');
  516. $TestModel = new TranslatedItem();
  517. $TestModel->locale = 'deu';
  518. $data = array(
  519. 'slug' => 'new_translated',
  520. 'title' => array('eng' => 'New title', 'spa' => 'Nuevo leyenda'),
  521. 'content' => array('eng' => 'New content', 'spa' => 'Nuevo contenido')
  522. );
  523. $TestModel->create($data);
  524. $TestModel->save();
  525. $TestModel->unbindTranslation();
  526. $translations = array('title' => 'Title', 'content' => 'Content');
  527. $TestModel->bindTranslation($translations, false);
  528. $TestModel->locale = array('eng', 'spa');
  529. $result = $TestModel->read();
  530. $expected = array(
  531. 'TranslatedItem' => array(
  532. 'id' => 4,
  533. 'slug' => 'new_translated',
  534. 'locale' => 'eng',
  535. 'title' => 'New title',
  536. 'content' => 'New content',
  537. 'translated_article_id' => null,
  538. ),
  539. 'Title' => array(
  540. array('id' => 21, 'locale' => 'eng', 'model' => 'TranslatedItem', 'foreign_key' => 4, 'field' => 'title', 'content' => 'New title'),
  541. array('id' => 22, 'locale' => 'spa', 'model' => 'TranslatedItem', 'foreign_key' => 4, 'field' => 'title', 'content' => 'Nuevo leyenda')
  542. ),
  543. 'Content' => array(
  544. array('id' => 19, 'locale' => 'eng', 'model' => 'TranslatedItem', 'foreign_key' => 4, 'field' => 'content', 'content' => 'New content'),
  545. array('id' => 20, 'locale' => 'spa', 'model' => 'TranslatedItem', 'foreign_key' => 4, 'field' => 'content', 'content' => 'Nuevo contenido')
  546. )
  547. );
  548. $this->assertEquals($expected, $result);
  549. }
  550. /**
  551. * testMultipleUpdate method
  552. *
  553. * @return void
  554. */
  555. public function testMultipleUpdate() {
  556. $this->loadFixtures('Translate', 'TranslatedItem');
  557. $TestModel = new TranslatedItem();
  558. $TestModel->locale = 'eng';
  559. $TestModel->validate['title'] = 'notEmpty';
  560. $data = array('TranslatedItem' => array(
  561. 'id' => 1,
  562. 'title' => array('eng' => 'New Title #1', 'deu' => 'Neue Titel #1', 'cze' => 'Novy Titulek #1'),
  563. 'content' => array('eng' => 'New Content #1', 'deu' => 'Neue Inhalt #1', 'cze' => 'Novy Obsah #1')
  564. ));
  565. $TestModel->create();
  566. $TestModel->save($data);
  567. $TestModel->unbindTranslation();
  568. $translations = array('title' => 'Title', 'content' => 'Content');
  569. $TestModel->bindTranslation($translations, false);
  570. $result = $TestModel->read(null, 1);
  571. $expected = array(
  572. 'TranslatedItem' => array(
  573. 'id' => '1',
  574. 'slug' => 'first_translated',
  575. 'locale' => 'eng',
  576. 'title' => 'New Title #1',
  577. 'content' => 'New Content #1',
  578. 'translated_article_id' => 1,
  579. ),
  580. 'Title' => array(
  581. array('id' => 1, 'locale' => 'eng', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'title', 'content' => 'New Title #1'),
  582. array('id' => 3, 'locale' => 'deu', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'title', 'content' => 'Neue Titel #1'),
  583. array('id' => 5, 'locale' => 'cze', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'title', 'content' => 'Novy Titulek #1')
  584. ),
  585. 'Content' => array(
  586. array('id' => 2, 'locale' => 'eng', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'content', 'content' => 'New Content #1'),
  587. array('id' => 4, 'locale' => 'deu', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'content', 'content' => 'Neue Inhalt #1'),
  588. array('id' => 6, 'locale' => 'cze', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'content', 'content' => 'Novy Obsah #1')
  589. )
  590. );
  591. $this->assertEquals($expected, $result);
  592. $TestModel->unbindTranslation($translations);
  593. $TestModel->bindTranslation(array('title', 'content'), false);
  594. }
  595. /**
  596. * testMixedCreateUpdateWithArrayLocale method
  597. *
  598. * @return void
  599. */
  600. public function testMixedCreateUpdateWithArrayLocale() {
  601. $this->loadFixtures('Translate', 'TranslatedItem');
  602. $TestModel = new TranslatedItem();
  603. $TestModel->locale = array('cze', 'deu');
  604. $data = array('TranslatedItem' => array(
  605. 'id' => 1,
  606. 'title' => array('eng' => 'Updated Title #1', 'spa' => 'Nuevo leyenda #1'),
  607. 'content' => 'Upraveny obsah #1'
  608. ));
  609. $TestModel->create();
  610. $TestModel->save($data);
  611. $TestModel->unbindTranslation();
  612. $translations = array('title' => 'Title', 'content' => 'Content');
  613. $TestModel->bindTranslation($translations, false);
  614. $result = $TestModel->read(null, 1);
  615. $result['Title'] = Set::sort($result['Title'], '{n}.id', 'asc');
  616. $result['Content'] = Set::sort($result['Content'], '{n}.id', 'asc');
  617. $expected = array(
  618. 'TranslatedItem' => array(
  619. 'id' => 1,
  620. 'slug' => 'first_translated',
  621. 'locale' => 'cze',
  622. 'title' => 'Titulek #1',
  623. 'content' => 'Upraveny obsah #1',
  624. 'translated_article_id' => 1,
  625. ),
  626. 'Title' => array(
  627. array('id' => 1, 'locale' => 'eng', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'title', 'content' => 'Updated Title #1'),
  628. array('id' => 3, 'locale' => 'deu', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'title', 'content' => 'Titel #1'),
  629. array('id' => 5, 'locale' => 'cze', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'title', 'content' => 'Titulek #1'),
  630. array('id' => 19, 'locale' => 'spa', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'title', 'content' => 'Nuevo leyenda #1')
  631. ),
  632. 'Content' => array(
  633. array('id' => 2, 'locale' => 'eng', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'content', 'content' => 'Content #1'),
  634. array('id' => 4, 'locale' => 'deu', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'content', 'content' => 'Inhalt #1'),
  635. array('id' => 6, 'locale' => 'cze', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'content', 'content' => 'Upraveny obsah #1')
  636. )
  637. );
  638. $this->assertEquals($expected, $result);
  639. }
  640. /**
  641. * Test that saveAll() works with hasMany associations that contain
  642. * translations.
  643. *
  644. * @return void
  645. */
  646. public function testSaveAllTranslatedAssociations() {
  647. $this->loadFixtures('Translate', 'TranslateArticle', 'TranslatedItem', 'TranslatedArticle', 'User');
  648. $Model = new TranslatedArticle();
  649. $Model->locale = 'eng';
  650. $data = array(
  651. 'TranslatedArticle' => array(
  652. 'id' => 4,
  653. 'user_id' => 1,
  654. 'published' => 'Y',
  655. 'title' => 'Title (eng) #1',
  656. 'body' => 'Body (eng) #1'
  657. ),
  658. 'TranslatedItem' => array(
  659. array(
  660. 'slug' => '',
  661. 'title' => 'Nuevo leyenda #1',
  662. 'content' => 'Upraveny obsah #1'
  663. ),
  664. array(
  665. 'slug' => '',
  666. 'title' => 'New Title #2',
  667. 'content' => 'New Content #2'
  668. ),
  669. )
  670. );
  671. $result = $Model->saveAll($data);
  672. $this->assertTrue($result);
  673. $result = $Model->TranslatedItem->find('all', array(
  674. 'conditions' => array('translated_article_id' => $Model->id)
  675. ));
  676. $this->assertCount(2, $result);
  677. $this->assertEquals($data['TranslatedItem'][0]['title'], $result[0]['TranslatedItem']['title']);
  678. $this->assertEquals($data['TranslatedItem'][1]['title'], $result[1]['TranslatedItem']['title']);
  679. }
  680. /**
  681. * testValidation method
  682. *
  683. * @return void
  684. */
  685. public function testValidation() {
  686. $this->loadFixtures('Translate', 'TranslatedItem');
  687. $TestModel = new TranslatedItem();
  688. $TestModel->locale = 'eng';
  689. $TestModel->validate['title'] = '/Only this title/';
  690. $data = array(
  691. 'TranslatedItem' => array(
  692. 'id' => 1,
  693. 'title' => array('eng' => 'New Title #1', 'deu' => 'Neue Titel #1', 'cze' => 'Novy Titulek #1'),
  694. 'content' => array('eng' => 'New Content #1', 'deu' => 'Neue Inhalt #1', 'cze' => 'Novy Obsah #1')
  695. )
  696. );
  697. $TestModel->create();
  698. $this->assertFalse($TestModel->save($data));
  699. $this->assertEquals(array('This field cannot be left blank'), $TestModel->validationErrors['title']);
  700. $TestModel->locale = 'eng';
  701. $TestModel->validate['title'] = '/Only this title/';
  702. $data = array('TranslatedItem' => array(
  703. 'id' => 1,
  704. 'title' => array('eng' => 'Only this title', 'deu' => 'Neue Titel #1', 'cze' => 'Novy Titulek #1'),
  705. 'content' => array('eng' => 'New Content #1', 'deu' => 'Neue Inhalt #1', 'cze' => 'Novy Obsah #1')
  706. ));
  707. $TestModel->create();
  708. $result = $TestModel->save($data);
  709. $this->assertFalse(empty($result));
  710. }
  711. /**
  712. * testAttachDetach method
  713. *
  714. * @return void
  715. */
  716. public function testAttachDetach() {
  717. $this->loadFixtures('Translate', 'TranslatedItem');
  718. $TestModel = new TranslatedItem();
  719. $TestModel->unbindTranslation();
  720. $translations = array('title' => 'Title', 'content' => 'Content');
  721. $TestModel->bindTranslation($translations, false);
  722. $result = array_keys($TestModel->hasMany);
  723. $expected = array('Title', 'Content');
  724. $this->assertEquals($expected, $result);
  725. $TestModel->Behaviors->detach('Translate');
  726. $result = array_keys($TestModel->hasMany);
  727. $expected = array();
  728. $this->assertEquals($expected, $result);
  729. $result = isset($TestModel->Behaviors->Translate);
  730. $this->assertFalse($result);
  731. $result = isset($Behavior->settings[$TestModel->alias]);
  732. $this->assertFalse($result);
  733. $result = isset($Behavior->runtime[$TestModel->alias]);
  734. $this->assertFalse($result);
  735. $TestModel->Behaviors->attach('Translate', array('title' => 'Title', 'content' => 'Content'));
  736. $result = array_keys($TestModel->hasMany);
  737. $expected = array('Title', 'Content');
  738. $this->assertEquals($expected, $result);
  739. $result = isset($TestModel->Behaviors->Translate);
  740. $this->assertTrue($result);
  741. $Behavior = $TestModel->Behaviors->Translate;
  742. $result = isset($Behavior->settings[$TestModel->alias]);
  743. $this->assertTrue($result);
  744. $result = isset($Behavior->runtime[$TestModel->alias]);
  745. $this->assertTrue($result);
  746. }
  747. /**
  748. * testAnotherTranslateTable method
  749. *
  750. * @return void
  751. */
  752. public function testAnotherTranslateTable() {
  753. $this->loadFixtures('Translate', 'TranslatedItem', 'TranslateTable');
  754. $TestModel = new TranslatedItemWithTable();
  755. $TestModel->locale = 'eng';
  756. $result = $TestModel->read(null, 1);
  757. $expected = array(
  758. 'TranslatedItemWithTable' => array(
  759. 'id' => 1,
  760. 'slug' => 'first_translated',
  761. 'locale' => 'eng',
  762. 'title' => 'Another Title #1',
  763. 'content' => 'Another Content #1',
  764. 'translated_article_id' => 1,
  765. )
  766. );
  767. $this->assertEquals($expected, $result);
  768. }
  769. /**
  770. * testTranslateWithAssociations method
  771. *
  772. * @return void
  773. */
  774. public function testTranslateWithAssociations() {
  775. $this->loadFixtures('TranslateArticle', 'TranslatedArticle', 'TranslatedItem', 'User', 'Comment', 'ArticlesTag', 'Tag');
  776. $TestModel = new TranslatedArticle();
  777. $TestModel->locale = 'eng';
  778. $recursive = $TestModel->recursive;
  779. $result = $TestModel->read(null, 1);
  780. $expected = array(
  781. 'TranslatedArticle' => array(
  782. 'id' => 1,
  783. 'user_id' => 1,
  784. 'published' => 'Y',
  785. 'created' => '2007-03-18 10:39:23',
  786. 'updated' => '2007-03-18 10:41:31',
  787. 'locale' => 'eng',
  788. 'title' => 'Title (eng) #1',
  789. 'body' => 'Body (eng) #1'
  790. ),
  791. 'User' => array(
  792. 'id' => 1,
  793. 'user' => 'mariano',
  794. 'password' => '5f4dcc3b5aa765d61d8327deb882cf99',
  795. 'created' => '2007-03-17 01:16:23',
  796. 'updated' => '2007-03-17 01:18:31'
  797. ),
  798. 'TranslatedItem' => array(
  799. array(
  800. 'id' => 1,
  801. 'translated_article_id' => 1,
  802. 'slug' => 'first_translated'
  803. ),
  804. array(
  805. 'id' => 2,
  806. 'translated_article_id' => 1,
  807. 'slug' => 'second_translated'
  808. ),
  809. array(
  810. 'id' => 3,
  811. 'translated_article_id' => 1,
  812. 'slug' => 'third_translated'
  813. ),
  814. )
  815. );
  816. $this->assertEquals($expected, $result);
  817. $result = $TestModel->find('all', array('recursive' => -1));
  818. $expected = array(
  819. array(
  820. 'TranslatedArticle' => array(
  821. 'id' => 1,
  822. 'user_id' => 1,
  823. 'published' => 'Y',
  824. 'created' => '2007-03-18 10:39:23',
  825. 'updated' => '2007-03-18 10:41:31',
  826. 'locale' => 'eng',
  827. 'title' => 'Title (eng) #1',
  828. 'body' => 'Body (eng) #1'
  829. )
  830. ),
  831. array(
  832. 'TranslatedArticle' => array(
  833. 'id' => 2,
  834. 'user_id' => 3,
  835. 'published' => 'Y',
  836. 'created' => '2007-03-18 10:41:23',
  837. 'updated' => '2007-03-18 10:43:31',
  838. 'locale' => 'eng',
  839. 'title' => 'Title (eng) #2',
  840. 'body' => 'Body (eng) #2'
  841. )
  842. ),
  843. array(
  844. 'TranslatedArticle' => array(
  845. 'id' => 3,
  846. 'user_id' => 1,
  847. 'published' => 'Y',
  848. 'created' => '2007-03-18 10:43:23',
  849. 'updated' => '2007-03-18 10:45:31',
  850. 'locale' => 'eng',
  851. 'title' => 'Title (eng) #3',
  852. 'body' => 'Body (eng) #3'
  853. )
  854. )
  855. );
  856. $this->assertEquals($expected, $result);
  857. $this->assertEquals($TestModel->recursive, $recursive);
  858. $TestModel->recursive = -1;
  859. $result = $TestModel->read(null, 1);
  860. $expected = array(
  861. 'TranslatedArticle' => array(
  862. 'id' => 1,
  863. 'user_id' => 1,
  864. 'published' => 'Y',
  865. 'created' => '2007-03-18 10:39:23',
  866. 'updated' => '2007-03-18 10:41:31',
  867. 'locale' => 'eng',
  868. 'title' => 'Title (eng) #1',
  869. 'body' => 'Body (eng) #1'
  870. )
  871. );
  872. $this->assertEquals($expected, $result);
  873. }
  874. /**
  875. * testTranslateTableWithPrefix method
  876. * Tests that is possible to have a translation model with a custom tablePrefix
  877. *
  878. * @return void
  879. */
  880. public function testTranslateTableWithPrefix() {
  881. $this->loadFixtures('TranslateWithPrefix', 'TranslatedItem');
  882. $TestModel = new TranslatedItem2;
  883. $TestModel->locale = 'eng';
  884. $result = $TestModel->read(null, 1);
  885. $expected = array('TranslatedItem' => array(
  886. 'id' => 1,
  887. 'slug' => 'first_translated',
  888. 'locale' => 'eng',
  889. 'content' => 'Content #1',
  890. 'title' => 'Title #1',
  891. 'translated_article_id' => 1,
  892. ));
  893. $this->assertEquals($expected, $result);
  894. }
  895. /**
  896. * Test infinite loops not occurring with unbindTranslation()
  897. *
  898. * @return void
  899. */
  900. public function testUnbindTranslationInfinteLoop() {
  901. $this->loadFixtures('Translate', 'TranslatedItem');
  902. $TestModel = new TranslatedItem();
  903. $TestModel->Behaviors->detach('Translate');
  904. $TestModel->actsAs = array();
  905. $TestModel->Behaviors->attach('Translate');
  906. $TestModel->bindTranslation(array('title', 'content'), true);
  907. $result = $TestModel->unbindTranslation();
  908. $this->assertFalse($result);
  909. }
  910. /**
  911. * Test that an exception is raised when you try to over-write the name attribute.
  912. *
  913. * @expectedException CakeException
  914. * @return void
  915. */
  916. public function testExceptionOnNameTranslation() {
  917. $this->loadFixtures('Translate', 'TranslatedItem');
  918. $TestModel = new TranslatedItem();
  919. $TestModel->bindTranslation(array('name' => 'name'));
  920. }
  921. /**
  922. * Test that translations can be bound and unbound dynamically.
  923. *
  924. * @return void
  925. */
  926. public function testUnbindTranslation() {
  927. $this->loadFixtures('Translate', 'TranslatedItem');
  928. $Model = new TranslatedItem();
  929. $Model->unbindTranslation();
  930. $Model->bindTranslation(array('body', 'slug'), false);
  931. $result = $Model->Behaviors->Translate->settings['TranslatedItem'];
  932. $this->assertEquals(array('body', 'slug'), $result);
  933. $Model->unbindTranslation(array('body'));
  934. $result = $Model->Behaviors->Translate->settings['TranslatedItem'];
  935. $this->assertNotContains('body', $result);
  936. $Model->unbindTranslation('slug');
  937. $result = $Model->Behaviors->Translate->settings['TranslatedItem'];
  938. $this->assertNotContains('slug', $result);
  939. }
  940. }