Subversion Repositories SmartDukaan

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
16591 anikendra 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       http://www.opensource.org/licenses/mit-license.php MIT License
14
 */
15
 
16
App::uses('Model', 'Model');
17
App::uses('AppModel', 'Model');
18
 
19
require_once dirname(dirname(__FILE__)) . DS . 'models.php';
20
 
21
/**
22
 * TranslateBehaviorTest class
23
 *
24
 * @package       Cake.Test.Case.Model.Behavior
25
 */
26
class TranslateBehaviorTest extends CakeTestCase {
27
 
28
/**
29
 * autoFixtures property
30
 *
31
 * @var bool
32
 */
33
	public $autoFixtures = false;
34
 
35
/**
36
 * fixtures property
37
 *
38
 * @var array
39
 */
40
	public $fixtures = array(
41
		'core.translated_item', 'core.translate', 'core.translate_table',
42
		'core.translated_article', 'core.translate_article', 'core.user', 'core.comment', 'core.tag', 'core.articles_tag',
43
		'core.translate_with_prefix'
44
	);
45
 
46
/**
47
 * Test that count queries with conditions get the correct joins
48
 *
49
 * @return void
50
 */
51
	public function testCountWithConditions() {
52
		$this->loadFixtures('Translate', 'TranslatedItem');
53
 
54
		$Model = new TranslatedItem();
55
		$Model->locale = 'eng';
56
		$result = $Model->find('count', array(
57
			'conditions' => array(
58
				'I18n__content.locale' => 'eng'
59
			)
60
		));
61
		$this->assertEquals(3, $result);
62
	}
63
 
64
/**
65
 * testTranslateModel method
66
 *
67
 * @return void
68
 */
69
	public function testTranslateModel() {
70
		$this->loadFixtures('TranslateTable', 'Tag', 'TranslatedItem', 'Translate', 'User', 'TranslatedArticle', 'TranslateArticle');
71
		$TestModel = new Tag();
72
		$TestModel->translateTable = 'another_i18n';
73
		$TestModel->Behaviors->load('Translate', array('title'));
74
		$translateModel = $TestModel->Behaviors->Translate->translateModel($TestModel);
75
		$this->assertEquals('I18nModel', $translateModel->name);
76
		$this->assertEquals('another_i18n', $translateModel->useTable);
77
 
78
		$TestModel = new User();
79
		$TestModel->Behaviors->load('Translate', array('title'));
80
		$translateModel = $TestModel->Behaviors->Translate->translateModel($TestModel);
81
		$this->assertEquals('I18nModel', $translateModel->name);
82
		$this->assertEquals('i18n', $translateModel->useTable);
83
 
84
		$TestModel = new TranslatedArticle();
85
		$translateModel = $TestModel->Behaviors->Translate->translateModel($TestModel);
86
		$this->assertEquals('TranslateArticleModel', $translateModel->name);
87
		$this->assertEquals('article_i18n', $translateModel->useTable);
88
 
89
		$TestModel = new TranslatedItem();
90
		$translateModel = $TestModel->Behaviors->Translate->translateModel($TestModel);
91
		$this->assertEquals('TranslateTestModel', $translateModel->name);
92
		$this->assertEquals('i18n', $translateModel->useTable);
93
	}
94
 
95
/**
96
 * testLocaleFalsePlain method
97
 *
98
 * @return void
99
 */
100
	public function testLocaleFalsePlain() {
101
		$this->loadFixtures('Translate', 'TranslatedItem', 'User');
102
 
103
		$TestModel = new TranslatedItem();
104
		$TestModel->locale = false;
105
 
106
		$result = $TestModel->read(null, 1);
107
		$expected = array('TranslatedItem' => array(
108
			'id' => 1,
109
			'slug' => 'first_translated',
110
			'translated_article_id' => 1,
111
		));
112
		$this->assertEquals($expected, $result);
113
 
114
		$result = $TestModel->find('all', array('fields' => array('slug')));
115
		$expected = array(
116
			array('TranslatedItem' => array('slug' => 'first_translated')),
117
			array('TranslatedItem' => array('slug' => 'second_translated')),
118
			array('TranslatedItem' => array('slug' => 'third_translated'))
119
		);
120
		$this->assertEquals($expected, $result);
121
	}
122
 
123
/**
124
 * testLocaleFalseAssociations method
125
 *
126
 * @return void
127
 */
128
	public function testLocaleFalseAssociations() {
129
		$this->loadFixtures('Translate', 'TranslatedItem');
130
 
131
		$TestModel = new TranslatedItem();
132
		$TestModel->locale = false;
133
		$TestModel->unbindTranslation();
134
		$translations = array('title' => 'Title', 'content' => 'Content');
135
		$TestModel->bindTranslation($translations, false);
136
 
137
		$result = $TestModel->read(null, 1);
138
		$expected = array(
139
			'TranslatedItem' => array('id' => 1, 'slug' => 'first_translated', 'translated_article_id' => 1),
140
			'Title' => array(
141
				array('id' => 1, 'locale' => 'eng', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'title', 'content' => 'Title #1'),
142
				array('id' => 3, 'locale' => 'deu', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'title', 'content' => 'Titel #1'),
143
				array('id' => 5, 'locale' => 'cze', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'title', 'content' => 'Titulek #1')
144
			),
145
			'Content' => array(
146
				array('id' => 2, 'locale' => 'eng', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'content', 'content' => 'Content #1'),
147
				array('id' => 4, 'locale' => 'deu', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'content', 'content' => 'Inhalt #1'),
148
				array('id' => 6, 'locale' => 'cze', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'content', 'content' => 'Obsah #1')
149
			)
150
		);
151
		$this->assertEquals($expected, $result);
152
 
153
		$TestModel->hasMany['Title']['fields'] = $TestModel->hasMany['Content']['fields'] = array('content');
154
		$TestModel->hasMany['Title']['conditions']['locale'] = $TestModel->hasMany['Content']['conditions']['locale'] = 'eng';
155
 
156
		$result = $TestModel->find('all', array('fields' => array('TranslatedItem.slug')));
157
		$expected = array(
158
			array(
159
				'TranslatedItem' => array('id' => 1, 'slug' => 'first_translated'),
160
				'Title' => array(array('foreign_key' => 1, 'content' => 'Title #1')),
161
				'Content' => array(array('foreign_key' => 1, 'content' => 'Content #1'))
162
			),
163
			array(
164
				'TranslatedItem' => array('id' => 2, 'slug' => 'second_translated'),
165
				'Title' => array(array('foreign_key' => 2, 'content' => 'Title #2')),
166
				'Content' => array(array('foreign_key' => 2, 'content' => 'Content #2'))
167
			),
168
			array(
169
				'TranslatedItem' => array('id' => 3, 'slug' => 'third_translated'),
170
				'Title' => array(array('foreign_key' => 3, 'content' => 'Title #3')),
171
				'Content' => array(array('foreign_key' => 3, 'content' => 'Content #3'))
172
			)
173
		);
174
		$this->assertEquals($expected, $result);
175
	}
176
 
177
/**
178
 * testLocaleSingle method
179
 *
180
 * @return void
181
 */
182
	public function testLocaleSingle() {
183
		$this->loadFixtures('Translate', 'TranslatedItem');
184
 
185
		$TestModel = new TranslatedItem();
186
		$TestModel->locale = 'eng';
187
 
188
		$result = $TestModel->read(null, 1);
189
		$expected = array(
190
			'TranslatedItem' => array(
191
				'id' => 1,
192
				'slug' => 'first_translated',
193
				'locale' => 'eng',
194
				'title' => 'Title #1',
195
				'content' => 'Content #1',
196
				'translated_article_id' => 1,
197
			)
198
		);
199
		$this->assertEquals($expected, $result);
200
 
201
		$result = $TestModel->find('all');
202
		$expected = array(
203
			array(
204
				'TranslatedItem' => array(
205
					'id' => 1,
206
					'slug' => 'first_translated',
207
					'locale' => 'eng',
208
					'title' => 'Title #1',
209
					'content' => 'Content #1',
210
					'translated_article_id' => 1,
211
				)
212
			),
213
			array(
214
				'TranslatedItem' => array(
215
					'id' => 2,
216
					'slug' => 'second_translated',
217
					'locale' => 'eng',
218
					'title' => 'Title #2',
219
					'content' => 'Content #2',
220
					'translated_article_id' => 1,
221
				)
222
			),
223
			array(
224
				'TranslatedItem' => array(
225
					'id' => 3,
226
					'slug' => 'third_translated',
227
					'locale' => 'eng',
228
					'title' => 'Title #3',
229
					'content' => 'Content #3',
230
					'translated_article_id' => 1,
231
				)
232
			)
233
		);
234
		$this->assertEquals($expected, $result);
235
 
236
		$result = $TestModel->field('title', array('TranslatedItem.id' => 1));
237
		$expected = 'Title #1';
238
		$this->assertEquals($expected, $result);
239
 
240
		$result = $TestModel->read('title', 1);
241
		$expected = array(
242
			'TranslatedItem' => array(
243
				'id' => 1,
244
				'slug' => 'first_translated',
245
				'locale' => 'eng',
246
				'title' => 'Title #1',
247
				'translated_article_id' => 1,
248
			)
249
		);
250
		$this->assertEquals($expected, $result);
251
 
252
		$result = $TestModel->read('id, title', 1);
253
		$expected = array(
254
			'TranslatedItem' => array(
255
				'id' => 1,
256
				'locale' => 'eng',
257
				'title' => 'Title #1',
258
			)
259
		);
260
		$this->assertEquals($expected, $result);
261
	}
262
 
263
/**
264
 * testLocaleSingleWithConditions method
265
 *
266
 * @return void
267
 */
268
	public function testLocaleSingleWithConditions() {
269
		$this->loadFixtures('Translate', 'TranslatedItem');
270
 
271
		$TestModel = new TranslatedItem();
272
		$TestModel->locale = 'eng';
273
		$result = $TestModel->find('all', array('conditions' => array('slug' => 'first_translated')));
274
		$expected = array(
275
			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
			)
285
		);
286
		$this->assertEquals($expected, $result);
287
 
288
		$result = $TestModel->find('all', array('conditions' => "TranslatedItem.slug = 'first_translated'"));
289
		$expected = array(
290
			array(
291
				'TranslatedItem' => array(
292
					'id' => 1,
293
					'slug' => 'first_translated',
294
					'locale' => 'eng',
295
					'title' => 'Title #1',
296
					'content' => 'Content #1',
297
					'translated_article_id' => 1,
298
				)
299
			)
300
		);
301
		$this->assertEquals($expected, $result);
302
	}
