public function testSimpleUserImportWhereAllRowsSucceed() { Yii::app()->user->userModel = User::getByUsername('super'); $tasks = Task::getAll(); $this->assertEquals(0, count($tasks)); $import = new Import(); $serializedData['importRulesType'] = 'Tasks'; $serializedData['firstRowIsHeaderRow'] = true; $import->serializedData = serialize($serializedData); $this->assertTrue($import->save()); ImportTestHelper::createTempTableByFileNameAndTableName('simpleImportTest.csv', $import->getTempTableName(), Yii::getPathOfAlias('application.modules.tasks.tests.unit.files')); $this->assertEquals(4, ImportDatabaseUtil::getCount($import->getTempTableName())); // includes header rows. $mappingData = array('column_0' => ImportMappingUtil::makeStringColumnMappingData('name'), 'column_1' => ImportMappingUtil::makeDateTimeColumnMappingData('dueDateTime'), 'column_2' => ImportMappingUtil::makeDateTimeColumnMappingData('completedDateTime'), 'column_3' => ImportMappingUtil::makeBooleanColumnMappingData('completed'), 'column_4' => ImportMappingUtil::makeModelDerivedColumnMappingData('AccountDerived'), 'column_5' => ImportMappingUtil::makeModelDerivedColumnMappingData('ContactDerived'), 'column_6' => ImportMappingUtil::makeModelDerivedColumnMappingData('OpportunityDerived'), 'column_7' => ImportMappingUtil::makeTextAreaColumnMappingData('description')); $importRules = ImportRulesUtil::makeImportRulesByType('Tasks'); $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); $actionDateTime = substr(DateTimeUtil::convertTimestampToDbFormatDateTime(time()), 0, -3); $messageLogger = new ImportMessageLogger(); ImportUtil::importByDataProvider($dataProvider, $importRules, $mappingData, $importResultsUtil, new ExplicitReadWriteModelPermissions(), $messageLogger); $importResultsUtil->processStatusAndMessagesForEachRow(); //Confirm that 3 models where created. $tasks = Task::getAll(); $this->assertEquals(3, count($tasks)); $tasks = Task::getByName('task1'); $this->assertEquals(1, count($tasks[0])); $this->assertEquals(1, count($tasks[0]->activityItems)); $this->assertEquals('testAccount', $tasks[0]->activityItems[0]->name); $this->assertEquals('Account', get_class($tasks[0]->activityItems[0])); $this->assertNull($tasks[0]->completed); $this->assertEquals($actionDateTime, substr($tasks[0]->latestDateTime, 0, -3)); $tasks = Task::getByName('task2'); $this->assertEquals(1, count($tasks[0])); $this->assertEquals(1, count($tasks[0]->activityItems)); $this->assertEquals('testContact', $tasks[0]->activityItems[0]->firstName); $this->assertEquals('Contact', get_class($tasks[0]->activityItems[0])); $this->assertEquals(1, $tasks[0]->completed); $this->assertEquals('2011-12-22 06:03', substr($tasks[0]->latestDateTime, 0, -3)); $tasks = Task::getByName('task3'); $this->assertEquals(1, count($tasks[0])); $this->assertEquals(1, count($tasks[0]->activityItems)); $this->assertEquals('testOpportunity', $tasks[0]->activityItems[0]->name); $this->assertEquals('Opportunity', get_class($tasks[0]->activityItems[0])); $this->assertNull($tasks[0]->completed); $this->assertEquals($actionDateTime, substr($tasks[0]->latestDateTime, 0, -3)); //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)); }
public function testImportDataAnalysisResults() { $super = User::getByUsername('super'); Yii::app()->user->userModel = $super; $import = new Import(); $serializedData['importRulesType'] = 'Tasks'; $import->serializedData = serialize($serializedData); $this->assertTrue($import->save()); $accountTableName = Account::getTableName('Account'); $contactTableName = Contact::getTableName('Contact'); $opportunityTableName = Opportunity::getTableName('Opportunity'); $account1 = AccountTestHelper::createAccountByNameForOwner('account1', $super); $account2 = AccountTestHelper::createAccountByNameForOwner('account2', $super); $account3 = AccountTestHelper::createAccountByNameForOwner('account3', $super); $contact1 = ContactTestHelper::createContactByNameForOwner('contact1', $super); $contact2 = ContactTestHelper::createContactByNameForOwner('contact2', $super); $contact3 = ContactTestHelper::createContactByNameForOwner('contact3', $super); $opportunity1 = OpportunityTestHelper::createOpportunityByNameForOwner('opportunity1', $super); $opportunity2 = OpportunityTestHelper::createOpportunityByNameForOwner('opportunity2', $super); $opportunity3 = OpportunityTestHelper::createOpportunityByNameForOwner('opportunity3', $super); //Make models externally linked for testing. ImportTestHelper::updateModelsExternalId($account2, 'ACC'); ImportTestHelper::updateModelsExternalId($contact2, 'CON'); ImportTestHelper::updateModelsExternalId($opportunity2, 'OPP'); ImportTestHelper::createTempTableByFileNameAndTableName('importAnalyzerTest.csv', $import->getTempTableName(), Yii::getPathOfAlias('application.modules.tasks.tests.unit.files')); R::exec("update " . $import->getTempTableName() . " set column_0 = " . $account3->id . " where id != 1 limit 3"); R::exec("update " . $import->getTempTableName() . " set column_2 = " . $contact3->id . " where id != 1 limit 4"); R::exec("update " . $import->getTempTableName() . " set column_4 = " . $opportunity3->id . " where id != 1 limit 5"); $mappingData = array('column_0' => ImportMappingUtil::makeModelDerivedColumnMappingData('AccountDerived', IdValueTypeMappingRuleForm::ZURMO_MODEL_ID), 'column_1' => ImportMappingUtil::makeModelDerivedColumnMappingData('AccountDerived'), 'column_2' => ImportMappingUtil::makeModelDerivedColumnMappingData('ContactDerived', IdValueTypeMappingRuleForm::ZURMO_MODEL_ID), 'column_3' => ImportMappingUtil::makeModelDerivedColumnMappingData('ContactDerived'), 'column_4' => ImportMappingUtil::makeModelDerivedColumnMappingData('OpportunityDerived', IdValueTypeMappingRuleForm::ZURMO_MODEL_ID), 'column_5' => ImportMappingUtil::makeModelDerivedColumnMappingData('OpportunityDerived')); $serializedData = unserialize($import->serializedData); $serializedData['mappingData'] = $mappingData; $import->serializedData = serialize($serializedData); $this->assertTrue($import->save()); $importRules = ImportRulesUtil::makeImportRulesByType('Tasks'); $config = array('pagination' => array('pageSize' => 2)); //This test csv has a header row. $dataProvider = new ImportDataProvider($import->getTempTableName(), true, $config); //Run data analyzer $importDataAnalyzer = new ImportDataAnalyzer($importRules, $dataProvider); foreach ($mappingData as $columnName => $columnMappingData) { $importDataAnalyzer->analyzeByColumnNameAndColumnMappingData($columnName, $columnMappingData); } $messagesData = $importDataAnalyzer->getMessagesData(); $compareData = array('column_0' => array(array('message' => '3 record(s) will be updated and 7 record(s) will be skipped during import.', 'sanitizerUtilType' => 'AccountDerivedIdValueType', 'moreAvailable' => false)), 'column_1' => array(array('message' => '3 record(s) will be updated and 7 record(s) will be skipped during import.', 'sanitizerUtilType' => 'AccountDerivedIdValueType', 'moreAvailable' => false)), 'column_2' => array(array('message' => '4 record(s) will be updated and 6 record(s) will be skipped during import.', 'sanitizerUtilType' => 'ContactDerivedIdValueType', 'moreAvailable' => false)), 'column_3' => array(array('message' => '3 record(s) will be updated and 7 record(s) will be skipped during import.', 'sanitizerUtilType' => 'ContactDerivedIdValueType', 'moreAvailable' => false)), 'column_4' => array(array('message' => '5 record(s) will be updated and 5 record(s) will be skipped during import.', 'sanitizerUtilType' => 'OpportunityDerivedIdValueType', 'moreAvailable' => false)), 'column_5' => array(array('message' => '3 record(s) will be updated and 7 record(s) will be skipped during import.', 'sanitizerUtilType' => 'OpportunityDerivedIdValueType', 'moreAvailable' => false))); $this->assertEquals($compareData, $messagesData); $importInstructionsData = $importDataAnalyzer->getImportInstructionsData(); $compareInstructionsData = array(); $this->assertEquals($compareInstructionsData, $importInstructionsData); }
public function testImportDataAnalysisResults() { $super = User::getByUsername('super'); Yii::app()->user->userModel = $super; $import = new Import(); $serializedData['importRulesType'] = 'Tasks'; $import->serializedData = serialize($serializedData); $this->assertTrue($import->save()); $account1 = AccountTestHelper::createAccountByNameForOwner('account1', $super); $account2 = AccountTestHelper::createAccountByNameForOwner('account2', $super); $account3 = AccountTestHelper::createAccountByNameForOwner('account3', $super); $contact1 = ContactTestHelper::createContactByNameForOwner('contact1', $super); $contact2 = ContactTestHelper::createContactByNameForOwner('contact2', $super); $contact3 = ContactTestHelper::createContactByNameForOwner('contact3', $super); $opportunity1 = OpportunityTestHelper::createOpportunityByNameForOwner('opportunity1', $super); $opportunity2 = OpportunityTestHelper::createOpportunityByNameForOwner('opportunity2', $super); $opportunity3 = OpportunityTestHelper::createOpportunityByNameForOwner('opportunity3', $super); //Make models externally linked for testing. ImportTestHelper::updateModelsExternalId($account2, 'ACC'); ImportTestHelper::updateModelsExternalId($contact2, 'CON'); ImportTestHelper::updateModelsExternalId($opportunity2, 'OPP'); ImportTestHelper::createTempTableByFileNameAndTableName('importAnalyzerTest.csv', $import->getTempTableName(), true, Yii::getPathOfAlias('application.modules.tasks.tests.unit.files')); ZurmoRedBean::exec("update " . $import->getTempTableName() . " set column_0 = " . $account3->id . " where id != 1 limit 3"); ZurmoRedBean::exec("update " . $import->getTempTableName() . " set column_2 = " . $contact3->id . " where id != 1 limit 4"); ZurmoRedBean::exec("update " . $import->getTempTableName() . " set column_4 = " . $opportunity3->id . " where id != 1 limit 5"); $mappingData = array('column_0' => ImportMappingUtil::makeModelDerivedColumnMappingData('AccountDerived', IdValueTypeMappingRuleForm::ZURMO_MODEL_ID), 'column_1' => ImportMappingUtil::makeModelDerivedColumnMappingData('AccountDerived'), 'column_2' => ImportMappingUtil::makeModelDerivedColumnMappingData('ContactDerived', IdValueTypeMappingRuleForm::ZURMO_MODEL_ID), 'column_3' => ImportMappingUtil::makeModelDerivedColumnMappingData('ContactDerived'), 'column_4' => ImportMappingUtil::makeModelDerivedColumnMappingData('OpportunityDerived', IdValueTypeMappingRuleForm::ZURMO_MODEL_ID), 'column_5' => ImportMappingUtil::makeModelDerivedColumnMappingData('OpportunityDerived'), 'column_6' => ImportMappingUtil::makeIntegerColumnMappingData('status')); $serializedData = unserialize($import->serializedData); $serializedData['mappingData'] = $mappingData; $import->serializedData = serialize($serializedData); $this->assertTrue($import->save()); $importRules = ImportRulesUtil::makeImportRulesByType('Tasks'); $config = array('pagination' => array('pageSize' => 15)); //This test csv has a header row. $dataProvider = new ImportDataProvider($import->getTempTableName(), true, $config); //Run data analyzer $importDataAnalyzer = new ImportDataAnalyzer($importRules, $dataProvider, $mappingData, array('column_0', 'column_1', 'column_2', 'column_3', 'column_4', 'column_5', 'column_6')); $importDataAnalyzer->analyzePage(); $data = $dataProvider->getData(); $this->assertEquals(10, count($data)); $compareData = array(); $compareData['column_0'][] = 'Is an existing record and will be updated.'; $compareData['column_1'][] = 'Was not found and this row will be skipped during import.'; $compareData['column_2'][] = 'Is an existing record and will be updated.'; $compareData['column_3'][] = 'Was not found and this row will be skipped during import.'; $compareData['column_4'][] = 'Is an existing record and will be updated.'; $compareData['column_5'][] = 'Was not found and this row will be skipped during import.'; $compareData['column_6'][] = 'Status specified is invalid and this row will be skipped during import.'; $this->assertEquals($compareData, unserialize($data[0]->serializedAnalysisMessages)); $this->assertEquals(ImportDataAnalyzer::STATUS_SKIP, $data[0]->analysisStatus); $compareData = array(); $compareData['column_0'][] = 'Is an existing record and will be updated.'; $compareData['column_1'][] = 'Is an existing record and will be updated.'; $compareData['column_2'][] = 'Is an existing record and will be updated.'; $compareData['column_3'][] = 'Was not found and this row will be skipped during import.'; $compareData['column_4'][] = 'Is an existing record and will be updated.'; $compareData['column_5'][] = 'Was not found and this row will be skipped during import.'; $compareData['column_6'][] = 'Status specified is invalid and this row will be skipped during import.'; $this->assertEquals($compareData, unserialize($data[1]->serializedAnalysisMessages)); $this->assertEquals(ImportDataAnalyzer::STATUS_SKIP, $data[1]->analysisStatus); $compareData = array(); $compareData['column_0'][] = 'Is an existing record and will be updated.'; $compareData['column_1'][] = 'Is an existing record and will be updated.'; $compareData['column_2'][] = 'Is an existing record and will be updated.'; $compareData['column_3'][] = 'Was not found and this row will be skipped during import.'; $compareData['column_4'][] = 'Is an existing record and will be updated.'; $compareData['column_5'][] = 'Was not found and this row will be skipped during import.'; $compareData['column_6'][] = 'Status specified is invalid and this row will be skipped during import.'; $this->assertEquals($compareData, unserialize($data[2]->serializedAnalysisMessages)); $this->assertEquals(ImportDataAnalyzer::STATUS_SKIP, $data[2]->analysisStatus); $compareData = array(); $compareData['column_0'][] = 'Was not found and this row will be skipped during import.'; $compareData['column_1'][] = 'Is an existing record and will be updated.'; $compareData['column_2'][] = 'Is an existing record and will be updated.'; $compareData['column_3'][] = 'Was not found and this row will be skipped during import.'; $compareData['column_4'][] = 'Is an existing record and will be updated.'; $compareData['column_5'][] = 'Was not found and this row will be skipped during import.'; $compareData['column_6'][] = 'Status specified is invalid and this row will be skipped during import.'; $this->assertEquals($compareData, unserialize($data[3]->serializedAnalysisMessages)); $this->assertEquals(ImportDataAnalyzer::STATUS_SKIP, $data[3]->analysisStatus); $compareData = array(); $compareData['column_0'][] = 'Was not found and this row will be skipped during import.'; $compareData['column_1'][] = 'Was not found and this row will be skipped during import.'; $compareData['column_2'][] = 'Was not found and this row will be skipped during import.'; $compareData['column_3'][] = 'Is an existing record and will be updated.'; $compareData['column_4'][] = 'Is an existing record and will be updated.'; $compareData['column_5'][] = 'Was not found and this row will be skipped during import.'; $compareData['column_6'][] = 'Status specified is invalid and this row will be skipped during import.'; $this->assertEquals($compareData, unserialize($data[4]->serializedAnalysisMessages)); $this->assertEquals(ImportDataAnalyzer::STATUS_SKIP, $data[4]->analysisStatus); $compareData = array(); $compareData['column_0'][] = 'Was not found and this row will be skipped during import.'; $compareData['column_1'][] = 'Was not found and this row will be skipped during import.'; $compareData['column_2'][] = 'Was not found and this row will be skipped during import.'; $compareData['column_3'][] = 'Is an existing record and will be updated.'; $compareData['column_4'][] = 'Was not found and this row will be skipped during import.'; $compareData['column_5'][] = 'Was not found and this row will be skipped during import.'; $compareData['column_6'][] = 'Status specified is invalid and this row will be skipped during import.'; $this->assertEquals($compareData, unserialize($data[5]->serializedAnalysisMessages)); $this->assertEquals(ImportDataAnalyzer::STATUS_SKIP, $data[5]->analysisStatus); $compareData = array(); $compareData['column_0'][] = 'Was not found and this row will be skipped during import.'; $compareData['column_1'][] = 'Was not found and this row will be skipped during import.'; $compareData['column_2'][] = 'Was not found and this row will be skipped during import.'; $compareData['column_3'][] = 'Is an existing record and will be updated.'; $compareData['column_4'][] = 'Was not found and this row will be skipped during import.'; $compareData['column_6'][] = 'Status specified is invalid and this row will be skipped during import.'; $compareData['column_5'][] = 'Is an existing record and will be updated.'; $this->assertEquals($compareData, unserialize($data[6]->serializedAnalysisMessages)); $this->assertEquals(ImportDataAnalyzer::STATUS_SKIP, $data[6]->analysisStatus); $compareData = array(); $compareData['column_0'][] = 'Was not found and this row will be skipped during import.'; $compareData['column_1'][] = 'Was not found and this row will be skipped during import.'; $compareData['column_2'][] = 'Was not found and this row will be skipped during import.'; $compareData['column_3'][] = 'Was not found and this row will be skipped during import.'; $compareData['column_4'][] = 'Was not found and this row will be skipped during import.'; $compareData['column_6'][] = 'Status specified is invalid and this row will be skipped during import.'; $compareData['column_5'][] = 'Is an existing record and will be updated.'; $this->assertEquals($compareData, unserialize($data[7]->serializedAnalysisMessages)); $this->assertEquals(ImportDataAnalyzer::STATUS_SKIP, $data[7]->analysisStatus); $compareData = array(); $compareData['column_0'][] = 'Was not found and this row will be skipped during import.'; $compareData['column_1'][] = 'Was not found and this row will be skipped during import.'; $compareData['column_2'][] = 'Was not found and this row will be skipped during import.'; $compareData['column_3'][] = 'Was not found and this row will be skipped during import.'; $compareData['column_4'][] = 'Was not found and this row will be skipped during import.'; $compareData['column_5'][] = 'Is an existing record and will be updated.'; $compareData['column_6'][] = 'Status specified is invalid and this row will be skipped during import.'; $this->assertEquals($compareData, unserialize($data[8]->serializedAnalysisMessages)); $this->assertEquals(ImportDataAnalyzer::STATUS_SKIP, $data[8]->analysisStatus); //Will result with no problems since it is all blank. $this->assertFalse(unserialize($data[9]->serializedAnalysisMessages)); $this->assertEquals(ImportDataAnalyzer::STATUS_CLEAN, $data[9]->analysisStatus); }