You are here

userpoints_api.test in User Points 7

Same filename and directory in other branches
  1. 6 tests/userpoints_api.test

Contains test classes for userpoints module.

File

tests/userpoints_api.test
View source
<?php

// Author: Jacob Redding
// additional tests added by Zhao ning (nzhao, user/96328)

/**
 * @file
 * Contains test classes for userpoints module.
 */

/**
 * Userpoints base test class with various helper functions.
 */
class UserpointsBaseTestCase extends DrupalWebTestCase {

  /**
   * Add points through the admin form.
   *
   * @param $points
   *   Amount of points to add.
   * @param $user
   *   User object for which to grant points for.
   * @param $total
   *   Amount of points the user should have after the points have been added.
   *   If not NULL, the confirmation string is checked and so is
   *   userpoints_get_current_points().
   *
   * @return
   *   The most recent transaction id, assuming that this belongs to this
   *   transaction.
   */
  function addPoints($points, $user, $total = NULL) {
    $edit = array(
      'txn_user' => $user->name,
      'points' => $points,
    );
    $this
      ->drupalPost('admin/config/people/userpoints/add', $edit, t('Save'));
    if ($total !== NULL) {
      $categories = userpoints_get_categories();
      $tid = userpoints_get_default_tid();
      $category = $categories[$tid];
      $this
        ->assertText(t('@name just earned @points points and now has @total points in the @category category.', array(
        '@name' => $user->name,
        '@points' => $points,
        '@total' => $total,
        '@category' => $category,
      )), t('Correct confirmation message displayed.'));
      $this
        ->assertEqual($total, userpoints_get_current_points($user->uid, $tid), t('User has the correct total amount of points.'));
    }
    return db_query('SELECT MAX(txn_id) FROM {userpoints_txn} WHERE uid = :uid', array(
      ':uid' => $user->uid,
    ))
      ->fetchField();
  }

  /**
   * Verify the current and optionally max points in a specific category.
   *
   * @param $uid
   *   User uid for the user that needs to be tested.
   * @param $current
   *   The amount of points the user is currently supposed to have.
   * @param $max
   *   The amount of max points of the user. Only tested if not NULL.
   * @param $tid
   *   The category that needs to be checked. Default is used is none is
   *   provided.
   */
  function verifyPoints($uid, $current, $max = NULL, $tid = NULL) {

    // Check if a term id is passed as a parameter.
    if (!$tid) {

      // It is not, so get the default term id.
      $tid = userpoints_get_default_tid();
    }
    $api_current = userpoints_get_current_points($uid, $tid);
    $this
      ->assertEqual($current, $api_current, t('Current points for tid %tid are correct (expected: %expected, actual: %actual).', array(
      '%expected' => $current,
      '%actual' => $api_current,
      '%tid' => $tid,
    )));
    if ($max !== NULL) {

      // Hijack static cache, delete this item from it.
      $max_cache =& drupal_static('userpoints_get_max_points', array());
      unset($max_cache[$uid][$tid]);
      $api_max = userpoints_get_max_points($uid, $tid);
      $this
        ->assertEqual($max, $api_max, t('Max points for tid %tid are correct (expected: %expected, actual: %actual).', array(
        '%expected' => $max,
        '%actual' => $api_max,
        '%tid' => $tid,
      )));
    }
  }

}

/**
 * API Tests.
 */
class UserpointsAPITestCase extends UserpointsBaseTestCase {
  private $admin_user;
  private $non_admin_user;

