統計
| ブランチ: | リビジョン:

pictcode / lib / Cake / Test / Case / Model / ModelDeleteTest.php @ 635eef61

履歴 | 表示 | アノテート | ダウンロード (24.428 KB)

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
}