public function testMissionReadUnreadStatus()
 {
     $steven = User::getByUsername('steven');
     $sally = User::getByUsername('sally');
     $mary = User::getByUsername('mary');
     $super = $this->logoutCurrentUserLoginNewUserAndGetByUsername('super');
     $mission = new Mission();
     $mission->owner = $steven;
     $mission->description = 'My test mission description';
     $mission->status = Mission::STATUS_AVAILABLE;
     $this->assertTrue($mission->save());
     $missionId = $mission->id;
     $explicitReadWriteModelPermissions = new ExplicitReadWriteModelPermissions();
     $explicitReadWriteModelPermissions->addReadWritePermitable(Group::getByName(Group::EVERYONE_GROUP_NAME));
     ExplicitReadWriteModelPermissionsUtil::resolveExplicitReadWriteModelPermissions($mission, $explicitReadWriteModelPermissions);
     $mission = Mission::getById($missionId);
     //Confirm users have mission marked as unread but not owner
     $this->assertTrue(MissionsUtil::hasUserReadMissionLatest($mission, $steven));
     $this->assertFalse(MissionsUtil::hasUserReadMissionLatest($mission, $super));
     $this->assertFalse(MissionsUtil::hasUserReadMissionLatest($mission, $sally));
     $this->assertFalse(MissionsUtil::hasUserReadMissionLatest($mission, $mary));
     //Super reads the mission
     $this->setGetArray(array('id' => $missionId));
     $this->runControllerWithNoExceptionsAndGetContent('missions/default/details');
     $mission = Mission::getById($missionId);
     $this->assertTrue(MissionsUtil::hasUserReadMissionLatest($mission, $steven));
     $this->assertTrue(MissionsUtil::hasUserReadMissionLatest($mission, $super));
     $this->assertFalse(MissionsUtil::hasUserReadMissionLatest($mission, $sally));
     $this->assertFalse(MissionsUtil::hasUserReadMissionLatest($mission, $mary));
     //Mary marks mission as read and post a comment
     $this->logoutCurrentUserLoginNewUserAndGetByUsername('mary');
     MissionsUtil::markUserHasReadLatest($mission, $mary);
     $this->setGetArray(array('relatedModelId' => $missionId, 'relatedModelClassName' => 'Mission', 'relatedModelRelationName' => 'comments', 'redirectUrl' => 'someRedirect'));
     $this->setPostArray(array('Comment' => array('description' => 'Mary\'s new comment')));
     $this->runControllerWithRedirectExceptionAndGetContent('comments/default/inlineCreateSave');
     $mission = Mission::getById($missionId);
     $this->assertFalse(MissionsUtil::hasUserReadMissionLatest($mission, $steven));
     $this->assertFalse(MissionsUtil::hasUserReadMissionLatest($mission, $super));
     $this->assertFalse(MissionsUtil::hasUserReadMissionLatest($mission, $sally));
     $this->assertTrue(MissionsUtil::hasUserReadMissionLatest($mission, $mary));
     //Sally reads and takes the mission
     $this->logoutCurrentUserLoginNewUserAndGetByUsername('sally');
     $this->setGetArray(array('id' => $missionId));
     $this->resetPostArray();
     $this->runControllerWithNoExceptionsAndGetContent('missions/default/details');
     $mission = Mission::getById($missionId);
     $this->assertFalse(MissionsUtil::hasUserReadMissionLatest($mission, $steven));
     $this->assertFalse(MissionsUtil::hasUserReadMissionLatest($mission, $super));
     $this->assertTrue(MissionsUtil::hasUserReadMissionLatest($mission, $sally));
     $this->assertTrue(MissionsUtil::hasUserReadMissionLatest($mission, $mary));
     $this->setGetArray(array('status' => Mission::STATUS_TAKEN, 'id' => $missionId));
     $this->runControllerWithNoExceptionsAndGetContent('missions/default/ajaxChangeStatus');
     //Every user other than owner and takenby are marked as read latest
     $mission = Mission::getById($missionId);
     $this->assertFalse(MissionsUtil::hasUserReadMissionLatest($mission, $steven));
     $this->assertTrue(MissionsUtil::hasUserReadMissionLatest($mission, $super));
     $this->assertTrue(MissionsUtil::hasUserReadMissionLatest($mission, $sally));
     $this->assertTrue(MissionsUtil::hasUserReadMissionLatest($mission, $mary));
 }
 public function testSettingExplicitReadWriteModelPermissionsDuringImportDontAffectTheModifiedByUserAttribute()
 {
     Yii::app()->user->userModel = User::getByUsername('super');
     $testModels = ImportModelTestItem::getAll();
     $this->assertEquals(0, count($testModels));
     //Add a read only user for import. Then all models should be readable by jim in addition to super.
     $explicitReadWriteModelPermissions = new ExplicitReadWriteModelPermissions();
     $explicitReadWriteModelPermissions->addReadOnlyPermitable(User::getByUsername('jim'));
     $testModels = ImportModelTestItem::getAll();
     $this->assertEquals(0, count($testModels));
     $import = new Import();
     $serializedData['importRulesType'] = 'ImportModelTestItem';
     $serializedData['firstRowIsHeaderRow'] = true;
     $import->serializedData = serialize($serializedData);
     $this->assertTrue($import->save());
     ImportTestHelper::createTempTableByFileNameAndTableName('importAnalyzerTest3.csv', $import->getTempTableName(), true);
     $this->assertEquals(2, ImportDatabaseUtil::getCount($import->getTempTableName()));
     // includes header rows.
     $mappingData = array('column_0' => array('attributeIndexOrDerivedType' => 'string', 'type' => 'importColumn', 'mappingRulesData' => array('DefaultValueModelAttributeMappingRuleForm' => array('defaultValue' => null))), 'column_7' => array('attributeIndexOrDerivedType' => 'modifiedByUser', 'type' => 'importColumn', 'mappingRulesData' => array('UserValueTypeModelAttributeMappingRuleForm' => array('type' => UserValueTypeModelAttributeMappingRuleForm::ZURMO_USERNAME))), 'column_23' => array('attributeIndexOrDerivedType' => 'FullName', 'type' => 'importColumn', 'mappingRulesData' => array('FullNameDefaultValueModelAttributeMappingRuleForm' => array('defaultValue' => null))));
     $importRules = ImportRulesUtil::makeImportRulesByType('ImportModelTestItem');
     $page = 0;
     $config = array('pagination' => array('pageSize' => 3));
     //This way all rows are processed.
     $dataProvider = new ImportDataProvider($import->getTempTableName(), true, $config);
     $dataProvider->getPagination()->setCurrentPage($page);
     $importResultsUtil = new ImportResultsUtil($import);
     $messageLogger = new ImportMessageLogger();
     ImportUtil::importByDataProvider($dataProvider, $importRules, $mappingData, $importResultsUtil, $explicitReadWriteModelPermissions, $messageLogger);
     $importResultsUtil->processStatusAndMessagesForEachRow();
     //Confirm that 1 models where created.
     $testModels = ImportModelTestItem::getAll();
     $this->assertEquals(1, count($testModels));
     $jim = User::getByUsername('jim');
     foreach ($testModels as $model) {
         $this->assertEquals(array(Permission::READ, Permission::NONE), $model->getExplicitActualPermissions($jim));
         $this->assertEquals('jim', $model->modifiedByUser->username);
     }
     //Clear out data in table
     ImportModelTestItem::deleteAll();
     //Now test with read/write permissions being set.
     $explicitReadWriteModelPermissions = new ExplicitReadWriteModelPermissions();
     $explicitReadWriteModelPermissions->addReadWritePermitable(User::getByUsername('jim'));
     $dataProvider = new ImportDataProvider($import->getTempTableName(), true, $config);
     $dataProvider->getPagination()->setCurrentPage($page);
     $importResultsUtil = new ImportResultsUtil($import);
     $messageLogger = new ImportMessageLogger();
     ImportUtil::importByDataProvider($dataProvider, $importRules, $mappingData, $importResultsUtil, $explicitReadWriteModelPermissions, $messageLogger);
     $importResultsUtil->processStatusAndMessagesForEachRow();
     //Confirm that 1 models where created.
     $testModels = ImportModelTestItem::getAll();
     $this->assertEquals(1, count($testModels));
     $jim = User::getByUsername('jim');
     foreach ($testModels as $model) {
         $this->assertEquals(array(Permission::READ_WRITE_CHANGE_PERMISSIONS_CHANGE_OWNER, Permission::NONE), $model->getExplicitActualPermissions($jim));
         $this->assertEquals('jim', $model->modifiedByUser->username);
     }
 }
 /**
  * Make an ExplicitReadWriteModelPermissions by SecurableItem.
  * @param SecurableItem $securableItem
  */
 public static function makeBySecurableItem(SecurableItem $securableItem)
 {
     $explicitReadWriteModelPermissions = new ExplicitReadWriteModelPermissions();
     foreach ($securableItem->permissions as $permission) {
         $permission->castDownPermitable();
         if (($permission->permitable instanceof Group || $permission->permitable instanceof User) && $permission->type == Permission::ALLOW) {
             if (Permission::WRITE == ($permission->permissions & Permission::WRITE)) {
                 $explicitReadWriteModelPermissions->addReadWritePermitable($permission->permitable);
             } elseif (Permission::READ == ($permission->permissions & Permission::READ)) {
                 $explicitReadWriteModelPermissions->addReadOnlyPermitable($permission->permitable);
             }
         }
     }
     return $explicitReadWriteModelPermissions;
 }
 /**
  * @depends testMakeBySecurableItem
  */
 public function testResolveExplicitReadWriteModelPermissions()
 {
     Yii::app()->user->userModel = User::getByUsername('super');
     $accounts = Account::getByName('aTestAccount');
     $this->assertEquals(1, count($accounts));
     $account = $accounts[0];
     $accountId = $account->id;
     $group4 = Group::getByName('Group4');
     $group3 = Group::getByName('Group3');
     $group2 = Group::getByName('Group2');
     $explicitReadWriteModelPermissions = new ExplicitReadWriteModelPermissions();
     $explicitReadWriteModelPermissions->addReadWritePermitableToRemove($group3);
     $explicitReadWriteModelPermissions->addReadWritePermitable($group4);
     ExplicitReadWriteModelPermissionsUtil::resolveExplicitReadWriteModelPermissions($account, $explicitReadWriteModelPermissions);
     $account->forget();
     $explicitReadWriteModelPermissions = ExplicitReadWriteModelPermissionsUtil::makeBySecurableItem(Account::getById($accountId));
     $readWritePermitables = $explicitReadWriteModelPermissions->getReadWritePermitables();
     $readOnlyPermitables = $explicitReadWriteModelPermissions->getReadOnlyPermitables();
     $this->assertEquals(2, count($readWritePermitables));
     $this->assertEquals(0, count($readOnlyPermitables));
     $this->assertEquals($group2, $readWritePermitables[$group2->id]);
     $this->assertEquals($group4, $readWritePermitables[$group4->id]);
 }
 public function testSettingAndGetting()
 {
     Yii::app()->user->userModel = User::getByUsername('super');
     $group1 = new Group();
     $group1->name = 'Group1';
     $this->assertTrue($group1->save());
     $group2 = new Group();
     $group2->name = 'Group2';
     $this->assertTrue($group2->save());
     $group3 = new Group();
     $group3->name = 'Group3';
     $this->assertTrue($group3->save());
     $group4 = new Group();
     $group4->name = 'Group4';
     $this->assertTrue($group4->save());
     $group5 = new Group();
     $group5->name = 'Group5';
     $this->assertTrue($group5->save());
     $group6 = new Group();
     $group6->name = 'Group6';
     $this->assertTrue($group6->save());
     $explicitReadWriteModelPermissions = new ExplicitReadWriteModelPermissions();
     $this->assertEquals(0, $explicitReadWriteModelPermissions->getReadOnlyPermitablesCount());
     $this->assertEquals(0, $explicitReadWriteModelPermissions->getReadWritePermitablesCount());
     //Now add permitables and test retrieving them.
     $explicitReadWriteModelPermissions->addReadOnlyPermitable($group1);
     $explicitReadWriteModelPermissions->addReadWritePermitable($group2);
     $explicitReadWriteModelPermissions->addReadWritePermitable($group3);
     $explicitReadWriteModelPermissions->addReadOnlyPermitableToRemove($group4);
     $explicitReadWriteModelPermissions->addReadWritePermitableToRemove($group5);
     $this->assertEquals(1, $explicitReadWriteModelPermissions->getReadOnlyPermitablesCount());
     $this->assertEquals(2, $explicitReadWriteModelPermissions->getReadWritePermitablesCount());
     $this->assertEquals(1, $explicitReadWriteModelPermissions->getReadWritePermitablesToRemoveCount());
     $this->assertEquals(1, $explicitReadWriteModelPermissions->getReadWritePermitablesToRemoveCount());
     $readOnlyPermitables = $explicitReadWriteModelPermissions->getReadOnlyPermitables();
     $readWritePermitables = $explicitReadWriteModelPermissions->getReadWritePermitables();
     $this->assertEquals(1, count($readOnlyPermitables));
     $this->assertEquals(2, count($readWritePermitables));
     $this->assertEquals($group1, $readOnlyPermitables[$group1->id]);
     $this->assertEquals($group2, $readWritePermitables[$group2->id]);
     $this->assertEquals($group3, $readWritePermitables[$group3->id]);
     $readOnlyPermitablesToRemove = $explicitReadWriteModelPermissions->getReadOnlyPermitablesToRemove();
     $readWritePermitablesToRemove = $explicitReadWriteModelPermissions->getReadWritePermitablesToRemove();
     $this->assertEquals($group4, $readOnlyPermitablesToRemove[$group4->id]);
     $this->assertEquals($group5, $readWritePermitablesToRemove[$group5->id]);
     $this->assertTrue($explicitReadWriteModelPermissions->isReadOrReadWritePermitable($group1));
     $this->assertTrue($explicitReadWriteModelPermissions->isReadOrReadWritePermitable($group2));
     $this->assertTrue($explicitReadWriteModelPermissions->isReadOrReadWritePermitable($group3));
     $this->assertFalse($explicitReadWriteModelPermissions->isReadOrReadWritePermitable($group4));
     $this->assertFalse($explicitReadWriteModelPermissions->isReadOrReadWritePermitable($group5));
     $this->assertFalse($explicitReadWriteModelPermissions->isReadOrReadWritePermitable($group6));
     $this->assertEquals(1, count($explicitReadWriteModelPermissions->getReadWritePermitablesToRemove()));
     $explicitReadWriteModelPermissions->removeAllReadWritePermitables();
     $this->assertEquals(3, count($explicitReadWriteModelPermissions->getReadWritePermitablesToRemove()));
 }
 /**
  * @depends testMakeBySecurableItem
  */
 public function testResolveExplicitReadWriteModelPermissions()
 {
     Yii::app()->user->userModel = User::getByUsername('super');
     $accounts = Account::getByName('aTestAccount');
     $this->assertEquals(1, count($accounts));
     $account = $accounts[0];
     $accountId = $account->id;
     $group4 = Group::getByName('Group4');
     $group3 = Group::getByName('Group3');
     $group2 = Group::getByName('Group2');
     $explicitReadWriteModelPermissions = new ExplicitReadWriteModelPermissions();
     $explicitReadWriteModelPermissions->addReadWritePermitableToRemove($group3);
     $explicitReadWriteModelPermissions->addReadWritePermitable($group4);
     ExplicitReadWriteModelPermissionsUtil::resolveExplicitReadWriteModelPermissions($account, $explicitReadWriteModelPermissions);
     $account->forget();
     $explicitReadWriteModelPermissions = ExplicitReadWriteModelPermissionsUtil::makeBySecurableItem(Account::getById($accountId));
     $readWritePermitables = $explicitReadWriteModelPermissions->getReadWritePermitables();
     $readOnlyPermitables = $explicitReadWriteModelPermissions->getReadOnlyPermitables();
     $this->assertEquals(2, count($readWritePermitables));
     $this->assertEquals(0, count($readOnlyPermitables));
     $this->assertEquals($group2, $readWritePermitables[$group2->getClassId('Permitable')]);
     $this->assertEquals($group4, $readWritePermitables[$group4->getClassId('Permitable')]);
     //Test adding group4 again. The _read count should be the same
     $account = Account::getById($accountId);
     $sanitizedData = array();
     $sanitizedData['explicitReadWriteModelPermissions'] = array('type' => ExplicitReadWriteModelPermissionsUtil::MIXED_TYPE_NONEVERYONE_GROUP, 'nonEveryoneGroup' => $group4->id);
     $explicitReadWriteModelPermissions = ExplicitReadWriteModelPermissionsUtil::resolveByPostDataAndModelThenMake($sanitizedData, $account);
     ExplicitReadWriteModelPermissionsUtil::resolveExplicitReadWriteModelPermissions($account, $explicitReadWriteModelPermissions);
     $this->assertEquals(array(array('G' . $group4->id, 1)), AccountReadPermissionsOptimizationBaseTest::getAccountMungeRows($account));
 }
 /**
  * Remove desired RW permitables from model, reset the _permitablesToDetachAfterSave array once done.
  * @param ExplicitReadWriteModelPermissions $explicitReadWriteModelPermissions
  */
 protected function resolvePermitablesToDetach(ExplicitReadWriteModelPermissions $explicitReadWriteModelPermissions)
 {
     foreach ($this->_permitablesToDetachAfterSave as $permitable) {
         $explicitReadWriteModelPermissions->addReadWritePermitableToRemove($permitable);
     }
     // this is what prevents infinite loops of saves
     $this->_permitablesToDetachAfterSave = array();
 }
 /**
  * @depends testSetFormByPostForStep1
  */
 public function testSetFormByFileUploadData()
 {
     $explicitReadWriteModelPermissions = new ExplicitReadWriteModelPermissions();
     $explicitReadWriteModelPermissions->addReadOnlyPermitable(new Group());
     $this->assertEquals(1, $explicitReadWriteModelPermissions->getReadOnlyPermitablesCount());
     $fileUploadData = array('a', 'b');
     $testTableName = 'testimporttable';
     $this->assertTrue(ImportTestHelper::createTempTableByFileNameAndTableName('importTest.csv', $testTableName, true));
     $importWizardForm = new ImportWizardForm();
     $importWizardForm->importRulesType = 'testAbc';
     $importWizardForm->explicitReadWriteModelPermissions = $explicitReadWriteModelPermissions;
     ImportWizardUtil::setFormByFileUploadDataAndTableName($importWizardForm, $fileUploadData, $testTableName);
     $this->assertEquals(array('a', 'b'), $importWizardForm->fileUploadData);
     $this->assertEquals('testAbc', $importWizardForm->importRulesType);
     $this->assertEquals(0, $importWizardForm->explicitReadWriteModelPermissions->getReadOnlyPermitablesCount());
     $compareData = array('column_0' => array('type' => 'importColumn', 'attributeIndexOrDerivedType' => null, 'mappingRulesData' => null), 'column_1' => array('type' => 'importColumn', 'attributeIndexOrDerivedType' => null, 'mappingRulesData' => null), 'column_2' => array('type' => 'importColumn', 'attributeIndexOrDerivedType' => null, 'mappingRulesData' => null));
     $this->assertEquals($compareData, $importWizardForm->mappingData);
 }
 /**
  * Resolve explicit permissions of the requested by user for the task
  * @param Task $task
  * @param Permitable $origRequestedByUser
  * @param Permitable $requestedByUser
  * @param ExplicitReadWriteModelPermissions $explicitReadWriteModelPermissions
  */
 public static function resolveExplicitPermissionsForRequestedByUser(Task $task, Permitable $origRequestedByUser, Permitable $requestedByUser, ExplicitReadWriteModelPermissions $explicitReadWriteModelPermissions)
 {
     $explicitReadWriteModelPermissions->addReadWritePermitableToRemove($origRequestedByUser);
     $explicitReadWriteModelPermissions->addReadWritePermitable($requestedByUser);
     ExplicitReadWriteModelPermissionsUtil::resolveExplicitReadWriteModelPermissions($task, $explicitReadWriteModelPermissions);
 }