public function testSavingTwiceWithAModelThatHasACurrencyValueAsARelation() { if (!RedBeanDatabase::isFrozen()) { Yii::app()->user->userModel = User::getByUsername('super'); $testItem = new OwnedSecurableTestItem(); $testItem->member = 'test'; $saved = $testItem->save(); $this->assertTrue($saved); //Because OwnedSecurableTestItem as a relatedCurrency, there are some strange issues with saving again. //It creates currency validation issues for any of the related users like owner, modifiedUser etc. //Need to investigate further to fix. //$testItem->forget(); //$testItem = OwnedSecurableTestItem::getById($testItem->id); //Save again immediately after. $validated = $testItem->validate(); // echo "<pre>"; // print_r($testItem->getErrors()); // echo "</pre>"; $this->assertTrue($validated); $saved = $testItem->save(); $this->assertTrue($saved); //Reset count of test items to 0. $testItem->delete(); } }
public function onEvent($type, $info) { assert('$type == "after_update"'); if (RedBeanDatabase::isFrozen()) { return; } $hints = $info->getMeta("hint"); if ($hints !== null) { assert('is_array($hints)'); foreach ($hints as $key => $value) { switch ($value) { case 'date': $this->dateOptimizer->setTable($info->getMeta("type")); $this->dateOptimizer->setColumn($key); $this->dateOptimizer->setValue($info->{$key}); $this->dateOptimizer->optimize(); break; case 'datetime': $this->datetimeOptimizer->setTable($info->getMeta("type")); $this->datetimeOptimizer->setColumn($key); $this->datetimeOptimizer->setValue($info->{$key}); $this->datetimeOptimizer->optimize(); break; case 'id': $this->idOptimizer->setTable($info->getMeta("type")); $this->idOptimizer->setColumn($key); $this->idOptimizer->setValue($info->{$key}); $this->idOptimizer->optimize(); break; } } } }
public function testSaveModelFromPostSuccessfulSave() { //Unfreeze since the test model is not part of the standard schema. $freezeWhenComplete = false; if (RedBeanDatabase::isFrozen()) { RedBeanDatabase::unfreeze(); $freezeWhenComplete = true; } Yii::app()->user->userModel = User::getByUsername('super'); $savedSuccessfully = false; $modelToStringValue = null; $postData = array('member' => 'abc'); $model = new OwnedSecurableTestItem(); $this->assertFalse($model->hasErrors()); $controllerUtil = new ZurmoControllerUtil(); $model = $controllerUtil->saveModelFromPost($postData, $model, $savedSuccessfully, $modelToStringValue); $this->assertTrue($savedSuccessfully); $this->assertEquals('abc', $modelToStringValue); $this->assertFalse($model->hasErrors()); $this->assertTrue($model->id > 0); //Re-freeze if needed. if ($freezeWhenComplete) { RedBeanDatabase::freeze(); } }
public function setup() { parent::setUp(); $freeze = false; if (RedBeanDatabase::isFrozen()) { RedBeanDatabase::unfreeze(); $freeze = true; } $this->freeze = $freeze; }
public static function setUpBeforeClass() { parent::setUpBeforeClass(); SecurityTestHelper::createSuperAdmin(); if (!RedBeanDatabase::isFrozen()) { // TODO: @Shoaibi: High: get rid of this for God's sake. $campaignItem = CampaignItemTestHelper::createCampaignItem(0); $campaignItem->delete(); } }
public function setUp() { parent::setUp(); Yii::app()->user->userModel = User::getByUsername('super'); $freeze = false; if (RedBeanDatabase::isFrozen()) { RedBeanDatabase::unfreeze(); $freeze = true; } $this->freeze = $freeze; }
public function setup() { parent::setUp(); Yii::app()->user->userModel = User::getByUsername('super'); DisplayAttributeForReportForm::resetCount(); $freeze = false; if (RedBeanDatabase::isFrozen()) { RedBeanDatabase::unfreeze(); $freeze = true; } $this->freeze = $freeze; }
public function onEvent($type, $info) { assert('$type == "sql_exec"'); if (!RedBeanDatabase::isFrozen()) { return; } //echo "<pre>"; //print_r($info->getSQL()); //echo "</pre>"; //now we can count total queries, how many time the same query is run, //if we want to do db timings we would need to do this from a different listener. (actually not sure how this will work...) }
public function setUp() { parent::setUp(); if (strlen(Yii::app()->params['testApiUrl']) > 0) { $this->serverUrl = Yii::app()->params['testApiUrl']; } $freeze = false; if (RedBeanDatabase::isFrozen()) { RedBeanDatabase::unfreeze(); $freeze = true; } $this->freeze = $freeze; }
public static function tearDownAfterClass() { if (RedBeanDatabase::isFrozen()) { TestDatabaseUtil::deleteRowsFromAllTablesExceptLog(); } else { TestDatabaseUtil::deleteAllTablesExceptLog(); } RedBeanModel::forgetAll(); RedBeanDatabase::close(); assert('!RedBeanDatabase::isSetup()'); // Not Coding Standard GeneralCache::forgetAll(); }
public function setup() { parent::setUp(); Yii::app()->user->userModel = User::getByUsername('super'); DisplayAttributeForReportForm::resetCount(); ModelRelationsAndAttributesToSummableReportAdapter::forgetAll(); ModelRelationsAndAttributesToRowsAndColumnsReportAdapter::forgetAll(); ModelRelationsAndAttributesToMatrixReportAdapter::forgetAll(); $freeze = false; if (RedBeanDatabase::isFrozen()) { RedBeanDatabase::unfreeze(); $freeze = true; } $this->freeze = $freeze; }
public function testResolveModelsHasManyFilesFromPost() { if (!RedBeanDatabase::isFrozen()) { Yii::app()->user->userModel = User::getByUsername('super'); $fileCount = count(FileModel::getAll()); $this->assertEquals(0, $fileCount); $file1 = ZurmoTestHelper::createFileModel(); $file2 = ZurmoTestHelper::createFileModel(); $file3 = ZurmoTestHelper::createFileModel(); $model = new ModelWithAttachmentTestItem(); $_POST['myTest'] = array($file1->id, $file2->id, $file3->id); FileModelUtil::resolveModelsHasManyFilesFromPost($model, 'files', 'myTest'); $model->member = 'test'; $saved = $model->save(); $this->assertTrue($saved); $fileCount = count(FileModel::getAll()); $this->assertEquals(3, $fileCount); $modelId = $model->id; $model->forget(); $model = ModelWithAttachmentTestItem::getById($modelId); $this->assertEquals(3, $model->files->count()); //Add a fourth file. $file4 = ZurmoTestHelper::createFileModel(); $_POST['myTest'] = array($file1->id, $file2->id, $file3->id, $file4->id); FileModelUtil::resolveModelsHasManyFilesFromPost($model, 'files', 'myTest'); $saved = $model->save(); $this->assertTrue($saved); $fileCount = count(FileModel::getAll()); $this->assertEquals(4, $fileCount); $model->forget(); $model = ModelWithAttachmentTestItem::getById($modelId); $this->assertEquals(4, $model->files->count()); //Remove the 2nd file. $_POST['myTest'] = array($file1->id, $file3->id, $file4->id); FileModelUtil::resolveModelsHasManyFilesFromPost($model, 'files', 'myTest'); $saved = $model->save(); $this->assertTrue($saved); $fileCount = count(FileModel::getAll()); $this->assertEquals(3, $fileCount); $model->forget(); $model = ModelWithAttachmentTestItem::getById($modelId); $this->assertEquals(3, $model->files->count()); $compareIds = array($file1->id, $file3->id, $file4->id); foreach ($model->files as $fileModel) { $this->assertTrue(in_array($fileModel->id, $compareIds)); } } }
public function onEvent($type, $info) { assert('$type == "update"'); if (RedBeanDatabase::isFrozen()) { return; } $hints = $info->getMeta("hint"); if ($hints !== null) { assert('is_array($hints)'); foreach ($hints as $key => $value) { if (in_array($value, array('blob', 'longblob', 'boolean', 'date', 'datetime', 'string', 'text', 'longtext', 'id'))) { RedBeanColumnTypeOptimizer::optimize($info->getMeta("type"), $key, $value); } } } }
public function testSequentialProcessViewFactory() { Yii::app()->user->userModel = User::getByUsername('super'); $freezeWhenComplete = false; //Unfreeze since the test model is not part of the standard schema. if (RedBeanDatabase::isFrozen()) { RedBeanDatabase::unfreeze(); $freezeWhenComplete = true; } $testModels = ImportModelTestItem::getAll(); $this->assertEquals(0, count($testModels)); $import = new Import(); $mappingData = array('column_0' => array('attributeIndexOrDerivedType' => 'string', 'type' => 'importColumn', 'mappingRulesData' => array('DefaultValueModelAttributeMappingRuleForm' => array('defaultValue' => null))), 'column_23' => array('attributeIndexOrDerivedType' => 'FullName', 'type' => 'importColumn', 'mappingRulesData' => array('FullNameDefaultValueModelAttributeMappingRuleForm' => array('defaultValue' => null)))); $serializedData['importRulesType'] = 'ImportModelTestItem'; $serializedData['mappingData'] = $mappingData; $serializedData['firstRowIsHeaderRow'] = true; $import->serializedData = serialize($serializedData); $this->assertTrue($import->save()); ImportTestHelper::createTempTableByFileNameAndTableName('importAnalyzerTest.csv', $import->getTempTableName()); $config = array('pagination' => array('pageSize' => 2)); $dataProvider = new ImportDataProvider($import->getTempTableName(), true, $config); $sequentialProcess = new ImportCreateUpdateModelsSequentialProcess($import, $dataProvider); $sequentialProcess->run(null, null); $route = 'default/someAction'; $view = SequentialProcessViewFactory::makeBySequentialProcess($sequentialProcess, $route); $content = $view->render(); $this->assertNotNull($content); $this->assertEquals('SequentialProcessView', get_class($view)); $this->assertEquals('processRows', $sequentialProcess->getNextStep()); //Now process the first run. Will process page 0. $sequentialProcess = new ImportCreateUpdateModelsSequentialProcess($import, $dataProvider); $sequentialProcess->run('processRows', null); $route = 'default/someAction'; $view = SequentialProcessViewFactory::makeBySequentialProcess($sequentialProcess, $route); $content = $view->render(); $this->assertNotNull($content); $this->assertEquals('SequentialProcessView', get_class($view)); $this->assertEquals(array('page' => 1), $sequentialProcess->getNextParams()); //Confirm 2 models were successfully added. $testModels = ImportModelTestItem::getAll(); $this->assertEquals(2, count($testModels)); //Re-freeze if needed. if ($freezeWhenComplete) { RedBeanDatabase::freeze(); } }
/** * Make sure the query actually runs correctly. */ public function testASingleAttributeThatRunsFrozenQueryCorrectly() { if (RedBeanDatabase::isFrozen()) { $q = DatabaseCompatibilityUtil::getQuote(); $joinTablesAdapter = new RedBeanModelJoinTablesQueryAdapter('ReportModelTestItem'); $builder = new FiltersReportQueryBuilder($joinTablesAdapter, '1'); $filter = new FilterForReportForm('AccountsModule', 'Account', Report::TYPE_ROWS_AND_COLUMNS); $filter->attributeIndexOrDerivedType = 'ReadOptimization'; $content = $builder->makeQueryContent(array($filter)); $compareContent = "({$q}ownedsecurableitem{$q}.{$q}securableitem_id{$q} = (select securableitem_id " . "from {$q}account_read{$q} where {$q}securableitem_id{$q} = {$q}ownedsecurableitem" . "{$q}.{$q}securableitem_id{$q} and {$q}munge_id{$q} in ('U" . self::$superUserId . "', 'G" . self::$everyoneGroupId . "') limit 1))"; $this->assertEquals($compareContent, $content); $this->assertEquals(1, $joinTablesAdapter->getFromTableJoinCount()); $this->assertEquals(0, $joinTablesAdapter->getLeftTableJoinCount()); $selectQueryAdapter = new RedBeanModelSelectQueryAdapter(); $selectQueryAdapter->addClause(Account::getTableName('Account'), 'id'); $sql = SQLQueryUtil::makeQuery(Account::getTableName('Account'), $selectQueryAdapter, $joinTablesAdapter, null, null, $content, null, null); $rows = R::getAll($sql); $this->assertEquals(0, count($rows)); } }
public function save($runValidation = true) { foreach ($this->deferredRelateBeans as $bean) { R::associate($this->bean, $bean); if (!RedBeanDatabase::isFrozen()) { $types = array($this->bean->getMeta("type"), $bean->getMeta("type")); sort($types); $tableName = implode("_", $types); foreach ($types as $type) { $columnName = "{$type}_id"; RedBeanColumnTypeOptimizer::optimize($tableName, $columnName, 'id'); } } } $this->deferredRelateBeans = array(); foreach ($this->deferredUnrelateBeans as $bean) { R::unassociate($this->bean, $bean); } $this->deferredUnrelateBeans = array(); return true; }
/** * Given a file resource, convert the file into a database table based on the table name provided. * Assumes the file is a csv. * @param resource $fileHandle * @param string $tableName * @return true on success. */ public static function makeDatabaseTableByFileHandleAndTableName($fileHandle, $tableName, $delimiter = ',', $enclosure = "'") { assert('gettype($fileHandle) == "resource"'); assert('is_string($tableName)'); assert('$tableName == strtolower($tableName)'); assert('$delimiter != null && is_string($delimiter)'); assert('$enclosure != null && is_string($enclosure)'); $freezeWhenComplete = false; if (RedBeanDatabase::isFrozen()) { RedBeanDatabase::unfreeze(); $freezeWhenComplete = true; } R::exec("drop table if exists {$tableName}"); $columns = self::optimizeTableImportColumnsAndGetColumnNames($fileHandle, $tableName, $delimiter, $enclosure); rewind($fileHandle); self::convertCsvIntoRowsInTable($fileHandle, $tableName, $delimiter, $enclosure, $columns); self::optimizeTableNonImportColumns($tableName); if ($freezeWhenComplete) { RedBeanDatabase::freeze(); } return true; }
protected static function decrementParentRolesCountsForAllSecurableItems($mungeTableName, Role $role) { assert('is_string($mungeTableName) && $mungeTableName != ""'); if (!RedBeanDatabase::isFrozen() && $role->role->isSame($role)) { return; } if ($role->role->id > 0) { self::decrementCountForAllSecurableItems($mungeTableName, $role->role); self::decrementParentRolesCountsForAllSecurableItems($mungeTableName, $role->role); } }
/** * @depends testAutoBuildDatabase */ public function testAutoBuildUpgrade() { $this->unfreezeWhenDone = false; if (RedBeanDatabase::isFrozen()) { RedBeanDatabase::unfreeze(); $this->unfreezeWhenDone = true; } // adding Text Field $metadata = Account::getMetadata(); $metadata['Account']['members'][] = 'newField'; $rules = array('newField', 'type', 'type' => 'string'); $metadata['Account']['rules'][] = $rules; $metadata['Account']['members'][] = 'string128'; $rules = array('string128', 'type', 'type' => 'string'); $metadata['Account']['rules'][] = $rules; $rules = array('string128', 'length', 'min' => 3, 'max' => 128); $metadata['Account']['rules'][] = $rules; $metadata['Account']['members'][] = 'string555'; $rules = array('string555', 'type', 'type' => 'string'); $metadata['Account']['rules'][] = $rules; $rules = array('string555', 'length', 'min' => 1, 'max' => 555); $metadata['Account']['rules'][] = $rules; $metadata['Account']['members'][] = 'string100000'; $rules = array('string100000', 'type', 'type' => 'string'); $metadata['Account']['rules'][] = $rules; $rules = array('string100000', 'length', 'min' => 1, 'max' => 100000); $metadata['Account']['rules'][] = $rules; $metadata['Account']['members'][] = 'textField'; $rules = array('textField', 'type', 'type' => 'text'); $metadata['Account']['rules'][] = $rules; $metadata['Account']['members'][] = 'longTextField'; $rules = array('longTextField', 'type', 'type' => 'longtext'); $metadata['Account']['rules'][] = $rules; $metadata['Account']['members'][] = 'dateField'; $rules = array('dateField', 'type', 'type' => 'date'); $metadata['Account']['rules'][] = $rules; $metadata['Account']['members'][] = 'booleanField'; $rules = array('booleanField', 'boolean'); $metadata['Account']['rules'][] = $rules; $metadata['Account']['members'][] = 'integerField'; $rules = array('integerField', 'type', 'type' => 'integer'); $metadata['Account']['rules'][] = $rules; $metadata['Account']['members'][] = 'dateTimeField'; $rules = array('dateTimeField', 'type', 'type' => 'datetime'); $metadata['Account']['rules'][] = $rules; $metadata['Account']['members'][] = 'urlField'; $rules = array('urlField', 'url'); $metadata['Account']['rules'][] = $rules; $metadata['Account']['members'][] = 'floatField'; $rules = array('floatField', 'type', 'type' => 'float'); $metadata['Account']['rules'][] = $rules; $metadata['Account']['members'][] = 'longTextField'; $rules = array('longTextField', 'type', 'type' => 'longtext'); $metadata['Account']['rules'][] = $rules; $metadata['Account']['members'][] = 'blobField'; $rules = array('blobField', 'type', 'type' => 'blob'); $metadata['Account']['rules'][] = $rules; $metadata['Account']['members'][] = 'longBlobField'; $rules = array('longBlobField', 'type', 'type' => 'longblob'); $metadata['Account']['rules'][] = $rules; Account::setMetadata($metadata); $super = User::getByUsername('super'); Yii::app()->user->userModel = $super; $messageLogger = new MessageLogger(); $beforeRowCount = DatabaseCompatibilityUtil::getTableRowsCountTotal(); InstallUtil::autoBuildDatabase($messageLogger); $afterRowCount = DatabaseCompatibilityUtil::getTableRowsCountTotal(); $this->assertEquals($beforeRowCount, $afterRowCount); //Check Account fields $tableName = RedBeanModel::getTableName('Account'); $columns = R::$writer->getColumns($tableName); $this->assertEquals('text', $columns['newfield']); $this->assertEquals('varchar(128)', $columns['string128']); $this->assertEquals('text', $columns['string555']); $this->assertEquals('longtext', $columns['string100000']); $this->assertEquals('text', $columns['textfield']); $this->assertEquals('date', $columns['datefield']); $this->assertEquals('tinyint(1)', $columns['booleanfield']); $this->assertEquals('int(11) unsigned', $columns['integerfield']); $this->assertEquals('datetime', $columns['datetimefield']); $this->assertEquals('varchar(255)', $columns['urlfield']); $this->assertEquals('double', $columns['floatfield']); $this->assertEquals('longtext', $columns['longtextfield']); $this->assertEquals('blob', $columns['blobfield']); $this->assertEquals('longblob', $columns['longblobfield']); $account = new Account(); $account->name = 'Test Name'; $account->owner = $super; $randomString = str_repeat("Aa", 64); $account->string128 = $randomString; $this->assertTrue($account->save()); $metadata = Account::getMetadata(); foreach ($metadata['Account']['rules'] as $key => $rule) { if ($rule[0] == 'string128' && $rule[1] == 'length') { $metadata['Account']['rules'][$key]['max'] = 64; } } Account::setMetadata($metadata); InstallUtil::autoBuildDatabase($messageLogger); RedBeanModel::forgetAll(); $modifiedAccount = Account::getById($account->id); $this->assertEquals($randomString, $modifiedAccount->string128); //Check Account fields $tableName = RedBeanModel::getTableName('Account'); $columns = R::$writer->getColumns($tableName); $this->assertEquals('varchar(128)', $columns['string128']); }
/** * @depends testDrillDownDetails */ public function testAutoComplete() { if (RedBeanDatabase::isFrozen()) { return; } $this->setGetArray(array('term' => 'a test', 'moduleClassName' => 'ReportsModule', 'type' => Report::TYPE_SUMMATION)); $content = $this->runControllerWithNoExceptionsAndGetContent('reports/default/autoComplete'); $this->assertEquals('[]', $content); }
protected function linkBeans() { $baseModelClassName = null; $baseBean = null; foreach ($this->modelClassNameToBean as $modelClassName => $bean) { if ($baseBean !== null) { ZurmoRedBeanLinkManager::link($bean, $baseBean); if (!RedBeanDatabase::isFrozen()) { $tableName = self::getTableName($modelClassName); $columnName = self::getTableName($baseModelClassName) . '_id'; RedBeanColumnTypeOptimizer::optimize($tableName, $columnName, 'id'); } } $baseModelClassName = $modelClassName; $baseBean = $bean; } }
/** * @depends testGetGlobalSearchResultsByPartialTermUsingScope */ public function testGetGlobalSearchResultsByPartialTermWithRegularUserAndElevationStepsForRegularUser() { //Unfrozen, there are too many attributes that have to be columns in the database at this point, so //now this is just a frozen test. if (RedBeanDatabase::isFrozen()) { $super = User::getByUsername('super'); $jimmy = User::getByUsername('jimmy'); Yii::app()->user->userModel = $super; //Jimmy does not have read access, so he should not be able to see any results. $this->assertEquals(Right::DENY, $jimmy->getEffectiveRight('AccountsModule', AccountsModule::RIGHT_ACCESS_ACCOUNTS)); $this->assertEquals(Right::DENY, $jimmy->getEffectiveRight('ContactsModule', ContactsModule::RIGHT_ACCESS_CONTACTS)); $this->assertEquals(Right::DENY, $jimmy->getEffectiveRight('OpportunitiesModule', OpportunitiesModule::RIGHT_ACCESS_OPPORTUNITIES)); Yii::app()->user->userModel = $jimmy; $data = ModelAutoCompleteUtil::getGlobalSearchResultsByPartialTerm('animal', 5, Yii::app()->user->userModel); $this->assertEquals(array(array('href' => '', 'label' => 'No Results Found', 'iconClass' => '')), $data); //Give Jimmy access to the module, he still will not be able to see results. Yii::app()->user->userModel = $super; $jimmy->setRight('AccountsModule', AccountsModule::RIGHT_ACCESS_ACCOUNTS); $jimmy->setRight('ContactsModule', ContactsModule::RIGHT_ACCESS_CONTACTS); $jimmy->setRight('LeadsModule', LeadsModule::RIGHT_ACCESS_LEADS); $jimmy->setRight('OpportunitiesModule', OpportunitiesModule::RIGHT_ACCESS_OPPORTUNITIES); $this->assertTrue($jimmy->save()); Yii::app()->user->userModel = $jimmy; $data = ModelAutoCompleteUtil::getGlobalSearchResultsByPartialTerm('animal', 5, Yii::app()->user->userModel); $this->assertEquals(array(array('href' => '', 'label' => 'No Results Found', 'iconClass' => '')), $data); //Give Jimmy read on 1 model. The search then should pick up this model. Yii::app()->user->userModel = $super; $accounts = Account::getByName('The Zoo'); $this->assertEquals(1, count($accounts)); $account = $accounts[0]; $this->assertEquals(Permission::NONE, $account->getEffectivePermissions($jimmy)); $account->addPermissions($jimmy, Permission::READ); $this->assertTrue($account->save()); ReadPermissionsOptimizationUtil::securableItemGivenPermissionsForUser($account, $jimmy); Yii::app()->user->userModel = $jimmy; $data = ModelAutoCompleteUtil::getGlobalSearchResultsByPartialTerm('animal', 5, Yii::app()->user->userModel); $this->assertEquals(1, count($data)); $this->assertEquals('The Zoo', $data[0]['label']); //Give Jimmy read on 2 more models. The search then should pick up these models. Yii::app()->user->userModel = $super; $contacts = Contact::getByName('Big Elephant'); $this->assertEquals(1, count($contacts)); $contact = $contacts[0]; $this->assertEquals(Permission::NONE, $contact->getEffectivePermissions($jimmy)); $contact->addPermissions($jimmy, Permission::READ); $this->assertTrue($contact->save()); ReadPermissionsOptimizationUtil::securableItemGivenPermissionsForUser($contact, $jimmy); $opportunities = Opportunity::getByName('Animal Crackers'); $this->assertEquals(1, count($opportunities)); $opportunity = $opportunities[0]; $this->assertEquals(Permission::NONE, $opportunity->getEffectivePermissions($jimmy)); $opportunity->addPermissions($jimmy, Permission::READ); $this->assertTrue($opportunity->save()); ReadPermissionsOptimizationUtil::securableItemGivenPermissionsForUser($opportunity, $jimmy); Yii::app()->user->userModel = $jimmy; $data = ModelAutoCompleteUtil::getGlobalSearchResultsByPartialTerm('animal', 5, Yii::app()->user->userModel); $this->assertEquals(3, count($data)); $this->assertEquals('The Zoo', $data[0]['label']); $this->assertEquals('Big Elephant', $data[1]['label']); $this->assertEquals('Animal Crackers', $data[2]['label']); } }
public function disabled_testAShootLoadOfAccounts() { $freezeAfterFirst20 = false; $super = User::getByUsername('super'); foreach (array(20, 50, 100, 200, 500, 1000, 10000, 100000, 200000) as $shootLoad) { echo "\nNuking existing accounts...\n"; Yii::app()->user->userModel = $super; $this->nukeExistingAccounts(); echo "Creating {$shootLoad} accounts...\n"; echo " - Giving every 10th to Betty, giving Benny read\n"; echo " on overy 8th, and giving Sales Staff read on\n"; echo " every 12th.\n"; list($time, $countThatBennyCanRead, $accountIdsThatBennyCanRead) = $this->createAccounts($shootLoad); echo 'Created accounts in ' . round($time, 1) . " seconds.\n"; echo "Benny can read {$countThatBennyCanRead} of them.\n"; echo 'The first few... '; for ($i = 0; $i < 10 && $i < count($accountIdsThatBennyCanRead); $i++) { echo "{$accountIdsThatBennyCanRead[$i]}|"; } echo "\n"; $startTime = microtime(true); ReadPermissionsOptimizationUtil::rebuild(true); $endTime = microtime(true); if ($this->isDebug()) { echo 'Rebuilt the munge in php in ' . round($endTime - $startTime, 1) . ' seconds, ' . self::getAccountMungeRowCount() . " rows.\n"; } $phpRows = R::getAll('select munge_id, securableitem_id, count from account_read order by munge_id, securableitem_id, count'); // If $securityOptimized is false in debug.php the second one will just do the php again. $startTime = microtime(true); ReadPermissionsOptimizationUtil::rebuild(); $endTime = microtime(true); if ($this->isDebug()) { echo 'Rebuilt the munge ' . (SECURITY_OPTIMIZED ? 'optimized' : 'in php') . ' in ' . round($endTime - $startTime, 1) . ' seconds, ' . self::getAccountMungeRowCount() . " rows.\n"; } $otherRows = R::getAll('select munge_id, securableitem_id, count from account_read order by munge_id, securableitem_id, count'); if (count(array_diff($phpRows, $otherRows)) > 0) { echo "PHP & optimized munges don't match.\n"; echo "--------\n"; foreach ($phpRows as $row) { echo join(', ', array_values($row)) . "\n"; } echo "--------\n"; foreach ($otherRows as $row) { echo join(', ', array_values($row)) . "\n"; } echo "--------\n"; } $this->assertEquals(count($phpRows), count($otherRows)); $this->assertEquals($phpRows, $otherRows); Yii::app()->user->userModel = User::getByUsername('benny'); $count = Account::getCount(); $startTime = microtime(true); $accounts = Account::getSubset(null, 0, 20); $endTime = microtime(true); echo 'As Benny retrieved 1 - ' . count($accounts) . " of {$count} in " . round($endTime - $startTime, 2) . " seconds.\n"; unset($accounts); $offset = intval($count * 0.75); $startTime = microtime(true); $accounts = Account::getSubset(null, $offset, 20); $endTime = microtime(true); echo "As Benny retrieved {$offset} - " . ($offset + count($accounts)) . " of {$count} in " . round($endTime - $startTime, 3) . " seconds.\n"; unset($accounts); echo "Done.\n"; echo "\n-------------------------------\n"; if ($freezeAfterFirst20 && !RedBeanDatabase::isFrozen()) { echo "Freezing database...\n"; RedBeanDatabase::freeze(); } } }
/** * @depends testSearchByMultipleValuesCustomField */ public function testSearchByTwoMultipleValuesCustomField() { if (!RedBeanDatabase::isFrozen()) { $quote = DatabaseCompatibilityUtil::getQuote(); //Test where relatioon id is in a joining table. Many to Many relationship $_FAKEPOST['TestOwnedCustomFieldsModel'] = array(); $_FAKEPOST['TestOwnedCustomFieldsModel']['multipleIndustries']['values'] = array('A', 'B', 'C'); $_FAKEPOST['TestOwnedCustomFieldsModel']['multipleSomethings']['values'] = array('D', 'E', 'F'); $metadataAdapter = new SearchDataProviderMetadataAdapter(new TestOwnedCustomFieldsModel(false), 1, $_FAKEPOST['TestOwnedCustomFieldsModel']); $searchAttributeData = $metadataAdapter->getAdaptedMetadata(); $joinTablesAdapter = new RedBeanModelJoinTablesQueryAdapter('TestOwnedCustomFieldsModel'); $where = RedBeanModelDataProvider::makeWhere('TestOwnedCustomFieldsModel', $searchAttributeData, $joinTablesAdapter); $compareWhere = "(1 = (select 1 from {$quote}customfieldvalue{$quote} customfieldvalue " . "where {$quote}customfieldvalue{$quote}.{$quote}multiplevaluescustomfield_id{$quote} = " . "{$quote}multiplevaluescustomfield{$quote}.id " . "and {$quote}customfieldvalue{$quote}.{$quote}value{$quote} IN('A','B','C') limit 1))"; // Not Coding Standard $compareWhere .= " and (1 = (select 1 from {$quote}customfieldvalue{$quote} customfieldvalue " . "where {$quote}customfieldvalue{$quote}.{$quote}multiplevaluescustomfield_id{$quote} = " . "{$quote}multiplevaluescustomfield1{$quote}.id " . "and {$quote}customfieldvalue{$quote}.{$quote}value{$quote} IN('D','E','F') limit 1))"; // Not Coding Standard $this->assertEquals($compareWhere, $where); //Now test that the joinTablesAdapter has correct information. $this->assertEquals(0, $joinTablesAdapter->getFromTableJoinCount()); $this->assertEquals(2, $joinTablesAdapter->getLeftTableJoinCount()); $leftTables = $joinTablesAdapter->getLeftTablesAndAliases(); $this->assertEquals('multiplevaluescustomfield', $leftTables[0]['tableName']); $this->assertEquals('multiplevaluescustomfield', $leftTables[1]['tableName']); //Now test that the subsetSQL query produced is correct. $subsetSql = TestOwnedCustomFieldsModel::makeSubsetOrCountSqlQuery('testcustomfieldsmodel', $joinTablesAdapter, 1, 5, $where, null); $compareSubsetSql = "select {$quote}testcustomfieldsmodel{$quote}.{$quote}id{$quote} id "; $compareSubsetSql .= "from {$quote}testcustomfieldsmodel{$quote} "; $compareSubsetSql .= "left join {$quote}multiplevaluescustomfield{$quote} on "; $compareSubsetSql .= "{$quote}multiplevaluescustomfield{$quote}.{$quote}id{$quote} = "; $compareSubsetSql .= "{$quote}testownedcustomfieldsmodel{$quote}.{$quote}multipleindustries_multiplevaluescustomfield_id{$quote} "; $compareSubsetSql .= "left join {$quote}multiplevaluescustomfield{$quote} multiplevaluescustomfield1 on "; $compareSubsetSql .= "{$quote}multiplevaluescustomfield1{$quote}.{$quote}id{$quote} = "; $compareSubsetSql .= "{$quote}testownedcustomfieldsmodel{$quote}.{$quote}multiplesomethings_multiplevaluescustomfield_id{$quote} "; $compareSubsetSql .= "where " . $compareWhere . ' '; $compareSubsetSql .= 'limit 5 offset 1'; $this->assertEquals($compareSubsetSql, $subsetSql); //Make sure the sql runs properly. $dataProvider = new RedBeanModelDataProvider('TestOwnedCustomFieldsModel', null, false, $searchAttributeData); $data = $dataProvider->getData(); $this->assertEquals(1, count($data)); } }
/** * @expectedException RedBean_Exception_SQL */ public function testDropTableByTableName() { $testTableName = 'testimporttable'; $sql = 'select * from ' . $testTableName; $tempTableData = R::getAll($sql); $this->assertEquals(4, count($tempTableData)); if (RedBeanDatabase::isFrozen()) { ImportDatabaseUtil::dropTableByTableName($testTableName); $sql = 'select * from ' . $testTableName; R::getAll($sql); } else { //Unfrozen will not throw an exception in this type of situation. throw new RedBean_Exception_SQL(); } }
public static function setUpBeforeClass() { parent::setUpBeforeClass(); // We need to unfreeze here as we are working with custom field values self::$freeze = false; if (RedBeanDatabase::isFrozen()) { RedBeanDatabase::unfreeze(); self::$freeze = true; } SecurityTestHelper::createSuperAdmin(); SecurityTestHelper::createUsers(); self::$super = User::getByUsername('super'); Yii::app()->user->userModel = self::$super; $currencies = Currency::getAll(); $currencyValue1 = new CurrencyValue(); $currencyValue1->value = 100; $currencyValue1->currency = $currencies[0]; $multiDropDownCustomFieldData1 = new CustomFieldData(); $multiDropDownCustomFieldData1->name = 'multiDropDown1'; $multiDropDownCustomFieldData1->serializedData = serialize(array('Ten', 11, 'XII')); $saved = $multiDropDownCustomFieldData1->save(); assert('$saved'); // Not Coding Standard $multiDropDownCustomFieldValue1 = new CustomFieldValue(); $multiDropDownCustomFieldValue1->value = 'Ten'; $multiDropDownCustomFieldValue2 = new CustomFieldValue(); $multiDropDownCustomFieldValue2->value = 11; $multiDropDownCustomFieldValue3 = new CustomFieldValue(); $multiDropDownCustomFieldValue3->value = 'XII'; $tagCustomFieldData1 = new CustomFieldData(); $tagCustomFieldData1->name = 'tagCloud1'; $tagCustomFieldData1->serializedData = serialize(array('Apache', 'PHP')); $saved = $tagCustomFieldData1->save(); assert('$saved'); // Not Coding Standard $tagCustomFieldValue1 = new CustomFieldValue(); $tagCustomFieldValue1->value = 'PHP'; $tagCustomFieldValue2 = new CustomFieldValue(); $tagCustomFieldValue2->value = 'Apache'; $primaryEmail1 = new Email(); $primaryEmail1->emailAddress = "*****@*****.**"; $primaryEmail1->isInvalid = true; $primaryEmail1->optOut = false; $secondaryEmail1 = new Email(); $secondaryEmail1->emailAddress = "*****@*****.**"; $secondaryEmail1->isInvalid = false; $secondaryEmail1->optOut = true; $address1 = new Address(); $address1->street1 = "SomeStreet1"; $address1->street2 = "SomeStreet2"; $address1->city = "SomeCity"; $address1->state = "SomeState"; $address1->postalCode = 1111; $address1->country = "SomeCountry"; $likeContactState1 = new ContactState(); $likeContactState1->name = 'Customer'; $likeContactState1->order = 0; $users = User::getAll(); $user1 = new User(); $user1->lastName = 'Kevin'; $user1->hash = 'rieWoy3aijohP6chaigaokohs1oovohf'; $user1->language = 'es'; $user1->timeZone = 'America/Chicago'; $user1->username = '******'; $user1->currency = $currencies[0]; $user1->manager = $users[0]; //Custom attribute $attributeForm = new TextAttributeForm(); $attributeForm->attributeName = 'custom'; $attributeForm->attributeLabels = array('en' => 'test label en'); $modelAttributesAdapterClassName = $attributeForm::getModelAttributeAdapterNameForSavingAttributeFormData(); $adapter = new $modelAttributesAdapterClassName(new EmailTemplateModelTestItem()); $adapter->setAttributeMetadataFromForm($attributeForm); $model = new EmailTemplateModelTestItem(); $model->string = 'abc'; $model->firstName = 'James'; $model->lastName = 'Jackson'; $model->phone = 1122334455; $model->boolean = true; $model->date = '2008-12-31'; $model->dateTime = '2008-12-31 07:48:04'; $model->textArea = 'Multiple Lines\\nOf Text'; $model->url = 'http://www.zurmo.com/'; $model->integer = 999; $model->float = 999.999; $model->currencyValue = $currencyValue1; $model->dropDown->value = "DropdownSelectedValue"; $model->radioDropDown->value = "RadioDropdownSelectedValue"; $model->primaryEmail = $primaryEmail1; $model->secondaryEmail = $secondaryEmail1; $model->primaryAddress = $address1; $model->likeContactState = $likeContactState1; $model->user = $user1; $model->multiDropDown->data = $multiDropDownCustomFieldData1; $model->tagCloud->data = $tagCustomFieldData1; $model->multiDropDown->values->add($multiDropDownCustomFieldValue1); $model->multiDropDown->values->add($multiDropDownCustomFieldValue2); $model->multiDropDown->values->add($multiDropDownCustomFieldValue3); $model->tagCloud->values->add($tagCustomFieldValue1); $model->tagCloud->values->add($tagCustomFieldValue2); $model->customCstm = 'text custom'; $saved = $model->save(); assert('$saved'); // Not Coding Standard self::$emailTemplate = $model; // Update all values but do not save the model. $multiDropDownCustomFieldData2 = new CustomFieldData(); $multiDropDownCustomFieldData2->name = 'multiDropDown2'; $multiDropDownCustomFieldData2->serializedData = serialize(array('Thirteen', 14, 'XV')); $saved = $multiDropDownCustomFieldData2->save(); assert('$saved'); // Not Coding Standard $multiDropDownCustomFieldValue4 = new CustomFieldValue(); $multiDropDownCustomFieldValue4->value = 'Thirteen'; $multiDropDownCustomFieldValue5 = new CustomFieldValue(); $multiDropDownCustomFieldValue5->value = 14; $multiDropDownCustomFieldValue6 = new CustomFieldValue(); $multiDropDownCustomFieldValue6->value = 'XV'; $tagCustomFieldData2 = new CustomFieldData(); $tagCustomFieldData2->name = 'tagCloud2'; $tagCustomFieldData2->serializedData = serialize(array('Nginx', 'Python')); $saved = $tagCustomFieldData2->save(); assert('$saved'); // Not Coding Standard $tagCustomFieldValue3 = new CustomFieldValue(); $tagCustomFieldValue3->value = 'Python'; $tagCustomFieldValue4 = new CustomFieldValue(); $tagCustomFieldValue4->value = 'Nginx'; self::$emailTemplate->string = 'def'; self::$emailTemplate->firstName = 'Jane'; self::$emailTemplate->lastName = 'Bond'; self::$emailTemplate->phone = 66778899; self::$emailTemplate->boolean = false; self::$emailTemplate->date = '2009-12-31'; self::$emailTemplate->dateTime = '2009-12-31 07:48:04'; self::$emailTemplate->textArea = 'Multiple Lines\\nOf\\nText'; self::$emailTemplate->url = 'http://www.zurmo.org/'; self::$emailTemplate->integer = 888; self::$emailTemplate->float = 888.888; self::$emailTemplate->currencyValue->value = 99; self::$emailTemplate->dropDown->value = "DropdownSelectedVal"; self::$emailTemplate->radioDropDown->value = "RadioDropdownSelectedVal"; self::$emailTemplate->primaryEmail->emailAddress = "*****@*****.**"; self::$emailTemplate->primaryEmail->isInvalid = false; self::$emailTemplate->primaryEmail->optOut = true; self::$emailTemplate->secondaryEmail->emailAddress = "*****@*****.**"; self::$emailTemplate->secondaryEmail->isInvalid = true; self::$emailTemplate->secondaryEmail->optOut = false; self::$emailTemplate->primaryAddress->street1 = "SomeOtherStreet1"; self::$emailTemplate->primaryAddress->street2 = "SomeOtherStreet2"; self::$emailTemplate->primaryAddress->city = "SomeOtherCity"; self::$emailTemplate->primaryAddress->state = "SomeOtherState"; self::$emailTemplate->primaryAddress->postalCode = 2222; self::$emailTemplate->primaryAddress->country = "SomeOtherCountry"; self::$emailTemplate->likeContactState->name = 'New'; self::$emailTemplate->likeContactState->order = 1; self::$emailTemplate->user->lastName = 'Dean'; self::$emailTemplate->user->hash = 'teo8eghaipaC5ahngahleiyaebofu6oo'; self::$emailTemplate->user->language = 'en'; self::$emailTemplate->user->timeZone = 'America/Denver'; self::$emailTemplate->user->username = '******'; self::$emailTemplate->multiDropDown->data = $multiDropDownCustomFieldData2; self::$emailTemplate->multiDropDown->values->remove($multiDropDownCustomFieldValue1); self::$emailTemplate->multiDropDown->values->remove($multiDropDownCustomFieldValue2); self::$emailTemplate->multiDropDown->values->remove($multiDropDownCustomFieldValue3); self::$emailTemplate->multiDropDown->values->add($multiDropDownCustomFieldValue4); self::$emailTemplate->multiDropDown->values->add($multiDropDownCustomFieldValue5); self::$emailTemplate->multiDropDown->values->add($multiDropDownCustomFieldValue6); self::$emailTemplate->tagCloud->data = $tagCustomFieldData2; self::$emailTemplate->tagCloud->values->remove($tagCustomFieldValue1); self::$emailTemplate->tagCloud->values->remove($tagCustomFieldValue2); self::$emailTemplate->tagCloud->values->add($tagCustomFieldValue3); self::$emailTemplate->tagCloud->values->add($tagCustomFieldValue4); self::$emailTemplate->customCstm = 'text custom changed'; self::$content = 'Current: [[STRING]] [[FIRST^NAME]] [[LAST^NAME]] ' . '[[PHONE]] Old: [[WAS%STRING]] [[WAS%FIRST^NAME]] ' . '[[WAS%LAST^NAME]] [[WAS%PHONE]]'; self::$compareContent = 'Current: def Jane Bond 66778899 Old: abc James ' . 'Jackson 1122334455'; }
public function testToggleStar() { if (!RedBeanDatabase::isFrozen()) { StarredUtil::createStarredTables(); $super = $this->logoutCurrentUserLoginNewUserAndGetByUsername('super'); $account = new Account(); $account->owner = $super; $account->name = 'Test Account'; $account->officePhone = '1234567890'; $this->assertTrue($account->save()); $this->setGetArray(array('modelClassName' => 'Account', 'modelId' => $account->id)); $content = $this->runControllerWithNoExceptionsAndGetContent('zurmo/default/toggleStar'); $this->assertEquals('icon-star starred', $content); $this->assertTrue(StarredUtil::isModelStarred($account)); $content = $this->runControllerWithNoExceptionsAndGetContent('zurmo/default/toggleStar'); $this->assertEquals('icon-star unstarred', $content); $this->assertFalse(StarredUtil::isModelStarred($account)); } }
protected static function stripNonFrozenModeErrorHandlersIfFrozen($sql) { if (RedBeanDatabase::isFrozen()) { // It is deliberate that these regexs are written to not catch // handlers that are not written consistently with the existing // ones. If the assertions blow up look at making your handler // match the expression rather than messing with the expression. if (!YII_DEBUG) { $sql = preg_replace('/ +declare (continue|exit) handler for (1054|1146|1054, 1146).*?begin.*?end;\\n/s', '', $sql, -1, $count); } else { $matched = preg_match('/create (function|procedure) ([^( ]+)/', $sql, $matches); // Not Coding Standard assert('$matched == 1'); $routineName = $matches[2]; $sql = preg_replace('/( +declare (continue|exit) handler for (1054|1146|1054, 1146).*?begin.*?)(end;\\n)/s', "\\1 call write_log(\"{$routineName} failed! (\\3)\");\n \\4", $sql, -1, $count); } if (!YII_DEBUG) { assert('strpos($sql, "1146") == false'); // Table doesn't exist. assert('strpos($sql, "1054") == false'); // Column doesn't exist. } } return $sql; }
public function save($runValidation = true) { if (!parent::save($runValidation)) { return false; } foreach ($this->deferredRelateBeans as $bean) { if ($this->linkType == RedBeanModel::LINK_TYPE_POLYMORPHIC) { if ($this->bean->id == null) { R::store($this->bean); } $polyIdFieldName = strtolower($this->linkName) . '_id'; $polyTypeFieldName = strtolower($this->linkName) . '_type'; $bean->{$polyTypeFieldName} = $this->bean->getMeta('type'); $bean->{$polyIdFieldName} = $this->bean->id; if (!RedBeanDatabase::isFrozen()) { $tableName = RedBeanModel::getTableName($this->modelClassName); RedBeanColumnTypeOptimizer::optimize($tableName, $polyIdFieldName, 'id'); } } else { ZurmoRedBeanLinkManager::link($bean, $this->bean, $this->resolveLinkNameForCasing()); if (!RedBeanDatabase::isFrozen()) { $tableName = RedBeanModel::getTableName($this->modelClassName); $columnName = RedBeanModel::getTableName($this->relatedModelClassName) . '_id'; $columnName = ZurmoRedBeanLinkManager::resolveColumnPrefix($this->resolveLinkNameForCasing()) . $columnName; RedBeanColumnTypeOptimizer::optimize($tableName, $columnName, 'id'); } } R::store($bean); } $this->deferredRelateBeans = array(); $tableName = RedBeanModel::getTableName($this->relatedModelClassName); foreach ($this->deferredUnrelateBeans as $bean) { if (!$this->owns) { ZurmoRedBeanLinkManager::breakLink($bean, $tableName, $this->resolveLinkNameForCasing()); R::store($bean); } else { R::trash($bean); } } $this->deferredUnrelateBeans = array(); return true; }
public static function logAuditEvent($moduleName, $eventName, $data = null, RedBeanModel $model = null, User $user = null) { assert('is_string($moduleName) && $moduleName != ""'); assert('is_string($eventName) && $eventName != ""'); if ($user === null) { $user = Yii::app()->user->userModel; if (!$user instanceof User) { throw new NoCurrentUserSecurityException(); } } if ($eventName == "Item Viewed") { AuditEventsRecentlyViewedUtil::resolveNewRecentlyViewedModel($data[1], $model, AuditEventsRecentlyViewedUtil::RECENTLY_VIEWED_COUNT + 1); } if ($eventName == "Item Deleted") { $modelClassName = get_class($model); AuditEventsRecentlyViewedUtil::deleteModelFromRecentlyViewed($modelClassName::getModuleClassName(), $model); } if (!AuditEvent::$isTableOptimized && (!AUDITING_OPTIMIZED || !RedBeanDatabase::isFrozen())) { $tableName = self::getTableName('AuditEvent'); RedBeanColumnTypeOptimizer::optimize($tableName, strtolower('modelId'), 'id'); $auditEvent = new AuditEvent(); $auditEvent->dateTime = DateTimeUtil::convertTimestampToDbFormatDateTime(time()); $auditEvent->moduleName = $moduleName; $auditEvent->eventName = $eventName; $auditEvent->user = $user; $auditEvent->modelClassName = $model !== null ? get_class($model) : null; $auditEvent->modelId = $model !== null ? $model->id : null; $auditEvent->serializedData = serialize($data); $saved = $auditEvent->save(); AuditEvent::$isTableOptimized = true; } else { $sql = "insert into auditevent (datetime,\n modulename,\n eventname,\n _user_id,\n modelclassname,\n modelid,\n serializeddata)\n values ('" . DateTimeUtil::convertTimestampToDbFormatDateTime(time()) . "',\n '{$moduleName}',\n '{$eventName}',\n {$user->id}, " . ($model !== null ? "'" . get_class($model) . "', " : 'null, ') . ($model !== null ? "{$model->id}, " : 'null, ') . ":data)"; R::exec($sql, array('data' => serialize($data))) !== null; $saved = true; } return $saved; }