Newer
Older
<?php
// $Id$
Dries Buytaert
committed
class SimpleTestFunctionalTest extends DrupalWebTestCase {
Dries Buytaert
committed
/**
* The results array that has been parsed by getTestResults().
*/
protected $childTestResults;
Dries Buytaert
committed
/**
* Store the test ID from each test run for comparison, to ensure they are
* incrementing.
Dries Buytaert
committed
*/
protected $test_ids = array();
Angie Byron
committed
public static function getInfo() {
return array(
'name' => t('SimpleTest functionality'),
'description' => t('Test SimpleTest\'s web interface: check that the intended tests were
run and ensure that test reports display the intended results. Also
test SimpleTest\'s internal browser and API\'s both explicitly and
implicitly.'),
'group' => t('SimpleTest')
);
}
function setUp() {
Dries Buytaert
committed
if (!$this->inCURL()) {
parent::setUp('simpletest');
Dries Buytaert
committed
// Create and login user
$admin_user = $this->drupalCreateUser(array('administer unit tests'));
$this->drupalLogin($admin_user);
}
else {
parent::setUp();
}
}
/**
* Test the internal browsers functionality.
*/
function testInternalBrowser() {
global $conf;
if (!$this->inCURL()) {
$this->drupalGet('node');
Dries Buytaert
committed
$this->assertTrue($this->drupalGetHeader('Date'), t('An HTTP header was received.'));
$this->assertTitle(variable_get('site_name', 'Drupal'), t('Site title matches.'));
$this->assertNoTitle('Foo', t('Site title does not match.'));
Dries Buytaert
committed
// Make sure that we are locked out of the installer when prefixing
// using the user-agent header. This is an important security check.
global $base_url;
$this->drupalGet($base_url . '/install.php', array('external' => TRUE));
$this->assertResponse(403, 'Cannot access install.php with a "simpletest" user-agent header.');
Dries Buytaert
committed
$this->drupalLogin($this->drupalCreateUser());
$headers = $this->drupalGetHeaders(TRUE);
$this->assertEqual(count($headers), 2, t('There was one intermediate request.'));
$this->assertTrue(strpos($headers[0][':status'], '302') !== FALSE, t('Intermediate response code was 302.'));
$this->assertFalse(empty($headers[0]['location']), t('Intermediate request contained a Location header.'));
$this->assertEqual($this->getUrl(), $headers[0]['location'], t('HTTP redirect was followed'));
$this->assertFalse($this->drupalGetHeader('Location'), t('Headers from intermediate request were reset.'));
$this->assertResponse(200, t('Response code from intermediate request was reset.'));
}
}
/**
* Make sure that tests selected through the web interface are run and
* that the results are displayed correctly.
*/
function testWebTestRunner() {
$this->pass = t('SimpleTest pass.');
$this->fail = t('SimpleTest fail.');
Dries Buytaert
committed
$this->valid_permission = 'access content';
$this->invalid_permission = 'invalid permission';
if ($this->inCURL()) {
// Only run following code if this test is running itself through a CURL request.
$this->stubTest();
}
else {
Angie Byron
committed
Dries Buytaert
committed
// Run twice so test_ids can be accumulated.
for ($i = 0; $i < 2; $i++) {
// Run this test from web interface.
$this->drupalGet('admin/development/testing');
Dries Buytaert
committed
$edit = array();
Dries Buytaert
committed
$edit['SimpleTestFunctionalTest'] = TRUE;
Dries Buytaert
committed
$this->drupalPost(NULL, $edit, t('Run tests'));
// Parse results and confirm that they are correct.
$this->getTestResults();
$this->confirmStubTestResults();
}
Dries Buytaert
committed
// Regression test for #290316.
// Check that test_id is incrementing.
$this->assertTrue($this->test_ids[0] != $this->test_ids[1], t('Test ID is incrementing.'));
}
}
/**
* Test to be run and the results confirmed.
*/
function stubTest() {
$this->pass($this->pass);
$this->fail($this->fail);
Dries Buytaert
committed
$this->drupalCreateUser(array($this->valid_permission));
$this->drupalCreateUser(array($this->invalid_permission));
Dries Buytaert
committed
$this->pass(t('Test ID is @id.', array('@id' => $this->testId)));
Angie Byron
committed
// Generates a warning.
$i = 1 / 0;
// Call an assert function specific to that class.
$this->assertNothing();
Angie Byron
committed
// Generates a warning inside a PHP function.
array_key_exists(NULL, NULL);
}
/**
* Assert nothing.
*/
function assertNothing() {
$this->pass("This is nothing.");
}
/**
* Confirm that the stub test produced the desired results.
*/
function confirmStubTestResults() {
Dries Buytaert
committed
$this->assertAssertion($this->pass, 'Other', 'Pass', 'simpletest.test', 'SimpleTestFunctionalTest->stubTest()');
$this->assertAssertion($this->fail, 'Other', 'Fail', 'simpletest.test', 'SimpleTestFunctionalTest->stubTest()');
Dries Buytaert
committed
$this->assertAssertion(t('Created permissions: @perms', array('@perms' => $this->valid_permission)), 'Role', 'Pass', 'simpletest.test', 'SimpleTestFunctionalTest->stubTest()');
$this->assertAssertion(t('Invalid permission %permission.', array('%permission' => $this->invalid_permission)), 'Role', 'Fail', 'simpletest.test', 'SimpleTestFunctionalTest->stubTest()');
// Check that a warning is catched by simpletest.
Dries Buytaert
committed
$this->assertAssertion('Division by zero', 'Warning', 'Fail', 'simpletest.test', 'SimpleTestFunctionalTest->stubTest()');
Dries Buytaert
committed
// Check that the backtracing code works for specific assert function.
Dries Buytaert
committed
$this->assertAssertion('This is nothing.', 'Other', 'Pass', 'simpletest.test', 'SimpleTestFunctionalTest->stubTest()');
Dries Buytaert
committed
Angie Byron
committed
// Check that errors that occur inside PHP internal functions are correctly reported.
// The exact error message differs between PHP versions so we check only
// the function name 'array_key_exists'.
$this->assertAssertion('array_key_exists', 'Warning', 'Fail', 'simpletest.test', 'SimpleTestFunctionalTest->stubTest()');
Angie Byron
committed
Dries Buytaert
committed
$this->test_ids[] = $test_id = $this->getTestIdFromResults();
$this->assertTrue($test_id, t('Found test ID in results.'));
}
/**
* Fetch the test id from the test results.
*/
function getTestIdFromResults() {
foreach ($this->childTestResults['assertions'] as $assertion) {
Dries Buytaert
committed
if (preg_match('@^Test ID is ([0-9]*)\.$@', $assertion['message'], $matches)) {
return $matches[1];
}
}
return NULL;
}
/**
* Assert that an assertion with the specified values is displayed
* in the test results.
*
* @param string $message Assertion message.
* @param string $type Assertion type.
* @param string $status Assertion status.
* @param string $file File where the assertion originated.
* @param string $functuion Function where the assertion originated.
* @return Assertion result.
*/
function assertAssertion($message, $type, $status, $file, $function) {
Dries Buytaert
committed
$message = trim(strip_tags($message));
$found = FALSE;
foreach ($this->childTestResults['assertions'] as $assertion) {
Angie Byron
committed
if ((strpos($assertion['message'], $message) !== FALSE) &&
$assertion['type'] == $type &&
$assertion['status'] == $status &&
$assertion['file'] == $file &&
$assertion['function'] == $function) {
$found = TRUE;
break;
}
}
return $this->assertTrue($found, t('Found assertion {"@message", "@type", "@status", "@file", "@function"}.', array('@message' => $message, '@type' => $type, '@status' => $status, "@file" => $file, "@function" => $function)));
}
/**
* Get the results from a test and store them in the class array $results.
*/
function getTestResults() {
$results = array();
if ($this->parse()) {
if ($fieldset = $this->getResultFieldSet()) {
// Code assumes this is the only test in group.
Dries Buytaert
committed
$results['summary'] = $this->asText($fieldset->div);
$results['name'] = $this->asText($fieldset->legend);
$results['assertions'] = array();
$tbody = $fieldset->table->tbody;
foreach ($tbody->tr as $row) {
$assertion = array();
$assertion['message'] = $this->asText($row->td[0]);
$assertion['type'] = $this->asText($row->td[1]);
$assertion['file'] = $this->asText($row->td[2]);
$assertion['line'] = $this->asText($row->td[3]);
$assertion['function'] = $this->asText($row->td[4]);
Dries Buytaert
committed
$ok_url = (url('misc/watchdog-ok.png') == 'misc/watchdog-ok.png') ? 'misc/watchdog-ok.png' : (base_path() . 'misc/watchdog-ok.png');
$assertion['status'] = ($row->td[5]->img['src'] == $ok_url) ? 'Pass' : 'Fail';
$results['assertions'][] = $assertion;
}
}
}
$this->childTestResults = $results;
}
/**
* Get the fieldset containing the results for group this test is in.
*
* @return fieldset containing the results for group this test is in.
*/
function getResultFieldSet() {
Dries Buytaert
committed
$fieldsets = $this->xpath('//fieldset');
$info = $this->getInfo();
foreach ($fieldsets as $fieldset) {
if ($fieldset->legend == $info['name']) {
return $fieldset;
}
}
return FALSE;
}
/**
* Extract the text contained by the element.
*
Dries Buytaert
committed
* @param $element
* Element to extract text from.
* @return
* Extracted text.
*/
function asText(SimpleXMLElement $element) {
Dries Buytaert
committed
if (!is_object($element)) {
return $this->fail('The element is not an element.');
}
return trim(html_entity_decode(strip_tags($element->asXML())));
}
/**
* Check if the test is being run from inside a CURL request.
*
* @return The test is being run from inside a CURL request.
*/
function inCURL() {
return preg_match("/^simpletest\d+/", $_SERVER['HTTP_USER_AGENT']);
}
}
Dries Buytaert
committed
class SimpleTestMailCaptureTestCase extends DrupalWebTestCase {
/**
Dries Buytaert
committed
* Implement getInfo().
Dries Buytaert
committed
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
*/
public static function getInfo() {
return array(
'name' => t('SimpleTest e-mail capturing'),
'description' => t('Test the SimpleTest e-mail capturing logic, the assertMail assertion and the drupalGetMails function.'),
'group' => t('SimpleTest'),
);
}
/**
* Test to see if the wrapper function is executed correctly.
*/
function testMailSend() {
// Create an e-mail.
$subject = $this->randomString(64);
$body = $this->randomString(128);
$message = array(
'id' => 'drupal_mail_test',
'headers' => array('Content-type'=> 'text/html'),
'subject' => $subject,
'to' => 'foobar@example.com',
'body' => $body,
);
// Before we send the e-mail, drupalGetMails should return an empty array.
$captured_emails = $this->drupalGetMails();
$this->assertEqual(count($captured_emails), 0, t('The captured e-mails queue is empty.'), t('E-mail'));
// Send the e-mail.
$response = drupal_mail_send($message);
// Ensure that there is one e-mail in the captured e-mails array.
$captured_emails = $this->drupalGetMails();
$this->assertEqual(count($captured_emails), 1, t('One e-mail was captured.'), t('E-mail'));
// Assert that the e-mail was sent by iterating over the message properties
// and ensuring that they are captured intact.
foreach($message as $field => $value) {
$this->assertMail($field, $value, t('The e-mail was sent and the value for property @field is intact.', array('@field' => $field)), t('E-mail'));
}
// Send additional e-mails so more than one e-mail is captured.
for ($index = 0; $index < 5; $index++) {
$message = array(
'id' => 'drupal_mail_test_' . $index,
'headers' => array('Content-type'=> 'text/html'),
'subject' => $this->randomString(64),
'to' => $this->randomName(32) . '@example.com',
'body' => $this->randomString(512),
);
drupal_mail_send($message);
}
// There should now be 6 e-mails captured.
$captured_emails = $this->drupalGetMails();
$this->assertEqual(count($captured_emails), 6, t('All e-mails were captured.'), t('E-mail'));
// Test different ways of getting filtered e-mails via drupalGetMails().
$captured_emails = $this->drupalGetMails(array('id' => 'drupal_mail_test'));
$this->assertEqual(count($captured_emails), 1, t('Only one e-mail is returned when filtering by id.'), t('E-mail'));
$captured_emails = $this->drupalGetMails(array('id' => 'drupal_mail_test', 'subject' => $subject));
$this->assertEqual(count($captured_emails), 1, t('Only one e-mail is returned when filtering by id and subject.'), t('E-mail'));
$captured_emails = $this->drupalGetMails(array('id' => 'drupal_mail_test', 'subject' => $subject, 'from' => 'this_was_not_used@example.com'));
$this->assertEqual(count($captured_emails), 0, t('No e-mails are returned when querying with an unused from address.'), t('E-mail'));
// Send the last e-mail again, so we can confirm that the drupalGetMails-filter
// correctly returns all e-mails with a given property/value.
drupal_mail_send($message);
$captured_emails = $this->drupalGetMails(array('id' => 'drupal_mail_test_4'));
$this->assertEqual(count($captured_emails), 2, t('All e-mails with the same id are returned when filtering by id.'), t('E-mail'));
}