303
 
304
/**
305
 * testLocaleSingleCountWithConditions method
306
 *
307
 * @return void
308
 */
309
	public function testLocaleSingleCountWithConditions() {
310
		$this->loadFixtures('Translate', 'TranslatedItem');
311
 
312
		$TestModel = new TranslatedItem();
313
		$TestModel->locale = 'eng';
314
		$result = $TestModel->find('all', array(
315
			'conditions' => array('slug' => 'first_translated')
316
		));
317
		$expected = array(
318
			array(
319
				'TranslatedItem' => array(
320
					'id' => 1,
321
					'slug' => 'first_translated',
322
					'locale' => 'eng',
323
					'title' => 'Title #1',
324
					'content' => 'Content #1',
325
					'translated_article_id' => 1,
326
				)
327
			)
328
		);
329
		$this->assertEquals($expected, $result);
330
 
331
		$result = $TestModel->find('count', array(
332
			'conditions' => array('slug' => 'first_translated')
333
		));
334
		$expected = 1;
335
		$this->assertEquals($expected, $result);
336
	}
337
 
338
/**
339
 * testLocaleSingleAssociations method
340
 *
341
 * @return void
342
 */
343
	public function testLocaleSingleAssociations() {
344
		$this->loadFixtures('Translate', 'TranslatedItem');
345
 
346
		$TestModel = new TranslatedItem();
347
		$TestModel->locale = 'eng';
348
		$TestModel->unbindTranslation();
349
		$translations = array('title' => 'Title', 'content' => 'Content');
350
		$TestModel->bindTranslation($translations, false);
351
 
352
		$result = $TestModel->read(null, 1);
353
		$expected = array(
354
			'TranslatedItem' => array(
355
				'id' => 1,
356
				'slug' => 'first_translated',
357
				'locale' => 'eng',
358
				'title' => 'Title #1',
359
				'content' => 'Content #1',
360
				'translated_article_id' => 1,
361
			),
362
			'Title' => array(
363
				array('id' => 1, 'locale' => 'eng', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'title', 'content' => 'Title #1'),
364
				array('id' => 3, 'locale' => 'deu', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'title', 'content' => 'Titel #1'),
365
				array('id' => 5, 'locale' => 'cze', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'title', 'content' => 'Titulek #1')
366
			),
367
			'Content' => array(
368
				array('id' => 2, 'locale' => 'eng', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'content', 'content' => 'Content #1'),
369
				array('id' => 4, 'locale' => 'deu', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'content', 'content' => 'Inhalt #1'),
370
				array('id' => 6, 'locale' => 'cze', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'content', 'content' => 'Obsah #1')
371
			)
372
		);
373
		$this->assertEquals($expected, $result);
374
 
375
		$TestModel->hasMany['Title']['fields'] = $TestModel->hasMany['Content']['fields'] = array('content');
376
		$TestModel->hasMany['Title']['conditions']['locale'] = $TestModel->hasMany['Content']['conditions']['locale'] = 'eng';
377
 
378
		$result = $TestModel->find('all', array('fields' => array('TranslatedItem.title')));
379
		$expected = array(
380
			array(
381
				'TranslatedItem' => array(
382
					'id' => 1,
383
					'locale' => 'eng',
384
					'title' => 'Title #1',
385
					'slug' => 'first_translated',
386
					'translated_article_id' => 1,
387
				),
388
				'Title' => array(array('foreign_key' => 1, 'content' => 'Title #1')),
389
				'Content' => array(array('foreign_key' => 1, 'content' => 'Content #1'))
390
			),
391
			array(
392
				'TranslatedItem' => array(
393
					'id' => 2,
394
					'locale' => 'eng',
395
					'title' => 'Title #2',
396
					'slug' => 'second_translated',
397
					'translated_article_id' => 1,
398
				),
399
				'Title' => array(array('foreign_key' => 2, 'content' => 'Title #2')),
400
				'Content' => array(array('foreign_key' => 2, 'content' => 'Content #2'))
401
			),
402
			array(
403
				'TranslatedItem' => array(
404
					'id' => 3,
405
					'locale' => 'eng',
406
					'title' => 'Title #3',
407
					'slug' => 'third_translated',
408
					'translated_article_id' => 1,
409
				),
410
				'Title' => array(array('foreign_key' => 3, 'content' => 'Title #3')),
411
				'Content' => array(array('foreign_key' => 3, 'content' => 'Content #3'))
412
			)
413
		);
414
		$this->assertEquals($expected, $result);
415
	}
