Subversion Repositories SmartDukaan

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
16591 anikendra 1
<?php
2
/**
3
 * ModelDeleteTest file
4
 *
5
 * CakePHP(tm) Tests <http://book.cakephp.org/2.0/en/development/testing.html>
6
 * Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
7
 *
8
 * Licensed under The MIT License
9
 * For full copyright and license information, please see the LICENSE.txt
10
 * Redistributions of files must retain the above copyright notice
11
 *
12
 * @copyright     Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
13
 * @link          http://book.cakephp.org/2.0/en/development/testing.html CakePHP(tm) Tests
14
 * @package       Cake.Test.Case.Model
15
 * @since         CakePHP(tm) v 1.2.0.4206
16
 * @license       http://www.opensource.org/licenses/mit-license.php MIT License
17
 */
18
 
19
require_once dirname(__FILE__) . DS . 'ModelTestBase.php';
20
 
21
/**
22
 * ModelDeleteTest
23
 *
24
 * @package       Cake.Test.Case.Model
25
 */
26
class ModelDeleteTest extends BaseModelTest {
27
 
28
/**
29
 * testDeleteHabtmReferenceWithConditions method
30
 *
31
 * @return void
32
 */
33
	public function testDeleteHabtmReferenceWithConditions() {
34
		$this->loadFixtures('Portfolio', 'Item', 'ItemsPortfolio', 'Syfile', 'Image');
35
 
36
		$Portfolio = new Portfolio();
37
		$Portfolio->hasAndBelongsToMany['Item']['conditions'] = array('ItemsPortfolio.item_id >' => 1);
38
 
39
		$result = $Portfolio->find('first', array(
40
			'conditions' => array('Portfolio.id' => 1)
41
		));
42
		$expected = array(
43
			array(
44
				'id' => 3,
45
				'syfile_id' => 3,
46
				'published' => false,
47
				'name' => 'Item 3',
48
				'ItemsPortfolio' => array(
49
					'id' => 3,
50
					'item_id' => 3,
51
					'portfolio_id' => 1
52
			)),
53
			array(
54
				'id' => 4,
55
				'syfile_id' => 4,
56
				'published' => false,
57
				'name' => 'Item 4',
58
				'ItemsPortfolio' => array(
59
					'id' => 4,
60
					'item_id' => 4,
61
					'portfolio_id' => 1
62
			)),
63
			array(
64
				'id' => 5,
65
				'syfile_id' => 5,
66
				'published' => false,
67
				'name' => 'Item 5',
68
				'ItemsPortfolio' => array(
69
					'id' => 5,
70
					'item_id' => 5,
71
					'portfolio_id' => 1
72
		)));
73
		$this->assertEquals($expected, $result['Item']);
74
 
75
		$result = $Portfolio->ItemsPortfolio->find('all', array(
76
			'conditions' => array('ItemsPortfolio.portfolio_id' => 1)
77
		));
78
		$expected = array(
79
			array(
80
				'ItemsPortfolio' => array(
81
					'id' => 1,
82
					'item_id' => 1,
83
					'portfolio_id' => 1
84
			)),
85
			array(
86
				'ItemsPortfolio' => array(
87
					'id' => 3,
88
					'item_id' => 3,
89
					'portfolio_id' => 1
90
			)),
91
			array(
92
				'ItemsPortfolio' => array(
93
					'id' => 4,
94
					'item_id' => 4,
95
					'portfolio_id' => 1
96
			)),
97
			array(
98
				'ItemsPortfolio' => array(
99
					'id' => 5,
100
					'item_id' => 5,
101
					'portfolio_id' => 1
102
		)));
103
		$this->assertEquals($expected, $result);
104
 
105
		$Portfolio->delete(1);
106
 
107
		$result = $Portfolio->find('first', array(
108
			'conditions' => array('Portfolio.id' => 1)
109
		));
110
		$this->assertSame(array(), $result);
111
 
112
		$result = $Portfolio->ItemsPortfolio->find('all', array(
113
			'conditions' => array('ItemsPortfolio.portfolio_id' => 1)
114
		));
115
		$this->assertSame(array(), $result);
116
	}
117
 
118
/**
119
 * testDeleteArticleBLinks method
120
 *
121
 * @return void
122
 */
123
	public function testDeleteArticleBLinks() {
124
		$this->loadFixtures('Article', 'ArticlesTag', 'Tag', 'User');
125
		$TestModel = new ArticleB();
126
 
127
		$result = $TestModel->ArticlesTag->find('all');
128
		$expected = array(
129
			array('ArticlesTag' => array('article_id' => '1', 'tag_id' => '1')),
130
			array('ArticlesTag' => array('article_id' => '1', 'tag_id' => '2')),
131
			array('ArticlesTag' => array('article_id' => '2', 'tag_id' => '1')),
132
			array('ArticlesTag' => array('article_id' => '2', 'tag_id' => '3'))
133
			);
134
		$this->assertEquals($expected, $result);
135
 
136
		$TestModel->delete(1);
137
		$result = $TestModel->ArticlesTag->find('all');
138
 
139
		$expected = array(
140
			array('ArticlesTag' => array('article_id' => '2', 'tag_id' => '1')),
141
			array('ArticlesTag' => array('article_id' => '2', 'tag_id' => '3'))
142
		);
143
		$this->assertEquals($expected, $result);
144
	}
145
 
146
/**
147
 * testDeleteDependentWithConditions method
148
 *
149
 * @return void
150
 */
151
	public function testDeleteDependentWithConditions() {
152
		$this->loadFixtures('Cd', 'Book', 'OverallFavorite');
153
 
154
		$Cd = new Cd();
155
		$Book = new Book();
156
		$OverallFavorite = new OverallFavorite();
157
 
158
		$Cd->delete(1);
159
 
160
		$result = $OverallFavorite->find('all', array(
161
			'fields' => array('model_type', 'model_id', 'priority')
162
		));
163
		$expected = array(
164
			array(
165
				'OverallFavorite' => array(
166
					'model_type' => 'Book',
167
					'model_id' => 1,
168
					'priority' => 2
169
		)));
170
 
171
		$this->assertTrue(is_array($result));
172
		$this->assertEquals($expected, $result);
173
 
174
		$Book->delete(1);
175
 
176
		$result = $OverallFavorite->find('all', array(
177
			'fields' => array('model_type', 'model_id', 'priority')
178
		));
179
		$expected = array();
180
 
181
		$this->assertTrue(is_array($result));
182
		$this->assertEquals($expected, $result);
183
	}
184
 
185
/**
186
 * testDel method
187
 *
188
 * @return void
189
 */
190
	public function testDelete() {
191
		$this->loadFixtures('Article', 'Comment', 'Attachment');
192
		$TestModel = new Article();
193
 
194
		$result = $TestModel->delete(2);
195
		$this->assertTrue($result);
196
 
197
		$result = $TestModel->read(null, 2);
198
		$this->assertSame(array(), $result);
199
 
200
		$TestModel->recursive = -1;
201
		$result = $TestModel->find('all', array(
202
			'fields' => array('id', 'title')
203
		));
204
		$expected = array(
205
			array('Article' => array(
206
				'id' => 1,
207
				'title' => 'First Article'
208
			)),
209
			array('Article' => array(
210
				'id' => 3,
211
				'title' => 'Third Article'
212
		)));
213
		$this->assertEquals($expected, $result);
214
 
215
		$result = $TestModel->delete(3);
216
		$this->assertTrue($result);
217
 
218
		$result = $TestModel->read(null, 3);
219
		$this->assertSame(array(), $result);
220
 
221
		$TestModel->recursive = -1;
222
		$result = $TestModel->find('all', array(
223
			'fields' => array('id', 'title')
224
		));
225
		$expected = array(
226
			array('Article' => array(
227
				'id' => 1,
228
				'title' => 'First Article'
229
		)));
230
 
231
		$this->assertEquals($expected, $result);
232
 
233
		// make sure deleting a non-existent record doesn't break save()
234
		// ticket #6293
235
		$this->loadFixtures('Uuid');
236
		$Uuid = new Uuid();
237
		$data = array(
238
			'B607DAB9-88A2-46CF-B57C-842CA9E3B3B3',
239
			'52C8865C-10EE-4302-AE6C-6E7D8E12E2C8',
240
			'8208C7FE-E89C-47C5-B378-DED6C271F9B8');
241
		foreach ($data as $id) {
242
			$Uuid->save(array('id' => $id));
243
		}
244
		$Uuid->delete('52C8865C-10EE-4302-AE6C-6E7D8E12E2C8');
245
		$Uuid->delete('52C8865C-10EE-4302-AE6C-6E7D8E12E2C8');
246
		foreach ($data as $id) {
247
			$Uuid->save(array('id' => $id));
248
		}
249
		$result = $Uuid->find('all', array(
250
			'conditions' => array('id' => $data),
251
			'fields' => array('id'),
252
			'order' => 'id'));
253
		$expected = array(
254
			array('Uuid' => array(
255
				'id' => '52C8865C-10EE-4302-AE6C-6E7D8E12E2C8')),
256
			array('Uuid' => array(
257
				'id' => '8208C7FE-E89C-47C5-B378-DED6C271F9B8')),
258
			array('Uuid' => array(
259
				'id' => 'B607DAB9-88A2-46CF-B57C-842CA9E3B3B3')));
260
		$this->assertEquals($expected, $result);
261
	}
262
 
263
/**
264
 * test that delete() updates the correct records counterCache() records.
265
 *
266
 * @return void
267
 */
268
	public function testDeleteUpdatingCounterCacheCorrectly() {
269
		$this->loadFixtures('CounterCacheUser', 'CounterCachePost');
270
		$User = new CounterCacheUser();
271
 
272
		$User->Post->delete(3);
273
		$result = $User->read(null, 301);
274
		$this->assertEquals(0, $result['User']['post_count']);
275
 
276
		$result = $User->read(null, 66);
277
		$this->assertEquals(2, $result['User']['post_count']);
278
	}
279
 
280
/**
281
 * testDeleteAll method
282
 *
283
 * @return void
284
 */
285
	public function testDeleteAll() {
286
		$this->loadFixtures('Article');
287
		$TestModel = new Article();
288
 
289
		$data = array('Article' => array(
290
			'user_id' => 2,
291
			'id' => 4,
292
			'title' => 'Fourth Article',
293
			'published' => 'N'
294
		));
295
		$result = $TestModel->set($data) && $TestModel->save();
296
		$this->assertTrue($result);
297
 
298
		$data = array('Article' => array(
299
			'user_id' => 2,
300
			'id' => 5,
301
			'title' => 'Fifth Article',
302
			'published' => 'Y'
303
		));
304
		$result = $TestModel->set($data) && $TestModel->save();
305
		$this->assertTrue($result);
306
 
307
		$data = array('Article' => array(
308
			'user_id' => 1,
309
			'id' => 6,
310
			'title' => 'Sixth Article',
311
			'published' => 'N'
312
		));
313
		$result = $TestModel->set($data) && $TestModel->save();
314
		$this->assertTrue($result);
315
 
316
		$TestModel->recursive = -1;
317
		$result = $TestModel->find('all', array(
318
			'fields' => array('id', 'user_id', 'title', 'published'),
319
			'order' => array('Article.id' => 'ASC')
320
		));
321
 
322
		$expected = array(
323
			array('Article' => array(
324
				'id' => 1,
325
				'user_id' => 1,
326
				'title' => 'First Article',
327
				'published' => 'Y'
328
			)),
329
			array('Article' => array(
330
				'id' => 2,
331
				'user_id' => 3,
332
				'title' => 'Second Article',
333
				'published' => 'Y'
334
			)),
335
			array('Article' => array(
336
				'id' => 3,
337
				'user_id' => 1,
338
				'title' => 'Third Article',
339
				'published' => 'Y')),
340
			array('Article' => array(
341
				'id' => 4,
342
				'user_id' => 2,
343
				'title' => 'Fourth Article',
344
				'published' => 'N'
345
			)),
346
			array('Article' => array(
347
				'id' => 5,
348
				'user_id' => 2,
349
				'title' => 'Fifth Article',
350
				'published' => 'Y'
351
			)),
352
			array('Article' => array(
353
				'id' => 6,
354
				'user_id' => 1,
355
				'title' => 'Sixth Article',
356
				'published' => 'N'
357
		)));
358
 
359
		$this->assertEquals($expected, $result);
360
 
361
		$result = $TestModel->deleteAll(array('Article.published' => 'N'));
362
		$this->assertTrue($result);
363
 
364
		$TestModel->recursive = -1;
365
		$result = $TestModel->find('all', array(
366
			'fields' => array('id', 'user_id', 'title', 'published'),
367
			'order' => array('Article.id' => 'ASC')
368
		));
369
		$expected = array(
370
			array('Article' => array(
371
				'id' => 1,
372
				'user_id' => 1,
373
				'title' => 'First Article',
374
				'published' => 'Y'
375
			)),
376
			array('Article' => array(
377
				'id' => 2,
378
				'user_id' => 3,
379
				'title' => 'Second Article',
380
				'published' => 'Y'
381
			)),
382
			array('Article' => array(
383
				'id' => 3,
384
				'user_id' => 1,
385
				'title' => 'Third Article',
386
				'published' => 'Y'
387
			)),
388
			array('Article' => array(
389
				'id' => 5,
390
				'user_id' => 2,
391
				'title' => 'Fifth Article',
392
				'published' => 'Y'
393
		)));
394
		$this->assertEquals($expected, $result);
395
 
396
		$data = array('Article.user_id' => array(2, 3));
397
		$result = $TestModel->deleteAll($data, true, true);
398
		$this->assertTrue($result);
399
 
400
		$TestModel->recursive = -1;
401
		$result = $TestModel->find('all', array(
402
			'fields' => array('id', 'user_id', 'title', 'published'),
403
			'order' => array('Article.id' => 'ASC')
404
		));
405
		$expected = array(
406
			array('Article' => array(
407
				'id' => 1,
408
				'user_id' => 1,
409
				'title' => 'First Article',
410
				'published' => 'Y'
411
			)),
412
			array('Article' => array(
413
				'id' => 3,
414
				'user_id' => 1,
415
				'title' => 'Third Article',
416
				'published' => 'Y'
417
		)));
418
		$this->assertEquals($expected, $result);
419
 
420
		$result = $TestModel->deleteAll(array('Article.user_id' => 999));
421
		$this->assertTrue($result, 'deleteAll returned false when all no records matched conditions. %s');
422
	}
423
 
424
/**
425
 * testDeleteAllUnknownColumn method
426
 *
427
 * @expectedException PDOException
428
 * @return void
429
 */
430
	public function testDeleteAllUnknownColumn() {
431
		$this->loadFixtures('Article');
432
		$TestModel = new Article();
433
		$result = $TestModel->deleteAll(array('Article.non_existent_field' => 999));
434
		$this->assertFalse($result, 'deleteAll returned true when find query generated sql error. %s');
435
	}
436
 
437
/**
438
 * testDeleteAllFailedFind method
439
 *
440
 * Eg: Behavior callback stops the event, find returns null
441
 *
442
 * @return void
443
 */
444
	public function testDeleteAllFailedFind() {
445
		$this->loadFixtures('Article');
446
		$TestModel = $this->getMock('Article', array('find'));
447
		$TestModel->expects($this->once())
448
			->method('find')
449
			->will($this->returnValue(null));
450
 
451
		$result = $TestModel->deleteAll(array('Article.user_id' => 999));
452
		$this->assertFalse($result);
453
	}
454
 
455
/**
456
 * testDeleteAllMultipleRowsPerId method
457
 *
458
 * Ensure find done in deleteAll only returns distinct ids. A wacky combination
459
 * of association and conditions can sometimes generate multiple rows per id.
460
 *
461
 * @return void
462
 */
463
	public function testDeleteAllMultipleRowsPerId() {
464
		$this->loadFixtures('Article', 'User');
465
 
466
		$TestModel = new Article();
467
		$TestModel->unbindModel(array(
468
			'belongsTo' => array('User'),
469
			'hasMany' => array('Comment'),
470
			'hasAndBelongsToMany' => array('Tag')
471
		), false);
472
		$TestModel->bindModel(array(
473
			'belongsTo' => array(
474
				'User' => array(
475
					'foreignKey' => false,
476
					'conditions' => array(
477
						'Article.user_id = 1'
478
					)
479
				)
480
			)
481
		), false);
482
 
483
		$result = $TestModel->deleteAll(
484
			array('Article.user_id' => array(1, 3)),
485
			true,
486
			true
487
		);
488
 
489
		$this->assertTrue($result);
490
	}
491
 
492
/**
493
 * testDeleteAllWithOrderProperty
494
 *
495
 * Ensure find done in deleteAll works with models that has $order property set
496
 *
497
 * @return void
498
 */
499
	public function testDeleteAllWithOrderProperty() {
500
		$this->loadFixtures('Article', 'User');
501
 
502
		$TestModel = new Article();
503
		$TestModel->order = 'Article.published desc';
504
		$TestModel->unbindModel(array(
505
			'belongsTo' => array('User'),
506
			'hasMany' => array('Comment'),
507
			'hasAndBelongsToMany' => array('Tag')
508
		), false);
509
 
510
		$result = $TestModel->deleteAll(
511
			array('Article.user_id' => array(1, 3)),
512
			true,
513
			true
514
		);
515
 
516
		$this->assertTrue($result);
517
	}
518
 
519
/**
520
 * testRecursiveDel method
521
 *
522
 * @return void
523
 */
524
	public function testRecursiveDel() {
525
		$this->loadFixtures('Article', 'Comment', 'Attachment');
526
		$TestModel = new Article();
527
 
528
		$result = $TestModel->delete(2);
529
		$this->assertTrue($result);
530
 
531
		$TestModel->recursive = 2;
532
		$result = $TestModel->read(null, 2);
533
		$this->assertSame(array(), $result);
534
 
535
		$result = $TestModel->Comment->read(null, 5);
536
		$this->assertSame(array(), $result);
537
 
538
		$result = $TestModel->Comment->read(null, 6);
539
		$this->assertSame(array(), $result);
540
 
541
		$result = $TestModel->Comment->Attachment->read(null, 1);
542
		$this->assertSame(array(), $result);
543
 
544
		$result = $TestModel->find('count');
545
		$this->assertEquals(2, $result);
546
 
547
		$result = $TestModel->Comment->find('count');
548
		$this->assertEquals(4, $result);
549
 
550
		$result = $TestModel->Comment->Attachment->find('count');
551
		$this->assertEquals(0, $result);
552
	}
553
 
554
/**
555
 * testDependentExclusiveDelete method
556
 *
557
 * @return void
558
 */
559
	public function testDependentExclusiveDelete() {
560
		$this->loadFixtures('Article', 'Comment');
561
		$TestModel = new Article10();
562
 
563
		$result = $TestModel->find('all');
564
		$this->assertEquals(4, count($result[0]['Comment']));
565
		$this->assertEquals(2, count($result[1]['Comment']));
566
		$this->assertEquals(6, $TestModel->Comment->find('count'));
567
 
568
		$TestModel->delete(1);
569
		$this->assertEquals(2, $TestModel->Comment->find('count'));
570
	}
571
 
572
/**
573
 * testDeleteLinks method
574
 *
575
 * @return void
576
 */
577
	public function testDeleteLinks() {
578
		$this->loadFixtures('Article', 'ArticlesTag', 'Tag');
579
		$TestModel = new Article();
580
 
581
		$result = $TestModel->ArticlesTag->find('all');
582
		$expected = array(
583
			array('ArticlesTag' => array(
584
				'article_id' => '1',
585
				'tag_id' => '1'
586
			)),
587
			array('ArticlesTag' => array(
588
				'article_id' => '1',
589
				'tag_id' => '2'
590
			)),
591
			array('ArticlesTag' => array(
592
				'article_id' => '2',
593
				'tag_id' => '1'
594
			)),
595
			array('ArticlesTag' => array(
596
				'article_id' => '2',
597
				'tag_id' => '3'
598
		)));
599
		$this->assertEquals($expected, $result);
600
 
601
		$TestModel->delete(1);
602
		$result = $TestModel->ArticlesTag->find('all');
603
 
604
		$expected = array(
605
			array('ArticlesTag' => array(
606
				'article_id' => '2',
607
				'tag_id' => '1'
608
			)),
609
			array('ArticlesTag' => array(
610
				'article_id' => '2',
611
				'tag_id' => '3'
612
		)));
613
		$this->assertEquals($expected, $result);
614
 
615
		$result = $TestModel->deleteAll(array('Article.user_id' => 999));
616
		$this->assertTrue($result, 'deleteAll returned false when all no records matched conditions. %s');
617
	}
618
 
619
/**
620
 * test that a plugin model as the 'with' model doesn't have issues
621
 *
622
 * @return void
623
 */
624
	public function testDeleteLinksWithPLuginJoinModel() {
625
		$this->loadFixtures('Article', 'ArticlesTag', 'Tag');
626
		$Article = new Article();
627
		$Article->unbindModel(array('hasAndBelongsToMany' => array('Tag')), false);
628
		unset($Article->Tag, $Article->ArticleTags);
629
		$Article->bindModel(array('hasAndBelongsToMany' => array(
630
			'Tag' => array('with' => 'TestPlugin.ArticlesTag')
631
		)), false);
632
 
633
		$Article->ArticlesTag->order = null;
634
		$this->assertTrue($Article->delete(1));
635
	}
636
 
637
/**
638
 * testDeleteDependent method
639
 *
640
 * @return void
641
 */
642
	public function testDeleteDependent() {
643
		$this->loadFixtures('Bidding', 'BiddingMessage', 'Article',
644
			'ArticlesTag', 'Comment', 'User', 'Attachment'
645
		);
646
		$Bidding = new Bidding();
647
		$result = $Bidding->find('all', array('order' => array('Bidding.id' => 'ASC')));
648
		$expected = array(
649
			array(
650
				'Bidding' => array('id' => 1, 'bid' => 'One', 'name' => 'Bid 1'),
651
				'BiddingMessage' => array('bidding' => 'One', 'name' => 'Message 1'),
652
			),
653
			array(
654
				'Bidding' => array('id' => 2, 'bid' => 'Two', 'name' => 'Bid 2'),
655
				'BiddingMessage' => array('bidding' => 'Two', 'name' => 'Message 2'),
656
			),
657
			array(
658
				'Bidding' => array('id' => 3, 'bid' => 'Three', 'name' => 'Bid 3'),
659
				'BiddingMessage' => array('bidding' => 'Three', 'name' => 'Message 3'),
660
			),
661
			array(
662
				'Bidding' => array('id' => 4, 'bid' => 'Five', 'name' => 'Bid 5'),
663
				'BiddingMessage' => array('bidding' => '', 'name' => ''),
664
			),
665
		);
666
		$this->assertEquals($expected, $result);
667
 
668
		$Bidding->delete(4, true);
669
		$result = $Bidding->find('all', array('order' => array('Bidding.id' => 'ASC')));
670
		$expected = array(
671
			array(
672
				'Bidding' => array('id' => 1, 'bid' => 'One', 'name' => 'Bid 1'),
673
				'BiddingMessage' => array('bidding' => 'One', 'name' => 'Message 1'),
674
			),
675
			array(
676
				'Bidding' => array('id' => 2, 'bid' => 'Two', 'name' => 'Bid 2'),
677
				'BiddingMessage' => array('bidding' => 'Two', 'name' => 'Message 2'),
678
			),
679
			array(
680
				'Bidding' => array('id' => 3, 'bid' => 'Three', 'name' => 'Bid 3'),
681
				'BiddingMessage' => array('bidding' => 'Three', 'name' => 'Message 3'),
682
			),
683
		);
684
		$this->assertEquals($expected, $result);
685
 
686
		$Bidding->delete(2, true);
687
		$result = $Bidding->find('all', array('order' => array('Bidding.id' => 'ASC')));
688
		$expected = array(
689
			array(
690
				'Bidding' => array('id' => 1, 'bid' => 'One', 'name' => 'Bid 1'),
691
				'BiddingMessage' => array('bidding' => 'One', 'name' => 'Message 1'),
692
			),
693
			array(
694
				'Bidding' => array('id' => 3, 'bid' => 'Three', 'name' => 'Bid 3'),
695
				'BiddingMessage' => array('bidding' => 'Three', 'name' => 'Message 3'),
696
			),
697
		);
698
		$this->assertEquals($expected, $result);
699
 
700
		$result = $Bidding->BiddingMessage->find('all', array('order' => array('BiddingMessage.name' => 'ASC')));
701
		$expected = array(
702
			array(
703
				'BiddingMessage' => array('bidding' => 'One', 'name' => 'Message 1'),
704
				'Bidding' => array('id' => 1, 'bid' => 'One', 'name' => 'Bid 1'),
705
			),
706
			array(
707
				'BiddingMessage' => array('bidding' => 'Three', 'name' => 'Message 3'),
708
				'Bidding' => array('id' => 3, 'bid' => 'Three', 'name' => 'Bid 3'),
709
			),
710
			array(
711
				'BiddingMessage' => array('bidding' => 'Four', 'name' => 'Message 4'),
712
				'Bidding' => array('id' => '', 'bid' => '', 'name' => ''),
713
			),
714
		);
715
		$this->assertEquals($expected, $result);
716
 
717
		$Article = new Article();
718
		$result = $Article->Comment->find('count', array(
719
			'conditions' => array('Comment.article_id' => 1)
720
		));
721
		$this->assertEquals(4, $result);
722
 
723
		$result = $Article->delete(1, true);
724
		$this->assertTrue($result);
725
 
726
		$result = $Article->Comment->find('count', array(
727
			'conditions' => array('Comment.article_id' => 1)
728
		));
729
		$this->assertEquals(0, $result);
730
	}
731
 
732
/**
733
 * test deleteLinks with Multiple habtm associations
734
 *
735
 * @return void
736
 */
737
	public function testDeleteLinksWithMultipleHabtmAssociations() {
738
		$this->loadFixtures('JoinA', 'JoinB', 'JoinC', 'JoinAB', 'JoinAC');
739
		$JoinA = new JoinA();
740
 
741
		//create two new join records to expose the issue.
742
		$JoinA->JoinAsJoinC->create(array(
743
			'join_a_id' => 1,
744
			'join_c_id' => 2,
745
		));
746
		$JoinA->JoinAsJoinC->save();
747
		$JoinA->JoinAsJoinB->create(array(
748
			'join_a_id' => 1,
749
			'join_b_id' => 2,
750
		));
751
		$JoinA->JoinAsJoinB->save();
752
 
753
		$result = $JoinA->delete(1);
754
		$this->assertTrue($result, 'Delete failed %s');
755
 
756
		$joinedBs = $JoinA->JoinAsJoinB->find('count', array(
757
			'conditions' => array('JoinAsJoinB.join_a_id' => 1)
758
		));
759
		$this->assertEquals(0, $joinedBs, 'JoinA/JoinB link records left over. %s');
760
 
761
		$joinedBs = $JoinA->JoinAsJoinC->find('count', array(
762
			'conditions' => array('JoinAsJoinC.join_a_id' => 1)
763
		));
764
		$this->assertEquals(0, $joinedBs, 'JoinA/JoinC link records left over. %s');
765
	}
766
 
767
/**
768
 * testHabtmDeleteLinksWhenNoPrimaryKeyInJoinTable method
769
 *
770
 * @return void
771
 */
772
	public function testHabtmDeleteLinksWhenNoPrimaryKeyInJoinTable() {
773
		$this->loadFixtures('Apple', 'Device', 'ThePaperMonkies');
774
		$ThePaper = new ThePaper();
775
		$ThePaper->id = 1;
776
		$ThePaper->save(array('Monkey' => array(2, 3)));
777
 
778
		$result = $ThePaper->findById(1);
779
		$expected = array(
780
			array(
781
				'id' => '2',
782
				'device_type_id' => '1',
783
				'name' => 'Device 2',
784
				'typ' => '1'
785
			),
786
			array(
787
				'id' => '3',
788
				'device_type_id' => '1',
789
				'name' => 'Device 3',
790
				'typ' => '2'
791
		));
792
		$this->assertEquals($expected, $result['Monkey']);
793
 
794
		$ThePaper = new ThePaper();
795
		$ThePaper->id = 2;
796
		$ThePaper->save(array('Monkey' => array(2, 3)));
797
 
798
		$result = $ThePaper->findById(2);
799
		$expected = array(
800
			array(
801
				'id' => '2',
802
				'device_type_id' => '1',
803
				'name' => 'Device 2',
804
				'typ' => '1'
805
			),
806
			array(
807
				'id' => '3',
808
				'device_type_id' => '1',
809
				'name' => 'Device 3',
810
				'typ' => '2'
811
		));
812
		$this->assertEquals($expected, $result['Monkey']);
813
 
814
		$ThePaper->delete(1);
815
		$result = $ThePaper->findById(2);
816
		$expected = array(
817
			array(
818
				'id' => '2',
819
				'device_type_id' => '1',
820
				'name' => 'Device 2',
821
				'typ' => '1'
822
			),
823
			array(
824
				'id' => '3',
825
				'device_type_id' => '1',
826
				'name' => 'Device 3',
827
				'typ' => '2'
828
		));
829
		$this->assertEquals($expected, $result['Monkey']);
830
	}
831
 
832
/**
833
 * test that beforeDelete returning false can abort deletion.
834
 *
835
 * @return void
836
 */
837
	public function testBeforeDeleteDeleteAbortion() {
838
		$this->loadFixtures('Post');
839
		$Model = new CallbackPostTestModel();
840
		$Model->beforeDeleteReturn = false;
841
 
842
		$result = $Model->delete(1);
843
		$this->assertFalse($result);
844
 
845
		$exists = $Model->findById(1);
846
		$this->assertTrue(is_array($exists));
847
	}
848
 
849
/**
850
 * test for a habtm deletion error that occurs in postgres but should not.
851
 * And should not occur in any dbo.
852
 *
853
 * @return void
854
 */
855
	public function testDeleteHabtmPostgresFailure() {
856
		$this->loadFixtures('Article', 'Tag', 'ArticlesTag');
857
 
858
		$Article = ClassRegistry::init('Article');
859
		$Article->hasAndBelongsToMany['Tag']['unique'] = true;
860
 
861
		$Tag = ClassRegistry::init('Tag');
862
		$Tag->bindModel(array('hasAndBelongsToMany' => array(
863
			'Article' => array(
864
				'className' => 'Article',
865
				'unique' => true
866
			)
867
		)), true);
868
 
869
		// Article 1 should have Tag.1 and Tag.2
870
		$before = $Article->find("all", array(
871
			"conditions" => array("Article.id" => 1),
872
		));
873
		$this->assertEquals(2, count($before[0]['Tag']), 'Tag count for Article.id = 1 is incorrect, should be 2 %s');
874
 
875
		// From now on, Tag #1 is only associated with Post #1
876
		$submittedData = array(
877
			"Tag" => array("id" => 1, 'tag' => 'tag1'),
878
			"Article" => array(
879
				"Article" => array(1)
880
			)
881
		);
882
		$Tag->save($submittedData);
883
 
884
		// One more submission (The other way around) to make sure the reverse save looks good.
885
		$submittedData = array(
886
			"Article" => array("id" => 2, 'title' => 'second article'),
887
			"Tag" => array(
888
				"Tag" => array(2, 3)
889
			)
890
		);
891
 
892
		// ERROR:
893
		// Postgresql: DELETE FROM "articles_tags" WHERE tag_id IN ('1', '3')
894
		// MySQL: DELETE `ArticlesTag` FROM `articles_tags` AS `ArticlesTag` WHERE `ArticlesTag`.`article_id` = 2 AND `ArticlesTag`.`tag_id` IN (1, 3)
895
		$Article->save($submittedData);
896
 
897
		// Want to make sure Article #1 has Tag #1 and Tag #2 still.
898
		$after = $Article->find("all", array(
899
			"conditions" => array("Article.id" => 1),
900
		));
901
 
902
		// Removing Article #2 from Tag #1 is all that should have happened.
903
		$this->assertEquals(count($before[0]["Tag"]), count($after[0]["Tag"]));
904
	}
905
 
906
/**
907
 * test that deleting records inside the beforeDelete doesn't truncate the table.
908
 *
909
 * @return void
910
 */
911
	public function testBeforeDeleteWipingTable() {
912
		$this->loadFixtures('Comment');
913
 
914
		$Comment = new BeforeDeleteComment();
915
		// Delete 3 records.
916
		$Comment->delete(4);
917
		$result = $Comment->find('count');
918
 
919
		$this->assertTrue($result > 1, 'Comments are all gone.');
920
		$Comment->create(array(
921
			'article_id' => 1,
922
			'user_id' => 2,
923
			'comment' => 'new record',
924
			'published' => 'Y'
925
		));
926
		$Comment->save();
927
 
928
		$Comment->delete(5);
929
		$result = $Comment->find('count');
930
 
931
		$this->assertTrue($result > 1, 'Comments are all gone.');
932
	}
933
 
934
/**
935
 * test that deleting the same record from the beforeDelete and the delete doesn't truncate the table.
936
 *
937
 * @return void
938
 */
939
	public function testBeforeDeleteWipingTableWithDuplicateDelete() {
940
		$this->loadFixtures('Comment');
941
 
942
		$Comment = new BeforeDeleteComment();
943
		$Comment->delete(1);
944
 
945
		$result = $Comment->find('count');
946
		$this->assertTrue($result > 1, 'Comments are all gone.');
947
	}
948
}