  /**
   * Implements getInfo().
   */
  function getInfo() {
    return array(
      'name' => t('Userpoints API'),
      'description' => t('Tests the core API for proper inserts & updates to the database tables,
			  moderation, expiration, as well as permission checks'),
      'group' => t('Userpoints'),
    );
  }

  /**
   * Install userpoints module and create users.
   */
  function setUp() {
    parent::setUp('userpoints');

    // Create an administrator account.
    $this->admin_user = $this
      ->drupalCreateUser(array(
      'administer userpoints',
    ));

    // Create a standard Drupal account and log in as that person.
    $this->non_admin_user = $this
      ->drupalCreateUser();
    $this
      ->drupalLogin($this->non_admin_user);
  }

  /**
   * Returns the user points of a specific transaction.
   *
   * @param $uid
   *   User uid for which the points should be selected.
   * @param $points
   *   Optionaly define which transaction should be loaded by specifying the
   *   points.
   * @param $sum
   *   If TRUE, calculate the sum of all matching transaction rows.
   * @return
   *   Amount of points according to the arguments.
   */
  function getTxnPoints($uid, $points = NULL, $sum = FALSE) {
    $query = db_select('userpoints_txn', 'p');
    if ($sum) {
      $query
        ->addExpression('SUM(points)');
    }
    else {
      $query
        ->addField('p', 'points');
    }
    $query
      ->condition('uid', $uid);
    if ($points) {
      $query
        ->condition('points', $points);
    }
    return (int) $query
      ->execute()
      ->fetchField();
  }

  /**
   * Returns the user points.
   *
   * @param $uid
   *   User uid for which the points should be selected.
   * @param $points
   *   Optionaly define which transaction should be loaded by specifying the
   *   points.
   * @param $sum
   *   If TRUE, calculate the sum of all matching transaction rows.
   * @return
   *   Amount of points according to the arguments.
   */
  function getPoints($uid, $points = NULL, $sum = FALSE) {
    $query = db_select('userpoints', 'p');
    if ($sum) {
      $query
        ->addExpression('SUM(points)');
    }
    else {
      $query
        ->addField('p', 'points');
    }
    $query
      ->condition('uid', $uid);
    if ($points) {
      $query
        ->condition('points', $points);
    }
    return (int) $query
      ->execute()
      ->fetchField();
  }

  /**
   * Call userpoints_userpointsapi() with just points.
   */
  function testBasicCall() {
    global $user;
    $points = (int) rand(1, 500);
    $sumpoints = $points;

    // NOTE: increment max points with all positive point changes, tests userpoints_get_max_points.
    $maxpoints = $points;

    // Test the a basic API call.
    $return = userpoints_userpointsapi($points);
    $this
      ->assertTrue($return['status'] == TRUE, t('API responded with successful grant of points'));

    // Check the database to ensure the point were properly saved.
    $this
      ->assertTrue($this
      ->getTxnPoints($user->uid, $points) === $points, t('Successfully verified points in the txn table'));

    // Check that the transaction table and the summary table match.
    $this
      ->assertTrue($this
      ->getTxnPoints($user->uid, NULL, TRUE) === $this
      ->getPoints($user->uid, NULL, TRUE), t('Sum of transactions match total points for user'));

    // Add negative points to the initial value and check the values.
    $points = -rand(1, 500);
    $sumpoints = $sumpoints + $points;
    userpoints_userpointsapi($points);

    // Check the database to ensure the negative point value was properly saved.
    $this
      ->assertTrue($this
      ->getTxnPoints($user->uid, $points) === $points, t('Successfully verified negative points in the txn table'));

    // Now test to make sure the transaction and and caching table stay in sync.
    // Also test userpoints_get_max_points and userpoints_get_current_points.
    for ($i = 0; $i <= rand(1, 50); $i++) {
      $points = rand(1, 500);
      if (rand() & 1) {
        $points = -$points;
      }
      $sumpoints = $sumpoints + $points;
      if ($sumpoints > $maxpoints) {
        $maxpoints = $sumpoints;
      }
      userpoints_userpointsapi($points);
    }

    // Check the summary table to make sure everything is still kosher.
    $this
      ->assertEqual($this
      ->getTxnPoints($user->uid, NULL, TRUE), $this
      ->getPoints($user->uid, NULL, TRUE));
    $this
      ->assertEqual($this
      ->getPoints($user->uid, NULL, TRUE), $sumpoints);
    $this
      ->assertEqual($sumpoints, userpoints_get_current_points());
    $this
      ->assertEqual($maxpoints, userpoints_get_max_points());
  }

  /**
   * Call the api functions with an array.
   */
  function testParamsArrayCall() {
    $points = rand();

    // Assert that the use of a params array with simply points in it works.
    $params = array(
      'points' => $points,
      'uid' => $this->non_admin_user->uid,
    );
    $this
      ->assertTrue(userpoints_userpointsapi($params) == TRUE, t('API call using a params array responded with successful grant of points'));

    // Check the Database to make sure the points made it there.
    $this
      ->assertTrue($this
      ->getPoints($this->non_admin_user->uid, NULL, TRUE) == $points, t('Successfully verified points in the txn table'));

    // Test to ensure that calling it with no points returns FALSE indicating an error.
    $params = array(
      'points' => '',
      'uid' => $this->non_admin_user->uid,
    );
    $return = userpoints_userpointsapi($params);
    $this
      ->assertFalse($return['status'], t('API successfully prevented null points from being added'));
    $params = array(
      'points' => 'abcd',
      'uid' => $this->non_admin_user->uid,
    );
    $return = userpoints_userpointsapi($params);
    $this
      ->assertFalse($return['status'], t('API successfully prevented non-numeric points from being added'));

    // Award points to admin user and test to ensure they were awarded to the correct user.
    $params = array(
      'points' => $points,
      'uid' => $this->admin_user->uid,
    );
    $this
      ->assertTrue(userpoints_userpointsapi($params) == TRUE, t('Successfully granted points to admin user'));

    // Check the Database to make sure the points made it there.
    $this
      ->assertTrue($this
      ->getPoints($this->non_admin_user->uid, NULL, TRUE) == $points, t('Successfully verified points in the txn table'));

    // Attempt to award points to a non-existent user.
    $sql = "SELECT MAX(uid) FROM {users}";
    $nonuid = db_query($sql)
      ->fetchField() + 1;
    $params = array(
      'points' => $points,
      'uid' => $nonuid,
    );
    $ret = userpoints_userpointsapi($params);
    $this
      ->assertFalse($ret['status'], t('Successfully blocked points given to a non-existent user'));

    /**
     * @todo: This is not actually implemented, just passed the tests because it
     *        has set the 'uid' key instead of 'tid'.
    // Attempt to award points to a non-existent term.
    $maxtid = "SELECT MAX(tid) from {taxonomy_term_data}";
    $nontid = db_query($sql)->fetchField() + 1;
    $params = array(
      'points' => $points,
      'tid' => $nontid,
    );

    $ret = userpoints_userpointsapi($params);
    $this->assertFalse($ret['status'], t('Successfully blocked points given to a non-existent tid'));
    */

    // Test various aspects of the API to ensure the DB is being updated successfully.
    $points = rand(1, 500);
    $description = $this
      ->randomName();
    $operation = $this
      ->randomName();
    $params = array(
      'points' => $points,
      'description' => $description,
      'operation' => $operation,
    );
    $ret = userpoints_userpointsapi($params);
    $sql = "SELECT description, operation, reference FROM {userpoints_txn} WHERE description = :description AND operation = :operation";
    $db_point_rec = db_query($sql, array(
      ':description' => $description,
      ':operation' => $operation,
    ))
      ->fetchAssoc();
    $this
      ->assertTrue($db_point_rec['description'] == $description, t('Point description successfully verified in DB'));
    $this
      ->assertTrue($db_point_rec['operation'] == $operation, t('Point event successfully verified in DB'));
  }
  function testExpiration() {
    $points = rand(1, 100);
    $sum_points = 0;

    // Create various time tests.
    $times['valid']['time'] = rand(1, 10000);
    $times['valid']['string'] = '(expirydate = random number)';
    $times['expire']['time'] = REQUEST_TIME;
    $times['expire']['string'] = '(expirydate = today)';
    $times['null']['time'] = NULL;
    $times['null']['string'] = '(expirydate = NULL)';
    $bad_time = 'test string';

    // First lets check to make sure it is blocking bad times.
    $params = array(
      'uid' => $this->non_admin_user->uid,
      'points' => $points,
      'expirydate' => $bad_time,
    );
    $return = userpoints_userpointsapi($params);
    $this
      ->assertFalse($return['status'], t(print_r($return, TRUE) . "API succesfully blocked an entry with a string as the expiry date"));
    foreach ($times as $time) {
      $params = array(
        'uid' => $this->non_admin_user->uid,
        'points' => $points,
        'expirydate' => $time['time'],
      );
      $return = userpoints_userpointsapi($params);
      $this
        ->assertTrue($return['status'], t($time['string'] . " API responded with a successful grant of points"));

      // Check the database to ensure the points were properly saved.
      $sql = "SELECT points FROM {userpoints_txn} WHERE uid = :uid AND points = :points AND expirydate = :date";
      $db_points = (int) db_query($sql, array(
        ':uid' => $this->non_admin_user->uid,
        ':points' => $points,
        ':date' => (int) $time['time'],
      ))
        ->fetchField();
      $this
        ->assertEqual($db_points, $points, t($time['string'] . "Successfully verified points in the txn table."));
      if ($db_points == $points) {
        $sum_points = $sum_points + $points;
      }

      // Check update point to 'userpoints' table.
      $this
        ->assertEqual($this
        ->getPoints($this->non_admin_user->uid), $sum_points, t($time['string'] . "Successfully verified that the summary table was updated"));
    }

    // Clear the slate again.
    db_truncate('userpoints')
      ->execute();
    db_truncate('userpoints_txn')
      ->execute();

    // Set a default expire time.
    variable_set(USERPOINTS_EXPIREON_DATE, REQUEST_TIME + 5000);

    // Add two different points in, one to post immediately another to expire in the future.
    $keep_points = rand(1, 100);
    $expire_points = rand(1, 100);
    $params = array(
      'uid' => $this->non_admin_user->uid,
      'points' => $expire_points,
      'expirydate' => REQUEST_TIME - 1000,
      'operation' => 'must_expire',
    );
    $return = userpoints_userpointsapi($params);
    $this
      ->assertTrue($return['status'], t("API succesfully added points for expiration"));
    $params = array(
      'uid' => $this->non_admin_user->uid,
      'points' => $keep_points,
      'expirydate' => REQUEST_TIME + 10000,
      'operation' => 'must_not_expire',
    );
    userpoints_userpointsapi($params);
    $this
      ->assertTrue($return['status'], t("API succesfully added points for expiration"));

    // Load timestamp of the first transaction.
    $time_stamp = db_query('SELECT time_stamp FROM {userpoints_txn} WHERE operation = :op', array(
      ':op' => 'must_expire',
    ))
      ->fetchField();

    // Call cron to check expiration.
    drupal_cron_run();

    // Check the user points removed or not if the point was expiration.
    $this
      ->assertEqual($this
      ->getTxnPoints($this->non_admin_user->uid, NULL, TRUE), $keep_points, t("Successfully removed expired points from the txn table."));
    $this
      ->assertEqual($this
      ->getPoints($this->non_admin_user->uid), $keep_points, t("Successfully removed expired points from the summary table."));

    // Load the expiry transaction from the database and verify that it does
    // not expire.
    $expired_time = db_query('SELECT expirydate FROM {userpoints_txn} WHERE operation = :expiry', array(
      ':expiry' => 'expiry',
    ))
      ->fetchField();
    $this
      ->assertEqual($expired_time, 0, t('Expiry userpoints transaction does not expire.'));

    // Load expired transaction and verify that time_stamp was not updated.
    $updated_time_stamp = db_query('SELECT time_stamp FROM {userpoints_txn} WHERE expired = 1')
      ->fetchField();
    $this
      ->assertEqual($time_stamp, $updated_time_stamp, t('Time stamp of expired transaction was not changed.'));
  }

  /**
   * Changes the default expiration date in the administrative settings
   * and then checks to ensure that it is saved/returned correctly.
   */
  function testDefaultExpireDate() {

    // Login as an admin.
    $this
      ->drupalLogin($this->admin_user);

    // Use a date in the future.
    $date = REQUEST_TIME + 100000;
    $date_array = array(
      'month' => date('n', $date),
      'day' => date('d', $date),
      'year' => date('Y', $date),
    );

    // save settings.
    $edit = array(
      'userpoints_expireon_date[month]' => $date_array['month'],
      'userpoints_expireon_date[day]' => $date_array['day'],
      'userpoints_expireon_date[year]' => $date_array['year'],
    );
    $this
      ->drupalPost('admin/config/people/userpoints/settings', $edit, 'Save configuration');

    // Check database.
    $database_date = variable_get('userpoints_expireon_date', FALSE);
    $this
      ->assertEqual($database_date['day'], $date_array['day']);
    $this
      ->assertEqual($database_date['month'], $date_array['month']);
    $this
      ->assertEqual($database_date['year'], $date_array['year']);

    // Check API.
    $expiry_date = userpoints_get_default_expiry_date();
    $this
      ->assertEqual($expiry_date, userpoints_date_to_timestamp($date_array));
  }

  /**
   * Test the default term id.
   */
  function testGetDefaultTid() {
    $vid = userpoints_get_vid();
    $term_name = $this
      ->randomName(10);
    $desc = $this
      ->randomName(10);

    // create a new term.
    $term = (object) array(
      'name' => $term_name,
      'description' => $desc,
      'vid' => $vid,
    );
    taxonomy_term_save($term);

    // login as admin userpoints
    $this->admin_user = $this
      ->drupalCreateUser(array(
      'administer userpoints',
    ));
    $this
      ->drupalLogin($this->admin_user);

    // save settings.
    $edit = array(
      'userpoints_category_default_tid' => $term->tid,
    );
    $this
      ->drupalPost('admin/config/people/userpoints/settings', $edit, 'Save configuration');

    // Check database.
    $this
      ->assertEqual(variable_get('userpoints_category_default_tid', FALSE), $term->tid);

    // check API.
    $tid = userpoints_get_default_tid();
    $this
      ->assertEqual($tid, $term->tid);

    // Check database.
    $this
      ->assertTrue(variable_get('userpoints_category_default_vid', FALSE) != FALSE, t("Successfully verified the vocab ID in the database."));

    // Check API.
    $vid = userpoints_get_vid();
    $this
      ->assertTrue(is_numeric($vid), t("Successfully retrieved default vid %d.", array(
      '%d' => $vid,
    )));
  }

  /**
   * Test user permissions
   */
  function testUserpermissions() {
    $this->non_admin_username = 'test';
    $points = 10;

    // check permission with admin user.
    $this->admin_user = $this
      ->drupalCreateUser(array(
      'administer userpoints',
    ));
    $this
      ->drupalLogin($this->admin_user);

    // check access page.
    $this
      ->drupalGet('admin/config/people/userpoints');
    $content = $this
      ->drupalGetContent();
    $content = strstr($content, 'Access denied');
    $this
      ->assertTrue($content == FALSE, t("Successful navigated to the page modify points"));

    // check modify points.
    $edit = array(
      'txn_user' => $this->admin_user->name,
      'points' => $points,
    );
    $this
      ->drupalPost('admin/config/people/userpoints/add', $edit, 'Save');

    // Check database.
    $this
      ->assertEqual($this
      ->getTxnPoints($this->admin_user->uid, $points), $points, t("Successful verified that points were added into database."));

    // logout and change user.
    $this
      ->drupalLogout();

    // check permission with view user.
    $view_user = $this
      ->drupalCreateUser(array(
      'view userpoints',
    ));
    $this
      ->drupalLogin($view_user);

    // check access page.
    $this
      ->drupalGet('admin/config/people/userpoints');
    $this
      ->assertResponse(403, t("Successful verified that a user without admin userpoints permissions can not access the admin interface."));
  }
  function testModeration() {
    $points = rand(1, 100);

    // condition1 moderate=TRUE.
    $params = array(
      'uid' => $this->non_admin_user->uid,
      'points' => $points,
      'moderate' => TRUE,
    );

    // add points to user.
    $return = userpoints_userpointsapi($params);
    $this
      ->assertTrue($return['status'] == TRUE, t("1. (moderate=TRUE) API responded with successful grant of points"));

    // Check the database to ensure the point were properly saved.
    $this
      ->assertTrue($this
      ->getTxnPoints($this->non_admin_user->uid, $points) == $points, t("1. (moderate=TRUE) Successfully verified points in the txn table and waiting moderation."));

    // Check do not update point to 'userpoints' table.
    $this
      ->assertTrue($this
      ->getPoints($this->non_admin_user->uid) == 0, t("1. (moderate=TRUE) Successfully verified that points were added and the summary table was not updated."));

    /*
          //DISABLED because it should be checking if it adhered to the sites default moderation status
          $params = array (
          'uid' => $this->non_admin_user->uid,
          'points' => $points,
          'moderate' => NULL,
          );
          $return = userpoints_userpointsapi($params);
          $this->assertTrue($return['status'] == TRUE , t("6. (moderate=NULL) API responded with successful grant of points"));
      $sql = "SELECT points FROM {userpoints_txn} WHERE uid = %d AND points = %d AND status = 1";
          $db_points = (int) db_result(db_query($sql, $this->non_admin_user->uid, $points));
          $this->assertTrue($db_points == $points,t("6. (moderate=NULL) Successfully verified points in the txn table and waiting moder.") );
      $sql1 = "SELECT points FROM {userpoints} WHERE uid=%d";
          $db_points = (int) db_result(db_query($sql1, $this->non_admin_user->uid));
          $this->assertTrue($db_points == 0,t("6. (moderate=NULL) Successfully, Points added and does not modify summary table.") );
    */

    // condition7 moderate=FALSE.
    $params = array(
      'uid' => $this->non_admin_user->uid,
      'points' => $points,
      'moderate' => FALSE,
    );

    // add points to user.
    $return = userpoints_userpointsapi($params);
    $this
      ->assertTrue($return['status'] == TRUE, t("7. (moderate=FALSE) API responded with successful grant of points"));

    // Check the database to ensure the point were properly saved.
    $sql = "SELECT points FROM {userpoints_txn} WHERE uid = :uid AND points = :points AND status = 0";
    $db_points = (int) db_query($sql, array(
      ':uid' => $this->non_admin_user->uid,
      ':points' => $points,
    ))
      ->fetchField();
    $this
      ->assertTrue($db_points == $points, t("7. (moderate=FALSE) Successfully verified points in the txn table and NOT waiting moderation."));
  }

  /**
   * Tests the userpoints_get_categories() function.
   */
  function testGetCategories() {
    $cats = userpoints_get_categories();
    $this
      ->assertTrue(is_array($cats), 'Successfully verified userpoints_get_categories() returned an array');
  }

  /**
   * Test that editing points correctly updates the current and max points.
   */
  function testEditingTransactions() {

    // First, add some points to two different categories.
    $uid = $this->non_admin_user->uid;
    $params = array(
      'points' => 100,
      'tid' => 0,
      'uid' => $uid,
    );
    userpoints_userpointsapi($params);
    $params = array(
      'points' => 50,
      'tid' => 1,
      'uid' => $uid,
    );
    userpoints_userpointsapi($params);

    // Add a third transaction that can be edited.
    $params = array(
      'points' => 5,
      'tid' => 0,
      'uid' => $uid,
    );
    $return = userpoints_userpointsapi($params);
    $txn_id = $return['transaction']['txn_id'];

    // Verify points up to this point.
    $this
      ->verifyPoints($uid, 105, 105, 0);
    $this
      ->verifyPoints($uid, 50, 50, 1);

    // Now, edit the transaction. Mix any combination of point, category and
    // status changes. After the change, verify current and max points.
    // Points change.
    $params = array(
      'txn_id' => $txn_id,
      'points' => -5,
    );
    userpoints_userpointsapi($params);
    $this
      ->verifyPoints($uid, 95, 105, 0);

    // Change status to pending.
    $params = array(
      'txn_id' => $txn_id,
      'status' => USERPOINTS_TXN_STATUS_PENDING,
    );
    userpoints_userpointsapi($params);
    $this
      ->verifyPoints($uid, 100, 105, 0);

    // Change status back to approved.
    $params = array(
      'txn_id' => $txn_id,
      'status' => USERPOINTS_TXN_STATUS_APPROVED,
    );
    userpoints_userpointsapi($params);
    $this
      ->verifyPoints($uid, 95, 105, 0);

    // Change category.
    $params = array(
      'txn_id' => $txn_id,
      'tid' => 1,
    );
    userpoints_userpointsapi($params);
    $this
      ->verifyPoints($uid, 100, 105, 0);
    $this
      ->verifyPoints($uid, 45, 50, 1);

    // Change points and status.
    $params = array(
      'txn_id' => $txn_id,
      'points' => 3,
      'status' => USERPOINTS_TXN_STATUS_PENDING,
    );
    userpoints_userpointsapi($params);
    $this
      ->verifyPoints($uid, 100, 105, 0);
    $this
      ->verifyPoints($uid, 50, 50, 1);

    // Change status back to approved.
    $params = array(
      'txn_id' => $txn_id,
      'status' => USERPOINTS_TXN_STATUS_APPROVED,
    );
    userpoints_userpointsapi($params);
    $this
      ->verifyPoints($uid, 53, 53, 1);

    // Change points and category.
    $params = array(
      'txn_id' => $txn_id,
      'points' => 9,
      'tid' => 0,
    );
    userpoints_userpointsapi($params);
    $this
      ->verifyPoints($uid, 109, 109, 0);
    $this
      ->verifyPoints($uid, 50, 53, 1);

    // Change points and status and category.
    $params = array(
      'txn_id' => $txn_id,
      'points' => 10,
      'tid' => 1,
      'status' => USERPOINTS_TXN_STATUS_DECLINED,
    );
    userpoints_userpointsapi($params);
    $this
      ->verifyPoints($uid, 100, 109, 0);
    $this
      ->verifyPoints($uid, 50, 53, 1);

    // Change points and status back to approved.
    $params = array(
      'txn_id' => $txn_id,
      'points' => 4,
      'status' => USERPOINTS_TXN_STATUS_APPROVED,
    );
    userpoints_userpointsapi($params);
    $this
      ->verifyPoints($uid, 100, 109, 0);
    $this
      ->verifyPoints($uid, 54, 54, 1);
    $this
      ->verifyPoints($uid, 154, 159, 'all');
  }

}

/**
 * Administration UI tests
 */
class UserpointsAdminTestCase extends UserpointsBaseTestCase {
  private $admin_user;
  private $non_admin_user;