416
 
417
/**
418
 * Test loading fields with 0 as the translated value.
419
 *
420
 * @return void
421
 */
422
	public function testFetchTranslationsWithZero() {
423
		$this->loadFixtures('Translate', 'TranslatedItem');
424
 
425
		$model = new TranslatedItem();
426
		$translateModel = $model->translateModel();
427
		$translateModel->updateAll(array('content' => "'0'"));
428
		$model->locale = 'eng';
429
 
430
		$result = $model->read(null, 1);
431
		$expected = array(
432
			'TranslatedItem' => array(
433
				'id' => 1,
434
				'slug' => 'first_translated',
435
				'locale' => 'eng',
436
				'title' => '0',
437
				'content' => '0',
438
				'translated_article_id' => 1,
439
			)
440
		);
441
		$this->assertEquals($expected, $result);
442
	}
443
 
444
/**
445
 * testLocaleMultiple method
446
 *
447
 * @return void
448
 */
449
	public function testLocaleMultiple() {
450
		$this->loadFixtures('Translate', 'TranslatedItem');
451
 
452
		$TestModel = new TranslatedItem();
453
		$TestModel->locale = array('deu', 'eng', 'cze');
454
 
455
		$result = $TestModel->read(null, 1);
456
		$expected = array(
457
			'TranslatedItem' => array(
458
				'id' => 1,
459
				'slug' => 'first_translated',
460
				'locale' => 'deu',
461
				'title' => 'Titel #1',
462
				'content' => 'Inhalt #1',
463
				'translated_article_id' => 1,
464
			)
465
		);
466
		$this->assertEquals($expected, $result);
467
 
468
		$result = $TestModel->find('all', array('fields' => array('slug', 'title', 'content')));
469
		$expected = array(
470
			array(
471
				'TranslatedItem' => array(
472
					'slug' => 'first_translated',
473
					'locale' => 'deu',
474
					'content' => 'Inhalt #1',
475
					'title' => 'Titel #1',
476
				)
477
			),
478
			array(
479
				'TranslatedItem' => array(
480
					'slug' => 'second_translated',
481
					'locale' => 'deu',
482
					'title' => 'Titel #2',
483
					'content' => 'Inhalt #2',
484
				)
485
			),
486
			array(
487
				'TranslatedItem' => array(
488
					'slug' => 'third_translated',
489
					'locale' => 'deu',
490
					'title' => 'Titel #3',
491
					'content' => 'Inhalt #3',
492
				)
493
			)
494
		);
495
		$this->assertEquals($expected, $result);
496
 
497
		$TestModel = new TranslatedItem();
498
		$TestModel->locale = array('pt-br');
499
		$result = $TestModel->find('all');
500
		$this->assertCount(3, $result, '3 records should have been found, no SQL error.');
501
	}
502
 
503
/**
504
 * testMissingTranslation method
505
 *
506
 * @return void
507
 */
508
	public function testMissingTranslation() {
509
		$this->loadFixtures('Translate', 'TranslatedItem');
510
 
511
		$TestModel = new TranslatedItem();
512
		$TestModel->locale = 'rus';
513
		$result = $TestModel->read(null, 1);
514
		$this->assertSame(array(), $result);
515
 
516
		$TestModel->locale = array('rus');
517
		$result = $TestModel->read(null, 1);
518
		$expected = array(
519
			'TranslatedItem' => array(
520
				'id' => 1,
521
				'slug' => 'first_translated',
522
				'locale' => 'rus',
523
				'title' => '',
524
				'content' => '',
525
				'translated_article_id' => 1,
526
			)
527
		);
528
		$this->assertEquals($expected, $result);
529
	}
530
 
531
/**
532
 * testTranslatedFindList method
533
 *
534
 * @return void
535
 */
536
	public function testTranslatedFindList() {
537
		$this->loadFixtures('Translate', 'TranslatedItem');
538
 
539
		$TestModel = new TranslatedItem();
540
		$TestModel->locale = 'deu';
541
		$TestModel->displayField = 'title';
542
		$result = $TestModel->find('list', array('recursive' => 1));
543
		$expected = array(1 => 'Titel #1', 2 => 'Titel #2', 3 => 'Titel #3');
544
		$this->assertEquals($expected, $result);
545
 
546
		// SQL Server trigger an error and stops the page even if the debug = 0
547
		if ($this->db instanceof Sqlserver) {
548
			$debug = Configure::read('debug');
549
			Configure::write('debug', 0);
550
 
551
			$result = $TestModel->find('list', array('recursive' => 1, 'callbacks' => false));
552
			$this->assertSame(array(), $result);
553
 
554
			$result = $TestModel->find('list', array('recursive' => 1, 'callbacks' => 'after'));
555
			$this->assertSame(array(), $result);
556
			Configure::write('debug', $debug);
557
		}
558
 
559
		$result = $TestModel->find('list', array('recursive' => 1, 'callbacks' => 'before'));
560
		$expected = array(1 => null, 2 => null, 3 => null);
561
		$this->assertEquals($expected, $result);
562
	}
563
 
564
/**
565
 * testReadSelectedFields method
566
 *
567
 * @return void
568
 */
