home | career | drupal | java | mac | mysql | perl | php | scala | uml | unix

Drupal example source code file (actions.test)

This example Drupal source code file (actions.test) is included in the DevDaily.com "Drupal Source Code Warehouse" project. The intent of this project is to help you "Learn Drupal by Example".

PHP - Drupal tags/keywords

action, actions, array, complex, edit, expected, function, language, make, new_action_label, php, sure, the, translate

The actions.test Drupal example source code

<?php
// $Id: actions.test,v 1.18 2010/08/05 23:53:38 webchick Exp $

class ActionsConfigurationTestCase extends DrupalWebTestCase {
  public static function getInfo() {
    return array(
      'name' => 'Actions configuration',
      'description' => 'Tests complex actions configuration by adding, editing, and deleting a complex action.',
      'group' => 'Actions',
    );
  }

  /**
   * Test the configuration of advanced actions through the administration
   * interface.
   */
  function testActionConfiguration() {
    // Create a user with permission to view the actions administration pages.
    $user = $this->drupalCreateUser(array('administer actions'));
    $this->drupalLogin($user);

    // Make a POST request to admin/config/system/actions/manage.
    $edit = array();
    $edit['action'] = drupal_hash_base64('system_goto_action');
    $this->drupalPost('admin/config/system/actions/manage', $edit, t('Create'));

    // Make a POST request to the individual action configuration page.
    $edit = array();
    $action_label = $this->randomName();
    $edit['actions_label'] = $action_label;
    $edit['url'] = 'admin';
    $this->drupalPost('admin/config/system/actions/configure/' . drupal_hash_base64('system_goto_action'), $edit, t('Save'));

    // Make sure that the new complex action was saved properly.
    $this->assertText(t('The action has been successfully saved.'), t("Make sure we get a confirmation that we've successfully saved the complex action."));
    $this->assertText($action_label, t("Make sure the action label appears on the configuration page after we've saved the complex action."));

    // Make another POST request to the action edit page.
    $this->clickLink(t('configure'));
    preg_match('|admin/config/system/actions/configure/(\d+)|', $this->getUrl(), $matches);
    $aid = $matches[1];
    $edit = array();
    $new_action_label = $this->randomName();
    $edit['actions_label'] = $new_action_label;
    $edit['url'] = 'admin';
    $this->drupalPost(NULL, $edit, t('Save'));

    // Make sure that the action updated properly.
    $this->assertText(t('The action has been successfully saved.'), t("Make sure we get a confirmation that we've successfully updated the complex action."));
    $this->assertNoText($action_label, t("Make sure the old action label does NOT appear on the configuration page after we've updated the complex action."));
    $this->assertText($new_action_label, t("Make sure the action label appears on the configuration page after we've updated the complex action."));

    // Make sure that deletions work properly.
    $this->clickLink(t('delete'));
    $edit = array();
    $this->drupalPost("admin/config/system/actions/delete/$aid", $edit, t('Delete'));

    // Make sure that the action was actually deleted.
    $this->assertRaw(t('Action %action was deleted', array('%action' => $new_action_label)), t('Make sure that we get a delete confirmation message.'));
    $this->drupalGet('admin/config/system/actions/manage');
    $this->assertNoText($new_action_label, t("Make sure the action label does not appear on the overview page after we've deleted the action."));
    $exists = db_query('SELECT aid FROM {actions} WHERE callback = :callback', array(':callback' => 'drupal_goto_action'))->fetchField();
    $this->assertFalse($exists, t('Make sure the action is gone from the database after being deleted.'));
  }
}

/**
 * Test actions executing in a potential loop, and make sure they abort properly.
 */
class ActionLoopTestCase extends DrupalWebTestCase {
  public static function getInfo() {
    return array(
      'name' => 'Actions executing in a potentially infinite loop',
      'description' => 'Tests actions executing in a loop, and makes sure they abort properly.',
      'group' => 'Actions',
    );
  }

  function setUp() {
    parent::setUp('dblog', 'trigger', 'actions_loop_test');
  }

  /**
   * Set up a loop with 3 - 12 recursions, and see if it aborts properly.
   */
  function testActionLoop() {
    $user = $this->drupalCreateUser(array('administer actions'));
    $this->drupalLogin($user);

    $hash = drupal_hash_base64('actions_loop_test_log');
    $edit = array('aid' => $hash);
    $this->drupalPost('admin/structure/trigger/actions_loop_test', $edit, t('Assign'));

    // Delete any existing watchdog messages to clear the plethora of
    // "Action added" messages from when Drupal was installed.
    db_delete('watchdog')->execute();
    // To prevent this test from failing when xdebug is enabled, the maximum
    // recursion level should be kept low enough to prevent the xdebug
    // infinite recursion protection mechanism from aborting the request.
    // See http://drupal.org/node/587634.
    variable_set('actions_max_stack', mt_rand(3, 12));
    $this->triggerActions();
  }

  /**
   * Create an infinite loop by causing a watchdog message to be set,
   * which causes the actions to be triggered again, up to actions_max_stack
   * times.
   */
  protected function triggerActions() {
    $this->drupalGet('<front>', array('query' => array('trigger_actions_on_watchdog' => TRUE)));
    $expected = array();
    $expected[] = 'Triggering action loop';
    for ($i = 1; $i <= variable_get('actions_max_stack', 35); $i++) {
      $expected[] = "Test log #$i";
    }
    $expected[] = 'Stack overflow: too many calls to actions_do(). Aborting to prevent infinite recursion.';

    $result = db_query("SELECT message FROM {watchdog} WHERE type = 'actions_loop_test' OR type = 'actions' ORDER BY wid");
    $loop_started = FALSE;
    foreach ($result as $row) {
      $expected_message = array_shift($expected);
      $this->assertEqual($row->message, $expected_message, t('Expected message %expected, got %message.', array('%expected' => $expected_message, '%message' => $row->message)));
    }
    $this->assertTrue(empty($expected), t('All expected messages found.'));
  }
}

Other Drupal examples (source code examples)

Here is a short list of links related to this Drupal actions.test source code file:

new blog posts

"Drupal" is a registered trademark of Dries Buytaert.

my drupal tutorials and examples  

Copyright 1998-2016 Alvin Alexander, alvinalexander.com
All Rights Reserved.

Beginning in 2016, a portion of the proceeds from pages under the '/drupal-code-examples/' URI will be donated to charity.