951 lines
24 KiB
PHP
951 lines
24 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
* ModelDeleteTest file
|
||
|
*
|
||
|
* CakePHP(tm) Tests <http://book.cakephp.org/2.0/en/development/testing.html>
|
||
|
* Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||
|
*
|
||
|
* Licensed under The MIT License
|
||
|
* For full copyright and license information, please see the LICENSE.txt
|
||
|
* Redistributions of files must retain the above copyright notice
|
||
|
*
|
||
|
* @copyright Copyright (c) Cake Software Foundation, Inc. (http://cakefoundation.org)
|
||
|
* @link http://book.cakephp.org/2.0/en/development/testing.html CakePHP(tm) Tests
|
||
|
* @package Cake.Test.Case.Model
|
||
|
* @since CakePHP(tm) v 1.2.0.4206
|
||
|
* @license http://www.opensource.org/licenses/mit-license.php MIT License
|
||
|
*/
|
||
|
|
||
|
require_once dirname(__FILE__) . DS . 'ModelTestBase.php';
|
||
|
|
||
|
/**
|
||
|
* ModelDeleteTest
|
||
|
*
|
||
|
* @package Cake.Test.Case.Model
|
||
|
*/
|
||
|
class ModelDeleteTest extends BaseModelTest {
|
||
|
|
||
|
/**
|
||
|
* testDeleteHabtmReferenceWithConditions method
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function testDeleteHabtmReferenceWithConditions() {
|
||
|
$this->loadFixtures('Portfolio', 'Item', 'ItemsPortfolio', 'Syfile', 'Image');
|
||
|
|
||
|
$Portfolio = new Portfolio();
|
||
|
$Portfolio->hasAndBelongsToMany['Item']['conditions'] = array('ItemsPortfolio.item_id >' => 1);
|
||
|
|
||
|
$result = $Portfolio->find('first', array(
|
||
|
'conditions' => array('Portfolio.id' => 1)
|
||
|
));
|
||
|
$expected = array(
|
||
|
array(
|
||
|
'id' => 3,
|
||
|
'syfile_id' => 3,
|
||
|
'published' => false,
|
||
|
'name' => 'Item 3',
|
||
|
'ItemsPortfolio' => array(
|
||
|
'id' => 3,
|
||
|
'item_id' => 3,
|
||
|
'portfolio_id' => 1
|
||
|
)),
|
||
|
array(
|
||
|
'id' => 4,
|
||
|
'syfile_id' => 4,
|
||
|
'published' => false,
|
||
|
'name' => 'Item 4',
|
||
|
'ItemsPortfolio' => array(
|
||
|
'id' => 4,
|
||
|
'item_id' => 4,
|
||
|
'portfolio_id' => 1
|
||
|
)),
|
||
|
array(
|
||
|
'id' => 5,
|
||
|
'syfile_id' => 5,
|
||
|
'published' => false,
|
||
|
'name' => 'Item 5',
|
||
|
'ItemsPortfolio' => array(
|
||
|
'id' => 5,
|
||
|
'item_id' => 5,
|
||
|
'portfolio_id' => 1
|
||
|
)));
|
||
|
$this->assertEquals($expected, $result['Item']);
|
||
|
|
||
|
$result = $Portfolio->ItemsPortfolio->find('all', array(
|
||
|
'conditions' => array('ItemsPortfolio.portfolio_id' => 1)
|
||
|
));
|
||
|
$expected = array(
|
||
|
array(
|
||
|
'ItemsPortfolio' => array(
|
||
|
'id' => 1,
|
||
|
'item_id' => 1,
|
||
|
'portfolio_id' => 1
|
||
|
)),
|
||
|
array(
|
||
|
'ItemsPortfolio' => array(
|
||
|
'id' => 3,
|
||
|
'item_id' => 3,
|
||
|
'portfolio_id' => 1
|
||
|
)),
|
||
|
array(
|
||
|
'ItemsPortfolio' => array(
|
||
|
'id' => 4,
|
||
|
'item_id' => 4,
|
||
|
'portfolio_id' => 1
|
||
|
)),
|
||
|
array(
|
||
|
'ItemsPortfolio' => array(
|
||
|
'id' => 5,
|
||
|
'item_id' => 5,
|
||
|
'portfolio_id' => 1
|
||
|
)));
|
||
|
$this->assertEquals($expected, $result);
|
||
|
|
||
|
$Portfolio->delete(1);
|
||
|
|
||
|
$result = $Portfolio->find('first', array(
|
||
|
'conditions' => array('Portfolio.id' => 1)
|
||
|
));
|
||
|
$this->assertSame(array(), $result);
|
||
|
|
||
|
$result = $Portfolio->ItemsPortfolio->find('all', array(
|
||
|
'conditions' => array('ItemsPortfolio.portfolio_id' => 1)
|
||
|
));
|
||
|
$this->assertSame(array(), $result);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* testDeleteArticleBLinks method
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function testDeleteArticleBLinks() {
|
||
|
$this->loadFixtures('Article', 'ArticlesTag', 'Tag', 'User');
|
||
|
$TestModel = new ArticleB();
|
||
|
|
||
|
$result = $TestModel->ArticlesTag->find('all');
|
||
|
$expected = array(
|
||
|
array('ArticlesTag' => array('article_id' => '1', 'tag_id' => '1')),
|
||
|
array('ArticlesTag' => array('article_id' => '1', 'tag_id' => '2')),
|
||
|
array('ArticlesTag' => array('article_id' => '2', 'tag_id' => '1')),
|
||
|
array('ArticlesTag' => array('article_id' => '2', 'tag_id' => '3'))
|
||
|
);
|
||
|
$this->assertEquals($expected, $result);
|
||
|
|
||
|
$TestModel->delete(1);
|
||
|
$result = $TestModel->ArticlesTag->find('all');
|
||
|
|
||
|
$expected = array(
|
||
|
array('ArticlesTag' => array('article_id' => '2', 'tag_id' => '1')),
|
||
|
array('ArticlesTag' => array('article_id' => '2', 'tag_id' => '3'))
|
||
|
);
|
||
|
$this->assertEquals($expected, $result);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* testDeleteDependentWithConditions method
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function testDeleteDependentWithConditions() {
|
||
|
$this->loadFixtures('Cd', 'Book', 'OverallFavorite');
|
||
|
|
||
|
$Cd = new Cd();
|
||
|
$Book = new Book();
|
||
|
$OverallFavorite = new OverallFavorite();
|
||
|
|
||
|
$Cd->delete(1);
|
||
|
|
||
|
$result = $OverallFavorite->find('all', array(
|
||
|
'fields' => array('model_type', 'model_id', 'priority')
|
||
|
));
|
||
|
$expected = array(
|
||
|
array(
|
||
|
'OverallFavorite' => array(
|
||
|
'model_type' => 'Book',
|
||
|
'model_id' => 1,
|
||
|
'priority' => 2
|
||
|
)));
|
||
|
|
||
|
$this->assertTrue(is_array($result));
|
||
|
$this->assertEquals($expected, $result);
|
||
|
|
||
|
$Book->delete(1);
|
||
|
|
||
|
$result = $OverallFavorite->find('all', array(
|
||
|
'fields' => array('model_type', 'model_id', 'priority')
|
||
|
));
|
||
|
$expected = array();
|
||
|
|
||
|
$this->assertTrue(is_array($result));
|
||
|
$this->assertEquals($expected, $result);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* testDel method
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function testDelete() {
|
||
|
$this->loadFixtures('Article', 'Comment', 'Attachment');
|
||
|
$TestModel = new Article();
|
||
|
|
||
|
$result = $TestModel->delete(2);
|
||
|
$this->assertTrue($result);
|
||
|
|
||
|
$result = $TestModel->read(null, 2);
|
||
|
$this->assertSame(array(), $result);
|
||
|
|
||
|
$TestModel->recursive = -1;
|
||
|
$result = $TestModel->find('all', array(
|
||
|
'fields' => array('id', 'title')
|
||
|
));
|
||
|
$expected = array(
|
||
|
array('Article' => array(
|
||
|
'id' => 1,
|
||
|
'title' => 'First Article'
|
||
|
)),
|
||
|
array('Article' => array(
|
||
|
'id' => 3,
|
||
|
'title' => 'Third Article'
|
||
|
)));
|
||
|
$this->assertEquals($expected, $result);
|
||
|
|
||
|
$result = $TestModel->delete(3);
|
||
|
$this->assertTrue($result);
|
||
|
|
||
|
$result = $TestModel->read(null, 3);
|
||
|
$this->assertSame(array(), $result);
|
||
|
|
||
|
$TestModel->recursive = -1;
|
||
|
$result = $TestModel->find('all', array(
|
||
|
'fields' => array('id', 'title')
|
||
|
));
|
||
|
$expected = array(
|
||
|
array('Article' => array(
|
||
|
'id' => 1,
|
||
|
'title' => 'First Article'
|
||
|
)));
|
||
|
|
||
|
$this->assertEquals($expected, $result);
|
||
|
|
||
|
// make sure deleting a non-existent record doesn't break save()
|
||
|
// ticket #6293
|
||
|
$this->loadFixtures('Uuid');
|
||
|
$Uuid = new Uuid();
|
||
|
$data = array(
|
||
|
'B607DAB9-88A2-46CF-B57C-842CA9E3B3B3',
|
||
|
'52C8865C-10EE-4302-AE6C-6E7D8E12E2C8',
|
||
|
'8208C7FE-E89C-47C5-B378-DED6C271F9B8');
|
||
|
foreach ($data as $id) {
|
||
|
$Uuid->save(array('id' => $id));
|
||
|
}
|
||
|
$Uuid->delete('52C8865C-10EE-4302-AE6C-6E7D8E12E2C8');
|
||
|
$Uuid->delete('52C8865C-10EE-4302-AE6C-6E7D8E12E2C8');
|
||
|
foreach ($data as $id) {
|
||
|
$Uuid->save(array('id' => $id));
|
||
|
}
|
||
|
$result = $Uuid->find('all', array(
|
||
|
'conditions' => array('id' => $data),
|
||
|
'fields' => array('id'),
|
||
|
'order' => 'id'));
|
||
|
$expected = array(
|
||
|
array('Uuid' => array(
|
||
|
'id' => '52C8865C-10EE-4302-AE6C-6E7D8E12E2C8')),
|
||
|
array('Uuid' => array(
|
||
|
'id' => '8208C7FE-E89C-47C5-B378-DED6C271F9B8')),
|
||
|
array('Uuid' => array(
|
||
|
'id' => 'B607DAB9-88A2-46CF-B57C-842CA9E3B3B3')));
|
||
|
$this->assertEquals($expected, $result);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* test that delete() updates the correct records counterCache() records.
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function testDeleteUpdatingCounterCacheCorrectly() {
|
||
|
$this->loadFixtures('CounterCacheUser', 'CounterCachePost');
|
||
|
$User = new CounterCacheUser();
|
||
|
|
||
|
$User->Post->delete(3);
|
||
|
$result = $User->read(null, 301);
|
||
|
$this->assertEquals(0, $result['User']['post_count']);
|
||
|
|
||
|
$result = $User->read(null, 66);
|
||
|
$this->assertEquals(2, $result['User']['post_count']);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* testDeleteAll method
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function testDeleteAll() {
|
||
|
$this->loadFixtures('Article');
|
||
|
$TestModel = new Article();
|
||
|
|
||
|
$data = array('Article' => array(
|
||
|
'user_id' => 2,
|
||
|
'id' => 4,
|
||
|
'title' => 'Fourth Article',
|
||
|
'published' => 'N'
|
||
|
));
|
||
|
$result = $TestModel->set($data) && $TestModel->save();
|
||
|
$this->assertTrue($result);
|
||
|
|
||
|
$data = array('Article' => array(
|
||
|
'user_id' => 2,
|
||
|
'id' => 5,
|
||
|
'title' => 'Fifth Article',
|
||
|
'published' => 'Y'
|
||
|
));
|
||
|
$result = $TestModel->set($data) && $TestModel->save();
|
||
|
$this->assertTrue($result);
|
||
|
|
||
|
$data = array('Article' => array(
|
||
|
'user_id' => 1,
|
||
|
'id' => 6,
|
||
|
'title' => 'Sixth Article',
|
||
|
'published' => 'N'
|
||
|
));
|
||
|
$result = $TestModel->set($data) && $TestModel->save();
|
||
|
$this->assertTrue($result);
|
||
|
|
||
|
$TestModel->recursive = -1;
|
||
|
$result = $TestModel->find('all', array(
|
||
|
'fields' => array('id', 'user_id', 'title', 'published'),
|
||
|
'order' => array('Article.id' => 'ASC')
|
||
|
));
|
||
|
|
||
|
$expected = array(
|
||
|
array('Article' => array(
|
||
|
'id' => 1,
|
||
|
'user_id' => 1,
|
||
|
'title' => 'First Article',
|
||
|
'published' => 'Y'
|
||
|
)),
|
||
|
array('Article' => array(
|
||
|
'id' => 2,
|
||
|
'user_id' => 3,
|
||
|
'title' => 'Second Article',
|
||
|
'published' => 'Y'
|
||
|
)),
|
||
|
array('Article' => array(
|
||
|
'id' => 3,
|
||
|
'user_id' => 1,
|
||
|
'title' => 'Third Article',
|
||
|
'published' => 'Y')),
|
||
|
array('Article' => array(
|
||
|
'id' => 4,
|
||
|
'user_id' => 2,
|
||
|
'title' => 'Fourth Article',
|
||
|
'published' => 'N'
|
||
|
)),
|
||
|
array('Article' => array(
|
||
|
'id' => 5,
|
||
|
'user_id' => 2,
|
||
|
'title' => 'Fifth Article',
|
||
|
'published' => 'Y'
|
||
|
)),
|
||
|
array('Article' => array(
|
||
|
'id' => 6,
|
||
|
'user_id' => 1,
|
||
|
'title' => 'Sixth Article',
|
||
|
'published' => 'N'
|
||
|
)));
|
||
|
|
||
|
$this->assertEquals($expected, $result);
|
||
|
|
||
|
$result = $TestModel->deleteAll(array('Article.published' => 'N'));
|
||
|
$this->assertTrue($result);
|
||
|
|
||
|
$TestModel->recursive = -1;
|
||
|
$result = $TestModel->find('all', array(
|
||
|
'fields' => array('id', 'user_id', 'title', 'published'),
|
||
|
'order' => array('Article.id' => 'ASC')
|
||
|
));
|
||
|
$expected = array(
|
||
|
array('Article' => array(
|
||
|
'id' => 1,
|
||
|
'user_id' => 1,
|
||
|
'title' => 'First Article',
|
||
|
'published' => 'Y'
|
||
|
)),
|
||
|
array('Article' => array(
|
||
|
'id' => 2,
|
||
|
'user_id' => 3,
|
||
|
'title' => 'Second Article',
|
||
|
'published' => 'Y'
|
||
|
)),
|
||
|
array('Article' => array(
|
||
|
'id' => 3,
|
||
|
'user_id' => 1,
|
||
|
'title' => 'Third Article',
|
||
|
'published' => 'Y'
|
||
|
)),
|
||
|
array('Article' => array(
|
||
|
'id' => 5,
|
||
|
'user_id' => 2,
|
||
|
'title' => 'Fifth Article',
|
||
|
'published' => 'Y'
|
||
|
)));
|
||
|
$this->assertEquals($expected, $result);
|
||
|
|
||
|
$data = array('Article.user_id' => array(2, 3));
|
||
|
$result = $TestModel->deleteAll($data, true, true);
|
||
|
$this->assertTrue($result);
|
||
|
|
||
|
$TestModel->recursive = -1;
|
||
|
$result = $TestModel->find('all', array(
|
||
|
'fields' => array('id', 'user_id', 'title', 'published'),
|
||
|
'order' => array('Article.id' => 'ASC')
|
||
|
));
|
||
|
$expected = array(
|
||
|
array('Article' => array(
|
||
|
'id' => 1,
|
||
|
'user_id' => 1,
|
||
|
'title' => 'First Article',
|
||
|
'published' => 'Y'
|
||
|
)),
|
||
|
array('Article' => array(
|
||
|
'id' => 3,
|
||
|
'user_id' => 1,
|
||
|
'title' => 'Third Article',
|
||
|
'published' => 'Y'
|
||
|
)));
|
||
|
$this->assertEquals($expected, $result);
|
||
|
|
||
|
$result = $TestModel->deleteAll(array('Article.user_id' => 999));
|
||
|
$this->assertTrue($result, 'deleteAll returned false when all no records matched conditions. %s');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* testDeleteAllUnknownColumn method
|
||
|
*
|
||
|
* @expectedException PDOException
|
||
|
* @return void
|
||
|
*/
|
||
|
public function testDeleteAllUnknownColumn() {
|
||
|
$this->loadFixtures('Article');
|
||
|
$TestModel = new Article();
|
||
|
$result = $TestModel->deleteAll(array('Article.non_existent_field' => 999));
|
||
|
$this->assertFalse($result, 'deleteAll returned true when find query generated sql error. %s');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* testDeleteAllFailedFind method
|
||
|
*
|
||
|
* Eg: Behavior callback stops the event, find returns null
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function testDeleteAllFailedFind() {
|
||
|
$this->loadFixtures('Article');
|
||
|
$this->getMock('Article', array('find'), array(), 'ArticleDeleteAll');
|
||
|
|
||
|
$TestModel = new ArticleDeleteAll();
|
||
|
$TestModel->expects($this->once())
|
||
|
->method('find')
|
||
|
->will($this->returnValue(null));
|
||
|
|
||
|
$result = $TestModel->deleteAll(array('Article.user_id' => 999));
|
||
|
$this->assertFalse($result);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* testDeleteAllMultipleRowsPerId method
|
||
|
*
|
||
|
* Ensure find done in deleteAll only returns distinct ids. A wacky combination
|
||
|
* of association and conditions can sometimes generate multiple rows per id.
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function testDeleteAllMultipleRowsPerId() {
|
||
|
$this->loadFixtures('Article', 'User');
|
||
|
|
||
|
$TestModel = new Article();
|
||
|
$TestModel->unbindModel(array(
|
||
|
'belongsTo' => array('User'),
|
||
|
'hasMany' => array('Comment'),
|
||
|
'hasAndBelongsToMany' => array('Tag')
|
||
|
), false);
|
||
|
$TestModel->bindModel(array(
|
||
|
'belongsTo' => array(
|
||
|
'User' => array(
|
||
|
'foreignKey' => false,
|
||
|
'conditions' => array(
|
||
|
'Article.user_id = 1'
|
||
|
)
|
||
|
)
|
||
|
)
|
||
|
), false);
|
||
|
|
||
|
$result = $TestModel->deleteAll(
|
||
|
array('Article.user_id' => array(1, 3)),
|
||
|
true,
|
||
|
true
|
||
|
);
|
||
|
|
||
|
$this->assertTrue($result);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* testDeleteAllWithOrderProperty
|
||
|
*
|
||
|
* Ensure find done in deleteAll works with models that has $order property set
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function testDeleteAllWithOrderProperty() {
|
||
|
$this->loadFixtures('Article', 'User');
|
||
|
|
||
|
$TestModel = new Article();
|
||
|
$TestModel->order = 'Article.published desc';
|
||
|
$TestModel->unbindModel(array(
|
||
|
'belongsTo' => array('User'),
|
||
|
'hasMany' => array('Comment'),
|
||
|
'hasAndBelongsToMany' => array('Tag')
|
||
|
), false);
|
||
|
|
||
|
$result = $TestModel->deleteAll(
|
||
|
array('Article.user_id' => array(1, 3)),
|
||
|
true,
|
||
|
true
|
||
|
);
|
||
|
|
||
|
$this->assertTrue($result);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* testRecursiveDel method
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function testRecursiveDel() {
|
||
|
$this->loadFixtures('Article', 'Comment', 'Attachment');
|
||
|
$TestModel = new Article();
|
||
|
|
||
|
$result = $TestModel->delete(2);
|
||
|
$this->assertTrue($result);
|
||
|
|
||
|
$TestModel->recursive = 2;
|
||
|
$result = $TestModel->read(null, 2);
|
||
|
$this->assertSame(array(), $result);
|
||
|
|
||
|
$result = $TestModel->Comment->read(null, 5);
|
||
|
$this->assertSame(array(), $result);
|
||
|
|
||
|
$result = $TestModel->Comment->read(null, 6);
|
||
|
$this->assertSame(array(), $result);
|
||
|
|
||
|
$result = $TestModel->Comment->Attachment->read(null, 1);
|
||
|
$this->assertSame(array(), $result);
|
||
|
|
||
|
$result = $TestModel->find('count');
|
||
|
$this->assertEquals(2, $result);
|
||
|
|
||
|
$result = $TestModel->Comment->find('count');
|
||
|
$this->assertEquals(4, $result);
|
||
|
|
||
|
$result = $TestModel->Comment->Attachment->find('count');
|
||
|
$this->assertEquals(0, $result);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* testDependentExclusiveDelete method
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function testDependentExclusiveDelete() {
|
||
|
$this->loadFixtures('Article', 'Comment');
|
||
|
$TestModel = new Article10();
|
||
|
|
||
|
$result = $TestModel->find('all');
|
||
|
$this->assertEquals(4, count($result[0]['Comment']));
|
||
|
$this->assertEquals(2, count($result[1]['Comment']));
|
||
|
$this->assertEquals(6, $TestModel->Comment->find('count'));
|
||
|
|
||
|
$TestModel->delete(1);
|
||
|
$this->assertEquals(2, $TestModel->Comment->find('count'));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* testDeleteLinks method
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function testDeleteLinks() {
|
||
|
$this->loadFixtures('Article', 'ArticlesTag', 'Tag');
|
||
|
$TestModel = new Article();
|
||
|
|
||
|
$result = $TestModel->ArticlesTag->find('all');
|
||
|
$expected = array(
|
||
|
array('ArticlesTag' => array(
|
||
|
'article_id' => '1',
|
||
|
'tag_id' => '1'
|
||
|
)),
|
||
|
array('ArticlesTag' => array(
|
||
|
'article_id' => '1',
|
||
|
'tag_id' => '2'
|
||
|
)),
|
||
|
array('ArticlesTag' => array(
|
||
|
'article_id' => '2',
|
||
|
'tag_id' => '1'
|
||
|
)),
|
||
|
array('ArticlesTag' => array(
|
||
|
'article_id' => '2',
|
||
|
'tag_id' => '3'
|
||
|
)));
|
||
|
$this->assertEquals($expected, $result);
|
||
|
|
||
|
$TestModel->delete(1);
|
||
|
$result = $TestModel->ArticlesTag->find('all');
|
||
|
|
||
|
$expected = array(
|
||
|
array('ArticlesTag' => array(
|
||
|
'article_id' => '2',
|
||
|
'tag_id' => '1'
|
||
|
)),
|
||
|
array('ArticlesTag' => array(
|
||
|
'article_id' => '2',
|
||
|
'tag_id' => '3'
|
||
|
)));
|
||
|
$this->assertEquals($expected, $result);
|
||
|
|
||
|
$result = $TestModel->deleteAll(array('Article.user_id' => 999));
|
||
|
$this->assertTrue($result, 'deleteAll returned false when all no records matched conditions. %s');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* test that a plugin model as the 'with' model doesn't have issues
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function testDeleteLinksWithPLuginJoinModel() {
|
||
|
$this->loadFixtures('Article', 'ArticlesTag', 'Tag');
|
||
|
$Article = new Article();
|
||
|
$Article->unbindModel(array('hasAndBelongsToMany' => array('Tag')), false);
|
||
|
unset($Article->Tag, $Article->ArticleTags);
|
||
|
$Article->bindModel(array('hasAndBelongsToMany' => array(
|
||
|
'Tag' => array('with' => 'TestPlugin.ArticlesTag')
|
||
|
)), false);
|
||
|
|
||
|
$Article->ArticlesTag->order = null;
|
||
|
$this->assertTrue($Article->delete(1));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* testDeleteDependent method
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function testDeleteDependent() {
|
||
|
$this->loadFixtures('Bidding', 'BiddingMessage', 'Article',
|
||
|
'ArticlesTag', 'Comment', 'User', 'Attachment'
|
||
|
);
|
||
|
$Bidding = new Bidding();
|
||
|
$result = $Bidding->find('all', array('order' => array('Bidding.id' => 'ASC')));
|
||
|
$expected = array(
|
||
|
array(
|
||
|
'Bidding' => array('id' => 1, 'bid' => 'One', 'name' => 'Bid 1'),
|
||
|
'BiddingMessage' => array('bidding' => 'One', 'name' => 'Message 1'),
|
||
|
),
|
||
|
array(
|
||
|
'Bidding' => array('id' => 2, 'bid' => 'Two', 'name' => 'Bid 2'),
|
||
|
'BiddingMessage' => array('bidding' => 'Two', 'name' => 'Message 2'),
|
||
|
),
|
||
|
array(
|
||
|
'Bidding' => array('id' => 3, 'bid' => 'Three', 'name' => 'Bid 3'),
|
||
|
'BiddingMessage' => array('bidding' => 'Three', 'name' => 'Message 3'),
|
||
|
),
|
||
|
array(
|
||
|
'Bidding' => array('id' => 4, 'bid' => 'Five', 'name' => 'Bid 5'),
|
||
|
'BiddingMessage' => array('bidding' => '', 'name' => ''),
|
||
|
),
|
||
|
);
|
||
|
$this->assertEquals($expected, $result);
|
||
|
|
||
|
$Bidding->delete(4, true);
|
||
|
$result = $Bidding->find('all', array('order' => array('Bidding.id' => 'ASC')));
|
||
|
$expected = array(
|
||
|
array(
|
||
|
'Bidding' => array('id' => 1, 'bid' => 'One', 'name' => 'Bid 1'),
|
||
|
'BiddingMessage' => array('bidding' => 'One', 'name' => 'Message 1'),
|
||
|
),
|
||
|
array(
|
||
|
'Bidding' => array('id' => 2, 'bid' => 'Two', 'name' => 'Bid 2'),
|
||
|
'BiddingMessage' => array('bidding' => 'Two', 'name' => 'Message 2'),
|
||
|
),
|
||
|
array(
|
||
|
'Bidding' => array('id' => 3, 'bid' => 'Three', 'name' => 'Bid 3'),
|
||
|
'BiddingMessage' => array('bidding' => 'Three', 'name' => 'Message 3'),
|
||
|
),
|
||
|
);
|
||
|
$this->assertEquals($expected, $result);
|
||
|
|
||
|
$Bidding->delete(2, true);
|
||
|
$result = $Bidding->find('all', array('order' => array('Bidding.id' => 'ASC')));
|
||
|
$expected = array(
|
||
|
array(
|
||
|
'Bidding' => array('id' => 1, 'bid' => 'One', 'name' => 'Bid 1'),
|
||
|
'BiddingMessage' => array('bidding' => 'One', 'name' => 'Message 1'),
|
||
|
),
|
||
|
array(
|
||
|
'Bidding' => array('id' => 3, 'bid' => 'Three', 'name' => 'Bid 3'),
|
||
|
'BiddingMessage' => array('bidding' => 'Three', 'name' => 'Message 3'),
|
||
|
),
|
||
|
);
|
||
|
$this->assertEquals($expected, $result);
|
||
|
|
||
|
$result = $Bidding->BiddingMessage->find('all', array('order' => array('BiddingMessage.name' => 'ASC')));
|
||
|
$expected = array(
|
||
|
array(
|
||
|
'BiddingMessage' => array('bidding' => 'One', 'name' => 'Message 1'),
|
||
|
'Bidding' => array('id' => 1, 'bid' => 'One', 'name' => 'Bid 1'),
|
||
|
),
|
||
|
array(
|
||
|
'BiddingMessage' => array('bidding' => 'Three', 'name' => 'Message 3'),
|
||
|
'Bidding' => array('id' => 3, 'bid' => 'Three', 'name' => 'Bid 3'),
|
||
|
),
|
||
|
array(
|
||
|
'BiddingMessage' => array('bidding' => 'Four', 'name' => 'Message 4'),
|
||
|
'Bidding' => array('id' => '', 'bid' => '', 'name' => ''),
|
||
|
),
|
||
|
);
|
||
|
$this->assertEquals($expected, $result);
|
||
|
|
||
|
$Article = new Article();
|
||
|
$result = $Article->Comment->find('count', array(
|
||
|
'conditions' => array('Comment.article_id' => 1)
|
||
|
));
|
||
|
$this->assertEquals(4, $result);
|
||
|
|
||
|
$result = $Article->delete(1, true);
|
||
|
$this->assertTrue($result);
|
||
|
|
||
|
$result = $Article->Comment->find('count', array(
|
||
|
'conditions' => array('Comment.article_id' => 1)
|
||
|
));
|
||
|
$this->assertEquals(0, $result);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* test deleteLinks with Multiple habtm associations
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function testDeleteLinksWithMultipleHabtmAssociations() {
|
||
|
$this->loadFixtures('JoinA', 'JoinB', 'JoinC', 'JoinAB', 'JoinAC');
|
||
|
$JoinA = new JoinA();
|
||
|
|
||
|
//create two new join records to expose the issue.
|
||
|
$JoinA->JoinAsJoinC->create(array(
|
||
|
'join_a_id' => 1,
|
||
|
'join_c_id' => 2,
|
||
|
));
|
||
|
$JoinA->JoinAsJoinC->save();
|
||
|
$JoinA->JoinAsJoinB->create(array(
|
||
|
'join_a_id' => 1,
|
||
|
'join_b_id' => 2,
|
||
|
));
|
||
|
$JoinA->JoinAsJoinB->save();
|
||
|
|
||
|
$result = $JoinA->delete(1);
|
||
|
$this->assertTrue($result, 'Delete failed %s');
|
||
|
|
||
|
$joinedBs = $JoinA->JoinAsJoinB->find('count', array(
|
||
|
'conditions' => array('JoinAsJoinB.join_a_id' => 1)
|
||
|
));
|
||
|
$this->assertEquals(0, $joinedBs, 'JoinA/JoinB link records left over. %s');
|
||
|
|
||
|
$joinedBs = $JoinA->JoinAsJoinC->find('count', array(
|
||
|
'conditions' => array('JoinAsJoinC.join_a_id' => 1)
|
||
|
));
|
||
|
$this->assertEquals(0, $joinedBs, 'JoinA/JoinC link records left over. %s');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* testHabtmDeleteLinksWhenNoPrimaryKeyInJoinTable method
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function testHabtmDeleteLinksWhenNoPrimaryKeyInJoinTable() {
|
||
|
$this->loadFixtures('Apple', 'Device', 'ThePaperMonkies');
|
||
|
$ThePaper = new ThePaper();
|
||
|
$ThePaper->id = 1;
|
||
|
$ThePaper->save(array('Monkey' => array(2, 3)));
|
||
|
|
||
|
$result = $ThePaper->findById(1);
|
||
|
$expected = array(
|
||
|
array(
|
||
|
'id' => '2',
|
||
|
'device_type_id' => '1',
|
||
|
'name' => 'Device 2',
|
||
|
'typ' => '1'
|
||
|
),
|
||
|
array(
|
||
|
'id' => '3',
|
||
|
'device_type_id' => '1',
|
||
|
'name' => 'Device 3',
|
||
|
'typ' => '2'
|
||
|
));
|
||
|
$this->assertEquals($expected, $result['Monkey']);
|
||
|
|
||
|
$ThePaper = new ThePaper();
|
||
|
$ThePaper->id = 2;
|
||
|
$ThePaper->save(array('Monkey' => array(2, 3)));
|
||
|
|
||
|
$result = $ThePaper->findById(2);
|
||
|
$expected = array(
|
||
|
array(
|
||
|
'id' => '2',
|
||
|
'device_type_id' => '1',
|
||
|
'name' => 'Device 2',
|
||
|
'typ' => '1'
|
||
|
),
|
||
|
array(
|
||
|
'id' => '3',
|
||
|
'device_type_id' => '1',
|
||
|
'name' => 'Device 3',
|
||
|
'typ' => '2'
|
||
|
));
|
||
|
$this->assertEquals($expected, $result['Monkey']);
|
||
|
|
||
|
$ThePaper->delete(1);
|
||
|
$result = $ThePaper->findById(2);
|
||
|
$expected = array(
|
||
|
array(
|
||
|
'id' => '2',
|
||
|
'device_type_id' => '1',
|
||
|
'name' => 'Device 2',
|
||
|
'typ' => '1'
|
||
|
),
|
||
|
array(
|
||
|
'id' => '3',
|
||
|
'device_type_id' => '1',
|
||
|
'name' => 'Device 3',
|
||
|
'typ' => '2'
|
||
|
));
|
||
|
$this->assertEquals($expected, $result['Monkey']);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* test that beforeDelete returning false can abort deletion.
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function testBeforeDeleteDeleteAbortion() {
|
||
|
$this->loadFixtures('Post');
|
||
|
$Model = new CallbackPostTestModel();
|
||
|
$Model->beforeDeleteReturn = false;
|
||
|
|
||
|
$result = $Model->delete(1);
|
||
|
$this->assertFalse($result);
|
||
|
|
||
|
$exists = $Model->findById(1);
|
||
|
$this->assertTrue(is_array($exists));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* test for a habtm deletion error that occurs in postgres but should not.
|
||
|
* And should not occur in any dbo.
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function testDeleteHabtmPostgresFailure() {
|
||
|
$this->loadFixtures('Article', 'Tag', 'ArticlesTag');
|
||
|
|
||
|
$Article = ClassRegistry::init('Article');
|
||
|
$Article->hasAndBelongsToMany['Tag']['unique'] = true;
|
||
|
|
||
|
$Tag = ClassRegistry::init('Tag');
|
||
|
$Tag->bindModel(array('hasAndBelongsToMany' => array(
|
||
|
'Article' => array(
|
||
|
'className' => 'Article',
|
||
|
'unique' => true
|
||
|
)
|
||
|
)), true);
|
||
|
|
||
|
// Article 1 should have Tag.1 and Tag.2
|
||
|
$before = $Article->find("all", array(
|
||
|
"conditions" => array("Article.id" => 1),
|
||
|
));
|
||
|
$this->assertEquals(2, count($before[0]['Tag']), 'Tag count for Article.id = 1 is incorrect, should be 2 %s');
|
||
|
|
||
|
// From now on, Tag #1 is only associated with Post #1
|
||
|
$submittedData = array(
|
||
|
"Tag" => array("id" => 1, 'tag' => 'tag1'),
|
||
|
"Article" => array(
|
||
|
"Article" => array(1)
|
||
|
)
|
||
|
);
|
||
|
$Tag->save($submittedData);
|
||
|
|
||
|
// One more submission (The other way around) to make sure the reverse save looks good.
|
||
|
$submittedData = array(
|
||
|
"Article" => array("id" => 2, 'title' => 'second article'),
|
||
|
"Tag" => array(
|
||
|
"Tag" => array(2, 3)
|
||
|
)
|
||
|
);
|
||
|
|
||
|
// ERROR:
|
||
|
// Postgresql: DELETE FROM "articles_tags" WHERE tag_id IN ('1', '3')
|
||
|
// MySQL: DELETE `ArticlesTag` FROM `articles_tags` AS `ArticlesTag` WHERE `ArticlesTag`.`article_id` = 2 AND `ArticlesTag`.`tag_id` IN (1, 3)
|
||
|
$Article->save($submittedData);
|
||
|
|
||
|
// Want to make sure Article #1 has Tag #1 and Tag #2 still.
|
||
|
$after = $Article->find("all", array(
|
||
|
"conditions" => array("Article.id" => 1),
|
||
|
));
|
||
|
|
||
|
// Removing Article #2 from Tag #1 is all that should have happened.
|
||
|
$this->assertEquals(count($before[0]["Tag"]), count($after[0]["Tag"]));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* test that deleting records inside the beforeDelete doesn't truncate the table.
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function testBeforeDeleteWipingTable() {
|
||
|
$this->loadFixtures('Comment');
|
||
|
|
||
|
$Comment = new BeforeDeleteComment();
|
||
|
// Delete 3 records.
|
||
|
$Comment->delete(4);
|
||
|
$result = $Comment->find('count');
|
||
|
|
||
|
$this->assertTrue($result > 1, 'Comments are all gone.');
|
||
|
$Comment->create(array(
|
||
|
'article_id' => 1,
|
||
|
'user_id' => 2,
|
||
|
'comment' => 'new record',
|
||
|
'published' => 'Y'
|
||
|
));
|
||
|
$Comment->save();
|
||
|
|
||
|
$Comment->delete(5);
|
||
|
$result = $Comment->find('count');
|
||
|
|
||
|
$this->assertTrue($result > 1, 'Comments are all gone.');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* test that deleting the same record from the beforeDelete and the delete doesn't truncate the table.
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function testBeforeDeleteWipingTableWithDuplicateDelete() {
|
||
|
$this->loadFixtures('Comment');
|
||
|
|
||
|
$Comment = new BeforeDeleteComment();
|
||
|
$Comment->delete(1);
|
||
|
|
||
|
$result = $Comment->find('count');
|
||
|
$this->assertTrue($result > 1, 'Comments are all gone.');
|
||
|
}
|
||
|
}
|