569
	public function testReadSelectedFields() {
570
		$this->loadFixtures('Translate', 'TranslatedItem');
571
 
572
		$TestModel = new TranslatedItem();
573
		$TestModel->locale = 'eng';
574
		$result = $TestModel->find('all', array('fields' => array('slug', 'TranslatedItem.content')));
575
		$expected = array(
576
			array('TranslatedItem' => array('slug' => 'first_translated', 'locale' => 'eng', 'content' => 'Content #1')),
577
			array('TranslatedItem' => array('slug' => 'second_translated', 'locale' => 'eng', 'content' => 'Content #2')),
578
			array('TranslatedItem' => array('slug' => 'third_translated', 'locale' => 'eng', 'content' => 'Content #3'))
579
		);
580
		$this->assertEquals($expected, $result);
581
 
582
		$result = $TestModel->find('all', array('fields' => array('TranslatedItem.slug', 'content')));
583
		$this->assertEquals($expected, $result);
584
 
585
		$TestModel->locale = array('eng', 'deu', 'cze');
586
		$delete = array(array('locale' => 'deu'), array('field' => 'content', 'locale' => 'eng'));
587
		$I18nModel = ClassRegistry::getObject('TranslateTestModel');
588
		$I18nModel->deleteAll(array('or' => $delete));
589
 
590
		$result = $TestModel->find('all', array('fields' => array('title', 'content')));
591
		$expected = array(
592
			array('TranslatedItem' => array('locale' => 'eng', 'title' => 'Title #1', 'content' => 'Obsah #1')),
593
			array('TranslatedItem' => array('locale' => 'eng', 'title' => 'Title #2', 'content' => 'Obsah #2')),
594
			array('TranslatedItem' => array('locale' => 'eng', 'title' => 'Title #3', 'content' => 'Obsah #3'))
595
		);
596
		$this->assertEquals($expected, $result);
597
	}
598
 
599
/**
600
 * testSaveCreate method
601
 *
602
 * @return void
603
 */
604
	public function testSaveCreate() {
605
		$this->loadFixtures('Translate', 'TranslatedItem');
606
 
607
		$TestModel = new TranslatedItem();
608
		$TestModel->locale = 'spa';
609
		$data = array(
610
			'slug' => 'fourth_translated',
611
			'title' => 'Leyenda #4',
612
			'content' => 'Contenido #4',
613
			'translated_article_id' => 1,
614
		);
615
		$TestModel->create($data);
616
		$TestModel->save();
617
		$result = $TestModel->read();
618
		$expected = array('TranslatedItem' => array_merge($data, array('id' => $TestModel->id, 'locale' => 'spa')));
619
		$this->assertEquals($expected, $result);
620
	}
621
 
622
/**
623
 * test saving/deleting with an alias, uses the model name.
624
 *
625
 * @return void
626
 */
627
	public function testSaveDeleteIgnoreAlias() {
628
		$this->loadFixtures('Translate', 'TranslatedItem');
629
 
630
		$TestModel = new TranslatedItem(array('alias' => 'SomethingElse'));
631
		$TestModel->locale = 'spa';
632
		$data = array(
633
			'slug' => 'fourth_translated',
634
			'title' => 'Leyenda #4',
635
			'content' => 'Contenido #4',
636
			'translated_article_id' => 1,
637
		);
638
		$TestModel->create($data);
639
		$TestModel->save();
640
		$id = $TestModel->id;
641
		$result = $TestModel->read();
642
		$expected = array($TestModel->alias => array_merge($data, array('id' => $id, 'locale' => 'spa')));
643
		$this->assertEquals($expected, $result);
644
 
645
		$TestModel->delete($id);
646
		$result = $TestModel->translateModel()->find('count', array(
647
			'conditions' => array('foreign_key' => $id)
648
		));
649
		$this->assertEquals(0, $result);
650
	}
651
 
652
/**
653
 * test save multiple locales method
654
 *
655
 * @return void
656
 */
657
	public function testSaveMultipleLocales() {
658
		$this->loadFixtures('Translate', 'TranslatedItem');
659
 
660
		$TestModel = new TranslatedItem();
661
		$data = array(
662
			'slug' => 'fourth_translated',
663
			'title' => array(
664
				'eng' => 'Title #4',
665
				'spa' => 'Leyenda #4',
666
			),
667
			'content' => array(
668
				'eng' => 'Content #4',
669
				'spa' => 'Contenido #4',
670
			),
671
			'translated_article_id' => 1,
672
		);
673
		$TestModel->create();
674
		$TestModel->save($data);
675
 
676
		$translations = array('title' => 'Title', 'content' => 'Content');
677
		$TestModel->bindTranslation($translations, false);
678
		$TestModel->locale = array('eng', 'spa');
679
		$result = $TestModel->read();
680
 
681
		$this->assertCount(2, $result['Title']);
682
		$this->assertEquals($result['Title'][0]['locale'], 'eng');
683
		$this->assertEquals($result['Title'][0]['content'], 'Title #4');
684
		$this->assertEquals($result['Title'][1]['locale'], 'spa');
685
		$this->assertEquals($result['Title'][1]['content'], 'Leyenda #4');
686
 
687
		$this->assertCount(2, $result['Content']);
688
	}
689
 
690
/**
691
 * testSaveAssociatedCreate method
692
 *
693
 * @return void
694
 */
695
	public function testSaveAssociatedMultipleLocale() {
696
		$this->loadFixtures('Translate', 'TranslatedItem');
697
 
698
		$TestModel = new TranslatedItem();
699
		$data = array(
700
			'slug' => 'fourth_translated',
701
			'title' => array(
702
				'eng' => 'Title #4',
703
				'spa' => 'Leyenda #4',
704
			),
705
			'content' => array(
706
				'eng' => 'Content #4',
707
				'spa' => 'Contenido #4',
708
			),
709
			'translated_article_id' => 1,
710
		);
711
		$TestModel->create();
712
		$TestModel->saveAssociated($data);
713
 
714
		$translations = array('title' => 'Title', 'content' => 'Content');
715
		$TestModel->bindTranslation($translations, false);
716
		$TestModel->locale = array('eng', 'spa');
717
		$result = $TestModel->read();
718
		$this->assertCount(2, $result['Title']);
719
		$this->assertCount(2, $result['Content']);
720
	}
721
 
722
/**
723
 * testSaveAssociatedAtomic method
724
 *
725
 * @return void
726
 */
