public function testRun() { $quote = DatabaseCompatibilityUtil::getQuote(); $super = User::getByUsername('super'); Yii::app()->user->userModel = $super; $box = EmailBox::resolveAndGetByName(EmailBox::NOTIFICATIONS_NAME); $folder = EmailFolder::getByBoxAndType($box, EmailFolder::TYPE_SENT); //Create 2 sent notifications, and set one with a date over a week ago (8 days ago) for the modifiedDateTime $emailMessage = EmailMessageTestHelper::createDraftSystemEmail('My Email Message', $super); $emailMessage->folder = $folder; $saved = $emailMessage->save(); $this->assertTrue($saved); $modifiedDateTime = DateTimeUtil::convertTimestampToDbFormatDateTime(time() - 60 * 60 * 24 * 8); $sql = "Update item set modifieddatetime = '" . $modifiedDateTime . "' where id = " . $emailMessage->getClassId('Item'); ZurmoRedBean::exec($sql); $emailMessage2 = EmailMessageTestHelper::createDraftSystemEmail('My Email Message 2', $super); $emailMessage2->folder = $folder; $saved = $emailMessage2->save(); $this->assertTrue($saved); $this->assertEquals(2, EmailMessage::getCount()); $job = new ClearSentNotificationsEmailJob(); $this->assertTrue($job->run()); $emailMessages = EmailMessage::getAll(); $this->assertEquals(1, count($emailMessages)); $this->assertEquals($emailMessage2->id, $emailMessages[0]->id); }
public function testRun() { $quote = DatabaseCompatibilityUtil::getQuote(); //Create 2 imports, and set one with a date over a week ago (8 days ago) for the modifiedDateTime $import = new Import(); $serializedData['importRulesType'] = 'ImportModelTestItem'; $import->serializedData = serialize($serializedData); $this->assertTrue($import->save()); ImportTestHelper::createTempTableByFileNameAndTableName('importAnalyzerTest.csv', $import->getTempTableName(), true); $modifiedDateTime = DateTimeUtil::convertTimestampToDbFormatDateTime(time() - 60 * 60 * 24 * 8); $sql = "Update item set modifieddatetime = '" . $modifiedDateTime . "' where id = " . $import->getClassId('Item'); ZurmoRedBean::exec($sql); $staleImportId = $import->id; $import2 = new Import(); $serializedData['importRulesType'] = 'ImportModelTestItem'; $import2->serializedData = serialize($serializedData); $this->assertTrue($import2->save()); ImportTestHelper::createTempTableByFileNameAndTableName('importAnalyzerTest.csv', $import2->getTempTableName(), true); $this->assertEquals(2, Import::getCount()); $tableExists = ZurmoRedBean::$writer->doesTableExist($import->getTempTableName()); $this->assertTrue($tableExists); $job = new ImportCleanupJob(); $this->assertTrue($job->run()); $tableExists = ZurmoRedBean::$writer->doesTableExist($import->getTempTableName()); $this->assertFalse($tableExists); $imports = Import::getAll(); $this->assertEquals(1, count($imports)); $this->assertEquals($import2->id, $imports[0]->id); }
/** * Deletes all job logs where the modifiedDateTime was more than 1 week ago. * Runs operation in bulk to improve performance when large jobLogs are present. * * @see BaseJob::run() */ public function run() { $oneWeekAgoTimeStamp = DateTimeUtil::convertTimestampToDbFormatDateTime(time() - 60 * 60 * 24 * 7); $sql = 'DELETE from item, joblog using joblog inner join item on ' . 'item.id = joblog.item_id where joblog.enddatetime <= "' . $oneWeekAgoTimeStamp . '"'; ZurmoRedBean::exec($sql); return true; }
/** * Given a event, perform the deletion of conversationItems related to the event sender. * @param CEvent $event */ public function deleteConversationItems(CEvent $event) { $model = $event->sender; assert('$model instanceof Item'); $itemId = $model->getClassId('Item'); $sql = 'DELETE from conversation_item where item_id = ' . $itemId; ZurmoRedBean::exec($sql); }
public static function cacheEntry($identifier, $entry) { assert('is_string($entry) || is_numeric($entry)'); parent::cacheEntry($identifier, $entry); if (static::supportsAndAllowsDatabaseCaching()) { ZurmoRedBean::exec("insert into actual_rights_cache\n (identifier, entry) values ('" . $identifier . "', '" . $entry . "') on duplicate key\n update entry = " . $entry); } }
/** * Given a model and external system id, update the external system id in the database for that model * @param object $model * @param string $externalSystemId */ public static function updateByModel(RedBeanModel $model, $externalSystemId) { assert('$externalSystemId == null || is_string($externalSystemId)'); $columnName = self::EXTERNAL_SYSTEM_ID_COLUMN_NAME; $tableName = $model::getTableName(); static::addExternalIdColumnIfMissing($tableName); ZurmoRedBean::exec("update " . $tableName . " set {$columnName} = '" . $externalSystemId . "' where id = " . $model->id); }
public static function addTransactionResolvedForOptimization($gamePoint, $value) { $transaction = new GamePointTransaction(); $transaction->value = $value; $transaction->unrestrictedSave(); $tableName = GamePointTransaction::getTableName(); $sql = "UPDATE {$tableName} SET gamepoint_id = '" . $gamePoint->id . "'\n WHERE id = '" . $transaction->id . "'"; ZurmoRedBean::exec($sql); }
/** * Given a event, perform the deletion of conversationItems related to the event sender. * @param CEvent $event */ public function deletePersonsOrAccountsItems(CEvent $event) { $model = $event->sender; assert('$model instanceof Item'); $itemId = $model->getClassId('Item'); $sql = 'DELETE from emailmessagerecipient_item where item_id = ' . $itemId; ZurmoRedBean::exec($sql); $sql = 'DELETE from emailmessagesender_item where item_id = ' . $itemId; ZurmoRedBean::exec($sql); }
public static function setUpBeforeClass() { parent::setUpBeforeClass(); $super = SecurityTestHelper::createSuperAdmin(); SecurityTestHelper::createUsers(); $account = AccountTestHelper::createAccountByNameForOwner('anAccount2', Yii::app()->user->userModel); $task = TaskTestHelper::createTaskWithOwnerAndRelatedAccount('startTask', $super, $account); $task->delete(); ZurmoRedBean::exec('delete from activity_item'); }
public function testRun() { $quote = DatabaseCompatibilityUtil::getQuote(); //Create 2 export items, and set one with a date over a week ago (8 days ago) for the modifiedDateTime $exportItem = new ExportItem(); $exportItem->isCompleted = 0; $exportItem->exportFileType = 'csv'; $exportItem->exportFileName = 'test'; $exportItem->modelClassName = 'Account'; $exportItem->serializedData = serialize(array('test', 'test2')); $this->assertTrue($exportItem->save()); $fileContent = new FileContent(); $fileContent->content = 'test'; $exportFileModel = new ExportFileModel(); $exportFileModel->fileContent = $fileContent; $exportFileModel->name = $exportItem->exportFileName . ".csv"; $exportFileModel->type = 'application/octet-stream'; $exportFileModel->size = strlen($fileContent->content); $this->assertTrue($exportFileModel->save()); $exportFileModel1Id = $exportFileModel->id; $exportItem->exportFileModel = $exportFileModel; $this->assertTrue($exportItem->save()); $modifiedDateTime = DateTimeUtil::convertTimestampToDbFormatDateTime(time() - 60 * 60 * 24 * 8); $sql = "Update item set modifieddatetime = '" . $modifiedDateTime . "' where id = " . $exportItem->getClassId('Item'); ZurmoRedBean::exec($sql); // Second exportItem, that shouldn't be deleted. $exportItem2 = new ExportItem(); $exportItem2->isCompleted = 0; $exportItem2->exportFileType = 'csv'; $exportItem2->exportFileName = 'test'; $exportItem2->modelClassName = 'Account'; $exportItem2->serializedData = serialize(array('test', 'test2')); $this->assertTrue($exportItem2->save()); $fileContent2 = new FileContent(); $fileContent2->content = 'test'; $exportFileModel2 = new ExportFileModel(); $exportFileModel2->fileContent = $fileContent2; $exportFileModel2->name = $exportItem->exportFileName . ".csv"; $exportFileModel2->type = 'application/octet-stream'; $exportFileModel2->size = strlen($fileContent->content); $this->assertTrue($exportFileModel2->save()); $exportFileModel2Id = $exportFileModel2->id; $exportItem2->exportFileModel = $exportFileModel2; $this->assertTrue($exportItem2->save()); $job = new ExportCleanupJob(); $this->assertTrue($job->run()); $exportItems = ExportItem::getAll(); $this->assertEquals(1, count($exportItems)); $this->assertEquals($exportItem2->id, $exportItems[0]->id); }
public function testSimpleUserImportWhereAllRowsSucceed() { Yii::app()->user->userModel = User::getByUsername('super'); $account = AccountTestHelper::createAccountByNameForOwner('Account', Yii::app()->user->userModel); $contact = ContactTestHelper::createContactByNameForOwner('Contact', Yii::app()->user->userModel); $accountContactAffiliations = AccountContactAffiliation::getAll(); $this->assertEquals(0, count($accountContactAffiliations)); $import = new Import(); $serializedData['importRulesType'] = 'AccountContactAffiliations'; $serializedData['firstRowIsHeaderRow'] = true; $import->serializedData = serialize($serializedData); $this->assertTrue($import->save()); ImportTestHelper::createTempTableByFileNameAndTableName('importTest.csv', $import->getTempTableName(), true, Yii::getPathOfAlias('application.modules.accountContactAffiliations.tests.unit.files')); //update the ids of the account column to match the parent account. ZurmoRedBean::exec("update " . $import->getTempTableName() . " set column_2 = " . $account->id . " where id != 1 limit 4"); ZurmoRedBean::exec("update " . $import->getTempTableName() . " set column_1 = " . $contact->id . " where id != 1 limit 4"); $this->assertEquals(4, ImportDatabaseUtil::getCount($import->getTempTableName())); // includes header rows. $mappingData = array('column_0' => ImportMappingUtil::makeDropDownColumnMappingData('role'), 'column_1' => ImportMappingUtil::makeHasOneColumnMappingData('contact'), 'column_2' => ImportMappingUtil::makeHasOneColumnMappingData('account')); $importRules = ImportRulesUtil::makeImportRulesByType('AccountContactAffiliations'); $page = 0; $config = array('pagination' => array('pageSize' => 50)); //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, new ExplicitReadWriteModelPermissions(), $messageLogger); $importResultsUtil->processStatusAndMessagesForEachRow(); //Confirm that 3 models where created. $accountContactAffiliations = AccountContactAffiliation::getAll(); $this->assertEquals(3, count($accountContactAffiliations)); $this->assertEquals('0', $accountContactAffiliations[0]->primary); $this->assertTrue($accountContactAffiliations[0]->account->isSame($account)); $this->assertTrue($accountContactAffiliations[0]->contact->isSame($contact)); $this->assertEquals('', $accountContactAffiliations[0]->role->value); $this->assertEquals('0', $accountContactAffiliations[1]->primary); $this->assertTrue($accountContactAffiliations[1]->account->isSame($account)); $this->assertTrue($accountContactAffiliations[1]->contact->isSame($contact)); $this->assertEquals('Support', $accountContactAffiliations[1]->role->value); $this->assertEquals('0', $accountContactAffiliations[2]->primary); $this->assertTrue($accountContactAffiliations[2]->account->isSame($account)); $this->assertTrue($accountContactAffiliations[2]->contact->isSame($contact)); $this->assertEquals('Technical', $accountContactAffiliations[2]->role->value); //Confirm 3 rows were processed as 'created'. $this->assertEquals(3, ImportDatabaseUtil::getCount($import->getTempTableName(), "status = " . ImportRowDataResultsUtil::CREATED)); //Confirm that 0 rows were processed as 'updated'. $this->assertEquals(0, ImportDatabaseUtil::getCount($import->getTempTableName(), "status = " . ImportRowDataResultsUtil::UPDATED)); }
public static function updateValueByDataIdAndOldValueAndNewValue($customFieldDataId, $oldValue, $newValue) { $quote = DatabaseCompatibilityUtil::getQuote(); $customFieldTableName = CustomField::getTableName(); $baseCustomFieldTableName = BaseCustomField::getTableName(); $baseCustomFieldJoinColumnName = $baseCustomFieldTableName . '_id'; $valueAttributeColumnName = 'value'; $dataAttributeColumnName = static::getForeignKeyName('BaseCustomField', 'data'); $sql = "update {$quote}{$customFieldTableName}{$quote}, {$quote}{$baseCustomFieldTableName}{$quote} "; $sql .= "set {$quote}{$valueAttributeColumnName}{$quote} = '{$newValue}' "; $sql .= "where {$quote}{$customFieldTableName}{$quote}.{$baseCustomFieldJoinColumnName} = "; // Not Coding Standard $sql .= "{$quote}{$baseCustomFieldTableName}{$quote}.id "; $sql .= "AND {$quote}{$dataAttributeColumnName}{$quote} = {$customFieldDataId} "; $sql .= "AND {$quote}{$valueAttributeColumnName}{$quote} = '{$oldValue}'"; ZurmoRedBean::exec($sql); }
/** * @depends testGetData */ public function testGetDataFilteredByStatus() { $testTableName = 'testimporttable'; ImportTestHelper::createTempTableByFileNameAndTableName('importTest.csv', $testTableName, true); $config = array('pagination' => array('pageSize' => 99)); $dataProvider = new ImportDataProvider($testTableName, true, $config); $data = $dataProvider->getData(); $this->assertEquals(4, count($data)); ZurmoRedBean::exec("update " . $testTableName . " set status = " . ImportRowDataResultsUtil::ERROR . " where id != 1 limit 1"); //Filter by error status. $dataProvider = new ImportDataProvider($testTableName, true, $config, ImportRowDataResultsUtil::ERROR); $data = $dataProvider->getData(); $this->assertEquals(1, count($data)); //Do without a filter $dataProvider = new ImportDataProvider($testTableName, true, $config); $data = $dataProvider->getData(); $this->assertEquals(4, count($data)); }
public function testRebuilt() { ModelCreationApiSyncUtil::buildTable(); $sql = 'INSERT INTO ' . ModelCreationApiSyncUtil::TABLE_NAME . ' VALUES (null, \'ApiServiceName\', \'1\', \'Contact\', \'2013-05-03 15:16:06\')'; ZurmoRedBean::exec($sql); $apiServiceCreationRow = ZurmoRedBean::getRow('SELECT * FROM ' . ModelCreationApiSyncUtil::TABLE_NAME); $this->assertTrue($apiServiceCreationRow['id'] > 0); $this->assertEquals('ApiServiceName', $apiServiceCreationRow['servicename']); $this->assertEquals(1, $apiServiceCreationRow['modelid']); $this->assertEquals('Contact', $apiServiceCreationRow['modelclassname']); $this->assertEquals('2013-05-03 15:16:06', $apiServiceCreationRow['createddatetime']); // Now test when table already exist ModelCreationApiSyncUtil::buildTable(); $apiServiceCreationRow = ZurmoRedBean::getRow('SELECT COUNT(*) as totalRows FROM ' . ModelCreationApiSyncUtil::TABLE_NAME); $this->assertEquals(1, $apiServiceCreationRow['totalRows']); $sql = 'INSERT INTO ' . ModelCreationApiSyncUtil::TABLE_NAME . ' VALUES (null, \'ApiServiceName\', \'2\', \'Contact\', \'2013-06-03 15:16:06\')'; ZurmoRedBean::exec($sql); $apiServiceCreationRow = ZurmoRedBean::getRow('SELECT COUNT(*) as totalRows FROM ' . ModelCreationApiSyncUtil::TABLE_NAME); $this->assertEquals(2, $apiServiceCreationRow['totalRows']); }
public function testRunDiagnostic() { ZurmoRedBean::exec("SHOW TABLES"); $countBefore = ZurmoRedBean::getCell("SELECT FOUND_ROWS();"); $content = $this->runControllerWithNoExceptionsAndGetContent('configuration/default/runDiagnostic'); $this->assertContains("Failed Required Services", $content); $this->assertContains("<span class=\"fail\">FAIL</span>", $content); $this->assertContains("Zurmo runs only on Apache 2.2.1 and higher or Microsoft-IIS 5.0.0 or higher web servers.", $content); $this->assertContains("\$_SERVER does not have HTTP_HOST, SERVER_NAME, SERVER_PORT, HTTP_ACCEPT, HTTP_USER_AGENT", $content); $criticalFailureCount = substr_count($content, "<span class=\"fail\">FAIL</span>"); $this->assertThat(true, $this->logicalOr($this->equalTo(2, $criticalFailureCount), $this->equalTo(3, $criticalFailureCount))); if ($criticalFailureCount === 3) { $this->assertTrue(strpos($content, "The application.log runtime file is writable.<br />\n" . "The /minScript/cache runtime directory is not writable.<br />\n" . "The debug.php file is present.") !== false || strpos($content, "Host Info/Script Url is incorrectly configured.") !== false); } $this->assertFileExists(realpath(INSTANCE_ROOT . DIRECTORY_SEPARATOR . 'protected' . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'perInstance.php')); $this->assertFileExists(realpath(INSTANCE_ROOT . DIRECTORY_SEPARATOR . 'protected' . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'debug.php')); ZurmoRedBean::exec("SHOW TABLES"); $countAfter = ZurmoRedBean::getCell("SELECT FOUND_ROWS();"); $this->assertEquals($countBefore, $countAfter); }
public function testIsJobInProcessOverThreashold() { Yii::app()->user->userModel = User::getByUsername('super'); $jobInProcess = new JobInProcess(); $jobInProcess->type = 'Test'; $this->assertTrue($jobInProcess->save()); //Set the createdDateTime as way in the past, so that it is over the threshold $sql = "update " . Item::getTableName() . " set createddatetime = '1980-06-03 18:33:03' where id = " . $jobInProcess->getClassId('Item'); ZurmoRedBean::exec($sql); $jobInProcessId = $jobInProcess->id; $jobInProcess->forget(); $jobInProcess = JobInProcess::getById($jobInProcessId); $this->assertTrue(JobsManagerUtil::isJobInProcessOverThreshold($jobInProcess, $jobInProcess->type)); $jobInProcess->delete(); //Test when a job is not over the threshold. $jobInProcess = new JobInProcess(); $jobInProcess->type = 'Test'; $this->assertTrue($jobInProcess->save()); $this->assertFalse(JobsManagerUtil::isJobInProcessOverThreshold($jobInProcess, $jobInProcess->type)); $jobInProcess->delete(); }
/** * @depends testSimpleUserImportWhereAllRowsSucceed */ public function testSimpleUserImportWithRelationsWhereAllRowsSucceed() { Yii::app()->user->userModel = User::getByUsername('super'); //Create account $sampleAccount = Account::getByName('sampleAccount'); $accountId = $sampleAccount[0]->id; //Create Contact $contact = ContactTestHelper::createContactByNameForOwner("My Contact", Yii::app()->user->userModel); $import = new Import(); $serializedData['importRulesType'] = 'Products'; $serializedData['firstRowIsHeaderRow'] = true; $import->serializedData = serialize($serializedData); $this->assertTrue($import->save()); ImportTestHelper::createTempTableByFileNameAndTableName('productsSampleWithRelations.csv', $import->getTempTableName(), true, Yii::getPathOfAlias('application.modules.products.tests.unit.files')); //update the ids of the account column to match the parent account. ZurmoRedBean::exec("update " . $import->getTempTableName() . " set column_9 = " . $contact->id . " where id != 1 limit 3"); $this->assertEquals(3, ImportDatabaseUtil::getCount($import->getTempTableName())); // includes header rows. $currencies = Currency::getAll(); $ownerColumnMappingData = array('attributeIndexOrDerivedType' => 'owner', 'type' => 'importColumn', 'mappingRulesData' => array('DefaultModelNameIdMappingRuleForm' => array('defaultModelId' => null), 'UserValueTypeModelAttributeMappingRuleForm' => array('type' => UserValueTypeModelAttributeMappingRuleForm::ZURMO_USERNAME))); $mappingData = array('column_0' => $ownerColumnMappingData, 'column_1' => ImportMappingUtil::makeStringColumnMappingData('name'), 'column_2' => ImportMappingUtil::makeTextAreaColumnMappingData('description'), 'column_3' => ImportMappingUtil::makeIntegerColumnMappingData('quantity'), 'column_4' => ImportMappingUtil::makeHasOneColumnMappingData('account', RelatedModelValueTypeMappingRuleForm::ZURMO_MODEL_NAME), 'column_5' => ImportMappingUtil::makeStringColumnMappingData('stage'), 'column_6' => ImportMappingUtil::makeCurrencyColumnMappingData('sellPrice', $currencies[0]), 'column_7' => ImportMappingUtil::makeIntegerColumnMappingData('priceFrequency'), 'column_8' => ImportMappingUtil::makeIntegerColumnMappingData('type')); $importRules = ImportRulesUtil::makeImportRulesByType('Products'); $page = 0; $config = array('pagination' => array('pageSize' => 50)); //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, new ExplicitReadWriteModelPermissions(), $messageLogger); $importResultsUtil->processStatusAndMessagesForEachRow(); //Confirm that 3 models where created. $products = Product::getAll(); $this->assertEquals(2, count($products)); $products = Product::getByName('A Bend in the River November Issue import'); $this->assertEquals(1, count($products)); $this->assertEquals('super', $products[0]->owner->username); $this->assertEquals('A Bend in the River November Issue import', $products[0]->name); $this->assertEquals(6, $products[0]->quantity); $this->assertEquals('sampleAccount', $products[0]->account->name); $this->assertEquals('Open', $products[0]->stage->value); $this->assertEquals('Test Desc', $products[0]->description); $this->assertEquals(210, $products[0]->sellPrice->value); $this->assertEquals(2, $products[0]->priceFrequency); $this->assertEquals(2, $products[0]->type); //$this->assertEquals('My Contact', $products[0]->contact->firstName); $products = Product::getByName('A Bend in the River November Issue import copy'); $this->assertEquals(1, count($products)); $this->assertEquals('super', $products[0]->owner->username); $this->assertEquals('A Bend in the River November Issue import copy', $products[0]->name); $this->assertEquals(6, $products[0]->quantity); $this->assertEquals('sampleAccount', $products[0]->account->name); $this->assertEquals('Open', $products[0]->stage->value); $this->assertEquals('Test Desc 1', $products[0]->description); $this->assertEquals(210, $products[0]->sellPrice->value); $this->assertEquals(2, $products[0]->priceFrequency); $this->assertEquals(2, $products[0]->type); //$this->assertEquals('My Contact', $products[0]->contact->firstName); //Confirm that 2 rows were processed as 'updated'. $this->assertEquals(0, ImportDatabaseUtil::getCount($import->getTempTableName(), "status = " . ImportRowDataResultsUtil::UPDATED)); //Confirm 2 rows were processed as 'errors'. $this->assertEquals(0, ImportDatabaseUtil::getCount($import->getTempTableName(), "status = " . ImportRowDataResultsUtil::ERROR)); $beansWithErrors = ImportDatabaseUtil::getSubset($import->getTempTableName(), "status = " . ImportRowDataResultsUtil::ERROR); $this->assertEquals(0, count($beansWithErrors)); }
/** * @param int $modelId * @param string $modelClassName */ protected static function deleteOnlyModelToReadSubscriptionTableByModelIdAndModelClassName($modelId, $modelClassName) { assert('is_int($modelId)'); assert('is_string($modelClassName)'); $updateStartTimestamp = time(); $updateDateTime = DateTimeUtil::convertTimestampToDbFormatDateTime($updateStartTimestamp); $tableName = static::getSubscriptionTableName($modelClassName); $sql = "UPDATE {$tableName} set\n subscriptiontype='" . self::TYPE_DELETE . "', modifieddatetime='" . $updateDateTime . "'\n WHERE\n modelid = '{$modelId}'\n AND subscriptiontype='" . self::TYPE_ADD . "'"; ZurmoRedBean::exec($sql); }
/** * There is a special way you can import rateToBase and currencyCode for an amount attribute. * if the column data is formatted like: $54.67__1.2__USD then it will split the column and properly * handle rate and currency code. Eventually this will be exposed in the user interface */ public function testImportWithRateAndCurrencyCodeSpecified() { Yii::app()->user->userModel = User::getByUsername('super'); $account = AccountTestHelper::createAccountByNameForOwner('Account', Yii::app()->user->userModel); $accountId = $account->id; $contracts = Contract::getAll(); $this->assertEquals(0, count($contracts)); $import = new Import(); $serializedData['importRulesType'] = 'Contracts'; $serializedData['firstRowIsHeaderRow'] = true; $import->serializedData = serialize($serializedData); $this->assertTrue($import->save()); ImportTestHelper::createTempTableByFileNameAndTableName('importTestIncludingRateAndCurrencyCode.csv', $import->getTempTableName(), true, Yii::getPathOfAlias('application.modules.contracts.tests.unit.files')); //update the ids of the account column to match the parent account. ZurmoRedBean::exec("update " . $import->getTempTableName() . " set column_3 = " . $account->id . " where id != 1 limit 4"); $this->assertEquals(4, ImportDatabaseUtil::getCount($import->getTempTableName())); // includes header rows. $currency = Currency::getByCode(Yii::app()->currencyHelper->getBaseCode()); $mappingData = array('column_0' => ImportMappingUtil::makeStringColumnMappingData('name'), 'column_1' => ImportMappingUtil::makeDateColumnMappingData('closeDate'), 'column_2' => ImportMappingUtil::makeIntegerColumnMappingData('description'), 'column_3' => ImportMappingUtil::makeHasOneColumnMappingData('account'), 'column_4' => ImportMappingUtil::makeDropDownColumnMappingData('stage'), 'column_5' => ImportMappingUtil::makeDropDownColumnMappingData('source'), 'column_6' => ImportMappingUtil::makeCurrencyColumnMappingData('amount', $currency)); $importRules = ImportRulesUtil::makeImportRulesByType('Contracts'); $page = 0; $config = array('pagination' => array('pageSize' => 50)); //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, new ExplicitReadWriteModelPermissions(), $messageLogger); $importResultsUtil->processStatusAndMessagesForEachRow(); //Confirm that 3 models where created. $contracts = Contract::getAll(); $this->assertEquals(3, count($contracts)); $contracts = Contract::getByName('opp1'); $this->assertEquals(1, count($contracts[0])); $this->assertEquals('opp1', $contracts[0]->name); $this->assertEquals('1980-06-03', $contracts[0]->closeDate); $this->assertEquals(10, $contracts[0]->probability); $this->assertEquals('desc1', $contracts[0]->description); $this->assertTrue($contracts[0]->account->isSame($account)); $this->assertEquals('Prospecting', $contracts[0]->stage->value); $this->assertEquals('Self-Generated', $contracts[0]->source->value); $this->assertEquals(500, $contracts[0]->amount->value); $this->assertEquals(1, $contracts[0]->amount->rateToBase); $this->assertEquals('USD', $contracts[0]->amount->currency->code); $contracts = Contract::getByName('opp2'); $this->assertEquals(1, count($contracts[0])); $this->assertEquals('opp2', $contracts[0]->name); $this->assertEquals('1980-06-04', $contracts[0]->closeDate); $this->assertEquals(25, $contracts[0]->probability); $this->assertEquals('desc2', $contracts[0]->description); $this->assertTrue($contracts[0]->account->isSame($account)); $this->assertEquals('Qualification', $contracts[0]->stage->value); $this->assertEquals('Inbound Call', $contracts[0]->source->value); $this->assertEquals(501, $contracts[0]->amount->value); // $this->assertEquals(2.7, $contracts[0]->amount->rateToBase); $this->assertEquals('GBP', $contracts[0]->amount->currency->code); $contracts = Contract::getByName('opp3'); $this->assertEquals(1, count($contracts[0])); $this->assertEquals('opp3', $contracts[0]->name); $this->assertEquals('1980-06-05', $contracts[0]->closeDate); $this->assertEquals(50, $contracts[0]->probability); $this->assertEquals('desc3', $contracts[0]->description); $this->assertTrue($contracts[0]->account->isSame($account)); $this->assertEquals('Negotiating', $contracts[0]->stage->value); $this->assertEquals('Tradeshow', $contracts[0]->source->value); $this->assertEquals(502, $contracts[0]->amount->value); // $this->assertEquals(3.2, $contracts[0]->amount->rateToBase); $this->assertEquals('EUR', $contracts[0]->amount->currency->code); //Confirm 10 rows were processed as 'created'. $this->assertEquals(3, ImportDatabaseUtil::getCount($import->getTempTableName(), "status = " . ImportRowDataResultsUtil::CREATED)); //Confirm that 0 rows were processed as 'updated'. $this->assertEquals(0, ImportDatabaseUtil::getCount($import->getTempTableName(), "status = " . ImportRowDataResultsUtil::UPDATED)); //Confirm 2 rows were processed as 'errors'. $this->assertEquals(0, ImportDatabaseUtil::getCount($import->getTempTableName(), "status = " . ImportRowDataResultsUtil::ERROR)); $beansWithErrors = ImportDatabaseUtil::getSubset($import->getTempTableName(), "status = " . ImportRowDataResultsUtil::ERROR); $this->assertEquals(0, count($beansWithErrors)); //test the account has 3 contracts $account->forget(); $account = Account::getById($accountId); $this->assertEquals(3, $account->contracts->count()); }
public function testSanitizeValueBySanitizerTypesForUserTypeThatIsRequired() { $billy = UserTestHelper::createBasicUser('billy'); $jimmy = UserTestHelper::createBasicUser('jimmy'); $sally = UserTestHelper::createBasicUser('sally'); //Update the external system id. ExternalSystemIdUtil::addExternalIdColumnIfMissing(User::getTableName()); $externalSystemIdColumnName = ExternalSystemIdUtil::EXTERNAL_SYSTEM_ID_COLUMN_NAME; ZurmoRedBean::exec("update " . User::getTableName() . " set {$externalSystemIdColumnName} = 'K' where id = {$jimmy->id}"); //Test a required user with no value or default value. $importSanitizeResultsUtil = new ImportSanitizeResultsUtil(); $columnMappingData = array('type' => 'importColumn', 'mappingRulesData' => array('DefaultModelNameIdMappingRuleForm' => array('defaultModelId' => null), 'UserValueTypeModelAttributeMappingRuleForm' => array('type' => UserValueTypeModelAttributeMappingRuleForm::ZURMO_USER_ID))); $sanitizerUtilTypes = UserAttributeImportRules::getSanitizerUtilTypesInProcessingOrder(); $sanitizedValue = ImportSanitizerUtil::sanitizeValueBySanitizerTypes($sanitizerUtilTypes, 'ImportModelTestItem', 'owner', null, 'column_0', $columnMappingData, $importSanitizeResultsUtil); $this->assertNull($sanitizedValue); $this->assertFalse($importSanitizeResultsUtil->shouldSaveModel()); $messages = $importSanitizeResultsUtil->getMessages(); $this->assertEquals(1, count($messages)); $compareMessage = 'Import - Owner Id is required and was not specified.'; $this->assertEquals($compareMessage, $messages[0]); //Test a required string with no value, but a valid default value, a user id. $importSanitizeResultsUtil = new ImportSanitizeResultsUtil(); $columnMappingData = array('type' => 'importColumn', 'mappingRulesData' => array('DefaultModelNameIdMappingRuleForm' => array('defaultModelId' => $billy->id), 'UserValueTypeModelAttributeMappingRuleForm' => array('type' => UserValueTypeModelAttributeMappingRuleForm::ZURMO_USER_ID))); $sanitizerUtilTypes = UserAttributeImportRules::getSanitizerUtilTypesInProcessingOrder(); $sanitizedValue = ImportSanitizerUtil::sanitizeValueBySanitizerTypes($sanitizerUtilTypes, 'ImportModelTestItem', 'owner', null, 'column_0', $columnMappingData, $importSanitizeResultsUtil); $this->assertEquals($billy, $sanitizedValue); $this->assertTrue($importSanitizeResultsUtil->shouldSaveModel()); $messages = $importSanitizeResultsUtil->getMessages(); $this->assertEquals(0, count($messages)); //Test a required string with a valid user id. $importSanitizeResultsUtil = new ImportSanitizeResultsUtil(); $columnMappingData = array('type' => 'importColumn', 'mappingRulesData' => array('DefaultModelNameIdMappingRuleForm' => array('defaultModelId' => null), 'UserValueTypeModelAttributeMappingRuleForm' => array('type' => UserValueTypeModelAttributeMappingRuleForm::ZURMO_USER_ID))); $sanitizerUtilTypes = UserAttributeImportRules::getSanitizerUtilTypesInProcessingOrder(); $sanitizedValue = ImportSanitizerUtil::sanitizeValueBySanitizerTypes($sanitizerUtilTypes, 'ImportModelTestItem', 'owner', $billy->id, 'column_0', $columnMappingData, $importSanitizeResultsUtil); $this->assertEquals($billy, $sanitizedValue); $this->assertTrue($importSanitizeResultsUtil->shouldSaveModel()); $messages = $importSanitizeResultsUtil->getMessages(); $this->assertEquals(0, count($messages)); //Test a required string with a valid external system user id. $importSanitizeResultsUtil = new ImportSanitizeResultsUtil(); $columnMappingData = array('type' => 'importColumn', 'mappingRulesData' => array('DefaultModelNameIdMappingRuleForm' => array('defaultModelId' => null), 'UserValueTypeModelAttributeMappingRuleForm' => array('type' => UserValueTypeModelAttributeMappingRuleForm::EXTERNAL_SYSTEM_USER_ID))); $sanitizerUtilTypes = UserAttributeImportRules::getSanitizerUtilTypesInProcessingOrder(); $sanitizedValue = ImportSanitizerUtil::sanitizeValueBySanitizerTypes($sanitizerUtilTypes, 'ImportModelTestItem', 'owner', 'K', 'column_0', $columnMappingData, $importSanitizeResultsUtil); $this->assertEquals($jimmy, $sanitizedValue); $this->assertTrue($importSanitizeResultsUtil->shouldSaveModel()); $messages = $importSanitizeResultsUtil->getMessages(); $this->assertEquals(0, count($messages)); //Test a required string with a valid username. $importSanitizeResultsUtil = new ImportSanitizeResultsUtil(); $columnMappingData = array('type' => 'importColumn', 'mappingRulesData' => array('DefaultModelNameIdMappingRuleForm' => array('defaultModelId' => null), 'UserValueTypeModelAttributeMappingRuleForm' => array('type' => UserValueTypeModelAttributeMappingRuleForm::ZURMO_USERNAME))); $sanitizerUtilTypes = UserAttributeImportRules::getSanitizerUtilTypesInProcessingOrder(); $sanitizedValue = ImportSanitizerUtil::sanitizeValueBySanitizerTypes($sanitizerUtilTypes, 'ImportModelTestItem', 'owner', 'sally', 'column_0', $columnMappingData, $importSanitizeResultsUtil); $this->assertEquals($sally, $sanitizedValue); $this->assertTrue($importSanitizeResultsUtil->shouldSaveModel()); $messages = $importSanitizeResultsUtil->getMessages(); $this->assertEquals(0, count($messages)); }
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) { $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)"; ZurmoRedBean::exec($sql, array('data' => serialize($data))) !== null; $saved = true; } return $saved; }
/** * Single sql query to improve performance */ protected static function updateUnprocessedJobLogsWithoutErrors() { $sql = 'update joblog set isprocessed = 1 where joblog.isprocessed = 0'; ZurmoRedBean::exec($sql); }
/** * Update an email message's folder and save it using SQL * @param EmailMessage $emailMessage * @param EmailFolder $folder * @throws NotSupportedException */ protected static function updateFolderForEmailMessageWithSQL(EmailMessage &$emailMessage, EmailFolder $folder) { // TODO: @Shoaibi/@Jason: Critical0: This fails CampaignItemsUtilTest.php:243 $folderForeignKeyName = RedBeanModel::getForeignKeyName('EmailMessage', 'folder'); $tableName = EmailMessage::getTableName(); $sql = "UPDATE " . DatabaseCompatibilityUtil::quoteString($tableName); $sql .= " SET " . DatabaseCompatibilityUtil::quoteString($folderForeignKeyName); $sql .= " = " . $folder->id; $sql .= " WHERE " . DatabaseCompatibilityUtil::quoteString('id') . " = " . $emailMessage->id; $effectedRows = ZurmoRedBean::exec($sql); if ($effectedRows == 1) { $emailMessageId = $emailMessage->id; $emailMessage->forgetAll(); $emailMessage = EmailMessage::getById($emailMessageId); return true; } return false; }
/** * Cleanup models and read permission tables * @param $modelClassName */ protected function deleteAllModelsAndRecordsFromReadPermissionTable($modelClassName) { $models = $modelClassName::getAll(); foreach ($models as $model) { $model->delete(); } $tableName = ReadPermissionsSubscriptionUtil::getSubscriptionTableName($modelClassName); $sql = "DELETE FROM {$tableName}"; ZurmoRedBean::exec($sql); $tableName = ReadPermissionsSubscriptionUtil::getAccountSubscriptionTempBuildTableName($modelClassName); $sql = "DELETE FROM {$tableName}"; ZurmoRedBean::exec($sql); }
/** * @depends testParentAccountHasCorrectAttributeImportType */ public function testSimpleUserImportWhereAllRowsSucceed() { Yii::app()->user->userModel = User::getByUsername('super'); $parentAccount = AccountTestHelper::createAccountByNameForOwner('parentAccount', Yii::app()->user->userModel); $parentAccountId = $parentAccount->id; $accounts = Account::getAll(); $this->assertEquals(1, count($accounts)); $import = new Import(); $serializedData['importRulesType'] = 'Accounts'; $serializedData['firstRowIsHeaderRow'] = true; $import->serializedData = serialize($serializedData); $this->assertTrue($import->save()); ImportTestHelper::createTempTableByFileNameAndTableName('importTest.csv', $import->getTempTableName(), true, Yii::getPathOfAlias('application.modules.accounts.tests.unit.files')); //update the ids of the account column to match the parent account. ZurmoRedBean::exec("update " . $import->getTempTableName() . " set column_16 = " . $parentAccount->id . " where id != 1 limit 4"); $this->assertEquals(4, ImportDatabaseUtil::getCount($import->getTempTableName())); // includes header rows. $mappingData = array('column_0' => ImportMappingUtil::makeStringColumnMappingData('name'), 'column_1' => ImportMappingUtil::makeStringColumnMappingData('officePhone'), 'column_2' => ImportMappingUtil::makeStringColumnMappingData('officeFax'), 'column_3' => ImportMappingUtil::makeIntegerColumnMappingData('employees'), 'column_4' => ImportMappingUtil::makeUrlColumnMappingData('website'), 'column_5' => ImportMappingUtil::makeFloatColumnMappingData('annualRevenue'), 'column_6' => ImportMappingUtil::makeTextAreaColumnMappingData('description'), 'column_7' => ImportMappingUtil::makeStringColumnMappingData('billingAddress__city'), 'column_8' => ImportMappingUtil::makeStringColumnMappingData('billingAddress__country'), 'column_9' => ImportMappingUtil::makeStringColumnMappingData('billingAddress__postalCode'), 'column_10' => ImportMappingUtil::makeStringColumnMappingData('billingAddress__state'), 'column_11' => ImportMappingUtil::makeStringColumnMappingData('billingAddress__street1'), 'column_12' => ImportMappingUtil::makeStringColumnMappingData('billingAddress__street2'), 'column_13' => ImportMappingUtil::makeEmailColumnMappingData('primaryEmail__emailAddress'), 'column_14' => ImportMappingUtil::makeBooleanColumnMappingData('primaryEmail__isInvalid'), 'column_15' => ImportMappingUtil::makeBooleanColumnMappingData('primaryEmail__optOut'), 'column_16' => ImportMappingUtil::makeHasOneColumnMappingData('account'), 'column_17' => ImportMappingUtil::makeDropDownColumnMappingData('industry'), 'column_18' => ImportMappingUtil::makeDropDownColumnMappingData('type')); $importRules = ImportRulesUtil::makeImportRulesByType('Accounts'); $page = 0; $config = array('pagination' => array('pageSize' => 50)); //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, new ExplicitReadWriteModelPermissions(), $messageLogger); $importResultsUtil->processStatusAndMessagesForEachRow(); //Confirm that 3 models where created. $accounts = Account::getAll(); $this->assertEquals(4, count($accounts)); $accounts = Account::getByName('account1'); $this->assertEquals(1, count($accounts[0])); $this->assertEquals(123456, $accounts[0]->officePhone); $this->assertEquals(555, $accounts[0]->officeFax); $this->assertEquals(1, $accounts[0]->employees); $this->assertEquals('http://www.account1.com', $accounts[0]->website); $this->assertEquals(100, $accounts[0]->annualRevenue); $this->assertEquals('desc1', $accounts[0]->description); $this->assertEquals('city1', $accounts[0]->billingAddress->city); $this->assertEquals('country1', $accounts[0]->billingAddress->country); $this->assertEquals('postal1', $accounts[0]->billingAddress->postalCode); $this->assertEquals('state1', $accounts[0]->billingAddress->state); $this->assertEquals('street11', $accounts[0]->billingAddress->street1); $this->assertEquals('street21', $accounts[0]->billingAddress->street2); $this->assertEquals('*****@*****.**', $accounts[0]->primaryEmail->emailAddress); $this->assertEquals(null, $accounts[0]->primaryEmail->isInvalid); $this->assertEquals(null, $accounts[0]->primaryEmail->optOut); $this->assertTrue($accounts[0]->account->isSame($parentAccount)); $this->assertEquals('Automotive', $accounts[0]->industry->value); $this->assertEquals('Prospect', $accounts[0]->type->value); $accounts = Account::getByName('account2'); $this->assertEquals(1, count($accounts[0])); $this->assertEquals(223456, $accounts[0]->officePhone); $this->assertEquals(666, $accounts[0]->officeFax); $this->assertEquals(2, $accounts[0]->employees); $this->assertEquals('http://www.account2.com', $accounts[0]->website); $this->assertEquals(200, $accounts[0]->annualRevenue); $this->assertEquals('desc2', $accounts[0]->description); $this->assertEquals('city2', $accounts[0]->billingAddress->city); $this->assertEquals('country2', $accounts[0]->billingAddress->country); $this->assertEquals('postal2', $accounts[0]->billingAddress->postalCode); $this->assertEquals('state2', $accounts[0]->billingAddress->state); $this->assertEquals('street12', $accounts[0]->billingAddress->street1); $this->assertEquals('street22', $accounts[0]->billingAddress->street2); $this->assertEquals('*****@*****.**', $accounts[0]->primaryEmail->emailAddress); $this->assertEquals('1', $accounts[0]->primaryEmail->isInvalid); $this->assertEquals('1', $accounts[0]->primaryEmail->optOut); $this->assertTrue($accounts[0]->account->isSame($parentAccount)); $this->assertEquals('Banking', $accounts[0]->industry->value); $this->assertEquals('Customer', $accounts[0]->type->value); $accounts = Account::getByName('account3'); $this->assertEquals(1, count($accounts[0])); $this->assertEquals(323456, $accounts[0]->officePhone); $this->assertEquals(777, $accounts[0]->officeFax); $this->assertEquals(3, $accounts[0]->employees); $this->assertEquals('http://www.account3.com', $accounts[0]->website); $this->assertEquals(300, $accounts[0]->annualRevenue); $this->assertEquals('desc3', $accounts[0]->description); $this->assertEquals('city3', $accounts[0]->billingAddress->city); $this->assertEquals('country3', $accounts[0]->billingAddress->country); $this->assertEquals('postal3', $accounts[0]->billingAddress->postalCode); $this->assertEquals('state3', $accounts[0]->billingAddress->state); $this->assertEquals('street13', $accounts[0]->billingAddress->street1); $this->assertEquals('street23', $accounts[0]->billingAddress->street2); $this->assertEquals('*****@*****.**', $accounts[0]->primaryEmail->emailAddress); $this->assertEquals(null, $accounts[0]->primaryEmail->isInvalid); $this->assertEquals(null, $accounts[0]->primaryEmail->optOut); $this->assertTrue($accounts[0]->account->isSame($parentAccount)); $this->assertEquals('Energy', $accounts[0]->industry->value); $this->assertEquals('Vendor', $accounts[0]->type->value); //Confirm 10 rows were processed as 'created'. $this->assertEquals(3, ImportDatabaseUtil::getCount($import->getTempTableName(), "status = " . ImportRowDataResultsUtil::CREATED)); //Confirm that 0 rows were processed as 'updated'. $this->assertEquals(0, ImportDatabaseUtil::getCount($import->getTempTableName(), "status = " . ImportRowDataResultsUtil::UPDATED)); //Confirm 2 rows were processed as 'errors'. $this->assertEquals(0, ImportDatabaseUtil::getCount($import->getTempTableName(), "status = " . ImportRowDataResultsUtil::ERROR)); $beansWithErrors = ImportDatabaseUtil::getSubset($import->getTempTableName(), "status = " . ImportRowDataResultsUtil::ERROR); $this->assertEquals(0, count($beansWithErrors)); //test the parent account has 3 children $parentAccount->forget(); $parentAccount = Account::getById($parentAccountId); $this->assertEquals(3, $parentAccount->accounts->count()); }
public static function removeAllForPermitable(Permitable $permitable) { ZurmoRedBean::exec("delete from policy where permitable_id = :id;", array('id' => $permitable->getClassId('Permitable'))); }
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']); }
public static function dropStoredFunctionsAndProcedures() { assert('RedBeanDatabase::isSetup()'); if (RedBeanDatabase::getDatabaseType() == 'mysql') { try { $rows = ZurmoRedBean::getAll("select routine_name, routine_type from information_schema.routines;"); foreach ($rows as $row) { ZurmoRedBean::exec("drop {$row['routine_type']} if exists {$row['routine_name']}"); } } catch (Exception $e) { if (isset($row)) { echo "Failed to drop {$row['routine_type']} {$row['routine_name']}.\n"; } throw $e; } if (YII_DEBUG) { ZurmoRedBean::exec("drop procedure if exists write_log"); } } else { throw new NotSupportedException(); } }
/** * Delete item from modelcreationapisync table * @param $serviceName * @param $modelId * @param $modelClassName */ public static function deleteItem($serviceName, $modelId, $modelClassName) { $sql = "DELETE FROM " . self::TABLE_NAME . " where servicename = '{$serviceName}'" . " AND modelid = '{$modelId}'" . " AND modelclassname = '{$modelClassName}'"; ZurmoRedBean::exec($sql); }
public function testGetUsersByPartialFullNameWithAutoCompleteOptionsAsExcludeRootUsers() { UserTestHelper::createBasicUser('Root'); ZurmoRedBean::exec('UPDATE _user SET isrootuser=1 WHERE username="******";'); // Not Coding Standard $users = UserSearch::getUsersByPartialFullName('Root', 5); $this->assertEquals(1, count($users)); $autoCompleteOptions = ArrayUtil::encodeAutoCompleteOptionsArray(array('excludeRootUsers' => true)); $users = UserSearch::getUsersByPartialFullName('Root', 5, $autoCompleteOptions); $this->assertEquals(0, count($users)); }