annotate modules/dblog/dblog.test @ 13:134d4b2e75f6

updated quicktabs and google analytics modules
author danieleb <danielebarchiesi@me.com>
date Tue, 29 Oct 2013 13:48:59 +0000
parents ff03f76ab3fe
children
rev   line source
danielebarchiesi@0 1 <?php
danielebarchiesi@0 2
danielebarchiesi@0 3 /**
danielebarchiesi@0 4 * @file
danielebarchiesi@0 5 * Tests for dblog.module.
danielebarchiesi@0 6 */
danielebarchiesi@0 7
danielebarchiesi@0 8 /**
danielebarchiesi@0 9 * Tests logging messages to the database.
danielebarchiesi@0 10 */
danielebarchiesi@0 11 class DBLogTestCase extends DrupalWebTestCase {
danielebarchiesi@0 12
danielebarchiesi@0 13 /**
danielebarchiesi@0 14 * A user with some relevent administrative permissions.
danielebarchiesi@0 15 *
danielebarchiesi@0 16 * @var object
danielebarchiesi@0 17 */
danielebarchiesi@0 18 protected $big_user;
danielebarchiesi@0 19
danielebarchiesi@0 20 /**
danielebarchiesi@0 21 * A user without any permissions.
danielebarchiesi@0 22 *
danielebarchiesi@0 23 * @var object
danielebarchiesi@0 24 */
danielebarchiesi@0 25 protected $any_user;
danielebarchiesi@0 26
danielebarchiesi@0 27 public static function getInfo() {
danielebarchiesi@0 28 return array(
danielebarchiesi@0 29 'name' => 'DBLog functionality',
danielebarchiesi@0 30 'description' => 'Generate events and verify dblog entries; verify user access to log reports based on persmissions.',
danielebarchiesi@0 31 'group' => 'DBLog',
danielebarchiesi@0 32 );
danielebarchiesi@0 33 }
danielebarchiesi@0 34
danielebarchiesi@0 35 /**
danielebarchiesi@0 36 * Enable modules and create users with specific permissions.
danielebarchiesi@0 37 */
danielebarchiesi@0 38 function setUp() {
danielebarchiesi@0 39 parent::setUp('dblog', 'blog', 'poll');
danielebarchiesi@0 40 // Create users.
danielebarchiesi@0 41 $this->big_user = $this->drupalCreateUser(array('administer site configuration', 'access administration pages', 'access site reports', 'administer users'));
danielebarchiesi@0 42 $this->any_user = $this->drupalCreateUser(array());
danielebarchiesi@0 43 }
danielebarchiesi@0 44
danielebarchiesi@0 45 /**
danielebarchiesi@0 46 * Tests Database Logging module functionality through interfaces.
danielebarchiesi@0 47 *
danielebarchiesi@0 48 * First logs in users, then creates database log events, and finally tests
danielebarchiesi@0 49 * Database Logging module functionality through both the admin and user
danielebarchiesi@0 50 * interfaces.
danielebarchiesi@0 51 */
danielebarchiesi@0 52 function testDBLog() {
danielebarchiesi@0 53 // Login the admin user.
danielebarchiesi@0 54 $this->drupalLogin($this->big_user);
danielebarchiesi@0 55
danielebarchiesi@0 56 $row_limit = 100;
danielebarchiesi@0 57 $this->verifyRowLimit($row_limit);
danielebarchiesi@0 58 $this->verifyCron($row_limit);
danielebarchiesi@0 59 $this->verifyEvents();
danielebarchiesi@0 60 $this->verifyReports();
danielebarchiesi@0 61
danielebarchiesi@0 62 // Login the regular user.
danielebarchiesi@0 63 $this->drupalLogin($this->any_user);
danielebarchiesi@0 64 $this->verifyReports(403);
danielebarchiesi@0 65 }
danielebarchiesi@0 66
danielebarchiesi@0 67 /**
danielebarchiesi@0 68 * Verifies setting of the database log row limit.
danielebarchiesi@0 69 *
danielebarchiesi@0 70 * @param int $row_limit
danielebarchiesi@0 71 * The row limit.
danielebarchiesi@0 72 */
danielebarchiesi@0 73 private function verifyRowLimit($row_limit) {
danielebarchiesi@0 74 // Change the database log row limit.
danielebarchiesi@0 75 $edit = array();
danielebarchiesi@0 76 $edit['dblog_row_limit'] = $row_limit;
danielebarchiesi@0 77 $this->drupalPost('admin/config/development/logging', $edit, t('Save configuration'));
danielebarchiesi@0 78 $this->assertResponse(200);
danielebarchiesi@0 79
danielebarchiesi@0 80 // Check row limit variable.
danielebarchiesi@0 81 $current_limit = variable_get('dblog_row_limit', 1000);
danielebarchiesi@0 82 $this->assertTrue($current_limit == $row_limit, format_string('[Cache] Row limit variable of @count equals row limit of @limit', array('@count' => $current_limit, '@limit' => $row_limit)));
danielebarchiesi@0 83 // Verify dblog row limit equals specified row limit.
danielebarchiesi@0 84 $current_limit = unserialize(db_query("SELECT value FROM {variable} WHERE name = :dblog_limit", array(':dblog_limit' => 'dblog_row_limit'))->fetchField());
danielebarchiesi@0 85 $this->assertTrue($current_limit == $row_limit, format_string('[Variable table] Row limit variable of @count equals row limit of @limit', array('@count' => $current_limit, '@limit' => $row_limit)));
danielebarchiesi@0 86 }
danielebarchiesi@0 87
danielebarchiesi@0 88 /**
danielebarchiesi@0 89 * Verifies that cron correctly applies the database log row limit.
danielebarchiesi@0 90 *
danielebarchiesi@0 91 * @param int $row_limit
danielebarchiesi@0 92 * The row limit.
danielebarchiesi@0 93 */
danielebarchiesi@0 94 private function verifyCron($row_limit) {
danielebarchiesi@0 95 // Generate additional log entries.
danielebarchiesi@0 96 $this->generateLogEntries($row_limit + 10);
danielebarchiesi@0 97 // Verify that the database log row count exceeds the row limit.
danielebarchiesi@0 98 $count = db_query('SELECT COUNT(wid) FROM {watchdog}')->fetchField();
danielebarchiesi@0 99 $this->assertTrue($count > $row_limit, format_string('Dblog row count of @count exceeds row limit of @limit', array('@count' => $count, '@limit' => $row_limit)));
danielebarchiesi@0 100
danielebarchiesi@0 101 // Run a cron job.
danielebarchiesi@0 102 $this->cronRun();
danielebarchiesi@0 103 // Verify that the database log row count equals the row limit plus one
danielebarchiesi@0 104 // because cron adds a record after it runs.
danielebarchiesi@0 105 $count = db_query('SELECT COUNT(wid) FROM {watchdog}')->fetchField();
danielebarchiesi@0 106 $this->assertTrue($count == $row_limit + 1, format_string('Dblog row count of @count equals row limit of @limit plus one', array('@count' => $count, '@limit' => $row_limit)));
danielebarchiesi@0 107 }
danielebarchiesi@0 108
danielebarchiesi@0 109 /**
danielebarchiesi@0 110 * Generates a number of random database log events.
danielebarchiesi@0 111 *
danielebarchiesi@0 112 * @param int $count
danielebarchiesi@0 113 * Number of watchdog entries to generate.
danielebarchiesi@0 114 * @param string $type
danielebarchiesi@0 115 * (optional) The type of watchdog entry. Defaults to 'custom'.
danielebarchiesi@0 116 * @param int $severity
danielebarchiesi@0 117 * (optional) The severity of the watchdog entry. Defaults to WATCHDOG_NOTICE.
danielebarchiesi@0 118 */
danielebarchiesi@0 119 private function generateLogEntries($count, $type = 'custom', $severity = WATCHDOG_NOTICE) {
danielebarchiesi@0 120 global $base_root;
danielebarchiesi@0 121
danielebarchiesi@0 122 // Prepare the fields to be logged
danielebarchiesi@0 123 $log = array(
danielebarchiesi@0 124 'type' => $type,
danielebarchiesi@0 125 'message' => 'Log entry added to test the dblog row limit.',
danielebarchiesi@0 126 'variables' => array(),
danielebarchiesi@0 127 'severity' => $severity,
danielebarchiesi@0 128 'link' => NULL,
danielebarchiesi@0 129 'user' => $this->big_user,
danielebarchiesi@0 130 'uid' => isset($this->big_user->uid) ? $this->big_user->uid : 0,
danielebarchiesi@0 131 'request_uri' => $base_root . request_uri(),
danielebarchiesi@0 132 'referer' => $_SERVER['HTTP_REFERER'],
danielebarchiesi@0 133 'ip' => ip_address(),
danielebarchiesi@0 134 'timestamp' => REQUEST_TIME,
danielebarchiesi@0 135 );
danielebarchiesi@0 136 $message = 'Log entry added to test the dblog row limit. Entry #';
danielebarchiesi@0 137 for ($i = 0; $i < $count; $i++) {
danielebarchiesi@0 138 $log['message'] = $message . $i;
danielebarchiesi@0 139 dblog_watchdog($log);
danielebarchiesi@0 140 }
danielebarchiesi@0 141 }
danielebarchiesi@0 142
danielebarchiesi@0 143 /**
danielebarchiesi@0 144 * Confirms that database log reports are displayed at the correct paths.
danielebarchiesi@0 145 *
danielebarchiesi@0 146 * @param int $response
danielebarchiesi@0 147 * (optional) HTTP response code. Defaults to 200.
danielebarchiesi@0 148 */
danielebarchiesi@0 149 private function verifyReports($response = 200) {
danielebarchiesi@0 150 $quote = '&#039;';
danielebarchiesi@0 151
danielebarchiesi@0 152 // View the database log help page.
danielebarchiesi@0 153 $this->drupalGet('admin/help/dblog');
danielebarchiesi@0 154 $this->assertResponse($response);
danielebarchiesi@0 155 if ($response == 200) {
danielebarchiesi@0 156 $this->assertText(t('Database logging'), 'DBLog help was displayed');
danielebarchiesi@0 157 }
danielebarchiesi@0 158
danielebarchiesi@0 159 // View the database log report page.
danielebarchiesi@0 160 $this->drupalGet('admin/reports/dblog');
danielebarchiesi@0 161 $this->assertResponse($response);
danielebarchiesi@0 162 if ($response == 200) {
danielebarchiesi@0 163 $this->assertText(t('Recent log messages'), 'DBLog report was displayed');
danielebarchiesi@0 164 }
danielebarchiesi@0 165
danielebarchiesi@0 166 // View the database log page-not-found report page.
danielebarchiesi@0 167 $this->drupalGet('admin/reports/page-not-found');
danielebarchiesi@0 168 $this->assertResponse($response);
danielebarchiesi@0 169 if ($response == 200) {
danielebarchiesi@0 170 $this->assertText(t('Top ' . $quote . 'page not found' . $quote . ' errors'), 'DBLog page-not-found report was displayed');
danielebarchiesi@0 171 }
danielebarchiesi@0 172
danielebarchiesi@0 173 // View the database log access-denied report page.
danielebarchiesi@0 174 $this->drupalGet('admin/reports/access-denied');
danielebarchiesi@0 175 $this->assertResponse($response);
danielebarchiesi@0 176 if ($response == 200) {
danielebarchiesi@0 177 $this->assertText(t('Top ' . $quote . 'access denied' . $quote . ' errors'), 'DBLog access-denied report was displayed');
danielebarchiesi@0 178 }
danielebarchiesi@0 179
danielebarchiesi@0 180 // View the database log event page.
danielebarchiesi@0 181 $this->drupalGet('admin/reports/event/1');
danielebarchiesi@0 182 $this->assertResponse($response);
danielebarchiesi@0 183 if ($response == 200) {
danielebarchiesi@0 184 $this->assertText(t('Details'), 'DBLog event node was displayed');
danielebarchiesi@0 185 }
danielebarchiesi@0 186 }
danielebarchiesi@0 187
danielebarchiesi@0 188 /**
danielebarchiesi@0 189 * Generates and then verifies various types of events.
danielebarchiesi@0 190 */
danielebarchiesi@0 191 private function verifyEvents() {
danielebarchiesi@0 192 // Invoke events.
danielebarchiesi@0 193 $this->doUser();
danielebarchiesi@0 194 $this->doNode('article');
danielebarchiesi@0 195 $this->doNode('blog');
danielebarchiesi@0 196 $this->doNode('page');
danielebarchiesi@0 197 $this->doNode('poll');
danielebarchiesi@0 198
danielebarchiesi@0 199 // When a user account is canceled, any content they created remains but the
danielebarchiesi@0 200 // uid = 0. Their blog entry shows as "'s blog" on the home page. Records
danielebarchiesi@0 201 // in the watchdog table related to that user have the uid set to zero.
danielebarchiesi@0 202 }
danielebarchiesi@0 203
danielebarchiesi@0 204 /**
danielebarchiesi@0 205 * Generates and then verifies some user events.
danielebarchiesi@0 206 */
danielebarchiesi@0 207 private function doUser() {
danielebarchiesi@0 208 // Set user variables.
danielebarchiesi@0 209 $name = $this->randomName();
danielebarchiesi@0 210 $pass = user_password();
danielebarchiesi@0 211 // Add a user using the form to generate an add user event (which is not
danielebarchiesi@0 212 // triggered by drupalCreateUser).
danielebarchiesi@0 213 $edit = array();
danielebarchiesi@0 214 $edit['name'] = $name;
danielebarchiesi@0 215 $edit['mail'] = $name . '@example.com';
danielebarchiesi@0 216 $edit['pass[pass1]'] = $pass;
danielebarchiesi@0 217 $edit['pass[pass2]'] = $pass;
danielebarchiesi@0 218 $edit['status'] = 1;
danielebarchiesi@0 219 $this->drupalPost('admin/people/create', $edit, t('Create new account'));
danielebarchiesi@0 220 $this->assertResponse(200);
danielebarchiesi@0 221 // Retrieve the user object.
danielebarchiesi@0 222 $user = user_load_by_name($name);
danielebarchiesi@0 223 $this->assertTrue($user != NULL, format_string('User @name was loaded', array('@name' => $name)));
danielebarchiesi@0 224 // pass_raw property is needed by drupalLogin.
danielebarchiesi@0 225 $user->pass_raw = $pass;
danielebarchiesi@0 226 // Login user.
danielebarchiesi@0 227 $this->drupalLogin($user);
danielebarchiesi@0 228 // Logout user.
danielebarchiesi@0 229 $this->drupalLogout();
danielebarchiesi@0 230 // Fetch the row IDs in watchdog that relate to the user.
danielebarchiesi@0 231 $result = db_query('SELECT wid FROM {watchdog} WHERE uid = :uid', array(':uid' => $user->uid));
danielebarchiesi@0 232 foreach ($result as $row) {
danielebarchiesi@0 233 $ids[] = $row->wid;
danielebarchiesi@0 234 }
danielebarchiesi@0 235 $count_before = (isset($ids)) ? count($ids) : 0;
danielebarchiesi@0 236 $this->assertTrue($count_before > 0, format_string('DBLog contains @count records for @name', array('@count' => $count_before, '@name' => $user->name)));
danielebarchiesi@0 237
danielebarchiesi@0 238 // Login the admin user.
danielebarchiesi@0 239 $this->drupalLogin($this->big_user);
danielebarchiesi@0 240 // Delete the user created at the start of this test.
danielebarchiesi@0 241 // We need to POST here to invoke batch_process() in the internal browser.
danielebarchiesi@0 242 $this->drupalPost('user/' . $user->uid . '/cancel', array('user_cancel_method' => 'user_cancel_reassign'), t('Cancel account'));
danielebarchiesi@0 243
danielebarchiesi@0 244 // View the database log report.
danielebarchiesi@0 245 $this->drupalGet('admin/reports/dblog');
danielebarchiesi@0 246 $this->assertResponse(200);
danielebarchiesi@0 247
danielebarchiesi@0 248 // Verify that the expected events were recorded.
danielebarchiesi@0 249 // Add user.
danielebarchiesi@0 250 // Default display includes name and email address; if too long, the email
danielebarchiesi@0 251 // address is replaced by three periods.
danielebarchiesi@0 252 $this->assertLogMessage(t('New user: %name (%email).', array('%name' => $name, '%email' => $user->mail)), 'DBLog event was recorded: [add user]');
danielebarchiesi@0 253 // Login user.
danielebarchiesi@0 254 $this->assertLogMessage(t('Session opened for %name.', array('%name' => $name)), 'DBLog event was recorded: [login user]');
danielebarchiesi@0 255 // Logout user.
danielebarchiesi@0 256 $this->assertLogMessage(t('Session closed for %name.', array('%name' => $name)), 'DBLog event was recorded: [logout user]');
danielebarchiesi@0 257 // Delete user.
danielebarchiesi@0 258 $message = t('Deleted user: %name %email.', array('%name' => $name, '%email' => '<' . $user->mail . '>'));
danielebarchiesi@0 259 $message_text = truncate_utf8(filter_xss($message, array()), 56, TRUE, TRUE);
danielebarchiesi@0 260 // Verify that the full message displays on the details page.
danielebarchiesi@0 261 $link = FALSE;
danielebarchiesi@0 262 if ($links = $this->xpath('//a[text()="' . html_entity_decode($message_text) . '"]')) {
danielebarchiesi@0 263 // Found link with the message text.
danielebarchiesi@0 264 $links = array_shift($links);
danielebarchiesi@0 265 foreach ($links->attributes() as $attr => $value) {
danielebarchiesi@0 266 if ($attr == 'href') {
danielebarchiesi@0 267 // Extract link to details page.
danielebarchiesi@0 268 $link = drupal_substr($value, strpos($value, 'admin/reports/event/'));
danielebarchiesi@0 269 $this->drupalGet($link);
danielebarchiesi@0 270 // Check for full message text on the details page.
danielebarchiesi@0 271 $this->assertRaw($message, 'DBLog event details was found: [delete user]');
danielebarchiesi@0 272 break;
danielebarchiesi@0 273 }
danielebarchiesi@0 274 }
danielebarchiesi@0 275 }
danielebarchiesi@0 276 $this->assertTrue($link, 'DBLog event was recorded: [delete user]');
danielebarchiesi@0 277 // Visit random URL (to generate page not found event).
danielebarchiesi@0 278 $not_found_url = $this->randomName(60);
danielebarchiesi@0 279 $this->drupalGet($not_found_url);
danielebarchiesi@0 280 $this->assertResponse(404);
danielebarchiesi@0 281 // View the database log page-not-found report page.
danielebarchiesi@0 282 $this->drupalGet('admin/reports/page-not-found');
danielebarchiesi@0 283 $this->assertResponse(200);
danielebarchiesi@0 284 // Check that full-length URL displayed.
danielebarchiesi@0 285 $this->assertText($not_found_url, 'DBLog event was recorded: [page not found]');
danielebarchiesi@0 286 }
danielebarchiesi@0 287
danielebarchiesi@0 288 /**
danielebarchiesi@0 289 * Generates and then verifies some node events.
danielebarchiesi@0 290 *
danielebarchiesi@0 291 * @param string $type
danielebarchiesi@0 292 * A node type (e.g., 'article', 'page' or 'poll').
danielebarchiesi@0 293 */
danielebarchiesi@0 294 private function doNode($type) {
danielebarchiesi@0 295 // Create user.
danielebarchiesi@0 296 $perm = array('create ' . $type . ' content', 'edit own ' . $type . ' content', 'delete own ' . $type . ' content');
danielebarchiesi@0 297 $user = $this->drupalCreateUser($perm);
danielebarchiesi@0 298 // Login user.
danielebarchiesi@0 299 $this->drupalLogin($user);
danielebarchiesi@0 300
danielebarchiesi@0 301 // Create a node using the form in order to generate an add content event
danielebarchiesi@0 302 // (which is not triggered by drupalCreateNode).
danielebarchiesi@0 303 $edit = $this->getContent($type);
danielebarchiesi@0 304 $langcode = LANGUAGE_NONE;
danielebarchiesi@0 305 $title = $edit["title"];
danielebarchiesi@0 306 $this->drupalPost('node/add/' . $type, $edit, t('Save'));
danielebarchiesi@0 307 $this->assertResponse(200);
danielebarchiesi@0 308 // Retrieve the node object.
danielebarchiesi@0 309 $node = $this->drupalGetNodeByTitle($title);
danielebarchiesi@0 310 $this->assertTrue($node != NULL, format_string('Node @title was loaded', array('@title' => $title)));
danielebarchiesi@0 311 // Edit the node.
danielebarchiesi@0 312 $edit = $this->getContentUpdate($type);
danielebarchiesi@0 313 $this->drupalPost('node/' . $node->nid . '/edit', $edit, t('Save'));
danielebarchiesi@0 314 $this->assertResponse(200);
danielebarchiesi@0 315 // Delete the node.
danielebarchiesi@0 316 $this->drupalPost('node/' . $node->nid . '/delete', array(), t('Delete'));
danielebarchiesi@0 317 $this->assertResponse(200);
danielebarchiesi@0 318 // View the node (to generate page not found event).
danielebarchiesi@0 319 $this->drupalGet('node/' . $node->nid);
danielebarchiesi@0 320 $this->assertResponse(404);
danielebarchiesi@0 321 // View the database log report (to generate access denied event).
danielebarchiesi@0 322 $this->drupalGet('admin/reports/dblog');
danielebarchiesi@0 323 $this->assertResponse(403);
danielebarchiesi@0 324
danielebarchiesi@0 325 // Login the admin user.
danielebarchiesi@0 326 $this->drupalLogin($this->big_user);
danielebarchiesi@0 327 // View the database log report.
danielebarchiesi@0 328 $this->drupalGet('admin/reports/dblog');
danielebarchiesi@0 329 $this->assertResponse(200);
danielebarchiesi@0 330
danielebarchiesi@0 331 // Verify that node events were recorded.
danielebarchiesi@0 332 // Was node content added?
danielebarchiesi@0 333 $this->assertLogMessage(t('@type: added %title.', array('@type' => $type, '%title' => $title)), 'DBLog event was recorded: [content added]');
danielebarchiesi@0 334 // Was node content updated?
danielebarchiesi@0 335 $this->assertLogMessage(t('@type: updated %title.', array('@type' => $type, '%title' => $title)), 'DBLog event was recorded: [content updated]');
danielebarchiesi@0 336 // Was node content deleted?
danielebarchiesi@0 337 $this->assertLogMessage(t('@type: deleted %title.', array('@type' => $type, '%title' => $title)), 'DBLog event was recorded: [content deleted]');
danielebarchiesi@0 338
danielebarchiesi@0 339 // View the database log access-denied report page.
danielebarchiesi@0 340 $this->drupalGet('admin/reports/access-denied');
danielebarchiesi@0 341 $this->assertResponse(200);
danielebarchiesi@0 342 // Verify that the 'access denied' event was recorded.
danielebarchiesi@0 343 $this->assertText(t('admin/reports/dblog'), 'DBLog event was recorded: [access denied]');
danielebarchiesi@0 344
danielebarchiesi@0 345 // View the database log page-not-found report page.
danielebarchiesi@0 346 $this->drupalGet('admin/reports/page-not-found');
danielebarchiesi@0 347 $this->assertResponse(200);
danielebarchiesi@0 348 // Verify that the 'page not found' event was recorded.
danielebarchiesi@0 349 $this->assertText(t('node/@nid', array('@nid' => $node->nid)), 'DBLog event was recorded: [page not found]');
danielebarchiesi@0 350 }
danielebarchiesi@0 351
danielebarchiesi@0 352 /**
danielebarchiesi@0 353 * Creates random content based on node content type.
danielebarchiesi@0 354 *
danielebarchiesi@0 355 * @param string $type
danielebarchiesi@0 356 * Node content type (e.g., 'article').
danielebarchiesi@0 357 *
danielebarchiesi@0 358 * @return array
danielebarchiesi@0 359 * Random content needed by various node types.
danielebarchiesi@0 360 */
danielebarchiesi@0 361 private function getContent($type) {
danielebarchiesi@0 362 $langcode = LANGUAGE_NONE;
danielebarchiesi@0 363 switch ($type) {
danielebarchiesi@0 364 case 'poll':
danielebarchiesi@0 365 $content = array(
danielebarchiesi@0 366 "title" => $this->randomName(8),
danielebarchiesi@0 367 'choice[new:0][chtext]' => $this->randomName(32),
danielebarchiesi@0 368 'choice[new:1][chtext]' => $this->randomName(32),
danielebarchiesi@0 369 );
danielebarchiesi@0 370 break;
danielebarchiesi@0 371
danielebarchiesi@0 372 default:
danielebarchiesi@0 373 $content = array(
danielebarchiesi@0 374 "title" => $this->randomName(8),
danielebarchiesi@0 375 "body[$langcode][0][value]" => $this->randomName(32),
danielebarchiesi@0 376 );
danielebarchiesi@0 377 break;
danielebarchiesi@0 378 }
danielebarchiesi@0 379 return $content;
danielebarchiesi@0 380 }
danielebarchiesi@0 381
danielebarchiesi@0 382 /**
danielebarchiesi@0 383 * Creates random content as an update based on node content type.
danielebarchiesi@0 384 *
danielebarchiesi@0 385 * @param string $type
danielebarchiesi@0 386 * Node content type (e.g., 'article').
danielebarchiesi@0 387 *
danielebarchiesi@0 388 * @return array
danielebarchiesi@0 389 * Random content needed by various node types.
danielebarchiesi@0 390 */
danielebarchiesi@0 391 private function getContentUpdate($type) {
danielebarchiesi@0 392 switch ($type) {
danielebarchiesi@0 393 case 'poll':
danielebarchiesi@0 394 $content = array(
danielebarchiesi@0 395 'choice[chid:1][chtext]' => $this->randomName(32),
danielebarchiesi@0 396 'choice[chid:2][chtext]' => $this->randomName(32),
danielebarchiesi@0 397 );
danielebarchiesi@0 398 break;
danielebarchiesi@0 399
danielebarchiesi@0 400 default:
danielebarchiesi@0 401 $langcode = LANGUAGE_NONE;
danielebarchiesi@0 402 $content = array(
danielebarchiesi@0 403 "body[$langcode][0][value]" => $this->randomName(32),
danielebarchiesi@0 404 );
danielebarchiesi@0 405 break;
danielebarchiesi@0 406 }
danielebarchiesi@0 407 return $content;
danielebarchiesi@0 408 }
danielebarchiesi@0 409
danielebarchiesi@0 410 /**
danielebarchiesi@0 411 * Tests the addition and clearing of log events through the admin interface.
danielebarchiesi@0 412 *
danielebarchiesi@0 413 * Logs in the admin user, creates a database log event, and tests the
danielebarchiesi@0 414 * functionality of clearing the database log through the admin interface.
danielebarchiesi@0 415 */
danielebarchiesi@0 416 protected function testDBLogAddAndClear() {
danielebarchiesi@0 417 global $base_root;
danielebarchiesi@0 418 // Get a count of how many watchdog entries already exist.
danielebarchiesi@0 419 $count = db_query('SELECT COUNT(*) FROM {watchdog}')->fetchField();
danielebarchiesi@0 420 $log = array(
danielebarchiesi@0 421 'type' => 'custom',
danielebarchiesi@0 422 'message' => 'Log entry added to test the doClearTest clear down.',
danielebarchiesi@0 423 'variables' => array(),
danielebarchiesi@0 424 'severity' => WATCHDOG_NOTICE,
danielebarchiesi@0 425 'link' => NULL,
danielebarchiesi@0 426 'user' => $this->big_user,
danielebarchiesi@0 427 'uid' => isset($this->big_user->uid) ? $this->big_user->uid : 0,
danielebarchiesi@0 428 'request_uri' => $base_root . request_uri(),
danielebarchiesi@0 429 'referer' => $_SERVER['HTTP_REFERER'],
danielebarchiesi@0 430 'ip' => ip_address(),
danielebarchiesi@0 431 'timestamp' => REQUEST_TIME,
danielebarchiesi@0 432 );
danielebarchiesi@0 433 // Add a watchdog entry.
danielebarchiesi@0 434 dblog_watchdog($log);
danielebarchiesi@0 435 // Make sure the table count has actually been incremented.
danielebarchiesi@0 436 $this->assertEqual($count + 1, db_query('SELECT COUNT(*) FROM {watchdog}')->fetchField(), format_string('dblog_watchdog() added an entry to the dblog :count', array(':count' => $count)));
danielebarchiesi@0 437 // Login the admin user.
danielebarchiesi@0 438 $this->drupalLogin($this->big_user);
danielebarchiesi@0 439 // Post in order to clear the database table.
danielebarchiesi@0 440 $this->drupalPost('admin/reports/dblog', array(), t('Clear log messages'));
danielebarchiesi@0 441 // Count the rows in watchdog that previously related to the deleted user.
danielebarchiesi@0 442 $count = db_query('SELECT COUNT(*) FROM {watchdog}')->fetchField();
danielebarchiesi@0 443 $this->assertEqual($count, 0, format_string('DBLog contains :count records after a clear.', array(':count' => $count)));
danielebarchiesi@0 444 }
danielebarchiesi@0 445
danielebarchiesi@0 446 /**
danielebarchiesi@0 447 * Tests the database log filter functionality at admin/reports/dblog.
danielebarchiesi@0 448 */
danielebarchiesi@0 449 protected function testFilter() {
danielebarchiesi@0 450 $this->drupalLogin($this->big_user);
danielebarchiesi@0 451
danielebarchiesi@0 452 // Clear the log to ensure that only generated entries will be found.
danielebarchiesi@0 453 db_delete('watchdog')->execute();
danielebarchiesi@0 454
danielebarchiesi@0 455 // Generate 9 random watchdog entries.
danielebarchiesi@0 456 $type_names = array();
danielebarchiesi@0 457 $types = array();
danielebarchiesi@0 458 for ($i = 0; $i < 3; $i++) {
danielebarchiesi@0 459 $type_names[] = $type_name = $this->randomName();
danielebarchiesi@0 460 $severity = WATCHDOG_EMERGENCY;
danielebarchiesi@0 461 for ($j = 0; $j < 3; $j++) {
danielebarchiesi@0 462 $types[] = $type = array(
danielebarchiesi@0 463 'count' => $j + 1,
danielebarchiesi@0 464 'type' => $type_name,
danielebarchiesi@0 465 'severity' => $severity++,
danielebarchiesi@0 466 );
danielebarchiesi@0 467 $this->generateLogEntries($type['count'], $type['type'], $type['severity']);
danielebarchiesi@0 468 }
danielebarchiesi@0 469 }
danielebarchiesi@0 470
danielebarchiesi@0 471 // View the database log page.
danielebarchiesi@0 472 $this->drupalGet('admin/reports/dblog');
danielebarchiesi@0 473
danielebarchiesi@0 474 // Confirm that all the entries are displayed.
danielebarchiesi@0 475 $count = $this->getTypeCount($types);
danielebarchiesi@0 476 foreach ($types as $key => $type) {
danielebarchiesi@0 477 $this->assertEqual($count[$key], $type['count'], 'Count matched');
danielebarchiesi@0 478 }
danielebarchiesi@0 479
danielebarchiesi@0 480 // Filter by each type and confirm that entries with various severities are
danielebarchiesi@0 481 // displayed.
danielebarchiesi@0 482 foreach ($type_names as $type_name) {
danielebarchiesi@0 483 $edit = array(
danielebarchiesi@0 484 'type[]' => array($type_name),
danielebarchiesi@0 485 );
danielebarchiesi@0 486 $this->drupalPost(NULL, $edit, t('Filter'));
danielebarchiesi@0 487
danielebarchiesi@0 488 // Count the number of entries of this type.
danielebarchiesi@0 489 $type_count = 0;
danielebarchiesi@0 490 foreach ($types as $type) {
danielebarchiesi@0 491 if ($type['type'] == $type_name) {
danielebarchiesi@0 492 $type_count += $type['count'];
danielebarchiesi@0 493 }
danielebarchiesi@0 494 }
danielebarchiesi@0 495
danielebarchiesi@0 496 $count = $this->getTypeCount($types);
danielebarchiesi@0 497 $this->assertEqual(array_sum($count), $type_count, 'Count matched');
danielebarchiesi@0 498 }
danielebarchiesi@0 499
danielebarchiesi@0 500 // Set the filter to match each of the two filter-type attributes and
danielebarchiesi@0 501 // confirm the correct number of entries are displayed.
danielebarchiesi@0 502 foreach ($types as $key => $type) {
danielebarchiesi@0 503 $edit = array(
danielebarchiesi@0 504 'type[]' => array($type['type']),
danielebarchiesi@0 505 'severity[]' => array($type['severity']),
danielebarchiesi@0 506 );
danielebarchiesi@0 507 $this->drupalPost(NULL, $edit, t('Filter'));
danielebarchiesi@0 508
danielebarchiesi@0 509 $count = $this->getTypeCount($types);
danielebarchiesi@0 510 $this->assertEqual(array_sum($count), $type['count'], 'Count matched');
danielebarchiesi@0 511 }
danielebarchiesi@0 512
danielebarchiesi@0 513 // Clear all logs and make sure the confirmation message is found.
danielebarchiesi@0 514 $this->drupalPost('admin/reports/dblog', array(), t('Clear log messages'));
danielebarchiesi@0 515 $this->assertText(t('Database log cleared.'), 'Confirmation message found');
danielebarchiesi@0 516 }
danielebarchiesi@0 517
danielebarchiesi@0 518 /**
danielebarchiesi@0 519 * Gets the database log event information from the browser page.
danielebarchiesi@0 520 *
danielebarchiesi@0 521 * @return array
danielebarchiesi@0 522 * List of log events where each event is an array with following keys:
danielebarchiesi@0 523 * - severity: (int) A database log severity constant.
danielebarchiesi@0 524 * - type: (string) The type of database log event.
danielebarchiesi@0 525 * - message: (string) The message for this database log event.
danielebarchiesi@0 526 * - user: (string) The user associated with this database log event.
danielebarchiesi@0 527 */
danielebarchiesi@0 528 protected function getLogEntries() {
danielebarchiesi@0 529 $entries = array();
danielebarchiesi@0 530 if ($table = $this->xpath('.//table[@id="admin-dblog"]')) {
danielebarchiesi@0 531 $table = array_shift($table);
danielebarchiesi@0 532 foreach ($table->tbody->tr as $row) {
danielebarchiesi@0 533 $entries[] = array(
danielebarchiesi@0 534 'severity' => $this->getSeverityConstant($row['class']),
danielebarchiesi@0 535 'type' => $this->asText($row->td[1]),
danielebarchiesi@0 536 'message' => $this->asText($row->td[3]),
danielebarchiesi@0 537 'user' => $this->asText($row->td[4]),
danielebarchiesi@0 538 );
danielebarchiesi@0 539 }
danielebarchiesi@0 540 }
danielebarchiesi@0 541 return $entries;
danielebarchiesi@0 542 }
danielebarchiesi@0 543
danielebarchiesi@0 544 /**
danielebarchiesi@0 545 * Gets the count of database log entries by database log event type.
danielebarchiesi@0 546 *
danielebarchiesi@0 547 * @param array $types
danielebarchiesi@0 548 * The type information to compare against.
danielebarchiesi@0 549 *
danielebarchiesi@0 550 * @return array
danielebarchiesi@0 551 * The count of each type keyed by the key of the $types array.
danielebarchiesi@0 552 */
danielebarchiesi@0 553 protected function getTypeCount(array $types) {
danielebarchiesi@0 554 $entries = $this->getLogEntries();
danielebarchiesi@0 555 $count = array_fill(0, count($types), 0);
danielebarchiesi@0 556 foreach ($entries as $entry) {
danielebarchiesi@0 557 foreach ($types as $key => $type) {
danielebarchiesi@0 558 if ($entry['type'] == $type['type'] && $entry['severity'] == $type['severity']) {
danielebarchiesi@0 559 $count[$key]++;
danielebarchiesi@0 560 break;
danielebarchiesi@0 561 }
danielebarchiesi@0 562 }
danielebarchiesi@0 563 }
danielebarchiesi@0 564 return $count;
danielebarchiesi@0 565 }
danielebarchiesi@0 566
danielebarchiesi@0 567 /**
danielebarchiesi@0 568 * Gets the watchdog severity constant corresponding to the CSS class.
danielebarchiesi@0 569 *
danielebarchiesi@0 570 * @param string $class
danielebarchiesi@0 571 * CSS class attribute.
danielebarchiesi@0 572 *
danielebarchiesi@0 573 * @return int|null
danielebarchiesi@0 574 * The watchdog severity constant or NULL if not found.
danielebarchiesi@0 575 *
danielebarchiesi@0 576 * @ingroup logging_severity_levels
danielebarchiesi@0 577 */
danielebarchiesi@0 578 protected function getSeverityConstant($class) {
danielebarchiesi@0 579 // Reversed array from dblog_overview().
danielebarchiesi@0 580 $map = array(
danielebarchiesi@0 581 'dblog-debug' => WATCHDOG_DEBUG,
danielebarchiesi@0 582 'dblog-info' => WATCHDOG_INFO,
danielebarchiesi@0 583 'dblog-notice' => WATCHDOG_NOTICE,
danielebarchiesi@0 584 'dblog-warning' => WATCHDOG_WARNING,
danielebarchiesi@0 585 'dblog-error' => WATCHDOG_ERROR,
danielebarchiesi@0 586 'dblog-critical' => WATCHDOG_CRITICAL,
danielebarchiesi@0 587 'dblog-alert' => WATCHDOG_ALERT,
danielebarchiesi@0 588 'dblog-emerg' => WATCHDOG_EMERGENCY,
danielebarchiesi@0 589 );
danielebarchiesi@0 590
danielebarchiesi@0 591 // Find the class that contains the severity.
danielebarchiesi@0 592 $classes = explode(' ', $class);
danielebarchiesi@0 593 foreach ($classes as $class) {
danielebarchiesi@0 594 if (isset($map[$class])) {
danielebarchiesi@0 595 return $map[$class];
danielebarchiesi@0 596 }
danielebarchiesi@0 597 }
danielebarchiesi@0 598 return NULL;
danielebarchiesi@0 599 }
danielebarchiesi@0 600
danielebarchiesi@0 601 /**
danielebarchiesi@0 602 * Extracts the text contained by the XHTML element.
danielebarchiesi@0 603 *
danielebarchiesi@0 604 * @param SimpleXMLElement $element
danielebarchiesi@0 605 * Element to extract text from.
danielebarchiesi@0 606 *
danielebarchiesi@0 607 * @return string
danielebarchiesi@0 608 * Extracted text.
danielebarchiesi@0 609 */
danielebarchiesi@0 610 protected function asText(SimpleXMLElement $element) {
danielebarchiesi@0 611 if (!is_object($element)) {
danielebarchiesi@0 612 return $this->fail('The element is not an element.');
danielebarchiesi@0 613 }
danielebarchiesi@0 614 return trim(html_entity_decode(strip_tags($element->asXML())));
danielebarchiesi@0 615 }
danielebarchiesi@0 616
danielebarchiesi@0 617 /**
danielebarchiesi@0 618 * Confirms that a log message appears on the database log overview screen.
danielebarchiesi@0 619 *
danielebarchiesi@0 620 * This function should only be used for the admin/reports/dblog page, because
danielebarchiesi@0 621 * it checks for the message link text truncated to 56 characters. Other log
danielebarchiesi@0 622 * pages have no detail links so they contain the full message text.
danielebarchiesi@0 623 *
danielebarchiesi@0 624 * @param string $log_message
danielebarchiesi@0 625 * The database log message to check.
danielebarchiesi@0 626 * @param string $message
danielebarchiesi@0 627 * The message to pass to simpletest.
danielebarchiesi@0 628 */
danielebarchiesi@0 629 protected function assertLogMessage($log_message, $message) {
danielebarchiesi@0 630 $message_text = truncate_utf8(filter_xss($log_message, array()), 56, TRUE, TRUE);
danielebarchiesi@0 631 // After filter_xss(), HTML entities should be converted to their character
danielebarchiesi@0 632 // equivalents because assertLink() uses this string in xpath() to query the
danielebarchiesi@0 633 // Document Object Model (DOM).
danielebarchiesi@0 634 $this->assertLink(html_entity_decode($message_text), 0, $message);
danielebarchiesi@0 635 }
danielebarchiesi@0 636 }
danielebarchiesi@0 637