727
	public function testSaveAssociatedAtomic() {
728
		$this->loadFixtures('Translate', 'TranslatedItem');
729
 
730
		$TestModel = new TranslatedItem();
731
		$data = array(
732
			'slug' => 'fourth_translated',
733
			'title' => array(
734
				'eng' => 'Title #4'
735
			),
736
			'content' => array(
737
				'eng' => 'Content #4'
738
			),
739
			'translated_article_id' => 1,
740
		);
741
		$Mock = $this->getMockForModel('TranslateTestModel', array('save'));
742
		$TestModel->Behaviors->Translate->runtime[$TestModel->alias]['model'] = $Mock;
743
 
744
		$with = array(
745
			'TranslateTestModel' => array (
746
				'model' => 'TranslatedItem',
747
				'foreign_key' => '4',
748
				'field' => 'content',
749
				'locale' => 'eng',
750
				'content' => 'Content #4',
751
			)
752
		);
753
		$Mock->expects($this->at(0))->method('save')->with($with, array('atomic' => false));
754
 
755
		$with = array(
756
			'TranslateTestModel' => array (
757
				'model' => 'TranslatedItem',
758
				'foreign_key' => '4',
759
				'field' => 'title',
760
				'locale' => 'eng',
761
				'content' => 'Title #4',
762
			)
763
		);
764
		$Mock->expects($this->at(1))->method('save')->with($with, array('atomic' => false));
765
 
766
		$TestModel->create();
767
		$TestModel->saveAssociated($data, array('atomic' => false));
768
	}
769
 
770
/**
771
 * Test that saving only some of the translated fields allows the record to be found again.
772
 *
773
 * @return void
774
 */
775
	public function testSavePartialFields() {
776
		$this->loadFixtures('Translate', 'TranslatedItem');
777
 
778
		$TestModel = new TranslatedItem();
779
		$TestModel->locale = 'spa';
780
		$data = array(
781
			'slug' => 'fourth_translated',
782
			'title' => 'Leyenda #4',
783
		);
784
		$TestModel->create($data);
785
		$TestModel->save();
786
		$result = $TestModel->read();
787
		$expected = array(
788
			'TranslatedItem' => array(
789
				'id' => $TestModel->id,
790
				'translated_article_id' => null,
791
				'locale' => 'spa',
792
				'content' => '',
793
			) + $data
794
		);
795
		$this->assertEquals($expected, $result);
796
	}
797
 
798
/**
799
 * Test that all fields are create with partial data + multiple locales.
800
 *
801
 * @return void
802
 */
803
	public function testSavePartialFieldMultipleLocales() {
804
		$this->loadFixtures('Translate', 'TranslatedItem');
805
 
806
		$TestModel = new TranslatedItem();
807
		$TestModel->locale = 'eng';
808
		$data = array(
809
			'slug' => 'fifth_translated',
810
			'title' => array('eng' => 'Title #5', 'spa' => 'Leyenda #5'),
811
		);
812
		$TestModel->create($data);
813
		$TestModel->save();
814
		$TestModel->unbindTranslation();
815
 
816
		$translations = array('title' => 'Title', 'content' => 'Content');
817
		$TestModel->bindTranslation($translations, false);
818
		$result = $TestModel->read(null, $TestModel->id);
819
		$expected = array(
820
			'TranslatedItem' => array(
821
				'id' => '4',
822
				'translated_article_id' => null,
823
				'slug' => 'fifth_translated',
824
				'locale' => 'eng',
825
				'title' => 'Title #5',
826
				'content' => ''
827
			),
828
			'Title' => array(
829
 
830
					'id' => '19',
831
					'locale' => 'eng',
832
					'model' => 'TranslatedItem',
833
					'foreign_key' => '4',
834
					'field' => 'title',
835
					'content' => 'Title #5'
836
				),
837
				1 => array(
838
					'id' => '20',
839
					'locale' => 'spa',
840
					'model' => 'TranslatedItem',
841
					'foreign_key' => '4',
842
					'field' => 'title',
843
					'content' => 'Leyenda #5'
844
				)
845
			),
846
			'Content' => array(
847
 
848
					'id' => '21',
849
					'locale' => 'eng',
850
					'model' => 'TranslatedItem',
851
					'foreign_key' => '4',
852
					'field' => 'content',
853
					'content' => ''
854
				),
855
				1 => array(
856
					'id' => '22',
857
					'locale' => 'spa',
858
					'model' => 'TranslatedItem',
859
					'foreign_key' => '4',
860
					'field' => 'content',
861
					'content' => ''
862
				)
863
			)
864
		);
865
		$this->assertEquals($expected, $result);
866
	}
867
 
868
/**
869
 * testSaveUpdate method
870
 *
871
 * @return void
872
 */
873
	public function testSaveUpdate() {
874
		$this->loadFixtures('Translate', 'TranslatedItem');
875
 
876
		$TestModel = new TranslatedItem();
877
		$TestModel->locale = 'spa';
878
		$oldData = array('slug' => 'fourth_translated', 'title' => 'Leyenda #4', 'translated_article_id' => 1);
879
		$TestModel->create($oldData);
880
		$TestModel->save();
881
		$id = $TestModel->id;
882
		$newData = array('id' => $id, 'content' => 'Contenido #4');
883
		$TestModel->create($newData);
884
		$TestModel->save();
885
		$result = $TestModel->read(null, $id);
886
		$expected = array('TranslatedItem' => array_merge($oldData, $newData, array('locale' => 'spa')));
887
		$this->assertEquals($expected, $result);
888
	}
889
 
890
/**
891
 * testMultipleCreate method
892
 *
893
 * @return void
894
 */
895
	public function testMultipleCreate() {
896
		$this->loadFixtures('Translate', 'TranslatedItem');
897
 
898
		$TestModel = new TranslatedItem();
899
		$TestModel->locale = 'deu';
900
		$data = array(
901
			'slug' => 'new_translated',
902
			'title' => array('eng' => 'New title', 'spa' => 'Nuevo leyenda'),
903
			'content' => array('eng' => 'New content', 'spa' => 'Nuevo contenido')
904
		);
905
		$TestModel->create($data);
906
		$TestModel->save();
907
 
908
		$TestModel->unbindTranslation();
909
		$translations = array('title' => 'Title', 'content' => 'Content');
910
		$TestModel->bindTranslation($translations, false);
911
		$TestModel->locale = array('eng', 'spa');
912
 
913
		$result = $TestModel->read();
914
		$expected = array(
915
			'TranslatedItem' => array(
916
				'id' => 4,
917
				'slug' => 'new_translated',
918
				'locale' => 'eng',
919
				'title' => 'New title',
920
				'content' => 'New content',
921
				'translated_article_id' => null,
922
			),
923
			'Title' => array(
924
				array('id' => 21, 'locale' => 'eng', 'model' => 'TranslatedItem', 'foreign_key' => 4, 'field' => 'title', 'content' => 'New title'),
925
				array('id' => 22, 'locale' => 'spa', 'model' => 'TranslatedItem', 'foreign_key' => 4, 'field' => 'title', 'content' => 'Nuevo leyenda')
926
			),
927
			'Content' => array(
928
				array('id' => 19, 'locale' => 'eng', 'model' => 'TranslatedItem', 'foreign_key' => 4, 'field' => 'content', 'content' => 'New content'),
929
				array('id' => 20, 'locale' => 'spa', 'model' => 'TranslatedItem', 'foreign_key' => 4, 'field' => 'content', 'content' => 'Nuevo contenido')
930
			)
931
		);
932
		$this->assertEquals($expected, $result);
933
	}
