Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

6549 lines (5919 sloc) 180.18 kb
<?php
/**
* ModelWriteTest file
*
* PHP 5
*
* CakePHP(tm) Tests <http://book.cakephp.org/view/1196/Testing>
* Copyright 2005-2011, Cake Software Foundation, Inc. (http://cakefoundation.org)
*
* Licensed under The MIT License
* Redistributions of files must retain the above copyright notice
*
* @copyright Copyright 2005-2011, Cake Software Foundation, Inc. (http://cakefoundation.org)
* @link http://book.cakephp.org/view/1196/Testing CakePHP(tm) Tests
* @package Cake.Test.Case.Model
* @since CakePHP(tm) v 1.2.0.4206
* @license MIT License (http://www.opensource.org/licenses/mit-license.php)
*/
require_once dirname(__FILE__) . DS . 'ModelTestBase.php';
/**
* ModelWriteTest
*
* @package Cake.Test.Case.Model
*/
class ModelWriteTest extends BaseModelTest {
/**
* testInsertAnotherHabtmRecordWithSameForeignKey method
*
* @access public
* @return void
*/
public function testInsertAnotherHabtmRecordWithSameForeignKey() {
$this->loadFixtures('JoinA', 'JoinB', 'JoinAB', 'JoinC', 'JoinAC');
$TestModel = new JoinA();
$result = $TestModel->JoinAsJoinB->findById(1);
$expected = array(
'JoinAsJoinB' => array(
'id' => 1,
'join_a_id' => 1,
'join_b_id' => 2,
'other' => 'Data for Join A 1 Join B 2',
'created' => '2008-01-03 10:56:33',
'updated' => '2008-01-03 10:56:33'
));
$this->assertEquals($expected, $result);
$TestModel->JoinAsJoinB->create();
$data = array(
'join_a_id' => 1,
'join_b_id' => 1,
'other' => 'Data for Join A 1 Join B 1',
'created' => '2008-01-03 10:56:44',
'updated' => '2008-01-03 10:56:44'
);
$result = $TestModel->JoinAsJoinB->save($data);
$lastInsertId = $TestModel->JoinAsJoinB->getLastInsertID();
$data['id'] = $lastInsertId;
$this->assertEquals($result, array('JoinAsJoinB' => $data));
$this->assertTrue($lastInsertId != null);
$result = $TestModel->JoinAsJoinB->findById(1);
$expected = array(
'JoinAsJoinB' => array(
'id' => 1,
'join_a_id' => 1,
'join_b_id' => 2,
'other' => 'Data for Join A 1 Join B 2',
'created' => '2008-01-03 10:56:33',
'updated' => '2008-01-03 10:56:33'
));
$this->assertEquals($expected, $result);
$updatedValue = 'UPDATED Data for Join A 1 Join B 2';
$TestModel->JoinAsJoinB->id = 1;
$result = $TestModel->JoinAsJoinB->saveField('other', $updatedValue, false);
$this->assertFalse(empty($result));
$result = $TestModel->JoinAsJoinB->findById(1);
$this->assertEquals($result['JoinAsJoinB']['other'], $updatedValue);
}
/**
* testSaveDateAsFirstEntry method
*
* @return void
*/
public function testSaveDateAsFirstEntry() {
$this->loadFixtures('Article', 'User', 'Comment', 'Attachment', 'Tag', 'ArticlesTag');
$Article = new Article();
$data = array(
'Article' => array(
'created' => array(
'day' => '1',
'month' => '1',
'year' => '2008'
),
'title' => 'Test Title',
'user_id' => 1
));
$Article->create();
$result = $Article->save($data);
$this->assertFalse(empty($result));
$testResult = $Article->find('first', array('conditions' => array('Article.title' => 'Test Title')));
$this->assertEquals($testResult['Article']['title'], $data['Article']['title']);
$this->assertEquals($testResult['Article']['created'], '2008-01-01 00:00:00');
}
/**
* testUnderscoreFieldSave method
*
* @return void
*/
public function testUnderscoreFieldSave() {
$this->loadFixtures('UnderscoreField');
$UnderscoreField = new UnderscoreField();
$currentCount = $UnderscoreField->find('count');
$this->assertEquals($currentCount, 3);
$data = array('UnderscoreField' => array(
'user_id' => '1',
'my_model_has_a_field' => 'Content here',
'body' => 'Body',
'published' => 'Y',
'another_field' => 4
));
$ret = $UnderscoreField->save($data);
$this->assertFalse(empty($ret));
$currentCount = $UnderscoreField->find('count');
$this->assertEquals($currentCount, 4);
}
/**
* testAutoSaveUuid method
*
* @return void
*/
public function testAutoSaveUuid() {
// SQLite does not support non-integer primary keys
$this->skipIf($this->db instanceof Sqlite, 'This test is not compatible with SQLite.');
$this->loadFixtures('Uuid');
$TestModel = new Uuid();
$TestModel->save(array('title' => 'Test record'));
$result = $TestModel->findByTitle('Test record');
$this->assertEquals(
array_keys($result['Uuid']),
array('id', 'title', 'count', 'created', 'updated')
);
$this->assertEquals(strlen($result['Uuid']['id']), 36);
}
/**
* Ensure that if the id key is null but present the save doesn't fail (with an
* x sql error: "Column id specified twice")
*
* @return void
*/
public function testSaveUuidNull() {
// SQLite does not support non-integer primary keys
$this->skipIf($this->db instanceof Sqlite, 'This test is not compatible with SQLite.');
$this->loadFixtures('Uuid');
$TestModel = new Uuid();
$TestModel->save(array('title' => 'Test record', 'id' => null));
$result = $TestModel->findByTitle('Test record');
$this->assertEquals(
array_keys($result['Uuid']),
array('id', 'title', 'count', 'created', 'updated')
);
$this->assertEquals(strlen($result['Uuid']['id']), 36);
}
/**
* testZeroDefaultFieldValue method
*
* @return void
*/
public function testZeroDefaultFieldValue() {
$this->skipIf($this->db instanceof Sqlite, 'SQLite uses loose typing, this operation is unsupported.');
$this->loadFixtures('DataTest');
$TestModel = new DataTest();
$TestModel->create(array());
$TestModel->save();
$result = $TestModel->findById($TestModel->id);
$this->assertEquals($result['DataTest']['count'], 0);
$this->assertEquals($result['DataTest']['float'], 0);
}
/**
* Tests validation parameter order in custom validation methods
*
* @return void
*/
public function testAllowSimulatedFields() {
$TestModel = new ValidationTest1();
$TestModel->create(array(
'title' => 'foo',
'bar' => 'baz'
));
$expected = array(
'ValidationTest1' => array(
'title' => 'foo',
'bar' => 'baz'
));
$this->assertEquals($TestModel->data, $expected);
}
/**
* test that Caches are getting cleared on save().
* ensure that both inflections of controller names are getting cleared
* as url for controller could be either overallFavorites/index or overall_favorites/index
*
* @return void
*/
public function testCacheClearOnSave() {
$_back = array(
'check' => Configure::read('Cache.check'),
'disable' => Configure::read('Cache.disable'),
);
Configure::write('Cache.check', true);
Configure::write('Cache.disable', false);
$this->loadFixtures('OverallFavorite');
$OverallFavorite = new OverallFavorite();
touch(CACHE . 'views' . DS . 'some_dir_overallfavorites_index.php');
touch(CACHE . 'views' . DS . 'some_dir_overall_favorites_index.php');
$data = array(
'OverallFavorite' => array(
'id' => 22,
'model_type' => '8-track',
'model_id' => '3',
'priority' => '1'
)
);
$OverallFavorite->create($data);
$OverallFavorite->save();
$this->assertFalse(file_exists(CACHE . 'views' . DS . 'some_dir_overallfavorites_index.php'));
$this->assertFalse(file_exists(CACHE . 'views' . DS . 'some_dir_overall_favorites_index.php'));
Configure::write('Cache.check', $_back['check']);
Configure::write('Cache.disable', $_back['disable']);
}
/**
* testSaveWithCounterCache method
*
* @return void
*/
public function testSaveWithCounterCache() {
$this->loadFixtures('Syfile', 'Item', 'Image', 'Portfolio', 'ItemsPortfolio');
$TestModel = new Syfile();
$TestModel2 = new Item();
$result = $TestModel->findById(1);
$this->assertSame($result['Syfile']['item_count'], null);
$TestModel2->save(array(
'name' => 'Item 7',
'syfile_id' => 1,
'published' => false
));
$result = $TestModel->findById(1);
$this->assertEquals($result['Syfile']['item_count'], 2);
$TestModel2->delete(1);
$result = $TestModel->findById(1);
$this->assertEquals($result['Syfile']['item_count'], 1);
$TestModel2->id = 2;
$TestModel2->saveField('syfile_id', 1);
$result = $TestModel->findById(1);
$this->assertEquals($result['Syfile']['item_count'], 2);
$result = $TestModel->findById(2);
$this->assertEquals($result['Syfile']['item_count'], 0);
}
/**
* Tests that counter caches are updated when records are added
*
* @return void
*/
public function testCounterCacheIncrease() {
$this->loadFixtures('CounterCacheUser', 'CounterCachePost');
$User = new CounterCacheUser();
$Post = new CounterCachePost();
$data = array('Post' => array(
'id' => 22,
'title' => 'New Post',
'user_id' => 66
));
$Post->save($data);
$user = $User->find('first', array(
'conditions' => array('id' => 66),
'recursive' => -1
));
$result = $user[$User->alias]['post_count'];
$expected = 3;
$this->assertEquals($expected, $result);
}
/**
* Tests that counter caches are updated when records are deleted
*
* @return void
*/
public function testCounterCacheDecrease() {
$this->loadFixtures('CounterCacheUser', 'CounterCachePost');
$User = new CounterCacheUser();
$Post = new CounterCachePost();
$Post->delete(2);
$user = $User->find('first', array(
'conditions' => array('id' => 66),
'recursive' => -1
));
$result = $user[$User->alias]['post_count'];
$expected = 1;
$this->assertEquals($expected, $result);
}
/**
* Tests that counter caches are updated when foreign keys of counted records change
*
* @return void
*/
public function testCounterCacheUpdated() {
$this->loadFixtures('CounterCacheUser', 'CounterCachePost');
$User = new CounterCacheUser();
$Post = new CounterCachePost();
$data = $Post->find('first', array(
'conditions' => array('id' => 1),
'recursive' => -1
));
$data[$Post->alias]['user_id'] = 301;
$Post->save($data);
$users = $User->find('all',array('order' => 'User.id'));
$this->assertEquals($users[0]['User']['post_count'], 1);
$this->assertEquals($users[1]['User']['post_count'], 2);
}
/**
* Test counter cache with models that use a non-standard (i.e. not using 'id')
* as their primary key.
*
* @return void
*/
public function testCounterCacheWithNonstandardPrimaryKey() {
$this->loadFixtures(
'CounterCacheUserNonstandardPrimaryKey',
'CounterCachePostNonstandardPrimaryKey'
);
$User = new CounterCacheUserNonstandardPrimaryKey();
$Post = new CounterCachePostNonstandardPrimaryKey();
$data = $Post->find('first', array(
'conditions' => array('pid' => 1),
'recursive' => -1
));
$data[$Post->alias]['uid'] = 301;
$Post->save($data);
$users = $User->find('all',array('order' => 'User.uid'));
$this->assertEquals($users[0]['User']['post_count'], 1);
$this->assertEquals($users[1]['User']['post_count'], 2);
}
/**
* test Counter Cache With Self Joining table
*
* @return void
*/
public function testCounterCacheWithSelfJoin() {
$this->skipIf($this->db instanceof Sqlite, 'SQLite 2.x does not support ALTER TABLE ADD COLUMN');
$this->loadFixtures('CategoryThread');
$column = 'COLUMN ';
if ($this->db instanceof Sqlserver) {
$column = '';
}
$column .= $this->db->buildColumn(array('name' => 'child_count', 'type' => 'integer'));
$this->db->query('ALTER TABLE '. $this->db->fullTableName('category_threads') . ' ADD ' . $column);
$this->db->flushMethodCache();
$Category = new CategoryThread();
$result = $Category->updateAll(array('CategoryThread.name' => "'updated'"), array('CategoryThread.parent_id' => 5));
$this->assertFalse(empty($result));
$Category = new CategoryThread();
$Category->belongsTo['ParentCategory']['counterCache'] = 'child_count';
$Category->updateCounterCache(array('parent_id' => 5));
$result = Set::extract($Category->find('all', array('conditions' => array('CategoryThread.id' => 5))), '{n}.CategoryThread.child_count');
$expected = array(1);
$this->assertEquals($expected, $result);
}
/**
* testSaveWithCounterCacheScope method
*
* @return void
*/
public function testSaveWithCounterCacheScope() {
$this->loadFixtures('Syfile', 'Item', 'Image', 'ItemsPortfolio', 'Portfolio');
$TestModel = new Syfile();
$TestModel2 = new Item();
$TestModel2->belongsTo['Syfile']['counterCache'] = true;
$TestModel2->belongsTo['Syfile']['counterScope'] = array('published' => true);
$result = $TestModel->findById(1);
$this->assertSame($result['Syfile']['item_count'], null);
$TestModel2->save(array(
'name' => 'Item 7',
'syfile_id' => 1,
'published' => true
));
$result = $TestModel->findById(1);
$this->assertEquals($result['Syfile']['item_count'], 1);
$TestModel2->id = 1;
$TestModel2->saveField('published', true);
$result = $TestModel->findById(1);
$this->assertEquals($result['Syfile']['item_count'], 2);
$TestModel2->save(array(
'id' => 1,
'syfile_id' => 1,
'published' => false
));
$result = $TestModel->findById(1);
$this->assertEquals($result['Syfile']['item_count'], 1);
}
/**
* Tests having multiple counter caches for an associated model
*
* @access public
* @return void
*/
public function testCounterCacheMultipleCaches() {
$this->loadFixtures('CounterCacheUser', 'CounterCachePost');
$User = new CounterCacheUser();
$Post = new CounterCachePost();
$Post->unbindModel(array('belongsTo' => array('User')), false);
$Post->bindModel(array(
'belongsTo' => array(
'User' => array(
'className' => 'CounterCacheUser',
'foreignKey' => 'user_id',
'counterCache' => array(
true,
'posts_published' => array('Post.published' => true)
)
)
)
), false);
// Count Increase
$user = $User->find('first', array(
'conditions' => array('id' => 66),
'recursive' => -1
));
$data = array('Post' => array(
'id' => 22,
'title' => 'New Post',
'user_id' => 66,
'published' => true
));
$Post->save($data);
$result = $User->find('first', array(
'conditions' => array('id' => 66),
'recursive' => -1
));
$this->assertEquals(3, $result[$User->alias]['post_count']);
$this->assertEquals(2, $result[$User->alias]['posts_published']);
// Count decrease
$Post->delete(1);
$result = $User->find('first', array(
'conditions' => array('id' => 66),
'recursive' => -1
));
$this->assertEquals(2, $result[$User->alias]['post_count']);
$this->assertEquals(2, $result[$User->alias]['posts_published']);
// Count update
$data = $Post->find('first', array(
'conditions' => array('id' => 1),
'recursive' => -1
));
$data[$Post->alias]['user_id'] = 301;
$Post->save($data);
$result = $User->find('all',array('order' => 'User.id'));
$this->assertEquals(2, $result[0]['User']['post_count']);
$this->assertEquals(1, $result[1]['User']['posts_published']);
}
/**
* test that beforeValidate returning false can abort saves.
*
* @return void
*/
public function testBeforeValidateSaveAbortion() {
$this->loadFixtures('Post');
$Model = new CallbackPostTestModel();
$Model->beforeValidateReturn = false;
$data = array(
'title' => 'new article',
'body' => 'this is some text.'
);
$Model->create();
$result = $Model->save($data);
$this->assertFalse($result);
}
/**
* test that beforeSave returning false can abort saves.
*
* @return void
*/
public function testBeforeSaveSaveAbortion() {
$this->loadFixtures('Post');
$Model = new CallbackPostTestModel();
$Model->beforeSaveReturn = false;
$data = array(
'title' => 'new article',
'body' => 'this is some text.'
);
$Model->create();
$result = $Model->save($data);
$this->assertFalse($result);
}
/**
* testSaveField method
*
* @return void
*/
public function testSaveField() {
$this->loadFixtures('Article');
$TestModel = new Article();
$TestModel->id = 1;
$result = $TestModel->saveField('title', 'New First Article');
$this->assertFalse(empty($result));
$TestModel->recursive = -1;
$result = $TestModel->read(array('id', 'user_id', 'title', 'body'), 1);
$expected = array('Article' => array(
'id' => '1',
'user_id' => '1',
'title' => 'New First Article',
'body' => 'First Article Body'
));
$this->assertEquals($expected, $result);
$TestModel->id = 1;
$result = $TestModel->saveField('title', '');
$this->assertFalse(empty($result));
$TestModel->recursive = -1;
$result = $TestModel->read(array('id', 'user_id', 'title', 'body'), 1);
$expected = array('Article' => array(
'id' => '1',
'user_id' => '1',
'title' => '',
'body' => 'First Article Body'
));
$result['Article']['title'] = trim($result['Article']['title']);
$this->assertEquals($expected, $result);
$TestModel->id = 1;
$TestModel->set('body', 'Messed up data');
$result = $TestModel->saveField('title', 'First Article');
$this->assertFalse(empty($result));
$result = $TestModel->read(array('id', 'user_id', 'title', 'body'), 1);
$expected = array('Article' => array(
'id' => '1',
'user_id' => '1',
'title' => 'First Article',
'body' => 'First Article Body'
));
$this->assertEquals($expected, $result);
$TestModel->recursive = -1;
$TestModel->read(array('id', 'user_id', 'title', 'body'), 1);
$TestModel->id = 1;
$result = $TestModel->saveField('title', '', true);
$this->assertFalse($result);
$TestModel->recursive = -1;
$TestModel->id = 1;
$result = $TestModel->saveField('user_id', 9999);
$this->assertTrue((bool)$result);
$result = $TestModel->read(array('id', 'user_id'), 1);
$expected = array('Article' => array(
'id' => '1',
'user_id' => '9999',
));
$this->assertEquals($expected, $result);
$this->loadFixtures('Node', 'Dependency');
$Node = new Node();
$Node->set('id', 1);
$result = $Node->read();
$this->assertEquals(Set::extract('/ParentNode/name', $result), array('Second'));
$Node->saveField('state', 10);
$result = $Node->read();
$this->assertEquals(Set::extract('/ParentNode/name', $result), array('Second'));
}
/**
* testSaveWithCreate method
*
* @return void
*/
public function testSaveWithCreate() {
$this->loadFixtures(
'User',
'Article',
'User',
'Comment',
'Tag',
'ArticlesTag',
'Attachment'
);
$TestModel = new User();
$data = array('User' => array(
'user' => 'user',
'password' => ''
));
$result = $TestModel->save($data);
$this->assertFalse($result);
$this->assertTrue(!empty($TestModel->validationErrors));
$TestModel = new Article();
$data = array('Article' => array(
'user_id' => '',
'title' => '',
'body' => ''
));
$result = $TestModel->create($data) && $TestModel->save();
$this->assertFalse($result);
$this->assertTrue(!empty($TestModel->validationErrors));
$data = array('Article' => array(
'id' => 1,
'user_id' => '1',
'title' => 'New First Article',
'body' => ''
));
$result = $TestModel->create($data) && $TestModel->save();
$this->assertFalse($result);
$data = array('Article' => array(
'id' => 1,
'title' => 'New First Article'
));
$result = $TestModel->create() && $TestModel->save($data, false);
$this->assertFalse(empty($result));
$TestModel->recursive = -1;
$result = $TestModel->read(array('id', 'user_id', 'title', 'body', 'published'), 1);
$expected = array('Article' => array(
'id' => '1',
'user_id' => '1',
'title' => 'New First Article',
'body' => 'First Article Body',
'published' => 'N'
));
$this->assertEquals($expected, $result);
$data = array('Article' => array(
'id' => 1,
'user_id' => '2',
'title' => 'First Article',
'body' => 'New First Article Body',
'published' => 'Y'
));
$result = $TestModel->create() && $TestModel->save($data, true, array('id', 'title', 'published'));
$this->assertFalse(empty($result));
$TestModel->recursive = -1;
$result = $TestModel->read(array('id', 'user_id', 'title', 'body', 'published'), 1);
$expected = array('Article' => array(
'id' => '1',
'user_id' => '1',
'title' => 'First Article',
'body' => 'First Article Body',
'published' => 'Y'
));
$this->assertEquals($expected, $result);
$data = array(
'Article' => array(
'user_id' => '2',
'title' => 'New Article',
'body' => 'New Article Body',
'created' => '2007-03-18 14:55:23',
'updated' => '2007-03-18 14:57:31'
),
'Tag' => array('Tag' => array(1, 3))
);
$TestModel->create();
$result = $TestModel->create() && $TestModel->save($data);
$this->assertFalse(empty($result));
$TestModel->recursive = 2;
$result = $TestModel->read(null, 4);
$expected = array(
'Article' => array(
'id' => '4',
'user_id' => '2',
'title' => 'New Article',
'body' => 'New Article Body',
'published' => 'N',
'created' => '2007-03-18 14:55:23',
'updated' => '2007-03-18 14:57:31'
),
'User' => array(
'id' => '2',
'user' => 'nate',
'password' => '5f4dcc3b5aa765d61d8327deb882cf99',
'created' => '2007-03-17 01:18:23',
'updated' => '2007-03-17 01:20:31'
),
'Comment' => array(),
'Tag' => array(
array(
'id' => '1',
'tag' => 'tag1',
'created' => '2007-03-18 12:22:23',
'updated' => '2007-03-18 12:24:31'
),
array(
'id' => '3',
'tag' => 'tag3',
'created' => '2007-03-18 12:26:23',
'updated' => '2007-03-18 12:28:31'
)));
$this->assertEquals($expected, $result);
$data = array('Comment' => array(
'article_id' => '4',
'user_id' => '1',
'comment' => 'Comment New Article',
'published' => 'Y',
'created' => '2007-03-18 14:57:23',
'updated' => '2007-03-18 14:59:31'
));
$result = $TestModel->Comment->create() && $TestModel->Comment->save($data);
$this->assertFalse(empty($result));
$data = array('Attachment' => array(
'comment_id' => '7',
'attachment' => 'newattachment.zip',
'created' => '2007-03-18 15:02:23',
'updated' => '2007-03-18 15:04:31'
));
$result = $TestModel->Comment->Attachment->save($data);
$this->assertFalse(empty($result));
$TestModel->recursive = 2;
$result = $TestModel->read(null, 4);
$expected = array(
'Article' => array(
'id' => '4',
'user_id' => '2',
'title' => 'New Article',
'body' => 'New Article Body',
'published' => 'N',
'created' => '2007-03-18 14:55:23',
'updated' => '2007-03-18 14:57:31'
),
'User' => array(
'id' => '2',
'user' => 'nate',
'password' => '5f4dcc3b5aa765d61d8327deb882cf99',
'created' => '2007-03-17 01:18:23',
'updated' => '2007-03-17 01:20:31'
),
'Comment' => array(
array(
'id' => '7',
'article_id' => '4',
'user_id' => '1',
'comment' => 'Comment New Article',
'published' => 'Y',
'created' => '2007-03-18 14:57:23',
'updated' => '2007-03-18 14:59:31',
'Article' => array(
'id' => '4',
'user_id' => '2',
'title' => 'New Article',
'body' => 'New Article Body',
'published' => 'N',
'created' => '2007-03-18 14:55:23',
'updated' => '2007-03-18 14:57:31'
),
'User' => array(
'id' => '1',
'user' => 'mariano',
'password' => '5f4dcc3b5aa765d61d8327deb882cf99',
'created' => '2007-03-17 01:16:23',
'updated' => '2007-03-17 01:18:31'
),
'Attachment' => array(
'id' => '2',
'comment_id' => '7',
'attachment' => 'newattachment.zip',
'created' => '2007-03-18 15:02:23',
'updated' => '2007-03-18 15:04:31'
))),
'Tag' => array(
array(
'id' => '1',
'tag' => 'tag1',
'created' => '2007-03-18 12:22:23',
'updated' => '2007-03-18 12:24:31'
),
array(
'id' => '3',
'tag' => 'tag3',
'created' => '2007-03-18 12:26:23',
'updated' => '2007-03-18 12:28:31'
)));
$this->assertEquals($expected, $result);
}
/**
* test that a null Id doesn't cause errors
*
* @return void
*/
public function testSaveWithNullId() {
$this->loadFixtures('User');
$User = new User();
$User->read(null, 1);
$User->data['User']['id'] = null;
$result = $User->save(array('password' => 'test'));
$this->assertFalse(empty($result));
$this->assertTrue($User->id > 0);
$User->read(null, 2);
$User->data['User']['id'] = null;
$result = $User->save(array('password' => 'test'));
$this->assertFalse(empty($result));
$this->assertTrue($User->id > 0);
$User->data['User'] = array('password' => 'something');
$result = $User->save();
$this->assertFalse(empty($result));
$result = $User->read();
$this->assertEquals($User->data['User']['password'], 'something');
}
/**
* testSaveWithSet method
*
* @return void
*/
public function testSaveWithSet() {
$this->loadFixtures('Article');
$TestModel = new Article();
// Create record we will be updating later
$data = array('Article' => array(
'user_id' => '1',
'title' => 'Fourth Article',
'body' => 'Fourth Article Body',
'published' => 'Y'
));
$result = $TestModel->create() && $TestModel->save($data);
$this->assertFalse(empty($result));
// Check record we created
$TestModel->recursive = -1;
$result = $TestModel->read(array('id', 'user_id', 'title', 'body', 'published'), 4);
$expected = array('Article' => array(
'id' => '4',
'user_id' => '1',
'title' => 'Fourth Article',
'body' => 'Fourth Article Body',
'published' => 'Y'
));
$this->assertEquals($expected, $result);
// Create new record just to overlap Model->id on previously created record
$data = array('Article' => array(
'user_id' => '4',
'title' => 'Fifth Article',
'body' => 'Fifth Article Body',
'published' => 'Y'
));
$result = $TestModel->create() && $TestModel->save($data);
$this->assertFalse(empty($result));
$TestModel->recursive = -1;
$result = $TestModel->read(array('id', 'user_id', 'title', 'body', 'published'), 5);
$expected = array('Article' => array(
'id' => '5',
'user_id' => '4',
'title' => 'Fifth Article',
'body' => 'Fifth Article Body',
'published' => 'Y'
));
$this->assertEquals($expected, $result);
// Go back and edit the first article we created, starting by checking it's still there
$TestModel->recursive = -1;
$result = $TestModel->read(array('id', 'user_id', 'title', 'body', 'published'), 4);
$expected = array('Article' => array(
'id' => '4',
'user_id' => '1',
'title' => 'Fourth Article',
'body' => 'Fourth Article Body',
'published' => 'Y'
));
$this->assertEquals($expected, $result);
// And now do the update with set()
$data = array('Article' => array(
'id' => '4',
'title' => 'Fourth Article - New Title',
'published' => 'N'
));
$result = $TestModel->set($data) && $TestModel->save();
$this->assertFalse(empty($result));
$TestModel->recursive = -1;
$result = $TestModel->read(array('id', 'user_id', 'title', 'body', 'published'), 4);
$expected = array('Article' => array(
'id' => '4',
'user_id' => '1',
'title' => 'Fourth Article - New Title',
'body' => 'Fourth Article Body',
'published' => 'N'
));
$this->assertEquals($expected, $result);
$TestModel->recursive = -1;
$result = $TestModel->read(array('id', 'user_id', 'title', 'body', 'published'), 5);
$expected = array('Article' => array(
'id' => '5',
'user_id' => '4',
'title' => 'Fifth Article',
'body' => 'Fifth Article Body',
'published' => 'Y'
));
$this->assertEquals($expected, $result);
$data = array('Article' => array('id' => '5', 'title' => 'Fifth Article - New Title 5'));
$result = ($TestModel->set($data) && $TestModel->save());
$this->assertFalse(empty($result));
$TestModel->recursive = -1;
$result = $TestModel->read(array('id', 'user_id', 'title', 'body', 'published'), 5);
$expected = array('Article' => array(
'id' => '5',
'user_id' => '4',
'title' => 'Fifth Article - New Title 5',
'body' => 'Fifth Article Body',
'published' => 'Y'
));
$this->assertEquals($expected, $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' => 2, 'title' => 'Second Article')),
array('Article' => array('id' => 3, 'title' => 'Third Article')),
array('Article' => array('id' => 4, 'title' => 'Fourth Article - New Title')),
array('Article' => array('id' => 5, 'title' => 'Fifth Article - New Title 5'))
);
$this->assertEquals($expected, $result);
}
/**
* testSaveWithNonExistentFields method
*
* @return void
*/
public function testSaveWithNonExistentFields() {
$this->loadFixtures('Article');
$TestModel = new Article();
$TestModel->recursive = -1;
$data = array(
'non_existent' => 'This field does not exist',
'user_id' => '1',
'title' => 'Fourth Article - New Title',
'body' => 'Fourth Article Body',
'published' => 'N'
);
$result = $TestModel->create() && $TestModel->save($data);
$this->assertFalse(empty($result));
$expected = array('Article' => array(
'id' => '4',
'user_id' => '1',
'title' => 'Fourth Article - New Title',
'body' => 'Fourth Article Body',
'published' => 'N'
));
$result = $TestModel->read(array('id', 'user_id', 'title', 'body', 'published'), 4);
$this->assertEquals($expected, $result);
$data = array(
'user_id' => '1',
'non_existent' => 'This field does not exist',
'title' => 'Fifth Article - New Title',
'body' => 'Fifth Article Body',
'published' => 'N'
);
$result = $TestModel->create() && $TestModel->save($data);
$this->assertFalse(empty($result));
$expected = array('Article' => array(
'id' => '5',
'user_id' => '1',
'title' => 'Fifth Article - New Title',
'body' => 'Fifth Article Body',
'published' => 'N'
));
$result = $TestModel->read(array('id', 'user_id', 'title', 'body', 'published'), 5);
$this->assertEquals($expected, $result);
}
/**
* testSaveFromXml method
*
* @return void
*/
public function testSaveFromXml() {
$this->markTestSkipped('This feature needs to be fixed or dropped');
$this->loadFixtures('Article');
App::uses('Xml', 'Utility');
$Article = new Article();
$result = $Article->save(Xml::build('<article title="test xml" user_id="5" />'));
$this->assertFalse(empty($result));
$results = $Article->find('first', array('conditions' => array('Article.title' => 'test xml')));
$this->assertFalse(empty($results));
$result = $Article->save(Xml::build('<article><title>testing</title><user_id>6</user_id></article>'));
$this->assertFalse(empty($result));
$results = $Article->find('first', array('conditions' => array('Article.title' => 'testing')));
$this->assertFalse(empty($results));
$result = $Article->save(Xml::build('<article><title>testing with DOMDocument</title><user_id>7</user_id></article>', array('return' => 'domdocument')));
$this->assertFalse(empty($result));
$results = $Article->find('first', array('conditions' => array('Article.title' => 'testing with DOMDocument')));
$this->assertFalse(empty($results));
}
/**
* testSaveHabtm method
*
* @return void
*/
public function testSaveHabtm() {
$this->loadFixtures('Article', 'User', 'Comment', 'Tag', 'ArticlesTag');
$TestModel = new Article();
$result = $TestModel->findById(2);
$expected = array(
'Article' => array(
'id' => '2',
'user_id' => '3',
'title' => 'Second Article',
'body' => 'Second Article Body',
'published' => 'Y',
'created' => '2007-03-18 10:41:23',
'updated' => '2007-03-18 10:43:31'
),
'User' => array(
'id' => '3',
'user' => 'larry',
'password' => '5f4dcc3b5aa765d61d8327deb882cf99',
'created' => '2007-03-17 01:20:23',
'updated' => '2007-03-17 01:22:31'
),
'Comment' => array(
array(
'id' => '5',
'article_id' => '2',
'user_id' => '1',
'comment' => 'First Comment for Second Article',
'published' => 'Y',
'created' => '2007-03-18 10:53:23',
'updated' => '2007-03-18 10:55:31'
),
array(
'id' => '6',
'article_id' => '2',
'user_id' => '2',
'comment' => 'Second Comment for Second Article',
'published' => 'Y',
'created' => '2007-03-18 10:55:23',
'updated' => '2007-03-18 10:57:31'
)),
'Tag' => array(
array(
'id' => '1',
'tag' => 'tag1',
'created' => '2007-03-18 12:22:23',
'updated' => '2007-03-18 12:24:31'
),
array(
'id' => '3',
'tag' => 'tag3',
'created' => '2007-03-18 12:26:23',
'updated' => '2007-03-18 12:28:31'
)
)
);
$this->assertEquals($expected, $result);
$data = array(
'Article' => array(
'id' => '2',
'title' => 'New Second Article'
),
'Tag' => array('Tag' => array(1, 2))
);
$result = $TestModel->set($data);
$this->assertFalse(empty($result));
$result = $TestModel->save();
$this->assertFalse(empty($result));
$TestModel->unbindModel(array('belongsTo' => array('User'), 'hasMany' => array('Comment')));
$result = $TestModel->find('first', array('fields' => array('id', 'user_id', 'title', 'body'), 'conditions' => array('Article.id' => 2)));
$expected = array(
'Article' => array(
'id' => '2',
'user_id' => '3',
'title' => 'New Second Article',
'body' => 'Second Article Body'
),
'Tag' => array(
array(
'id' => '1',
'tag' => 'tag1',
'created' => '2007-03-18 12:22:23',
'updated' => '2007-03-18 12:24:31'
),
array(
'id' => '2',
'tag' => 'tag2',
'created' => '2007-03-18 12:24:23',
'updated' => '2007-03-18 12:26:31'
)));
$this->assertEquals($expected, $result);
$data = array('Article' => array('id' => '2'), 'Tag' => array('Tag' => array(2, 3)));
$result = $TestModel->set($data);
$this->assertFalse(empty($result));
$result = $TestModel->save();
$this->assertFalse(empty($result));
$TestModel->unbindModel(array(
'belongsTo' => array('User'),
'hasMany' => array('Comment')
));
$result = $TestModel->find('first', array('fields' => array('id', 'user_id', 'title', 'body'), 'conditions' => array('Article.id' => 2)));
$expected = array(
'Article' => array(
'id' => '2',
'user_id' => '3',
'title' => 'New Second Article',
'body' => 'Second Article Body'
),
'Tag' => array(
array(
'id' => '2',
'tag' => 'tag2',
'created' => '2007-03-18 12:24:23',
'updated' => '2007-03-18 12:26:31'
),
array(
'id' => '3',
'tag' => 'tag3',
'created' => '2007-03-18 12:26:23',
'updated' => '2007-03-18 12:28:31'
)));
$this->assertEquals($expected, $result);
$data = array('Tag' => array('Tag' => array(1, 2, 3)));
$result = $TestModel->set($data);
$this->assertFalse(empty($result));
$result = $TestModel->save();
$this->assertFalse(empty($result));
$TestModel->unbindModel(array(
'belongsTo' => array('User'),
'hasMany' => array('Comment')
));
$result = $TestModel->find('first', array('fields' => array('id', 'user_id', 'title', 'body'), 'conditions' => array('Article.id' => 2)));
$expected = array(
'Article' => array(
'id' => '2',
'user_id' => '3',
'title' => 'New Second Article',
'body' => 'Second Article Body'
),
'Tag' => array(
array(
'id' => '1',
'tag' => 'tag1',
'created' => '2007-03-18 12:22:23',
'updated' => '2007-03-18 12:24:31'
),
array(
'id' => '2',
'tag' => 'tag2',
'created' => '2007-03-18 12:24:23',
'updated' => '2007-03-18 12:26:31'
),
array(
'id' => '3',
'tag' => 'tag3',
'created' => '2007-03-18 12:26:23',
'updated' => '2007-03-18 12:28:31'
)));
$this->assertEquals($expected, $result);
$data = array('Tag' => array('Tag' => array()));
$result = $TestModel->set($data);
$this->assertFalse(empty($result));
$result = $TestModel->save();
$this->assertFalse(empty($result));
$data = array('Tag' => array('Tag' => ''));
$result = $TestModel->set($data);
$this->assertFalse(empty($result));
$result = $TestModel->save();
$this->assertFalse(empty($result));
$TestModel->unbindModel(array(
'belongsTo' => array('User'),
'hasMany' => array('Comment')
));
$result = $TestModel->find('first', array('fields' => array('id', 'user_id', 'title', 'body'), 'conditions' => array('Article.id' => 2)));
$expected = array(
'Article' => array(
'id' => '2',
'user_id' => '3',
'title' => 'New Second Article',
'body' => 'Second Article Body'
),
'Tag' => array()
);
$this->assertEquals($expected, $result);
$data = array('Tag' => array('Tag' => array(2, 3)));
$result = $TestModel->set($data);
$this->assertFalse(empty($result));
$result = $TestModel->save();
$this->assertFalse(empty($result));
$TestModel->unbindModel(array(
'belongsTo' => array('User'),
'hasMany' => array('Comment')
));
$result = $TestModel->find('first', array('fields' => array('id', 'user_id', 'title', 'body'), 'conditions' => array('Article.id' => 2)));
$expected = array(
'Article' => array(
'id' => '2',
'user_id' => '3',
'title' => 'New Second Article',
'body' => 'Second Article Body'
),
'Tag' => array(
array(
'id' => '2',
'tag' => 'tag2',
'created' => '2007-03-18 12:24:23',
'updated' => '2007-03-18 12:26:31'
),
array(
'id' => '3',
'tag' => 'tag3',
'created' => '2007-03-18 12:26:23',
'updated' => '2007-03-18 12:28:31'
)));
$this->assertEquals($expected, $result);
$data = array(
'Tag' => array(
'Tag' => array(1, 2)
),
'Article' => array(
'id' => '2',
'title' => 'New Second Article'
));
$result = $TestModel->set($data);
$this->assertFalse(empty($result));
$result = $TestModel->save();
$this->assertFalse(empty($result));
$TestModel->unbindModel(array(
'belongsTo' => array('User'),
'hasMany' => array('Comment')
));
$result = $TestModel->find('first', array('fields' => array('id', 'user_id', 'title', 'body'), 'conditions' => array('Article.id' => 2)));
$expected = array(
'Article' => array(
'id' => '2',
'user_id' => '3',
'title' => 'New Second Article',
'body' => 'Second Article Body'
),
'Tag' => array(
array(
'id' => '1',
'tag' => 'tag1',
'created' => '2007-03-18 12:22:23',
'updated' => '2007-03-18 12:24:31'
),
array(
'id' => '2',
'tag' => 'tag2',
'created' => '2007-03-18 12:24:23',
'updated' => '2007-03-18 12:26:31'
)));
$this->assertEquals($expected, $result);
$data = array(
'Tag' => array(
'Tag' => array(1, 2)
),
'Article' => array(
'id' => '2',
'title' => 'New Second Article Title'
));
$result = $TestModel->set($data);
$this->assertFalse(empty($result));
$result = $TestModel->save();
$this->assertFalse(empty($result));
$TestModel->unbindModel(array(
'belongsTo' => array('User'),
'hasMany' => array('Comment')
));
$result = $TestModel->find('first', array('fields' => array('id', 'user_id', 'title', 'body'), 'conditions' => array('Article.id' => 2)));
$expected = array(
'Article' => array(
'id' => '2',
'user_id' => '3',
'title' => 'New Second Article Title',
'body' => 'Second Article Body'
),
'Tag' => array(
array(
'id' => '1',
'tag' => 'tag1',
'created' => '2007-03-18 12:22:23',
'updated' => '2007-03-18 12:24:31'
),
array(
'id' => '2',
'tag' => 'tag2',
'created' => '2007-03-18 12:24:23',
'updated' => '2007-03-18 12:26:31'
)
)
);
$this->assertEquals($expected, $result);
$data = array(
'Tag' => array(
'Tag' => array(2, 3)
),
'Article' => array(
'id' => '2',
'title' => 'Changed Second Article'
));
$result = $TestModel->set($data);
$this->assertFalse(empty($result));
$result = $TestModel->save();
$this->assertFalse(empty($result));
$TestModel->unbindModel(array(
'belongsTo' => array('User'),
'hasMany' => array('Comment')
));
$result = $TestModel->find('first', array('fields' => array('id', 'user_id', 'title', 'body'), 'conditions' => array('Article.id' => 2)));
$expected = array(
'Article' => array(
'id' => '2',
'user_id' => '3',
'title' => 'Changed Second Article',
'body' => 'Second Article Body'
),
'Tag' => array(
array(
'id' => '2',
'tag' => 'tag2',
'created' => '2007-03-18 12:24:23',
'updated' => '2007-03-18 12:26:31'
),
array(
'id' => '3',
'tag' => 'tag3',
'created' => '2007-03-18 12:26:23',
'updated' => '2007-03-18 12:28:31'
)
)
);
$this->assertEquals($expected, $result);
$data = array(
'Tag' => array(
'Tag' => array(1, 3)
),
'Article' => array('id' => '2'),
);
$result = $TestModel->set($data);
$this->assertFalse(empty($result));
$result = $TestModel->save();
$this->assertFalse(empty($result));
$TestModel->unbindModel(array(
'belongsTo' => array('User'),
'hasMany' => array('Comment')
));
$result = $TestModel->find('first', array('fields' => array('id', 'user_id', 'title', 'body'), 'conditions' => array('Article.id' => 2)));
$expected = array(
'Article' => array(
'id' => '2',
'user_id' => '3',
'title' => 'Changed Second Article',
'body' => 'Second Article Body'
),
'Tag' => array(
array(
'id' => '1',
'tag' => 'tag1',
'created' => '2007-03-18 12:22:23',
'updated' => '2007-03-18 12:24:31'
),
array(
'id' => '3',
'tag' => 'tag3',
'created' => '2007-03-18 12:26:23',
'updated' => '2007-03-18 12:28:31'
)));
$this->assertEquals($expected, $result);
$data = array(
'Article' => array(
'id' => 10,
'user_id' => '2',
'title' => 'New Article With Tags and fieldList',
'body' => 'New Article Body with Tags and fieldList',
'created' => '2007-03-18 14:55:23',
'updated' => '2007-03-18 14:57:31'
),
'Tag' => array(
'Tag' => array(1, 2, 3)
));
$result = $TestModel->create()
&& $TestModel->save($data, true, array('user_id', 'title', 'published'));
$this->assertFalse(empty($result));
$TestModel->unbindModel(array('belongsTo' => array('User'), 'hasMany' => array('Comment')));
$result = $TestModel->read();
$expected = array(
'Article' => array(
'id' => 4,
'user_id' => 2,
'title' => 'New Article With Tags and fieldList',
'body' => '',
'published' => 'N',
'created' => '',
'updated' => ''
),
'Tag' => array(
0 => array(
'id' => 1,
'tag' => 'tag1',
'created' => '2007-03-18 12:22:23',
'updated' => '2007-03-18 12:24:31'
),
1 => array(
'id' => 2,
'tag' => 'tag2',
'created' => '2007-03-18 12:24:23',
'updated' => '2007-03-18 12:26:31'
),
2 => array(
'id' => 3,
'tag' => 'tag3',
'created' => '2007-03-18 12:26:23',
'updated' => '2007-03-18 12:28:31'
)));
$this->assertEquals($expected, $result);
$this->loadFixtures('JoinA', 'JoinC', 'JoinAC', 'JoinB', 'JoinAB');
$TestModel = new JoinA();
$TestModel->hasBelongsToMany = array('JoinC' => array('unique' => true));
$data = array(
'JoinA' => array(
'id' => 1,
'name' => 'Join A 1',
'body' => 'Join A 1 Body',
),
'JoinC' => array(
'JoinC' => array(
array('join_c_id' => 2, 'other' => 'new record'),
array('join_c_id' => 3, 'other' => 'new record')
)
)
);
$TestModel->save($data);
$result = $TestModel->read(null, 1);
$expected = array(4, 5);
$this->assertEquals(Set::extract('/JoinC/JoinAsJoinC/id', $result), $expected);
$expected = array('new record', 'new record');
$this->assertEquals(Set::extract('/JoinC/JoinAsJoinC/other', $result), $expected);
}
/**
* testSaveHabtmNoPrimaryData method
*
* @return void
*/
public function testSaveHabtmNoPrimaryData() {
$this->loadFixtures('Article', 'User', 'Comment', 'Tag', 'ArticlesTag');
$TestModel = new Article();
$TestModel->unbindModel(array('belongsTo' => array('User'), 'hasMany' => array('Comment')), false);
$result = $TestModel->findById(2);
$expected = array(
'Article' => array(
'id' => '2',
'user_id' => '3',
'title' => 'Second Article',
'body' => 'Second Article Body',
'published' => 'Y',
'created' => '2007-03-18 10:41:23',
'updated' => '2007-03-18 10:43:31'
),
'Tag' => array(
array(
'id' => '1',
'tag' => 'tag1',
'created' => '2007-03-18 12:22:23',
'updated' => '2007-03-18 12:24:31'
),
array(
'id' => '3',
'tag' => 'tag3',
'created' => '2007-03-18 12:26:23',
'updated' => '2007-03-18 12:28:31'
)
)
);
$this->assertEquals($expected, $result);
$ts = date('Y-m-d H:i:s');
$TestModel->id = 2;
$data = array('Tag' => array('Tag' => array(2)));
$TestModel->save($data);
$result = $TestModel->findById(2);
$expected = array(
'Article' => array(
'id' => '2',
'user_id' => '3',
'title' => 'Second Article',
'body' => 'Second Article Body',
'published' => 'Y',
'created' => '2007-03-18 10:41:23',
'updated' => $ts
),
'Tag' => array(
array(
'id' => '2',
'tag' => 'tag2',
'created' => '2007-03-18 12:24:23',
'updated' => '2007-03-18 12:26:31'
)
)
);
$this->assertEquals($expected, $result);
$this->loadFixtures('Portfolio', 'Item', 'ItemsPortfolio');
$TestModel = new Portfolio();
$result = $TestModel->findById(2);
$expected = array(
'Portfolio' => array(
'id' => 2,
'seller_id' => 1,
'name' => 'Portfolio 2'
),
'Item' => array(
array(
'id' => 2,
'syfile_id' => 2,
'published' => '',
'name' => 'Item 2',
'ItemsPortfolio' => array(
'id' => 2,
'item_id' => 2,
'portfolio_id' => 2
)
),
array(
'id' => 6,
'syfile_id' => 6,
'published' => '',
'name' => 'Item 6',
'ItemsPortfolio' => array(
'id' => 6,
'item_id' => 6,
'portfolio_id' => 2
)
)
)
);
$this->assertEquals($expected, $result);
$data = array('Item' => array('Item' => array(1, 2)));
$TestModel->id = 2;
$TestModel->save($data);
$result = $TestModel->findById(2);
$result['Item'] = Set::sort($result['Item'], '{n}.id', 'asc');
$expected = array(
'Portfolio' => array(
'id' => 2,
'seller_id' => 1,
'name' => 'Portfolio 2'
),
'Item' => array(
array(
'id' => 1,
'syfile_id' => 1,
'published' => '',
'name' => 'Item 1',
'ItemsPortfolio' => array(
'id' => 7,
'item_id' => 1,
'portfolio_id' => 2
)
),
array(
'id' => 2,
'syfile_id' => 2,
'published' => '',
'name' => 'Item 2',
'ItemsPortfolio' => array(
'id' => 8,
'item_id' => 2,
'portfolio_id' => 2
)
)
)
);
$this->assertEquals($expected, $result);
}
/**
* testSaveHabtmCustomKeys method
*
* @return void
*/
public function testSaveHabtmCustomKeys() {
$this->loadFixtures('Story', 'StoriesTag', 'Tag');
$Story = new Story();
$data = array(
'Story' => array('story' => '1'),
'Tag' => array(
'Tag' => array(2, 3)
));
$result = $Story->set($data);
$this->assertFalse(empty($result));
$result = $Story->save();
$this->assertFalse(empty($result));
$result = $Story->find('all', array('order' => array('Story.story')));
$expected = array(
array(
'Story' => array(
'story' => 1,
'title' => 'First Story'
),
'Tag' => array(
array(
'id' => 2,
'tag' => 'tag2',
'created' => '2007-03-18 12:24:23',
'updated' => '2007-03-18 12:26:31'
),
array(
'id' => 3,
'tag' => 'tag3',
'created' => '2007-03-18 12:26:23',
'updated' => '2007-03-18 12:28:31'
))),
array(
'Story' => array(
'story' => 2,
'title' => 'Second Story'
),
'Tag' => array()
));
$this->assertEquals($expected, $result);
}
/**
* test that saving habtm records respects conditions set in the 'conditions' key
* for the association.
*
* @return void
*/
public function testHabtmSaveWithConditionsInAssociation() {
$this->loadFixtures('JoinThing', 'Something', 'SomethingElse');
$Something = new Something();
$Something->unbindModel(array('hasAndBelongsToMany' => array('SomethingElse')), false);
$Something->bindModel(array(
'hasAndBelongsToMany' => array(
'DoomedSomethingElse' => array(
'className' => 'SomethingElse',
'joinTable' => 'join_things',
'conditions' => array('JoinThing.doomed' => true),
'unique' => true
),
'NotDoomedSomethingElse' => array(
'className' => 'SomethingElse',
'joinTable' => 'join_things',
'conditions' => array('JoinThing.doomed' => 0),
'unique' => true
)
)
), false);
$result = $Something->read(null, 1);
$this->assertTrue(empty($result['NotDoomedSomethingElse']));
$this->assertEquals(count($result['DoomedSomethingElse']), 1);
$data = array(
'Something' => array('id' => 1),
'NotDoomedSomethingElse' => array(
'NotDoomedSomethingElse' => array(
array('something_else_id' => 2, 'doomed' => 0),
array('something_else_id' => 3, 'doomed' => 0)
)
)
);
$Something->create($data);
$result = $Something->save();
$this->assertFalse(empty($result));
$result = $Something->read(null, 1);
$this->assertEquals(count($result['NotDoomedSomethingElse']), 2);
$this->assertEquals(count($result['DoomedSomethingElse']), 1);
}
/**
* testHabtmSaveKeyResolution method
*
* @return void
*/
public function testHabtmSaveKeyResolution() {
$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($result['Monkey'], $expected);
$ThePaper->id = 2;
$ThePaper->save(array('Monkey' => array(1, 2, 3)));
$result = $ThePaper->findById(2);
$expected = array(
array(
'id' => '1',
'device_type_id' => '1',
'name' => 'Device 1',
'typ' => '1'
),
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($result['Monkey'], $expected);
$ThePaper->id = 2;
$ThePaper->save(array('Monkey' => array(1, 3)));
$result = $ThePaper->findById(2);
$expected = array(
array(
'id' => '1',
'device_type_id' => '1',
'name' => 'Device 1',
'typ' => '1'
),
array(
'id' => '3',
'device_type_id' => '1',
'name' => 'Device 3',
'typ' => '2'
));
$this->assertEquals($result['Monkey'], $expected);
$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($result['Monkey'], $expected);
}
/**
* testCreationOfEmptyRecord method
*
* @return void
*/
public function testCreationOfEmptyRecord() {
$this->loadFixtures('Author');
$TestModel = new Author();
$this->assertEquals($TestModel->find('count'), 4);
$TestModel->deleteAll(true, false, false);
$this->assertEquals($TestModel->find('count'), 0);
$result = $TestModel->save();
$this->assertTrue(isset($result['Author']['created']));
$this->assertTrue(isset($result['Author']['updated']));
$this->assertEquals($TestModel->find('count'), 1);
}
/**
* testCreateWithPKFiltering method
*
* @return void
*/
public function testCreateWithPKFiltering() {
$TestModel = new Article();
$data = array(
'id' => 5,
'user_id' => 2,
'title' => 'My article',
'body' => 'Some text'
);
$result = $TestModel->create($data);
$expected = array(
'Article' => array(
'published' => 'N',
'id' => 5,
'user_id' => 2,
'title' => 'My article',
'body' => 'Some text'
));
$this->assertEquals($expected, $result);
$this->assertEquals($TestModel->id, 5);
$result = $TestModel->create($data, true);
$expected = array(
'Article' => array(
'published' => 'N',
'id' => false,
'user_id' => 2,
'title' => 'My article',
'body' => 'Some text'
));
$this->assertEquals($expected, $result);
$this->assertFalse($TestModel->id);
$result = $TestModel->create(array('Article' => $data), true);
$expected = array(
'Article' => array(
'published' => 'N',
'id' => false,
'user_id' => 2,
'title' => 'My article',
'body' => 'Some text'
));
$this->assertEquals($expected, $result);
$this->assertFalse($TestModel->id);
$data = array(
'id' => 6,
'user_id' => 2,
'title' => 'My article',
'body' => 'Some text',
'created' => '1970-01-01 00:00:00',
'updated' => '1970-01-01 12:00:00',
'modified' => '1970-01-01 12:00:00'
);
$result = $TestModel->create($data);
$expected = array(
'Article' => array(
'published' => 'N',
'id' => 6,
'user_id' => 2,
'title' => 'My article',
'body' => 'Some text',
'created' => '1970-01-01 00:00:00',
'updated' => '1970-01-01 12:00:00',
'modified' => '1970-01-01 12:00:00'
));
$this->assertEquals($expected, $result);
$this->assertEquals($TestModel->id, 6);
$result = $TestModel->create(array(
'Article' => array_diff_key($data, array(
'created' => true,
'updated' => true,
'modified' => true
))), true);
$expected = array(
'Article' => array(
'published' => 'N',
'id' => false,
'user_id' => 2,
'title' => 'My article',
'body' => 'Some text'
));
$this->assertEquals($expected, $result);
$this->assertFalse($TestModel->id);
}
/**
* testCreationWithMultipleData method
*
* @return void
*/
public function testCreationWithMultipleData() {
$this->loadFixtures('Article', 'Comment');
$Article = new Article();
$Comment = new Comment();
$articles = $Article->find('all', array(
'fields' => array('id','title'),
'recursive' => -1
));
$comments = $Comment->find('all', array(
'fields' => array('id','article_id','user_id','comment','published'), 'recursive' => -1));
$this->assertEquals($articles, array(
array('Article' => array(
'id' => 1,
'title' => 'First Article'
)),
array('Article' => array(
'id' => 2,
'title' => 'Second Article'
)),
array('Article' => array(
'id' => 3,
'title' => 'Third Article'
))));
$this->assertEquals($comments, array(
array('Comment' => array(
'id' => 1,
'article_id' => 1,
'user_id' => 2,
'comment' => 'First Comment for First Article',
'published' => 'Y'
)),
array('Comment' => array(
'id' => 2,
'article_id' => 1,
'user_id' => 4,
'comment' => 'Second Comment for First Article',
'published' => 'Y'
)),
array('Comment' => array(
'id' => 3,
'article_id' => 1,
'user_id' => 1,
'comment' => 'Third Comment for First Article',
'published' => 'Y'
)),
array('Comment' => array(
'id' => 4,
'article_id' => 1,
'user_id' => 1,
'comment' => 'Fourth Comment for First Article',
'published' => 'N'
)),
array('Comment' => array(
'id' => 5,
'article_id' => 2,
'user_id' => 1,
'comment' => 'First Comment for Second Article',
'published' => 'Y'
)),
array('Comment' => array(
'id' => 6,
'article_id' => 2,
'user_id' => 2,
'comment' => 'Second Comment for Second Article',
'published' => 'Y'
))));
$data = array(
'Comment' => array(
'article_id' => 2,
'user_id' => 4,
'comment' => 'Brand New Comment',
'published' => 'N'
),
'Article' => array(
'id' => 2,
'title' => 'Second Article Modified'
));
$result = $Comment->create($data);
$this->assertFalse(empty($result));
$result = $Comment->save();
$this->assertFalse(empty($result));
$articles = $Article->find('all', array(
'fields' => array('id','title'),
'recursive' => -1
));
$comments = $Comment->find('all', array(
'fields' => array('id','article_id','user_id','comment','published'),
'recursive' => -1
));
$this->assertEquals($articles, array(
array('Article' => array(
'id' => 1,
'title' => 'First Article'
)),
array('Article' => array(
'id' => 2,
'title' => 'Second Article'
)),
array('Article' => array(
'id' => 3,
'title' => 'Third Article'
))));
$this->assertEquals($comments, array(
array('Comment' => array(
'id' => 1,
'article_id' => 1,
'user_id' => 2,
'comment' => 'First Comment for First Article',
'published' => 'Y'
)),
array('Comment' => array(
'id' => 2,
'article_id' => 1,
'user_id' => 4,
'comment' => 'Second Comment for First Article',
'published' => 'Y'
)),
array('Comment' => array(
'id' => 3,
'article_id' => 1,
'user_id' => 1,
'comment' => 'Third Comment for First Article',
'published' => 'Y'
)),
array('Comment' => array(
'id' => 4,
'article_id' => 1,
'user_id' => 1,
'comment' => 'Fourth Comment for First Article',
'published' => 'N'
)),
array('Comment' => array(
'id' => 5,
'article_id' => 2,
'user_id' => 1,
'comment' => 'First Comment for Second Article',
'published' => 'Y'
)),
array('Comment' => array(
'id' => 6,
'article_id' => 2,
'user_id' => 2, 'comment' =>
'Second Comment for Second Article',
'published' => 'Y'
)),
array('Comment' => array(
'id' => 7,
'article_id' => 2,
'user_id' => 4,
'comment' => 'Brand New Comment',
'published' => 'N'
))));
}
/**
* testCreationWithMultipleDataSameModel method
*
* @return void
*/
public function testCreationWithMultipleDataSameModel() {
$this->loadFixtures('Article');
$Article = new Article();
$SecondaryArticle = new Article();
$result = $Article->field('title', array('id' => 1));
$this->assertEquals($result, 'First Article');
$data = array(
'Article' => array(
'user_id' => 2,
'title' => 'Brand New Article',
'body' => 'Brand New Article Body',
'published' => 'Y'
),
'SecondaryArticle' => array(
'id' => 1
));
$Article->create();
$result = $Article->save($data);
$this->assertFalse(empty($result));
$result = $Article->getInsertID();
$this->assertTrue(!empty($result));
$result = $Article->field('title', array('id' => 1));
$this->assertEquals($result, 'First Article');
$articles = $Article->find('all', array(
'fields' => array('id','title'),
'recursive' => -1
));
$this->assertEquals($articles, array(
array('Article' => array(
'id' => 1,
'title' => 'First Article'
)),
array('Article' => array(
'id' => 2,
'title' => 'Second Article'
)),
array('Article' => array(
'id' => 3,
'title' => 'Third Article'
)),
array('Article' => array(
'id' => 4,
'title' => 'Brand New Article'
))));
}
/**
* testCreationWithMultipleDataSameModelManualInstances method
*
* @return void
*/
public function testCreationWithMultipleDataSameModelManualInstances() {
$this->loadFixtures('PrimaryModel');
$Primary = new PrimaryModel();
$Secondary = new PrimaryModel();
$result = $Primary->field('primary_name', array('id' => 1));
$this->assertEquals($result, 'Primary Name Existing');
$data = array(
'PrimaryModel' => array(
'primary_name' => 'Primary Name New'
),
'SecondaryModel' => array(
'id' => array(1)
));
$Primary->create();
$result = $Primary->save($data);
$this->assertFalse(empty($result));
$result = $Primary->field('primary_name', array('id' => 1));
$this->assertEquals($result, 'Primary Name Existing');
$result = $Primary->getInsertID();
$this->assertTrue(!empty($result));
$result = $Primary->field('primary_name', array('id' => $result));
$this->assertEquals($result, 'Primary Name New');
$result = $Primary->find('count');
$this->assertEquals($result, 2);
}
/**
* testRecordExists method
*
* @return void
*/
public function testRecordExists() {
$this->loadFixtures('User');
$TestModel = new User();
$this->assertFalse($TestModel->exists());
$TestModel->read(null, 1);
$this->assertTrue($TestModel->exists());
$TestModel->create();
$this->assertFalse($TestModel->exists());
$TestModel->id = 4;
$this->assertTrue($TestModel->exists());
$TestModel = new TheVoid();
$this->assertFalse($TestModel->exists());
}
/**
* testRecordExistsMissingTable method
*
* @expectedException PDOException
* @return void
*/
public function testRecordExistsMissingTable() {
$TestModel = new TheVoid();
$TestModel->id = 5;
$TestModel->exists();
}
/**
* testUpdateExisting method
*
* @return void
*/
public function testUpdateExisting() {
$this->loadFixtures('User', 'Article', 'Comment');
$TestModel = new User();
$TestModel->create();
$TestModel->save(array(
'User' => array(
'user' => 'some user',
'password' => 'some password'
)));
$this->assertTrue(is_int($TestModel->id) || (intval($TestModel->id) === 5));
$id = $TestModel->id;
$TestModel->save(array(
'User' => array(
'user' => 'updated user'
)));
$this->assertEquals($TestModel->id, $id);
$result = $TestModel->findById($id);
$this->assertEquals($result['User']['user'], 'updated user');
$this->assertEquals($result['User']['password'], 'some password');
$Article = new Article();
$Comment = new Comment();
$data = array(
'Comment' => array(
'id' => 1,
'comment' => 'First Comment for First Article'
),
'Article' => array(
'id' => 2,
'title' => 'Second Article'
));
$result = $Article->save($data);
$this->assertFalse(empty($result));
$result = $Comment->save($data);
$this->assertFalse(empty($result));
}
/**
* test updating records and saving blank values.
*
* @return void
*/
public function testUpdateSavingBlankValues() {
$this->loadFixtures('Article');
$Article = new Article();
$Article->validate = array();
$Article->create();
$result = $Article->save(array(
'id' => 1,
'title' => '',
'body' => ''
));
$this->assertTrue((bool)$result);
$result = $Article->find('first', array('conditions' => array('Article.id' => 1)));
$this->assertEquals('', $result['Article']['title'], 'Title is not blank');
$this->assertEquals('', $result['Article']['body'], 'Body is not blank');
}
/**
* testUpdateMultiple method
*
* @return void
*/
public function testUpdateMultiple() {
$this->loadFixtures('Comment', 'Article', 'User', 'CategoryThread');
$TestModel = new Comment();
$result = Set::extract($TestModel->find('all'), '{n}.Comment.user_id');
$expected = array('2', '4', '1', '1', '1', '2');
$this->assertEquals($expected, $result);
$TestModel->updateAll(array('Comment.user_id' => 5), array('Comment.user_id' => 2));
$result = Set::combine($TestModel->find('all'), '{n}.Comment.id', '{n}.Comment.user_id');
$expected = array(1 => 5, 2 => 4, 3 => 1, 4 => 1, 5 => 1, 6 => 5);
$this->assertEquals($expected, $result);
$result = $TestModel->updateAll(
array('Comment.comment' => "'Updated today'"),
array('Comment.user_id' => 5)
);
$this->assertFalse(empty($result));
$result = Set::extract(
$TestModel->find('all', array(
'conditions' => array(
'Comment.user_id' => 5
))),
'{n}.Comment.comment'
);
$expected = array_fill(0, 2, 'Updated today');
$this->assertEquals($expected, $result);
}
/**
* testHabtmUuidWithUuidId method
*
* @return void
*/
public function testHabtmUuidWithUuidId() {
$this->loadFixtures('Uuidportfolio', 'Uuiditem', 'UuiditemsUuidportfolio', 'UuiditemsUuidportfolioNumericid');
$TestModel = new Uuidportfolio();
$data = array('Uuidportfolio' => array('name' => 'Portfolio 3'));
$data['Uuiditem']['Uuiditem'] = array('483798c8-c7cc-430e-8cf9-4fcc40cf8569');
$TestModel->create($data);
$TestModel->save();
$id = $TestModel->id;
$result = $TestModel->read(null, $id);
$this->assertEquals(1, count($result['Uuiditem']));
$this->assertEquals(strlen($result['Uuiditem'][0]['UuiditemsUuidportfolio']['id']), 36);
}
/**
* test HABTM saving when join table has no primary key and only 2 columns.
*
* @return void
*/
public function testHabtmSavingWithNoPrimaryKeyUuidJoinTable() {
$this->loadFixtures('UuidTag', 'Fruit', 'FruitsUuidTag');
$Fruit = new Fruit();
$data = array(
'Fruit' => array(
'color' => 'Red',
'shape' => 'Heart-shaped',
'taste' => 'sweet',
'name' => 'Strawberry',
),
'UuidTag' => array(
'UuidTag' => array(
'481fc6d0-b920-43e0-e50f-6d1740cf8569'
)
)
);
$result = $Fruit->save($data);
$this->assertFalse(empty($result));
}
/**
* test HABTM saving when join table has no primary key and only 2 columns, no with model is used.
*
* @return void
*/
public function testHabtmSavingWithNoPrimaryKeyUuidJoinTableNoWith() {
$this->loadFixtures('UuidTag', 'Fruit', 'FruitsUuidTag');
$Fruit = new FruitNoWith();
$data = array(
'Fruit' => array(
'color' => 'Red',
'shape' => 'Heart-shaped',
'taste' => 'sweet',
'name' => 'Strawberry',
),
'UuidTag' => array(
'UuidTag' => array(
'481fc6d0-b920-43e0-e50f-6d1740cf8569'
)
)
);
$result = $Fruit->save($data);
$this->assertFalse(empty($result));
}
/**
* testHabtmUuidWithNumericId method
*
* @return void
*/
public function testHabtmUuidWithNumericId() {
$this->loadFixtures('Uuidportfolio', 'Uuiditem', 'UuiditemsUuidportfolioNumericid');
$TestModel = new Uuiditem();
$data = array('Uuiditem' => array('name' => 'Item 7', 'published' => 0));
$data['Uuidportfolio']['Uuidportfolio'] = array('480af662-eb8c-47d3-886b-230540cf8569');
$TestModel->create($data);
$TestModel->save();
$id = $TestModel->id;
$result = $TestModel->read(null, $id);
$this->assertEquals(1, count($result['Uuidportfolio']));
}
/**
* testSaveMultipleHabtm method
*
* @return void
*/
public function testSaveMultipleHabtm() {
$this->loadFixtures('JoinA', 'JoinB', 'JoinC', 'JoinAB', 'JoinAC');
$TestModel = new JoinA();
$result = $TestModel->findById(1);
$expected = array(
'JoinA' => array(
'id' => 1,
'name' => 'Join A 1',
'body' => 'Join A 1 Body',
'created' => '2008-01-03 10:54:23',
'updated' => '2008-01-03 10:54:23'
),
'JoinB' => array(
0 => array(
'id' => 2,
'name' => 'Join B 2',
'created' => '2008-01-03 10:55:02',
'updated' => '2008-01-03 10:55:02',
'JoinAsJoinB' => array(
'id' => 1,
'join_a_id' => 1,
'join_b_id' => 2,
'other' => 'Data for Join A 1 Join B 2',
'created' => '2008-01-03 10:56:33',
'updated' => '2008-01-03 10:56:33'
))),
'JoinC' => array(
0 => array(
'id' => 2,
'name' => 'Join C 2',
'created' => '2008-01-03 10:56:12',
'updated' => '2008-01-03 10:56:12',
'JoinAsJoinC' => array(
'id' => 1,
'join_a_id' => 1,
'join_c_id' => 2,
'other' => 'Data for Join A 1 Join C 2',
'created' => '2008-01-03 10:57:22',
'updated' => '2008-01-03 10:57:22'
))));
$this->assertEquals($expected, $result);
$ts = date('Y-m-d H:i:s');
$TestModel->id = 1;
$data = array(
'JoinA' => array(
'id' => '1',
'name' => 'New name for Join A 1',
'updated' => $ts
),
'JoinB' => array(
array(
'id' => 1,
'join_b_id' => 2,
'other' => 'New data for Join A 1 Join B 2',
'created' => $ts,
'updated' => $ts
)),
'JoinC' => array(
array(
'id' => 1,
'join_c_id' => 2,
'other' => 'New data for Join A 1 Join C 2',
'created' => $ts,
'updated' => $ts
)));
$TestModel->set($data);
$TestModel->save();
$result = $TestModel->findById(1);
$expected = array(
'JoinA' => array(
'id' => 1,
'name' => 'New name for Join A 1',
'body' => 'Join A 1 Body',
'created' => '2008-01-03 10:54:23',
'updated' => $ts
),
'JoinB' => array(
0 => array(
'id' => 2,
'name' => 'Join B 2',
'created' => '2008-01-03 10:55:02',
'updated' => '2008-01-03 10:55:02',
'JoinAsJoinB' => array(
'id' => 1,
'join_a_id' => 1,
'join_b_id' => 2,
'other' => 'New data for Join A 1 Join B 2',
'created' => $ts,
'updated' => $ts
))),
'JoinC' => array(
0 => array(
'id' => 2,
'name' => 'Join C 2',
'created' => '2008-01-03 10:56:12',
'updated' => '2008-01-03 10:56:12',
'JoinAsJoinC' => array(
'id' => 1,
'join_a_id' => 1,
'join_c_id' => 2,
'other' => 'New data for Join A 1 Join C 2',
'created' => $ts,
'updated' => $ts
))));
$this->assertEquals($expected, $result);
}
/**
* testSaveAll method
*
* @return void
*/
public function testSaveAll() {
$this->loadFixtures('Post', 'Author', 'Comment', 'Attachment', 'Article', 'User');
$TestModel = new Post();
$result = $TestModel->find('all');
$this->assertEquals(count($result), 3);
$this->assertFalse(isset($result[3]));
$ts = date('Y-m-d H:i:s');
$TestModel->saveAll(array(
'Post' => array(
'title' => 'Post with Author',
'body' => 'This post will be saved with an author'
),
'Author' => array(
'user' => 'bob',
'password' => '5f4dcc3b5aa765d61d8327deb882cf90'
)));
$result = $TestModel->find('all');
$expected = array(
'Post' => array(
'id' => '4',
'author_id' => '5',
'title' => 'Post with Author',
'body' => 'This post will be saved with an author',
'published' => 'N'
),
'Author' => array(
'id' => '5',
'user' => 'bob',
'password' => '5f4dcc3b5aa765d61d8327deb882cf90',
'test' => 'working'
));
$this->assertTrue($result[3]['Post']['created'] >= $ts);
$this->assertTrue($result[3]['Post']['updated'] >= $ts);
$this->assertTrue($result[3]['Author']['created'] >= $ts);
$this->assertTrue($result[3]['Author']['updated'] >= $ts);
unset($result[3]['Post']['created'], $result[3]['Post']['updated']);
unset($result[3]['Author']['created'], $result[3]['Author']['updated']);
$this->assertEquals($result[3], $expected);
$this->assertEquals(count($result), 4);
$TestModel->deleteAll(true);
$this->assertEquals($TestModel->find('all'), array());
// SQLite seems to reset the PK counter when that happens, so we need this to make the tests pass
$this->db->truncate($TestModel);
$ts = date('Y-m-d H:i:s');
$TestModel->saveAll(array(
array(
'title' => 'Multi-record post 1',
'body' => 'First multi-record post',
'author_id' => 2
),
array(
'title' => 'Multi-record post 2',
'body' => 'Second multi-record post',
'author_id' => 2
)));
$result = $TestModel->find('all', array(
'recursive' => -1,
'order'</