3 * Tine 2.0 - http://www.tine20.org
6 * @license http://www.gnu.org/licenses/agpl.html
7 * @copyright Copyright (c) 2015 Metaways Infosystems GmbH (http://www.metaways.de)
8 * @author Philipp Schüle <p.schuele@metaways.de>
12 * Test class for Crm_Import_Csv
14 class Crm_Import_CsvTest extends ImportTestCase
16 protected $_importerClassName = 'Crm_Import_Csv';
17 protected $_exporterClassName = 'Crm_Export_Csv';
18 protected $_modelName = 'Crm_Model_Lead';
20 protected $_tasksToDelete = array();
25 protected function tearDown()
30 Tasks_Controller_Task::getInstance()->delete($this->_tasksToDelete);
32 Crm_Config::getInstance()->set(Crm_Config::LEAD_IMPORT_AUTOTASK, false);
33 Crm_Config::getInstance()->set(Crm_Config::LEAD_IMPORT_NOTIFICATION, false);
38 * @param boolean $dryrun
41 public function testImport($dryrun = true)
43 $result = $this->_importHelper('leads.csv', 'crm_tine_import_csv', $dryrun);
44 $this->assertEquals(2, $result['totalcount'], 'should import 2 records: ' . print_r($result, true));
46 $firstLead = $result['results']->getFirstRecord();
47 $this->assertContains('neuer lead', $firstLead->lead_name);
48 $this->assertEquals(1, count($firstLead->tags));
49 $this->assertEquals(5, count($firstLead->relations),
50 'relations not imported for first lead ' . print_r($firstLead->toArray(), true));
51 $this->assertEquals(6, count($result['results'][1]->relations),
52 'relations not imported for second lead ' . print_r($result['results'][1]->toArray(), true));
60 * @param $importFilename
61 * @param string $definitionName
63 * @param string $duplicateResolveStrategy
65 * @throws Tinebase_Exception_NotFound
67 protected function _importHelper($importFilename, $definitionName = 'crm_tine_import_csv', $dryrun = true, $duplicateResolveStrategy = null)
69 $this->_testNeedsTransaction();
71 $this->_testContainer = $this->_getTestContainer('Crm', 'Crm_Model_Lead');
72 $this->_filename = dirname(__FILE__) . '/files/' . $importFilename;
73 $this->_deleteImportFile = false;
76 'container_id' => $this->_testContainer->getId(),
80 if ($duplicateResolveStrategy) {
81 $options['duplicateResolveStrategy'] = $duplicateResolveStrategy;
84 $result = $this->_doImport($options, $definitionName);
90 * @see 0011234: automatically add task for responsible person on lead import
92 public function testAutoTaskImport()
94 Crm_Config::getInstance()->set(Crm_Config::LEAD_IMPORT_AUTOTASK, true);
95 $personalContainerOfSClever = $this->_getPersonalContainer('Tasks', $this->_personas['sclever']);
96 $this->_setPersonaGrantsForTestContainer($personalContainerOfSClever->getId(), 'sclever', true, false);
98 $result = $this->testImport(/* dry run = */ false);
99 foreach ($result['results'] as $lead) {
100 foreach ($lead->relations as $relation) {
101 if ($relation->type === 'TASK') {
102 $this->_tasksToDelete[] = $relation->related_id;
107 $tasks = $this->_searchTestTasks($personalContainerOfSClever->getId());
108 $this->assertEquals(1, count($tasks), 'could not find task in sclevers container: '
109 . print_r($personalContainerOfSClever->toArray(), true));
110 $task = $tasks->getFirstRecord();
111 $this->assertEquals($this->_personas['sclever']['accountId'], $task->organizer);
112 $this->assertEquals('IN-PROCESS', $task->status);
118 * @param $containerId
119 * @param null $summary
120 * @return array|Tinebase_Record_RecordSet
122 protected function _searchTestTasks($containerId, $summary = null)
125 $translate = Tinebase_Translation::getTranslation('Crm');
126 $summary = $translate->_('Edit new lead');
128 $tasksFilter = new Tasks_Model_TaskFilter(array(
129 array('field' => 'container_id', 'operator' => 'equals', 'value' => $containerId),
130 array('field' => 'summary', 'operator' => 'contains', 'value' => $summary),
132 $tasks = Tasks_Controller_Task::getInstance()->search($tasksFilter);
133 $this->_tasksToDelete = array_merge($this->_tasksToDelete, $tasks->getArrayOfIds());
138 * @see 0011376: send mail on lead import to responsibles
140 public function testEmailNotification()
142 $smtpConfig = Tinebase_Config::getInstance()->get(Tinebase_Config::SMTP, new Tinebase_Config_Struct())->toArray();
143 if (empty($smtpConfig)) {
144 $this->markTestSkipped('No SMTP config found: this is needed to send notifications.');
147 Crm_Config::getInstance()->set(Crm_Config::LEAD_IMPORT_NOTIFICATION, true);
148 $this->testImport(/* dry run = */ false);
149 // mark tasks for deletion
150 $this->_searchTestTasks(Tinebase_Container::getInstance()->getDefaultContainer('Tasks_Model_Task')->getId(), 'task');
152 // assert emails for responsibles
153 $messages = self::getMessages();
154 $this->assertGreaterThan(1, count($messages));
156 $translate = Tinebase_Translation::getTranslation('Crm');
157 $importNotifications = array();
158 $subjectToMatch = sprintf($translate->_('%s new leads have been imported'), 1);
159 foreach ($messages as $message) {
160 if ($message->getSubject() == $subjectToMatch) {
161 $importNotifications[] = $message;
165 $this->assertGreaterThan(1, count($importNotifications),
166 'expecting 2 or more mails (at least for unittest + sclever) / messages:'
167 . print_r($messages, true));
168 $firstMessage = $importNotifications[0];
169 $this->assertContains('neuer lead 2', $firstMessage->getBodyText()->getContent(), 'lead name missing');
170 $this->assertContains('PHPUnit', $firstMessage->getBodyText()->getContent(), 'container name missing');