934
 
935
/**
936
 * testMultipleUpdate method
937
 *
938
 * @return void
939
 */
940
	public function testMultipleUpdate() {
941
		$this->loadFixtures('Translate', 'TranslatedItem');
942
 
943
		$TestModel = new TranslatedItem();
944
		$TestModel->locale = 'eng';
945
		$TestModel->validate['title'] = 'notBlank';
946
		$data = array('TranslatedItem' => array(
947
			'id' => 1,
948
			'title' => array('eng' => 'New Title #1', 'deu' => 'Neue Titel #1', 'cze' => 'Novy Titulek #1'),
949
			'content' => array('eng' => 'New Content #1', 'deu' => 'Neue Inhalt #1', 'cze' => 'Novy Obsah #1')
950
		));
951
		$TestModel->create();
952
		$TestModel->save($data);
953
 
954
		$TestModel->unbindTranslation();
955
		$translations = array('title' => 'Title', 'content' => 'Content');
956
		$TestModel->bindTranslation($translations, false);
957
		$result = $TestModel->read(null, 1);
958
		$expected = array(
959
			'TranslatedItem' => array(
960
				'id' => '1',
961
				'slug' => 'first_translated',
962
				'locale' => 'eng',
963
				'title' => 'New Title #1',
964
				'content' => 'New Content #1',
965
				'translated_article_id' => 1,
966
			),
967
			'Title' => array(
968
				array('id' => 1, 'locale' => 'eng', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'title', 'content' => 'New Title #1'),
969
				array('id' => 3, 'locale' => 'deu', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'title', 'content' => 'Neue Titel #1'),
970
				array('id' => 5, 'locale' => 'cze', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'title', 'content' => 'Novy Titulek #1')
971
			),
972
			'Content' => array(
973
				array('id' => 2, 'locale' => 'eng', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'content', 'content' => 'New Content #1'),
974
				array('id' => 4, 'locale' => 'deu', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'content', 'content' => 'Neue Inhalt #1'),
975
				array('id' => 6, 'locale' => 'cze', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'content', 'content' => 'Novy Obsah #1')
976
			)
977
		);
978
		$this->assertEquals($expected, $result);
979
 
980
		$TestModel->unbindTranslation($translations);
981
		$TestModel->bindTranslation(array('title', 'content'), false);
982
	}
983
 
984
/**
985
 * testMixedCreateUpdateWithArrayLocale method
986
 *
987
 * @return void
988
 */
989
	public function testMixedCreateUpdateWithArrayLocale() {
990
		$this->loadFixtures('Translate', 'TranslatedItem');
991
 
992
		$TestModel = new TranslatedItem();
993
		$TestModel->locale = array('cze', 'deu');
994
		$data = array('TranslatedItem' => array(
995
			'id' => 1,
996
			'title' => array('eng' => 'Updated Title #1', 'spa' => 'Nuevo leyenda #1'),
997
			'content' => 'Upraveny obsah #1'
998
		));
999
		$TestModel->create();
1000
		$TestModel->save($data);
1001
 
1002
		$TestModel->unbindTranslation();
1003
		$translations = array('title' => 'Title', 'content' => 'Content');
1004
		$TestModel->bindTranslation($translations, false);
1005
		$result = $TestModel->read(null, 1);
1006
		$result['Title'] = Hash::sort($result['Title'], '{n}.id', 'asc');
1007
		$result['Content'] = Hash::sort($result['Content'], '{n}.id', 'asc');
1008
		$expected = array(
1009
			'TranslatedItem' => array(
1010
				'id' => 1,
1011
				'slug' => 'first_translated',
1012
				'locale' => 'cze',
1013
				'title' => 'Titulek #1',
1014
				'content' => 'Upraveny obsah #1',
1015
				'translated_article_id' => 1,
1016
			),
1017
			'Title' => array(
1018
				array('id' => 1, 'locale' => 'eng', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'title', 'content' => 'Updated Title #1'),
1019
				array('id' => 3, 'locale' => 'deu', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'title', 'content' => 'Titel #1'),
1020
				array('id' => 5, 'locale' => 'cze', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'title', 'content' => 'Titulek #1'),
1021
				array('id' => 19, 'locale' => 'spa', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'title', 'content' => 'Nuevo leyenda #1')
1022
			),
1023
			'Content' => array(
1024
				array('id' => 2, 'locale' => 'eng', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'content', 'content' => 'Content #1'),
1025
				array('id' => 4, 'locale' => 'deu', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'content', 'content' => 'Inhalt #1'),
1026
				array('id' => 6, 'locale' => 'cze', 'model' => 'TranslatedItem', 'foreign_key' => 1, 'field' => 'content', 'content' => 'Upraveny obsah #1')
1027
			)
1028
		);
1029
		$this->assertEquals($expected, $result);
1030
	}
1031
 
1032
/**
1033
 * Test that saveAll() works with hasMany associations that contain
1034
 * translations.
1035
 *
1036
 * @return void
1037
 */
1038
	public function testSaveAllTranslatedAssociations() {
1039
		$this->loadFixtures('Translate', 'TranslateArticle', 'TranslatedItem', 'TranslatedArticle', 'User');
1040
		$Model = new TranslatedArticle();
1041
		$Model->locale = 'eng';
1042
 
1043
		$data = array(
1044
			'TranslatedArticle' => array(
1045
				'id' => 4,
1046
				'user_id' => 1,
1047
				'published' => 'Y',
1048
				'title' => 'Title (eng) #1',
1049
				'body' => 'Body (eng) #1'
1050
			),
1051
			'TranslatedItem' => array(
1052
				array(
1053
					'slug' => '',
1054
					'title' => 'Nuevo leyenda #1',
1055
					'content' => 'Upraveny obsah #1'
1056
				),
1057
				array(
1058
					'slug' => '',
1059
					'title' => 'New Title #2',
1060
					'content' => 'New Content #2'
1061
				),
1062
			)
1063
		);
1064
		$result = $Model->saveAll($data);
1065
		$this->assertTrue($result);
1066
 
1067
		$result = $Model->TranslatedItem->find('all', array(
1068
			'conditions' => array('translated_article_id' => $Model->id)
1069
		));
1070
		$this->assertCount(2, $result);
1071
		$this->assertEquals($data['TranslatedItem'][0]['title'], $result[0]['TranslatedItem']['title']);
1072
		$this->assertEquals($data['TranslatedItem'][1]['title'], $result[1]['TranslatedItem']['title']);
1073
	}
1074
 
1075
/**
1076
 * testValidation method
1077
 *
1078
 * @return void
1079
 */
