summaryrefslogtreecommitdiff
path: root/modules/simpletest/simpletest.test
blob: 2da05d6a33c5fd98f2ef7cd3a0aae54cf08ada5e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
<?php
// $Id$

class SimpleTestTestCase extends DrupalWebTestCase {
  protected $results;

  /**
   * Implementation of getInfo().
   */
  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')
    );
  }

  /**
   * Implementation of setUp().
   */
  function setUp() {
    if (!$this->inCURL()) {
      parent::setUp('simpletest');

      // 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');
      $this->assertTitle(variable_get('site_name', 'Drupal'), t('Site title matches.'));
    }
  }

  /**
   * 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.');
    $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 {
      // Run this test from web interface.
      $this->drupalGet('admin/build/testing');

      $edit = array();
      $edit['SimpleTestTestCase'] = TRUE;
      $this->drupalPost(NULL, $edit, t('Run tests'));

      $this->getTestResults();

      $this->confirmStubTestResults();
    }
  }

  /**
   * Test to be run and the results confirmed.
   */
  function stubTest() {
    $this->pass($this->pass);
    $this->fail($this->fail);

    $this->drupalCreateUser(array($this->valid_permission));
    $this->drupalCreateUser(array($this->invalid_permission));
  }

  /**
   * Confirm that the stub test produced the desired results.
   */
  function confirmStubTestResults() {
    $this->assertAssertion($this->pass, 'Other', 'Pass');
    $this->assertAssertion($this->fail, 'Other', 'Fail');

    $this->assertAssertion(t('Created permissions: @perms', array('@perms' => $this->valid_permission)), 'Role', 'Pass');
    $this->assertAssertion(t('Invalid permission %permission.', array('%permission' => $this->invalid_permission)), 'Role', 'Fail');
  }

  /**
   * 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.
   * @return Assertion result.
   */
  function assertAssertion($message, $type, $status) {
    $message = trim(strip_tags($message));
    $found = FALSE;
    foreach ($this->results['assertions'] as $assertion) {
      if ($assertion['message'] == $message &&
          $assertion['type'] == $type &&
          $assertion['status'] == $status) {
        $found = TRUE;
        break;
      }
    }
    return $this->assertTrue($found, t('Found assertion {"@message", "@type", "@status"}.', array('@message' => $message, '@type' => $type, '@status' => $status)));
  }

  /**
   * 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.
        $results['summary'] = $this->asText($fieldset->div);
        $results['name'] = $this->asText($fieldset->fieldset->legend);

        $results['assertions'] = array();
        $tbody = $fieldset->fieldset->table->tbody;
        foreach ($tbody->tr as $row) {
          $assertion = array();
          $assertion['message'] = $this->asText($row->td[0]);
          $assertion['type'] = $this->asText($row->td[1]);
          $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->results = $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() {
    $fieldsets = $this->elements->xpath('//fieldset');
    $info = $this->getInfo();
    foreach ($fieldsets as $fieldset) {
      if ($fieldset->legend == $info['group']) {
        return $fieldset;
      }
    }
    return FALSE;
  }

  /**
   * Extract the text contained by the element.
   *
   * @param $element
   *   Element to extract text from.
   * @return
   *   Extracted text.
   */
  function asText(SimpleXMLElement $element) {
    if (!is_object($element)) {
      return $this->fail('The element is not an element.');
    }
    return trim(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']);
  }
}