public function testOnCreateOwnerChangeAndDeleteAccountModel()
 {
     $super = User::getByUsername('super');
     $billy = self::$billy;
     Yii::app()->user->userModel = $super;
     $job = new ReadPermissionSubscriptionUpdateForAccountFromBuildTableJob();
     Yii::app()->jobQueue->deleteAll();
     // Clean contact table
     $sql = "SELECT * FROM account_read_subscription";
     $rows = ZurmoRedBean::getAll($sql);
     $this->assertTrue(empty($rows));
     $account1 = AccountTestHelper::createAccountByNameForOwner('First Account', $super);
     sleep(1);
     $queuedJobs = Yii::app()->jobQueue->getAll();
     $this->assertEquals(1, count($queuedJobs[5]));
     $this->assertEquals('ReadPermissionSubscriptionUpdateForAccountFromBuildTable', $queuedJobs[5][0]['jobType']);
     Yii::app()->jobQueue->deleteAll();
     $this->assertTrue($job->run());
     $sql = "SELECT * FROM account_read_subscription order by userid";
     $rows = ZurmoRedBean::getAll($sql);
     $this->assertEquals(2, count($rows));
     $this->assertEquals($super->id, $rows[0]['userid']);
     $this->assertEquals($account1->id, $rows[0]['modelid']);
     $this->assertEquals(ReadPermissionsSubscriptionUtil::TYPE_ADD, $rows[0]['subscriptiontype']);
     $this->assertEquals($billy->id, $rows[1]['userid']);
     $this->assertEquals($account1->id, $rows[1]['modelid']);
     $this->assertEquals(ReadPermissionsSubscriptionUtil::TYPE_ADD, $rows[1]['subscriptiontype']);
     sleep(1);
     // Test deletion
     $account1->delete();
     sleep(1);
     $queuedJobs = Yii::app()->jobQueue->getAll();
     $this->assertEquals(1, count($queuedJobs[5]));
     $this->assertEquals('ReadPermissionSubscriptionUpdateForAccountFromBuildTable', $queuedJobs[5][0]['jobType']);
     Yii::app()->jobQueue->deleteAll();
     $this->assertTrue($job->run());
     $sql = "SELECT * FROM account_read_subscription order by userid";
     $rows2 = ZurmoRedBean::getAll($sql);
     $this->assertEquals(2, count($rows2));
     $this->assertEquals($super->id, $rows2[0]['userid']);
     $this->assertEquals($account1->id, $rows2[0]['modelid']);
     $this->assertEquals(ReadPermissionsSubscriptionUtil::TYPE_DELETE, $rows2[0]['subscriptiontype']);
     $this->assertNotEquals($rows[0]['modifieddatetime'], $rows2[0]['modifieddatetime']);
     $this->assertEquals($billy->id, $rows2[1]['userid']);
     $this->assertEquals($account1->id, $rows2[1]['modelid']);
     $this->assertEquals(ReadPermissionsSubscriptionUtil::TYPE_DELETE, $rows2[1]['subscriptiontype']);
     $this->assertNotEquals($rows[1]['modifieddatetime'], $rows2[1]['modifieddatetime']);
     // Test owner change, but when both users have permissions to access the account
     $sql = "DELETE FROM account_read_subscription";
     ZurmoRedBean::exec($sql);
     $sql = "SELECT * FROM account_read_subscription";
     $rows = ZurmoRedBean::getAll($sql);
     $this->assertTrue(empty($rows));
     $account2 = AccountTestHelper::createAccountByNameForOwner('Second Account', $super);
     sleep(1);
     $queuedJobs = Yii::app()->jobQueue->getAll();
     $this->assertEquals(1, count($queuedJobs[5]));
     $this->assertEquals('ReadPermissionSubscriptionUpdateForAccountFromBuildTable', $queuedJobs[5][0]['jobType']);
     Yii::app()->jobQueue->deleteAll();
     $this->assertTrue($job->run());
     $sql = "SELECT * FROM account_read_subscription order by userid";
     $rows = ZurmoRedBean::getAll($sql);
     $this->assertEquals(2, count($rows));
     $this->assertEquals($super->id, $rows[0]['userid']);
     $this->assertEquals($account2->id, $rows[0]['modelid']);
     $this->assertEquals(ReadPermissionsSubscriptionUtil::TYPE_ADD, $rows[0]['subscriptiontype']);
     $this->assertEquals($billy->id, $rows[1]['userid']);
     $this->assertEquals($account2->id, $rows[1]['modelid']);
     $this->assertEquals(ReadPermissionsSubscriptionUtil::TYPE_ADD, $rows[1]['subscriptiontype']);
     sleep(1);
     $account2->owner = self::$billy;
     $this->assertTrue($account2->save());
     sleep(1);
     $queuedJobs = Yii::app()->jobQueue->getAll();
     $this->assertEquals(1, count($queuedJobs[5]));
     $this->assertEquals('ReadPermissionSubscriptionUpdateForAccountFromBuildTable', $queuedJobs[5][0]['jobType']);
     Yii::app()->jobQueue->deleteAll();
     $this->assertTrue($job->run());
     $sql = "SELECT * FROM account_read_subscription order by userid";
     $rows = ZurmoRedBean::getAll($sql);
     $this->assertEquals(2, count($rows));
     $this->assertEquals($super->id, $rows[0]['userid']);
     $this->assertEquals($account2->id, $rows[0]['modelid']);
     $this->assertEquals(ReadPermissionsSubscriptionUtil::TYPE_ADD, $rows[0]['subscriptiontype']);
     $this->assertEquals(self::$billy->id, $rows[1]['userid']);
     $this->assertEquals($account2->id, $rows[1]['modelid']);
     $this->assertEquals(ReadPermissionsSubscriptionUtil::TYPE_ADD, $rows[1]['subscriptiontype']);
     // Clean account table
     $accounts = Account::getAll();
     foreach ($accounts as $account) {
         $account->delete();
     }
     $sql = "DELETE FROM account_read_subscription";
     ZurmoRedBean::exec($sql);
     $johnny = self::$johnny;
     $account3 = AccountTestHelper::createAccountByNameForOwner('Third Account', $johnny);
     sleep(1);
     $queuedJobs = Yii::app()->jobQueue->getAll();
     $this->assertEquals(1, count($queuedJobs[5]));
     $this->assertEquals('ReadPermissionSubscriptionUpdateForAccountFromBuildTable', $queuedJobs[5][0]['jobType']);
     Yii::app()->jobQueue->deleteAll();
     $this->assertTrue($job->run());
     $sql = "SELECT * FROM account_read_subscription order by userid";
     $rows = ZurmoRedBean::getAll($sql);
     $this->assertEquals(3, count($rows));
     $this->assertEquals($super->id, $rows[0]['userid']);
     $this->assertEquals($account3->id, $rows[0]['modelid']);
     $this->assertEquals(ReadPermissionsSubscriptionUtil::TYPE_ADD, $rows[0]['subscriptiontype']);
     $this->assertEquals($billy->id, $rows[1]['userid']);
     $this->assertEquals($account3->id, $rows[1]['modelid']);
     $this->assertEquals(ReadPermissionsSubscriptionUtil::TYPE_ADD, $rows[1]['subscriptiontype']);
     $this->assertEquals($johnny->id, $rows[2]['userid']);
     $this->assertEquals($account3->id, $rows[2]['modelid']);
     $this->assertEquals(ReadPermissionsSubscriptionUtil::TYPE_ADD, $rows[2]['subscriptiontype']);
     $account3Id = $account3->id;
     $account3->forgetAll();
     $account3 = Account::getById($account3Id);
     $this->assertTrue($account3->save());
     $account3->forgetAll();
     PermissionsCache::forgetAll();
     $account3 = Account::getById($account3Id);
     $account3->owner = $super;
     $this->assertTrue($account3->save());
     sleep(1);
     $queuedJobs = Yii::app()->jobQueue->getAll();
     $this->assertEquals(1, count($queuedJobs[5]));
     $this->assertEquals('ReadPermissionSubscriptionUpdateForAccountFromBuildTable', $queuedJobs[5][0]['jobType']);
     Yii::app()->jobQueue->deleteAll();
     $this->assertTrue($job->run());
     $sql = "SELECT * FROM account_read_subscription order by userid";
     $rows = ZurmoRedBean::getAll($sql);
     $this->assertEquals(3, count($rows));
     $this->assertEquals($super->id, $rows[0]['userid']);
     $this->assertEquals($account3->id, $rows[0]['modelid']);
     $this->assertEquals(ReadPermissionsSubscriptionUtil::TYPE_ADD, $rows[0]['subscriptiontype']);
     $this->assertEquals($billy->id, $rows[1]['userid']);
     $this->assertEquals($account3->id, $rows[1]['modelid']);
     $this->assertEquals(ReadPermissionsSubscriptionUtil::TYPE_ADD, $rows[1]['subscriptiontype']);
     $this->assertEquals($johnny->id, $rows[2]['userid']);
     $this->assertEquals($account3->id, $rows[2]['modelid']);
     $this->assertEquals(ReadPermissionsSubscriptionUtil::TYPE_DELETE, $rows[2]['subscriptiontype']);
 }
 /**
  * Test cases when:
  * 1. user is created
  * 2. permissions for user to access account are added
  * 3. permissions for user to access account are removed
  * 4. permissions for user to access account are added after they are being removed
  */
 public function testUserCreationsAndPermissions()
 {
     $super = User::getByUsername('super');
     Yii::app()->user->userModel = $super;
     $this->deleteAllModelsAndRecordsFromReadPermissionTable('Account');
     Yii::app()->jobQueue->deleteAll();
     $job = new ReadPermissionSubscriptionUpdateForAccountJob();
     $jobBasedOnBuildTable = new ReadPermissionSubscriptionUpdateForAccountFromBuildTableJob();
     $account = AccountTestHelper::createAccountByNameForOwner('First Account For Users', $super);
     Yii::app()->jobQueue->deleteAll();
     sleep(1);
     $user = new User();
     $user->username = '******';
     $user->lastName = 'Smitson';
     $user->setPassword(strtolower('password'));
     $this->assertTrue($user->save());
     $queuedJobs = Yii::app()->jobQueue->getAll();
     $this->assertEquals(1, count($queuedJobs[5]));
     $this->assertEquals('ReadPermissionSubscriptionUpdateForAccount', $queuedJobs[5][0]['jobType']);
     Yii::app()->jobQueue->deleteAll();
     $this->assertTrue($job->run());
     $sql = "SELECT * FROM account_read_subscription order by userid";
     $rows = ZurmoRedBean::getAll($sql);
     $this->assertEquals(1, count($rows));
     $this->assertEquals($super->id, $rows[0]['userid']);
     $this->assertEquals($account->id, $rows[0]['modelid']);
     $this->assertEquals(ReadPermissionsSubscriptionUtil::TYPE_ADD, $rows[0]['subscriptiontype']);
     // Test add read permissions to user for account
     $account->addPermissions($user, Permission::READ);
     $this->assertTrue($account->save());
     ReadPermissionsOptimizationUtil::rebuild();
     $queuedJobs = Yii::app()->jobQueue->getAll();
     $this->assertEquals(1, count($queuedJobs[5]));
     $this->assertEquals('ReadPermissionSubscriptionUpdateForAccountFromBuildTable', $queuedJobs[5][0]['jobType']);
     Yii::app()->jobQueue->deleteAll();
     $this->assertTrue($jobBasedOnBuildTable->run());
     // Check if everything is added correctly
     $sql = "SELECT * FROM account_read_subscription order by userid";
     $rows = ZurmoRedBean::getAll($sql);
     $this->assertEquals(2, count($rows));
     $this->assertEquals($super->id, $rows[0]['userid']);
     $this->assertEquals($account->id, $rows[0]['modelid']);
     $this->assertEquals(ReadPermissionsSubscriptionUtil::TYPE_ADD, $rows[0]['subscriptiontype']);
     $this->assertEquals($user->id, $rows[1]['userid']);
     $this->assertEquals($account->id, $rows[1]['modelid']);
     $this->assertEquals(ReadPermissionsSubscriptionUtil::TYPE_ADD, $rows[1]['subscriptiontype']);
     // Test remove read permissions from user for account
     $account->removePermissions($user, Permission::READ);
     $this->assertTrue($account->save());
     ReadPermissionsOptimizationUtil::rebuild();
     $queuedJobs = Yii::app()->jobQueue->getAll();
     $this->assertEquals(1, count($queuedJobs[5]));
     $this->assertEquals('ReadPermissionSubscriptionUpdateForAccountFromBuildTable', $queuedJobs[5][0]['jobType']);
     Yii::app()->jobQueue->deleteAll();
     $this->assertTrue($jobBasedOnBuildTable->run());
     // Because user is added to group, and group have read access to account, this account should be in
     // read permission table for user
     $sql = "SELECT * FROM account_read_subscription order by userid";
     $rows = ZurmoRedBean::getAll($sql);
     $this->assertEquals(2, count($rows));
     $this->assertEquals($super->id, $rows[0]['userid']);
     $this->assertEquals($account->id, $rows[0]['modelid']);
     $this->assertEquals(ReadPermissionsSubscriptionUtil::TYPE_ADD, $rows[0]['subscriptiontype']);
     $this->assertEquals($user->id, $rows[1]['userid']);
     $this->assertEquals($account->id, $rows[1]['modelid']);
     $this->assertEquals(ReadPermissionsSubscriptionUtil::TYPE_DELETE, $rows[1]['subscriptiontype']);
     // Test add read permissions AGAIN to user for account
     $account->addPermissions($user, Permission::READ);
     $this->assertTrue($account->save());
     ReadPermissionsOptimizationUtil::rebuild();
     $queuedJobs = Yii::app()->jobQueue->getAll();
     $this->assertEquals(1, count($queuedJobs[5]));
     $this->assertEquals('ReadPermissionSubscriptionUpdateForAccountFromBuildTable', $queuedJobs[5][0]['jobType']);
     Yii::app()->jobQueue->deleteAll();
     $this->assertTrue($jobBasedOnBuildTable->run());
     // Check if everything is added correctly
     $sql = "SELECT * FROM account_read_subscription order by userid";
     $rows = ZurmoRedBean::getAll($sql);
     $this->assertEquals(2, count($rows));
     $this->assertEquals($super->id, $rows[0]['userid']);
     $this->assertEquals($account->id, $rows[0]['modelid']);
     $this->assertEquals(ReadPermissionsSubscriptionUtil::TYPE_ADD, $rows[0]['subscriptiontype']);
     $this->assertEquals($user->id, $rows[1]['userid']);
     $this->assertEquals($account->id, $rows[1]['modelid']);
     $this->assertEquals(ReadPermissionsSubscriptionUtil::TYPE_ADD, $rows[1]['subscriptiontype']);
 }