summaryrefslogtreecommitdiff
path: root/kolab.org/www/drupal-7.26/modules/simpletest/tests/pager.test
blob: 6e8ce8e79e70767bc229ae5f75a84fd93dd2b73f (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
<?php

/**
 * @file
 * Tests for pager functionality.
 */

/**
 * Tests pager functionality.
 */
class PagerFunctionalWebTestCase extends DrupalWebTestCase {
  protected $profile = 'testing';

  public static function getInfo() {
    return array(
      'name' => 'Pager functionality',
      'description' => 'Tests pager functionality.',
      'group' => 'Pager',
    );
  }

  function setUp() {
    parent::setUp(array('dblog'));

    // Insert 300 log messages.
    for ($i = 0; $i < 300; $i++) {
      watchdog('pager_test', $this->randomString(), NULL, WATCHDOG_DEBUG);
    }

    $this->admin_user = $this->drupalCreateUser(array(
      'access site reports',
    ));
    $this->drupalLogin($this->admin_user);
  }

  /**
   * Tests markup and CSS classes of pager links.
   */
  function testActiveClass() {
    // Verify first page.
    $this->drupalGet('admin/reports/dblog');
    $current_page = 0;
    $this->assertPagerItems($current_page);

    // Verify any page but first/last.
    $current_page++;
    $this->drupalGet('admin/reports/dblog', array('query' => array('page' => $current_page)));
    $this->assertPagerItems($current_page);

    // Verify last page.
    $elements = $this->xpath('//li[contains(@class, :class)]/a', array(':class' => 'pager-last'));
    preg_match('@page=(\d+)@', $elements[0]['href'], $matches);
    $current_page = (int) $matches[1];
    $this->drupalGet($GLOBALS['base_root'] . $elements[0]['href'], array('external' => TRUE));
    $this->assertPagerItems($current_page);
  }

  /**
   * Asserts pager items and links.
   *
   * @param int $current_page
   *   The current pager page the internal browser is on.
   */
  protected function assertPagerItems($current_page) {
    $elements = $this->xpath('//ul[@class=:class]/li', array(':class' => 'pager'));
    $this->assertTrue(!empty($elements), 'Pager found.');

    // Make current page 1-based.
    $current_page++;

    // Extract first/previous and next/last items.
    // first/previous only exist, if the current page is not the first.
    if ($current_page > 1) {
      $first = array_shift($elements);
      $previous = array_shift($elements);
    }
    // next/last always exist, unless the current page is the last.
    if ($current_page != count($elements)) {
      $last = array_pop($elements);
      $next = array_pop($elements);
    }

    // Verify items and links to pages.
    foreach ($elements as $page => $element) {
      // Make item/page index 1-based.
      $page++;
      if ($current_page == $page) {
        $this->assertClass($element, 'pager-current', 'Item for current page has .pager-current class.');
        $this->assertFalse(isset($element->a), 'Item for current page has no link.');
      }
      else {
        $this->assertNoClass($element, 'pager-current', "Item for page $page has no .pager-current class.");
        $this->assertClass($element, 'pager-item', "Item for page $page has .pager-item class.");
        $this->assertTrue($element->a, "Link to page $page found.");
        $this->assertNoClass($element->a, 'active', "Link to page $page is not active.");
      }
      unset($elements[--$page]);
    }
    // Verify that no other items remain untested.
    $this->assertTrue(empty($elements), 'All expected items found.');

    // Verify first/previous and next/last items and links.
    if (isset($first)) {
      $this->assertClass($first, 'pager-first', 'Item for first page has .pager-first class.');
      $this->assertTrue($first->a, 'Link to first page found.');
      $this->assertNoClass($first->a, 'active', 'Link to first page is not active.');
    }
    if (isset($previous)) {
      $this->assertClass($previous, 'pager-previous', 'Item for first page has .pager-previous class.');
      $this->assertTrue($previous->a, 'Link to previous page found.');
      $this->assertNoClass($previous->a, 'active', 'Link to previous page is not active.');
    }
    if (isset($next)) {
      $this->assertClass($next, 'pager-next', 'Item for next page has .pager-next class.');
      $this->assertTrue($next->a, 'Link to next page found.');
      $this->assertNoClass($next->a, 'active', 'Link to next page is not active.');
    }
    if (isset($last)) {
      $this->assertClass($last, 'pager-last', 'Item for last page has .pager-last class.');
      $this->assertTrue($last->a, 'Link to last page found.');
      $this->assertNoClass($last->a, 'active', 'Link to last page is not active.');
    }
  }

  /**
   * Asserts that an element has a given class.
   *
   * @param SimpleXMLElement $element
   *   The element to test.
   * @param string $class
   *   The class to assert.
   * @param string $message
   *   (optional) A verbose message to output.
   */
  protected function assertClass(SimpleXMLElement $element, $class, $message = NULL) {
    if (!isset($message)) {
      $message = "Class .$class found.";
    }
    $this->assertTrue(strpos($element['class'], $class) !== FALSE, $message);
  }

  /**
   * Asserts that an element does not have a given class.
   *
   * @param SimpleXMLElement $element
   *   The element to test.
   * @param string $class
   *   The class to assert.
   * @param string $message
   *   (optional) A verbose message to output.
   */
  protected function assertNoClass(SimpleXMLElement $element, $class, $message = NULL) {
    if (!isset($message)) {
      $message = "Class .$class not found.";
    }
    $this->assertTrue(strpos($element['class'], $class) === FALSE, $message);
  }
}