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); }