/**
  * Tests that counter caches are updated when foreign keys of counted records change
  *
  * @access public
  * @return void
  */
 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->assertEqual($users[0]['User']['post_count'], 1);
     $this->assertEqual($users[1]['User']['post_count'], 2);
 }
 public function testToggleBoolFields()
 {
     $this->loadFixtures('CounterCacheUser', 'CounterCachePost');
     $Post = new CounterCachePost();
     $Post->unbindModel(array('belongsTo' => array('User')), true);
     $true = array('Post' => array('published' => true, 'id' => 2));
     $false = array('Post' => array('published' => false, 'id' => 2));
     $fields = array('Post.published', 'Post.id');
     $updateConditions = array('Post.id' => 2);
     // check its true
     $result = $Post->find('first', array('conditions' => $updateConditions, 'fields' => $fields));
     $this->assertEquals($true, $result);
     // Testing without the alias
     $this->assertTrue($Post->updateAll(array('published' => 'NOT published'), $updateConditions));
     $result = $Post->find('first', array('conditions' => $updateConditions, 'fields' => $fields));
     $this->assertEquals($false, $result);
     $this->assertTrue($Post->updateAll(array('published' => 'NOT published'), $updateConditions));
     $result = $Post->find('first', array('conditions' => $updateConditions, 'fields' => $fields));
     $this->assertEquals($true, $result);
     $db = ConnectionManager::getDataSource('test');
     $alias = $db->name('Post.published');
     // Testing with the alias
     $this->assertTrue($Post->updateAll(array('Post.published' => "NOT {$alias}"), $updateConditions));
     $result = $Post->find('first', array('conditions' => $updateConditions, 'fields' => $fields));
     $this->assertEquals($false, $result);
     $this->assertTrue($Post->updateAll(array('Post.published' => "NOT {$alias}"), $updateConditions));
     $result = $Post->find('first', array('conditions' => $updateConditions, 'fields' => $fields));
     $this->assertEquals($true, $result);
 }
 /**
  * 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']);
 }