TranslateBehaviorTest.php 37 KB

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