1080
	public function testValidation() {
1081
		Configure::write('Config.language', 'eng');
1082
		$this->loadFixtures('Translate', 'TranslatedItem');
1083
 
1084
		$TestModel = new TranslatedItem();
1085
		$TestModel->locale = 'eng';
1086
		$TestModel->validate['title'] = '/Only this title/';
1087
		$data = array(
1088
			'TranslatedItem' => array(
1089
				'id' => 1,
1090
				'title' => array('eng' => 'New Title #1', 'deu' => 'Neue Titel #1', 'cze' => 'Novy Titulek #1'),
1091
				'content' => array('eng' => 'New Content #1', 'deu' => 'Neue Inhalt #1', 'cze' => 'Novy Obsah #1')
1092
			)
1093
		);
1094
		$TestModel->create();
1095
		$this->assertFalse($TestModel->save($data));
1096
		$this->assertEquals(array('This field cannot be left blank'), $TestModel->validationErrors['title']);
1097
 
1098
		$TestModel->locale = 'eng';
1099
		$TestModel->validate['title'] = '/Only this title/';
1100
		$data = array('TranslatedItem' => array(
1101
			'id' => 1,
1102
			'title' => array('eng' => 'Only this title', 'deu' => 'Neue Titel #1', 'cze' => 'Novy Titulek #1'),
1103
			'content' => array('eng' => 'New Content #1', 'deu' => 'Neue Inhalt #1', 'cze' => 'Novy Obsah #1')
1104
		));
1105
		$TestModel->create();
1106
		$result = $TestModel->save($data);
1107
		$this->assertFalse(empty($result));
1108
	}
1109
 
1110
/**
1111
 * test restoring fields after temporary binds method
1112
 *
1113
 * @return void
1114
 */
1115
	public function testFieldsRestoreAfterBind() {
1116
		$this->loadFixtures('Translate', 'TranslatedItem');
1117
 
1118
		$TestModel = new TranslatedItem();
1119
 
1120
		$translations = array('title' => 'Title');
1121
		$TestModel->bindTranslation($translations);
1122
 
1123
		$result = $TestModel->find('first');
1124
		$this->assertArrayHasKey('Title', $result);
1125
		$this->assertArrayHasKey('content', $result['Title'][0]);
1126
		$this->assertArrayNotHasKey('title', $result);
1127
 
1128
		$result = $TestModel->find('first');
1129
		$this->assertArrayNotHasKey('Title', $result);
1130
		$this->assertEquals('Title #1', $result['TranslatedItem']['title']);
1131
	}
1132
 
1133
/**
1134
 * testAttachDetach method
1135
 *
1136
 * @return void
1137
 */
1138
	public function testAttachDetach() {
1139
		$this->loadFixtures('Translate', 'TranslatedItem');
1140
 
1141
		$TestModel = new TranslatedItem();
1142
 
1143
		$TestModel->unbindTranslation();
1144
		$translations = array('title' => 'Title', 'content' => 'Content');
1145
		$TestModel->bindTranslation($translations, false);
1146
 
1147
		$result = array_keys($TestModel->hasMany);
1148
		$expected = array('Title', 'Content');
1149
		$this->assertEquals($expected, $result);
1150
 
1151
		$TestModel->Behaviors->unload('Translate');
1152
		$result = array_keys($TestModel->hasMany);
1153
		$expected = array();
1154
		$this->assertEquals($expected, $result);
1155
 
1156
		$result = isset($TestModel->Behaviors->Translate);
1157
		$this->assertFalse($result);
1158
 
1159
		$result = isset($Behavior->settings[$TestModel->alias]);
1160
		$this->assertFalse($result);
1161
 
1162
		$result = isset($Behavior->runtime[$TestModel->alias]);
1163
		$this->assertFalse($result);
1164
 
1165
		$TestModel->Behaviors->load('Translate', array('title' => 'Title', 'content' => 'Content'));
1166
		$result = array_keys($TestModel->hasMany);
1167
		$expected = array('Title', 'Content');
1168
		$this->assertEquals($expected, $result);
1169
 
1170
		$result = isset($TestModel->Behaviors->Translate);
1171
		$this->assertTrue($result);
1172
 
1173
		$Behavior = $TestModel->Behaviors->Translate;
1174
 
1175
		$result = isset($Behavior->settings[$TestModel->alias]);
1176
		$this->assertTrue($result);
1177
 
1178
		$result = isset($Behavior->runtime[$TestModel->alias]);
1179
		$this->assertTrue($result);
1180
	}
1181
 
1182
/**
1183
 * testAnotherTranslateTable method
1184
 *
1185
 * @return void
1186
 */
1187
	public function testAnotherTranslateTable() {
1188
		$this->loadFixtures('Translate', 'TranslatedItem', 'TranslateTable');
1189
 
1190
		$TestModel = new TranslatedItemWithTable();
1191
		$TestModel->locale = 'eng';
1192
		$result = $TestModel->read(null, 1);
1193
		$expected = array(
1194
			'TranslatedItemWithTable' => array(
1195
				'id' => 1,
1196
				'slug' => 'first_translated',
1197
				'locale' => 'eng',
1198
				'title' => 'Another Title #1',
1199
				'content' => 'Another Content #1',
1200
				'translated_article_id' => 1,
1201
			)
1202
		);
1203
		$this->assertEquals($expected, $result);
1204
	}
1205
 
1206
/**
1207
 * testTranslateWithAssociations method
1208
 *
1209
 * @return void
1210
 */