  /**
   * Implements getInfo().
   */
  function getInfo() {
    return array(
      'name' => t('Userpoints Admin'),
      'description' => t('Test various userpoints administration forms and listings.'),
      'group' => t('Userpoints'),
    );
  }

  /**
   * Install userpoints module and create users.
   */
  function setUp() {
    parent::setUp('userpoints');

    // Create an administrator account and log in with that.
    $this->admin_user = $this
      ->drupalCreateUser(array(
      'administer userpoints',
    ));
    $this
      ->drupalLogin($this->admin_user);
  }
  function testAddEditPoints() {
    $user = $this
      ->drupalCreateUser();
    $categories = userpoints_get_categories();
    $tid = userpoints_get_default_tid();
    $category = $categories[$tid];

    // Grant some points with admin user.
    $txn_id = $this
      ->addPoints(10, $user, 10);

    // Go to the listing page, verify that the user is shown.
    $row = $this
      ->xpath('//table/tbody/tr');

    //$this->assertEqual(strip_tags((string)$row[0]->td[0]), t('@name (details)', array('@name' => $user->name)), t('User name with details link displayed.'));
    $this
      ->assertEqual((string) $row[0]->td[1], 10, t('Points correctly displayed.'));

    // Go to the transaction listing page, verify that the transaction is shown.
    $this
      ->clickLink(t('Transactions'));
    $row = $this
      ->xpath('//table/tbody/tr');
    $transaction = userpoints_transaction_load($txn_id);

    //$this->assertEqual(strip_tags((string)$row[0]->td[0]), $user->name, t('User correctly displayed.'));
    $this
      ->assertEqual((string) $row[0]->td[1], 10, t('Points correctly displayed.'));
    $this
      ->assertEqual((string) $row[0]->td[2], format_date($transaction->time_stamp, 'small'), t('Date correctly displayed.'));
    $this
      ->assertEqual((string) $row[0]->td[3], 'admin', t('Reason correctly displayed.'));
    $this
      ->assertEqual((string) $row[0]->td[4], t('Approved'), t('Status correctly displayed.'));
    $this
      ->clickLink(t('edit'));

    // Verify default values.
    $this
      ->assertFieldByName('points', 10);
    $value = $this
      ->xpath("//input[@name=:name and @disabled=:disabled]/@value", array(
      ':name' => 'txn_user',
      ':disabled' => 'disabled',
    ));
    $this
      ->assertEqual($value[0]['value'], $user->name, t('User field has the correct value and is disabled.'));
    $this
      ->assertFieldByName('approver', $this->admin_user->name);
    $edit = array(
      'points' => 7,
      'operation' => $this
        ->randomName(),
      'description' => $this
        ->randomName(),
      'reference' => $this
        ->randomName(),
    );
    $this
      ->drupalPost(NULL, $edit, t('Save'));

    // Verify that the transaction has been updated.
    $this
      ->assertEqual(7, userpoints_get_current_points($user->uid));
    $row = $this
      ->xpath('//table/tbody/tr');
    $transaction = userpoints_transaction_load($transaction->txn_id);

    //$this->assertEqual(strip_tags((string)$row[0]->td[0]), $user->name, t('User correctly displayed.'));
    $this
      ->assertEqual((string) $row[0]->td[1], 7, t('Points correctly displayed.'));
    $this
      ->assertEqual((string) $row[0]->td[2], format_date($transaction->time_stamp, 'small'), t('Date correctly displayed.'));
    $this
      ->assertEqual((string) $row[0]->td[3], $edit['description'], t('Reason correctly displayed.'));
    $this
      ->assertEqual((string) $row[0]->td[4], t('Approved'), t('Status correctly displayed.'));

    // Go to the listing page, verify that the total points have been updated.
    $this
      ->clickLink(t('Totals'));
    $row = $this
      ->xpath('//table/tbody/tr');

    //$this->assertEqual(strip_tags((string)$row[0]->td[0]), t('@name (details)', array('@name' => $user->name)), t('User name with details link displayed.'));
    $this
      ->assertEqual((string) $row[0]->td[1], 7, t('Points correctly displayed.'));

    // View transaction details.
    $this
      ->clickLink(t('Transactions'));
    $this
      ->clickLink('view');
  }

}

Classes

Namesort descending Description
UserpointsAdminTestCase Administration UI tests
UserpointsAPITestCase API Tests.
UserpointsBaseTestCase Userpoints base test class with various helper functions.