Skip to content

Commit

Permalink
tests for report downloads
Browse files Browse the repository at this point in the history
  • Loading branch information
demeritcowboy committed Jul 19, 2020
1 parent 2fbf625 commit 9c4a5d7
Showing 1 changed file with 212 additions and 0 deletions.
212 changes: 212 additions & 0 deletions tests/phpunit/CRM/Report/Utils/ReportTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -69,4 +69,216 @@ public function testMakeCsv() {
$this->assertEquals($expectedOutput, $csvString);
}

/**
* Test when you choose Print from the actions dropdown.
*
* We're not too concerned about the actual report rows - there's other
* tests for that - we're more interested in does it echo it in print
* format.
*/
public function testOutputPrint() {
// Create many contacts, in particular so that the report would be more
// than a one-pager.
for ($i = 0; $i < 110; $i++) {
$this->individualCreate([], $i, TRUE);
}

// Get the name of the expected last contact in the output in sort order.
// Even in print format we can check the string contains the name which
// we'll take as some assurance that it output all the rows.
$last_contact = $this->callAPISuccess('Contact', 'get', [
'return' => 'sort_name',
'sequential' => 1,
'options' => [
'limit' => 1,
'sort' => 'sort_name DESC',
],
])['values'][0];

$report_instance = $this->createReportInstance();

// avoid warnings
if (empty($_SERVER['QUERY_STRING'])) {
$_SERVER['QUERY_STRING'] = 'reset=1';
}

// A bit weird - it will send the output to the browser, which here is the
// console, then throw a specific exception. So we capture the output
// and the exception.
try {
ob_start();
CRM_Report_Utils_Report::processReport([
'instanceId' => $report_instance['id'],
'format' => 'print',
'sendmail' => FALSE,
]);
}
catch (CRM_Core_Exception_PrematureExitException $e) {
$contents = ob_get_contents();
ob_end_clean();
}
$this->assertStringContainsString('<title>CiviCRM Report</title>', $contents);
$this->assertStringContainsString('test report', $contents);
$this->assertStringContainsString($last_contact['sort_name'], $contents);
}

/**
* Test when you choose PDF from the actions dropdown.
*
* We're not too concerned about the actual report rows - there's other
* tests for that - we're more interested in does it echo it in pdf
* format.
*
* This isn't great but otherwise dompdf complains about headers already sent.
* @runInSeparateProcess
* @preserveGlobalState disabled
*/
public function testOutputPdf() {
// Create many contacts, in particular so that the report would be more
// than a one-pager.
for ($i = 0; $i < 110; $i++) {
$this->individualCreate([], $i, TRUE);
}

// Get the id of the expected last contact in the output in sort order.
// Even in pdf format we can check the string contains the link to the
// detail report for this contact which we'll take as some assurance that
// it output all the rows.
$last_contact = $this->callAPISuccess('Contact', 'get', [
'return' => 'id',
'options' => [
'limit' => 1,
'sort' => 'sort_name DESC',
],
]);

$report_instance = $this->createReportInstance();

// avoid warnings
if (empty($_SERVER['QUERY_STRING'])) {
$_SERVER['QUERY_STRING'] = 'reset=1';
}

// A bit weird - it will send the output to the browser, which here is the
// console, then throw a specific exception. So we capture the output
// and the exception.
try {
ob_start();
CRM_Report_Utils_Report::processReport([
'instanceId' => $report_instance['id'],
'format' => 'pdf',
'sendmail' => FALSE,
]);
}
catch (CRM_Core_Exception_PrematureExitException $e) {
$contents = ob_get_contents();
ob_end_clean();
}
$this->assertStringStartsWith('%PDF', $contents);
$this->assertStringContainsString("id_value={$last_contact['id']}", $contents);
}

/**
* Test when you choose Csv from the actions dropdown.
*/
public function testOutputCsv() {
// Create many contacts, in particular so that the report would be more
// than a one-pager.
for ($i = 0; $i < 110; $i++) {
$this->individualCreate([], $i, TRUE);
}

$report_instance = $this->createReportInstance();

// avoid warnings
if (empty($_SERVER['QUERY_STRING'])) {
$_SERVER['QUERY_STRING'] = 'reset=1';
}

// A bit weird - it will send the output to the browser, which here is the
// console, then throw a specific exception. So we capture the output
// and the exception.
try {
ob_start();
CRM_Report_Utils_Report::processReport([
'instanceId' => $report_instance['id'],
'format' => 'csv',
'sendmail' => FALSE,
]);
}
catch (CRM_Core_Exception_PrematureExitException $e) {
$contents = ob_get_contents();
ob_end_clean();
}

// Pull all the contacts to get our expected output.
$contacts = $this->callAPISuccess('Contact', 'get', [
'return' => 'sort_name',
'options' => [
'limit' => 0,
'sort' => 'sort_name',
],
]);
$rows = [];
foreach ($contacts['values'] as $contact) {
$rows[] = ['civicrm_contact_sort_name' => $contact['sort_name']];
}
// need this for makeCsv()
$fakeForm = new CRM_Report_Form();
$fakeForm->_columnHeaders = [
'civicrm_contact_sort_name' => [
'title' => 'Contact Name',
'type' => 2,
],
];

$this->assertEquals(
CRM_Report_Utils_Report::makeCsv($fakeForm, $rows),
$contents
);
}

/**
* Helper to create a report instance of the contact summary report.
*/
private function createReportInstance() {
return $this->callAPISuccess('ReportInstance', 'create', [
'report_id' => 'contact/summary',
'title' => 'test report',
'form_values' => [
serialize([
'fields' => [
'sort_name' => '1',
'street_address' => '1',
'city' => '1',
'country_id' => '1',
],
'sort_name_op' => 'has',
'sort_name_value' => '',
'source_op' => 'has',
'source_value' => '',
'id_min' => '',
'id_max' => '',
'id_op' => 'lte',
'id_value' => '',
'country_id_op' => 'in',
'country_id_value' => [],
'state_province_id_op' => 'in',
'state_province_id_value' => [],
'gid_op' => 'in',
'gid_value' => [],
'tagid_op' => 'in',
'tagid_value' => [],
'description' => 'Provides a list of address and telephone information for constituent records in your system.',
'email_subject' => '',
'email_to' => '',
'email_cc' => '',
'permission' => 'view all contacts',
'groups' => '',
'domain_id' => 1,
]),
],
]);
}

}

0 comments on commit 9c4a5d7

Please sign in to comment.