Merge pull request #11881 from yashodha/CRM-21854
[civicrm-core.git] / tests / phpunit / WebTest / Report / LoggingReportTest.php
CommitLineData
6a488035
TO
1<?php
2/*
3 +--------------------------------------------------------------------+
2fe49090 4 | CiviCRM version 5 |
6a488035 5 +--------------------------------------------------------------------+
8c9251b3 6 | Copyright CiviCRM LLC (c) 2004-2018 |
6a488035
TO
7 +--------------------------------------------------------------------+
8 | This file is a part of CiviCRM. |
9 | |
10 | CiviCRM is free software; you can copy, modify, and distribute it |
11 | under the terms of the GNU Affero General Public License |
12 | Version 3, 19 November 2007 and the CiviCRM Licensing Exception. |
13 | |
14 | CiviCRM is distributed in the hope that it will be useful, but |
15 | WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
17 | See the GNU Affero General Public License for more details. |
18 | |
19 | You should have received a copy of the GNU Affero General Public |
20 | License along with this program; if not, contact CiviCRM LLC |
21 | at info[AT]civicrm[DOT]org. If you have questions about the |
22 | GNU Affero General Public License or the licensing of CiviCRM, |
23 | see the CiviCRM license FAQ at http://civicrm.org/licensing |
24 +--------------------------------------------------------------------+
d25dd0ee 25 */
6a488035 26
6a488035 27require_once 'CiviTest/CiviSeleniumTestCase.php';
e9479dcf
EM
28
29/**
30 * Class WebTest_Report_LoggingReportTest
31 */
6a488035
TO
32class WebTest_Report_LoggingReportTest extends CiviSeleniumTestCase {
33
34 protected function setUp() {
35 parent::setUp();
36 }
331a5c18 37
00be9182 38 public function testLoggingReport() {
6a488035
TO
39 $this->webtestLogin();
40
41 //enable the logging
8fe1f83e 42 $this->openCiviPage('admin/setting/misc', 'reset=1');
6a488035
TO
43 $this->click("xpath=//tr[@class='crm-miscellaneous-form-block-logging']/td[2]/label[text()='Yes']");
44 $this->click("_qf_Miscellaneous_next-top");
57828c6e
DS
45 $this->waitForPageToLoad(2 * $this->getTimeoutMsec());
46 // FIXME: good to do waitForText here but enabling log is time consuming and status may fade out by the time we do the check.
331a5c18
PJ
47
48 //enable CiviCase component
b9715b8a
CW
49 $this->enableComponents("CiviCase");
50
6a488035 51 //add new contact
fcb93467 52 $originalFirstName = $firstName = 'Anthony' . substr(sha1(rand()), 0, 7);
92915c55 53 $lastName = 'Anderson' . substr(sha1(rand()), 0, 7);
331a5c18 54
6a488035 55 $this->webtestAddContact($firstName, $lastName);
a471a3b6 56 $cid = $this->urlArg('cid');
6a488035
TO
57
58 //add contact to group
59 $this->waitForElementPresent("xpath=//li[@id='tab_group']/a");
60 $this->click("xpath=//li[@id='tab_group']/a");
efb29358
CW
61 // Because it tends to cause problems, all uses of sleep() must be justified in comments
62 // Sleep should never be used for wait for anything to load from the server
63 // Justification for this instance: FIXME
371f954c 64 $this->waitForElementPresent("group_id");
6a488035 65 $this->select("group_id", "label=Case Resources");
e3bb9229 66 $this->click("_qf_GroupContact_next");
67 $this->waitForElementPresent("xpath=//form[@id='GroupContact']//div[@class='view-content view-contact-groups']//div[@class='dataTables_wrapper no-footer']/table/tbody/tr/td[4]/a");
68 $this->click("xpath=//form[@id='GroupContact']//div[@class='view-content view-contact-groups']//div[@class='dataTables_wrapper no-footer']/table/tbody/tr/td[4]/a");
331a5c18
PJ
69
70 // Check confirmation alert.
9445497e 71 $this->waitForText("xpath=//div[@class='crm-confirm-dialog ui-dialog-content ui-widget-content modal-dialog']", "Remove $firstName $lastName from Case Resources?");
72 $this->click("xpath=//div[@class='ui-dialog-buttonset']//button//span[text()='Continue']");
6a488035 73
331a5c18 74 //tag addition
6a488035
TO
75 $this->waitForElementPresent("xpath=//li[@id='tab_tag']/a");
76 $this->click("xpath=//li[@id='tab_tag']/a");
efb29358
CW
77 // Because it tends to cause problems, all uses of sleep() must be justified in comments
78 // Sleep should never be used for wait for anything to load from the server
79 // Justification for this instance: FIXME
f952d4f0 80 $this->waitForElementPresent("tagtree");
e3bb9229 81 $this->click("xpath=//div[@id='tagtree']/ul//li/span/label[text()='Company']");
6a488035 82 $this->waitForTextPresent("Saved");
e3bb9229 83 $this->click("xpath=//div[@id='tagtree']/ul//li/span/label[text()='Government Entity']");
6a488035 84 $this->waitForTextPresent("Saved");
e3bb9229 85 $this->click("xpath=//div[@id='tagtree']/ul//li/span/label[text()='Company']");
6a488035
TO
86 $this->waitForTextPresent("Saved");
87
88 //add new note
89 $this->waitForElementPresent("xpath=//li[@id='tab_note']/a");
90 $this->click("xpath=//li[@id='tab_note']/a");
c79fb98e
WA
91 $this->waitForAjaxContent();
92 $this->click("xpath=//div[@class='view-content']//div[@class='action-link']/a[@class='button medium-popup']");
6a488035
TO
93
94 $this->waitForElementPresent("_qf_Note_upload-top");
95 $noteSubject = "test note" . substr(sha1(rand()), 0, 7);
96 $noteText = "test note text" . substr(sha1(rand()), 0, 7);
97 $this->type('subject', $noteSubject);
98 $this->type('note', $noteText);
99 $this->click("_qf_Note_upload-top");
b18eb8e1
RK
100 $this->waitForElementPresent("xpath=//div[@id='notes']/div/table/tbody/tr/td[7]/span[1]/a[2][text()='Edit']");
101 $this->click("xpath=//div[@id='notes']/div/table/tbody/tr/td[7]/span[1]/a[2][text()='Edit']");
6a488035
TO
102 $this->waitForElementPresent("_qf_Note_upload-top");
103 $this->type('subject', $noteSubject . "_edited");
104 $this->type('note', $noteText . "_edited");
9445497e 105 $this->clickLink("_qf_Note_upload-top", "xpath=//div[@class='crm-results-block']/div[@id='notes']/div/table/tbody/tr//td/span[2]/ul/li[2]/a[text()='Delete']", FALSE);
331a5c18 106
b18eb8e1 107 $this->click("xpath=//div[@id='notes']/div/table/tbody/tr/td[7]/span[2]/ul/li[2]/a[text()='Delete']");
331a5c18 108 // Check confirmation alert.
e3bb9229 109 $this->waitForText("xpath=//form[@id='Note']/div[@class='view-content']/div[@class='status']", "Are you sure you want to delete the note ''?");
9445497e 110 $this->click("xpath=//input[@id='_qf_Note_next']");
111 $this->waitForText('crm-notification-container', "Selected Note has been deleted successfully.");
331a5c18 112
6a488035
TO
113 //add new relationship , disable it , delete it
114 $this->waitForElementPresent("xpath=//li[@id='tab_rel']/a");
57828c6e
DS
115 $this->click("css=li#tab_rel a");
116 $this->waitForElementPresent("link=Add Relationship");
117 $this->click("link=Add Relationship");
118 $this->waitForElementPresent("_qf_Relationship_cancel");
6a488035 119 $this->select("relationship_type_id", "label=Employee of");
9445497e 120 $this->select2('related_contact_id', 'Default', TRUE);
121 $this->click('_qf_Relationship_upload-bottom');
b18eb8e1
RK
122 $this->waitForElementPresent("xpath=//div[@id='contact-summary-relationship-tab']/div[2]/div/table/tbody/tr/td[9]/span[2][text()='more']/ul/li[1]/a[text()='Disable']");
123
124 $this->click("xpath=//div[@id='contact-summary-relationship-tab']/div[2]/div/table/tbody/tr/td[9]/span[2][text()='more']/ul/li[1]/a[text()='Disable']");
f390456a 125 $this->waitForText("xpath=//div[@class='crm-confirm-dialog ui-dialog-content ui-widget-content modal-dialog crm-ajax-container']", 'Are you sure you want to disable this relationship?');
e3bb9229 126 $this->click("xpath=//div[@class='ui-dialog-buttonset']//button//span[text()='Yes']");
127 $this->waitForElementPresent("xpath=//div[@class='crm-contact-relationship-past']/div//table/tbody//tr/td[9]/span[2][text()='more']/ul/li[2]/a[text()='Delete']");
128 $this->click("xpath=//div[@class='crm-contact-relationship-past']/div//table/tbody//tr/td[9]/span[2][text()='more']/ul/li[2]/a[text()='Delete']");
9445497e 129 $this->waitForText("xpath=//form[@id='Relationship']/div[@class='status']", "Are you sure you want to delete this Relationship?");
130 $this->click("_qf_Relationship_next-bottom");
131 $this->waitForElementPresent("link=Add Relationship");
6a488035
TO
132
133 //update existing contact
134 $this->click("xpath=//ul[@id='actions']/li[2]/a");
135 $this->waitForElementPresent("_qf_Contact_upload_view-top");
136 $firstName = "{$firstName}_edited";
137 $this->type("first_name", $firstName);
138 $this->click("_qf_Contact_upload_view-top");
139 $this->waitForPageToLoad($this->getTimeoutMsec());
331a5c18 140
6a488035
TO
141 //add an activity
142 $this->click("xpath=//li[@id='tab_activity']/a");
143 $this->waitForElementPresent("other_activity");
144 $this->select("other_activity", "label=Interview");
9445497e 145 $this->waitForElementPresent("_qf_Activity_cancel-bottom");
6a488035 146 $this->click('_qf_Activity_upload-bottom');
3d4f16de
WA
147 $this->waitForElementPresent("xpath=//div[@class='dataTables_wrapper no-footer']/table/tbody/tr//td//span/a[text()='Edit']");
148 $this->click("xpath=//div[@class='dataTables_wrapper no-footer']/table/tbody/tr//td//span/a[text()='Edit']");
9445497e 149 $this->waitForElementPresent("_qf_Activity_cancel-bottom");
6c6e6187 150 $this->select("status_id", "value=2");
05e39ac3 151 $this->waitForAjaxContent();
6a488035 152 $this->click('_qf_Activity_upload-bottom');
9445497e 153 $this->waitForText("crm-notification-container", "Activity has been saved.");
05e39ac3
WA
154 $this->waitForElementPresent("xpath=//div[@class='dataTables_wrapper no-footer']/table/tbody/tr/td[7]/div");
155 $this->verifyText("xpath=//div[@class='dataTables_wrapper no-footer']/table/tbody/tr/td[7]/div", 'Completed');
331a5c18 156
6a488035
TO
157 //add a case
158 $this->click("xpath=//li[@id='tab_case']/a");
3d4f16de
WA
159 $this->waitForElementPresent("xpath=//form[@id='Search']//div/div//div[@class='action-link']/a");
160 $this->click("xpath=//form[@id='Search']//div/div//div[@class='action-link']/a");
9445497e 161 $this->waitForElementPresent("_qf_Case_cancel-bottom");
92fcb95f 162 $this->type('activity_subject', "subject" . rand());
6c6e6187 163 $this->select('case_type_id', 'value=1');
6a488035 164 $this->click('_qf_Case_upload-bottom');
05e39ac3
WA
165 $this->waitForElementPresent("xpath=//table[@class='caseSelector']/tbody//tr/td[9]//span/a[1][text()='Manage']");
166 $this->click("xpath=//table[@class='caseSelector']/tbody//tr/td[9]//span/a[1][text()='Manage']");
9445497e 167 $this->waitForElementPresent("xpath=//form[@id='CaseView']/div[2]/table/tbody/tr/td[4]/a");
6a488035
TO
168 $this->click("xpath=//form[@id='CaseView']/div[2]/table/tbody/tr/td[4]/a");
169 $this->waitForElementPresent("_qf_Activity_cancel-bottom");
6c6e6187 170 $this->select("case_status_id", "value=2");
6a488035 171 $this->click("_qf_Activity_upload-top");
9445497e 172 $this->waitForElementPresent("_qf_CaseView_cancel-bottom");
173 $this->click("_qf_CaseView_cancel-bottom");
6a488035 174 $this->waitForPageToLoad($this->getTimeoutMsec());
331a5c18 175
6a488035 176 //visit the logging contact summary report
8fe1f83e 177 $this->openCiviPage('report/logging/contact/summary', 'reset=1');
1361cc61 178 $this->waitForElementPresent('altered_contact_value');
6a488035
TO
179 $this->type('altered_contact_value', $firstName);
180 $this->click("_qf_LoggingSummary_submit");
181 $this->waitForPageToLoad($this->getTimeoutMsec());
182
183 $data = array(
331a5c18
PJ
184 //contact data check
185 array("log_type" => "Contact", "altered_contact" => "{$firstName} {$lastName}", "action" => "Update"),
186 array("log_type" => "Contact", "altered_contact" => "{$firstName} {$lastName}", "action" => "Insert"),
187 //relationship data check
92915c55
TO
188 array(
189 "log_type" => "Relationship",
190 "altered_contact" => "{$firstName} {$lastName} [Employee of]",
5396af74 191 "action" => "Update",
92915c55
TO
192 ),
193 array(
194 "log_type" => "Relationship",
195 "altered_contact" => "{$firstName} {$lastName} [Employee of]",
5396af74 196 "action" => "Insert",
92915c55
TO
197 ),
198 array(
199 "log_type" => "Relationship",
200 "altered_contact" => "{$firstName} {$lastName} [Employee of]",
5396af74 201 "action" => "Delete",
92915c55 202 ),
331a5c18 203 //group data check
92915c55
TO
204 array(
205 "log_type" => "Group",
206 "altered_contact" => "{$firstName} {$lastName} [Case Resources]",
5396af74 207 "action" => "Added",
92915c55
TO
208 ),
209 array(
210 "log_type" => "Group",
211 "altered_contact" => "{$firstName} {$lastName} [Case Resources]",
5396af74 212 "action" => "Removed",
92915c55 213 ),
331a5c18
PJ
214 //note data check
215 array("log_type" => "Note", "altered_contact" => "{$firstName} {$lastName}", "action" => "Update"),
216 array("log_type" => "Note", "altered_contact" => "{$firstName} {$lastName}", "action" => "Insert"),
217 array("log_type" => "Note", "altered_contact" => "{$firstName} {$lastName}", "action" => "Delete"),
218 //tags data check
219 array("log_type" => "Tag", "altered_contact" => "{$firstName} {$lastName} [Company]", "action" => "Insert"),
92915c55
TO
220 array(
221 "log_type" => "Tag",
222 "altered_contact" => "{$firstName} {$lastName} [Government Entity]",
5396af74 223 "action" => "Insert",
92915c55 224 ),
331a5c18
PJ
225 array("log_type" => "Tag", "altered_contact" => "{$firstName} {$lastName} [Company]", "action" => "Delete"),
226 //case data check
92915c55
TO
227 array(
228 "log_type" => "Case",
229 "altered_contact" => "{$firstName} {$lastName} [Housing Support]",
5396af74 230 "action" => "Update",
92915c55
TO
231 ),
232 array(
233 "log_type" => "Case",
234 "altered_contact" => "{$firstName} {$lastName} [Housing Support]",
5396af74 235 "action" => "Insert",
92915c55 236 ),
331a5c18 237 //case activity check
92915c55
TO
238 array(
239 "log_type" => "Activity",
240 "altered_contact" => "{$firstName} {$lastName} [Interview]",
5396af74 241 "action" => "Update",
92915c55
TO
242 ),
243 array(
244 "log_type" => "Activity",
245 "altered_contact" => "{$firstName} {$lastName} [Interview]",
5396af74 246 "action" => "Insert",
92915c55 247 ),
331a5c18 248 );
6a488035 249 $this->verifyReportData($data);
331a5c18 250
6a488035
TO
251 //update link (logging details report check)
252 $contactInfo = array();
253 $contactInfo['data'] = array(
92915c55
TO
254 array(
255 'field' => 'Sort Name',
fcb93467 256 'changed_from' => "{$lastName}, {$originalFirstName}",
5396af74 257 'changed_to' => "{$lastName}, {$firstName}",
92915c55
TO
258 ),
259 array(
260 'field' => 'Display Name',
fcb93467 261 'changed_from' => "{$originalFirstName} {$lastName}",
5396af74 262 'changed_to' => "{$firstName} {$lastName}",
92915c55 263 ),
fcb93467
EM
264 array('field' => 'First Name', 'changed_from' => $originalFirstName, 'changed_to' => $firstName),
265 // array('field' => 'Email Greeting', 'changed_from' => "Dear {$originalFirstName}", 'changed_to' => "Dear {$firstName}"),
266 // array('field' => 'Postal Greeting', 'changed_from' => "Dear {$originalFirstName}", 'changed_to' => "Dear {$firstName}"),
267 // array('field' => 'Addressee', 'changed_from' => "{$originalFirstName} {$lastName}", 'changed_to' => "{$firstName} {$lastName}"),
6a488035
TO
268 );
269 $contactInfo = array_merge($contactInfo, $data[0]);
331a5c18 270
6a488035
TO
271 $relationshipInfo = array();
272 $relationshipInfo['data'] = array(
92915c55 273 array('field' => 'Relationship Is Active', 'changed_from' => 'true', 'changed_to' => 'false'),
6a488035
TO
274 );
275 $relationshipInfo = array_merge($relationshipInfo, $data[2]);
276
277 $noteInfo = array();
278 $noteInfo['data'] = array(
279 array('field' => 'Note', 'changed_from' => $noteText, 'changed_to' => "{$noteText}_edited"),
280 array('field' => 'Subject', 'changed_from' => $noteSubject, 'changed_to' => "{$noteSubject}_edited"),
281 );
282 $noteInfo = array_merge($noteInfo, $data[7]);
283
284 $caseInfo = array();
285 $caseInfo['data'] = array(
286 array('field' => 'Case Status Id', 'changed_from' => 'Ongoing', 'changed_to' => "Resolved"),
287 );
288 $caseInfo = array_merge($caseInfo, $data[13]);
289
331a5c18
PJ
290 $activityInfo = array();
291 $activityInfo['data'] = array(
92915c55
TO
292 array('field' => 'Activity Status Id', 'changed_from' => 'Scheduled', 'changed_to' => 'Completed'),
293 );
331a5c18 294 $activityInfo = array_merge($activityInfo, $data[15]);
6a488035
TO
295
296 $dataForReportDetail = array($contactInfo, $relationshipInfo, $noteInfo, $caseInfo, $activityInfo);
297 $filters = array(
298 'text' => array('altered_contact_value' => "{$firstName} {$lastName}"),
299 );
300 $this->detailReportCheck($dataForReportDetail, $filters);
331a5c18 301
6a488035 302 //delete contact check
57828c6e 303 $this->openCiviPage('contact/view/delete', "reset=1&delete=1&cid=$cid");
6a488035
TO
304 $this->click("_qf_Delete_done");
305 $this->waitForPageToLoad($this->getTimeoutMsec());
331a5c18 306
8fe1f83e 307 $this->openCiviPage('report/logging/contact/summary', 'reset=1');
6a488035
TO
308 $this->click("_qf_LoggingSummary_submit");
309 $this->waitForPageToLoad($this->getTimeoutMsec());
331a5c18 310
92915c55
TO
311 $contactDataDelete = array(
312 array(
313 "log_type" => "Contact",
314 "altered_contact" => "{$firstName} {$lastName}",
5396af74 315 "action" => "Delete (to trash)",
316 ),
92915c55 317 );
6a488035 318 $this->verifyReportData($contactDataDelete);
331a5c18 319
6a488035 320 //disable the logging
8fe1f83e 321 $this->openCiviPage('admin/setting/misc', 'reset=1');
4a058f26 322 $this->waitForElementPresent("xpath=//tr[@class='crm-miscellaneous-form-block-logging']/td[2]/label[text()='No']");
6a488035
TO
323 $this->click("xpath=//tr[@class='crm-miscellaneous-form-block-logging']/td[2]/label[text()='No']");
324 $this->click("_qf_Miscellaneous_next-top");
325 $this->waitForTextPresent("Changes Saved");
326 }
331a5c18 327
4cbe18b8
EM
328 /**
329 * @param $data
330 */
00be9182 331 public function verifyReportData($data) {
6a488035
TO
332 foreach ($data as $value) {
333 // check for the row contains proper data
334 $actionPath = ($value['action'] == 'Update') ? "td[1]/a[2]" : "td[1][contains(text(), '{$value['action']}')]";
335 $contactCheck = ($value['action'] == 'Delete (to trash)') ? "td[4][contains(text(), '{$value['altered_contact']}')]" : "td[4]/a[contains(text(), '{$value['altered_contact']}')]/..";
331a5c18 336
6a488035 337 $this->assertTrue($this->isElementPresent("xpath=//table/tbody//tr/td[2][contains(text(), '{$value['log_type']}')]/../{$contactCheck}/../{$actionPath}"), "The proper record not present for (log type : {$value['log_type']}, altered contact : {$value['altered_contact']}, action as {$value['action']})");
331a5c18 338
6a488035 339 if ($value['action'] == 'Update') {
481a74f4 340 $this->assertTrue(($value['action'] == $this->getText("xpath=//table/tbody//tr/td[2][contains(text(), '{$value['log_type']}')]/../td[4]/a[contains(text(), '{$value['altered_contact']}')]/../../{$actionPath}")), "The proper record action {$value['action']} not present for (log type : {$value['log_type']}, altered contact : {$value['altered_contact']} record)");
6a488035
TO
341 }
342 }
343 }
331a5c18 344
4cbe18b8
EM
345 /**
346 * @param $dataForReportDetail
347 * @param array $filters
348 */
00be9182 349 public function detailReportCheck($dataForReportDetail, $filters = array()) {
6a488035
TO
350 foreach ($dataForReportDetail as $value) {
351 $this->waitForElementPresent("xpath=//table/tbody//tr/td[2][contains(text(), '{$value['log_type']}')]/../td[4]/a[contains(text(), '{$value['altered_contact']}')]/../../td[1]/a[2]");
352 $this->click("xpath=//table/tbody//tr/td[2][contains(text(), '{$value['log_type']}')]/../td[4]/a[contains(text(), '{$value['altered_contact']}')]/../../td[1]/a[2]");
353 $this->waitForPageToLoad($this->getTimeoutMsec());
331a5c18 354
6a488035
TO
355 foreach ($value['data'] as $key => $data) {
356 $rowCount = $this->getXpathCount("//table[@class='report-layout display']/tbody/tr");
357 for ($i = 1; $i <= $rowCount; $i++) {
358 $field = $data['field'];
359 if ($this->isElementPresent("xpath=//form[@id='LoggingDetail']//table/tbody/tr[{$i}]/td[@class='crm-report-field'][text()='$field']")) {
360 $this->verifyText("xpath=//form[@id='LoggingDetail']//table/tbody/tr[{$i}]/td[@class='crm-report-field']", preg_quote($data['field']));
361 $this->verifyText("xpath=//form[@id='LoggingDetail']//table/tbody/tr[{$i}]/td[@class='crm-report-from']", preg_quote($data['changed_from']));
362 $this->verifyText("xpath=//form[@id='LoggingDetail']//table/tbody/tr[{$i}]/td[@class='crm-report-to']", preg_quote($data['changed_to']));
363 }
364 }
365 }
366
6c6e6187
TO
367 //visit the logging contact summary report
368 $this->openCiviPage('report/logging/contact/summary', 'reset=1');
369 foreach ($filters as $type => $filter) {
481a74f4 370 if ($type == 'text') {
6c6e6187
TO
371 foreach ($filter as $filterName => $filterValue) {
372 $this->type($filterName, $filterValue);
373 }
6a488035
TO
374 }
375 }
6c6e6187
TO
376 $this->click("_qf_LoggingSummary_submit");
377 $this->waitForPageToLoad($this->getTimeoutMsec());
6a488035
TO
378 }
379 }
96025800 380
b9715b8a 381}