1211
	public function testTranslateWithAssociations() {
1212
		$this->loadFixtures('TranslateArticle', 'TranslatedArticle', 'TranslatedItem', 'User', 'Comment', 'ArticlesTag', 'Tag');
1213
 
1214
		$TestModel = new TranslatedArticle();
1215
		$TestModel->locale = 'eng';
1216
		$recursive = $TestModel->recursive;
1217
 
1218
		$result = $TestModel->read(null, 1);
1219
		$expected = array(
1220
			'TranslatedArticle' => array(
1221
				'id' => 1,
1222
				'user_id' => 1,
1223
				'published' => 'Y',
1224
				'created' => '2007-03-18 10:39:23',
1225
				'updated' => '2007-03-18 10:41:31',
1226
				'locale' => 'eng',
1227
				'title' => 'Title (eng) #1',
1228
				'body' => 'Body (eng) #1'
1229
			),
1230
			'User' => array(
1231
				'id' => 1,
1232
				'user' => 'mariano',
1233
				'password' => '5f4dcc3b5aa765d61d8327deb882cf99',
1234
				'created' => '2007-03-17 01:16:23',
1235
				'updated' => '2007-03-17 01:18:31'
1236
			),
1237
			'TranslatedItem' => array(
1238
				array(
1239
					'id' => 1,
1240
					'translated_article_id' => 1,
1241
					'slug' => 'first_translated'
1242
				),
1243
				array(
1244
					'id' => 2,
1245
					'translated_article_id' => 1,
1246
					'slug' => 'second_translated'
1247
				),
1248
				array(
1249
					'id' => 3,
1250
					'translated_article_id' => 1,
1251
					'slug' => 'third_translated'
1252
				),
1253
			)
1254
		);
1255
		$this->assertEquals($expected, $result);
1256
 
1257
		$result = $TestModel->find('all', array('recursive' => -1));
1258
		$expected = array(
1259
			array(
1260
				'TranslatedArticle' => array(
1261
					'id' => 1,
1262
					'user_id' => 1,
1263
					'published' => 'Y',
1264
					'created' => '2007-03-18 10:39:23',
1265
					'updated' => '2007-03-18 10:41:31',
1266
					'locale' => 'eng',
1267
					'title' => 'Title (eng) #1',
1268
					'body' => 'Body (eng) #1'
1269
				)
1270
			),
1271
			array(
1272
				'TranslatedArticle' => array(
1273
					'id' => 2,
1274
					'user_id' => 3,
1275
					'published' => 'Y',
1276
					'created' => '2007-03-18 10:41:23',
1277
					'updated' => '2007-03-18 10:43:31',
1278
					'locale' => 'eng',
1279
					'title' => 'Title (eng) #2',
1280
					'body' => 'Body (eng) #2'
1281
				)
1282
			),
1283
			array(
1284
				'TranslatedArticle' => array(
1285
					'id' => 3,
1286
					'user_id' => 1,
1287
					'published' => 'Y',
1288
					'created' => '2007-03-18 10:43:23',
1289
					'updated' => '2007-03-18 10:45:31',
1290
					'locale' => 'eng',
1291
					'title' => 'Title (eng) #3',
1292
					'body' => 'Body (eng) #3'
1293
				)
1294
			)
1295
		);
1296
		$this->assertEquals($expected, $result);
1297
		$this->assertEquals($TestModel->recursive, $recursive);
1298
 
1299
		$TestModel->recursive = -1;
1300
		$result = $TestModel->read(null, 1);
1301
		$expected = array(
1302
			'TranslatedArticle' => array(
1303
				'id' => 1,
1304
				'user_id' => 1,
1305
				'published' => 'Y',
1306
				'created' => '2007-03-18 10:39:23',
1307
				'updated' => '2007-03-18 10:41:31',
1308
				'locale' => 'eng',
1309
				'title' => 'Title (eng) #1',
1310
				'body' => 'Body (eng) #1'
1311
			)
1312
		);
1313
		$this->assertEquals($expected, $result);
1314
	}
1315
 
1316
/**
1317
 * testTranslateTableWithPrefix method
1318
 * Tests that is possible to have a translation model with a custom tablePrefix
1319
 *
1320
 * @return void
1321
 */
1322
	public function testTranslateTableWithPrefix() {
1323
		$this->loadFixtures('TranslateWithPrefix', 'TranslatedItem');
1324
		$TestModel = new TranslatedItem2;
1325
		$TestModel->locale = 'eng';
1326
		$result = $TestModel->read(null, 1);
1327
		$expected = array('TranslatedItem' => array(
1328
			'id' => 1,
1329
			'slug' => 'first_translated',
1330
			'locale' => 'eng',
1331
			'content' => 'Content #1',
1332
			'title' => 'Title #1',
1333
			'translated_article_id' => 1,
1334
		));
1335
		$this->assertEquals($expected, $result);
1336
	}
1337
 
1338
/**
1339
 * Test infinite loops not occurring with unbindTranslation()
1340
 *
1341
 * @return void
1342
 */
1343
	public function testUnbindTranslationInfinteLoop() {
1344
		$this->loadFixtures('Translate', 'TranslatedItem');
1345
 
1346
		$TestModel = new TranslatedItem();
1347
		$TestModel->Behaviors->unload('Translate');
1348
		$TestModel->actsAs = array();
1349
		$TestModel->Behaviors->load('Translate');
1350
		$TestModel->bindTranslation(array('title', 'content'), true);
1351
		$result = $TestModel->unbindTranslation();
1352
 
1353
		$this->assertFalse($result);
1354
	}
1355
 
1356
/**
1357
 * Test that an exception is raised when you try to over-write the name attribute.
1358
 *
1359
 * @expectedException CakeException
1360
 * @return void
1361
 */
1362
	public function testExceptionOnNameTranslation() {
1363
		$this->loadFixtures('Translate', 'TranslatedItem');
1364
		$TestModel = new TranslatedItem();
1365
		$TestModel->bindTranslation(array('name' => 'name'));
1366
	}
1367
 
1368
/**
1369
 * Test that translations can be bound and unbound dynamically.
1370
 *
1371
 * @return void
1372
 */
1373
	public function testUnbindTranslation() {
1374
		$this->loadFixtures('Translate', 'TranslatedItem');
1375
		$Model = new TranslatedItem();
1376
		$Model->unbindTranslation();
1377
		$Model->bindTranslation(array('body', 'slug'), false);
1378
 
1379
		$result = $Model->Behaviors->Translate->settings['TranslatedItem'];
1380
		$this->assertEquals(array('body', 'slug'), $result);
1381
 
1382
		$Model->unbindTranslation(array('body'));
1383
		$result = $Model->Behaviors->Translate->settings['TranslatedItem'];
1384
		$this->assertNotContains('body', $result);
1385
 
1386
		$Model->unbindTranslation('slug');
1387
		$result = $Model->Behaviors->Translate->settings['TranslatedItem'];
1388
		$this->assertNotContains('slug', $result);
1389
	}
1390
 
1391
/**
1392
 * Test that additional records are not inserted for associated translations.
1393
 *
1394
 * @return void
1395
 */
1396
	public function testNoExtraRowsForAssociatedTranslations() {
1397
		$this->loadFixtures('Translate', 'TranslatedItem');
1398
		$TestModel = new TranslatedItem();
1399
		$TestModel->locale = 'spa';
1400
		$TestModel->unbindTranslation();
1401
		$TestModel->bindTranslation(array('name' => 'nameTranslate'));
1402
 
1403
		$data = array(
1404
			'TranslatedItem' => array(
1405
				'slug' => 'spanish-name',
1406
				'name' => 'Spanish name',
1407
			),
1408
		);
1409
		$TestModel->create($data);
1410
		$TestModel->save();
1411
 
1412
		$Translate = $TestModel->translateModel();
1413
		$results = $Translate->find('all', array(
1414
			'conditions' => array(
1415
				'locale' => $TestModel->locale,
1416
				'foreign_key' => $TestModel->id
1417
			)
1418
		));
1419
		$this->assertCount(1, $results, 'Only one field should be saved');
1420
		$this->assertEquals('name', $results[0]['TranslateTestModel']['field']);
1421
	}
1422
 
1423
}