You are here

nodequeue.test in Nodequeue 7.2

Same filename and directory in other branches
  1. 5.2 tests/nodequeue.test
  2. 6.2 tests/nodequeue.test

Tests for the Nodequeue module.

File

tests/nodequeue.test
View source
<?php

/**
 * @file
 * Tests for the Nodequeue module.
 */

/**
 * Class with common helper methods.
 */
class NodequeueWebTestCase extends DrupalWebTestCase {

  /**
   * Follows an image link by alt or title text.
   *
   * Index behavior is the same as clickLink()'s.
   *
   * @param $label
   *   Text between the anchor tags.
   * @param int $index
   *   Link position counting from zero.
   *
   * @return bool
   *   Page on success, or FALSE on failure.
   */
  protected function clickImage($label, $index = 0) {
    $url_before = $this
      ->getUrl();
    $urls = $this
      ->xpath('//img[@title="' . $label . '"]/ancestor::a|//img[@alt="' . $label . '"]/ancestor::a');
    if (isset($urls[$index])) {
      $url_target = $this
        ->getAbsoluteUrl($urls[$index]['href']);
    }
    $this
      ->assertTrue(isset($urls[$index]), t('Clicked image link "!label" (!url_target) from !url_before', array(
      '!label' => $label,
      '!url_target' => $url_target,
      '!url_before' => $url_before,
    )), t('Browser'));
    if (isset($urls[$index])) {
      return $this
        ->drupalGet($url_target);
    }
    return FALSE;
  }

  /**
   * @param array $types
   *   An array of content types that can be put in the queue.
   * @param array $rids
   * @param int $size
   *   The size of the queue, 0 for infinite.
   * @param bool $reverse
   *   Reverse the queue in the admin view.
   * @param string $owner
   *
   * @return object
   *   A nodequeue object.
   *
   * @internal param int $rid
   *   The role ID allowed to manipulate this queue.
   */
  function createNodequeue($types, $rids = array(
    2,
  ), $size = 10, $reverse = FALSE, $owner = 'nodequeue') {
    $queue = new stdClass();
    $queue->title = $this
      ->randomName();
    $queue->name = str_replace(' ', '_', trim($queue->title));
    $queue->subqueue_title = '';
    $queue->size = $size;
    $queue->reverse = $reverse;
    $queue->types = array(
      'page',
      'article',
    );
    $queue->roles = $rids;
    $queue->add_subqueue = array(
      0 => $queue->title,
    );
    $queue->link = 'Add to ' . $queue->title;
    $queue->link_remove = 'Remove from ' . $queue->title;
    $queue->show_in_links = TRUE;
    $queue->show_in_tab = TRUE;
    $queue->show_in_ui = TRUE;
    $queue->i18n = TRUE;
    $queue->reference = 0;
    $queue->owner = $owner;
    $queue->new = TRUE;
    $queue->unique_entries = FALSE;
    $queue->insert_at_front = 0;
    $queue->reverse = 0;
    $qid = nodequeue_save($queue);
    $this
      ->assertTrue(is_numeric($qid), t('Nodequeue was created and assigned a qid.'), t('Nodequeue'));
    return $queue;
  }

  /**
   * @param int $qid
   *   The QID of the queue to populate.
   * @param int $count
   *   The number of nodes to create. Deafult is 10.
   * @return array
   *   An array of node IDs
   */
  function populateNodequeue($qid, $count = 10) {
    $nodes = array();
    for ($i = 0; $i < $count; $i++) {
      $node = $this
        ->drupalCreateNode(array(
        'type' => 'article',
        'promote' => 1,
      ));
      $nodes[$node->nid] = node_load($node->nid);
    }
    $queue = nodequeue_load($qid);
    $this
      ->assertTrue($queue->subqueues == 1, t('Nodequeue has no subqueues.'), t('Nodequeue'));
    $subqueues = nodequeue_load_subqueues_by_queue($queue->qid);
    $this
      ->assertTrue(count($subqueues) == 1, t('Loaded one subqueue.'), t('Nodequeue'));
    $subqueue = array_shift($subqueues);
    foreach ($nodes as $node) {
      nodequeue_subqueue_add($queue, $subqueue, $node->nid);
    }
    $this
      ->assertTrue($subqueue->count == $count, t('Subqueue contains %count nodes.', array(
      '%count' => $count,
    )), t('Nodequeue'));
    return $nodes;
  }

}
class NodequeueManipulateTestCase extends NodequeueWebTestCase {
  public static function getInfo() {
    return array(
      'name' => t('User'),
      'description' => t('Manipulate a nodequeue.'),
      'group' => t('Nodequeue'),
    );
  }
  function setUp() {
    parent::setUp('nodequeue', 'translation');
    $user = $this
      ->drupalCreateUser(array(
      'manipulate queues',
    ));
    $this
      ->drupalLogin($user);
  }
  function testNodequeueInterface() {

    // create and populate a nodequeue
    $queue = $this
      ->createNodequeue(array(
      'page',
      'article',
    ), array(
      2,
    ), 6);
    $nodes = $this
      ->populateNodequeue($queue->qid, 4);
    $nids = array_keys($nodes);

    // is the "remove from nodequeue" link present on the front page?
    $this
      ->drupalGet('node');
    $this
      ->assertText('Remove from ' . $queue->title, t('Found nodequeue link on front page.'), t('Nodequeue'));

    // do we have access to the nodequeue tab on a node page?
    $this
      ->drupalGet('node/' . $nids[0]);

    /*
        $this->assertRaw('<a href="' . url('node/1/nodequeue', array('absolute' => true)) . '">Nodequeue', t('Found nodequeue tab on node page.'), t('Nodequeue'));
        $this->assertText('Remove from '. $queue->title, t('Found nodequeue link on node page.'), t('Nodequeue'));
    */

    // is the table present on the nodequeue tab?
    $this
      ->drupalGet('node/' . $nids[0] . '/nodequeue');
    $this
      ->assertText($queue->title, t('Found nodequeue in table on nodequeue tab.'), t('Nodequeue'));
    $this
      ->assertRaw('"nodequeue-max-nodes">' . $queue->size, t('Nodequeue table reports correct queue size.'), t('Nodequeue'));
    $this
      ->assertRaw('"nodequeue-in-queue">' . count($nids), t('Nodequeue table reports correct number of elements in queue.'), t('Nodequeue'));
    $this
      ->assertText('Remove from queue', t('"Remove from queue" link is present.'), t('Nodequeue'));
  }
  function testNodequeueAddNode() {

    // create and populate a nodequeue
    $queue = $this
      ->createNodequeue(array(
      'page',
      'article',
    ), array(
      2,
    ), 6);
    $nodes = $this
      ->populateNodequeue($queue->qid, 4);

    // create a new node and add it to the queue using the 'add to queue' link
    // in the table on the nodequeue tab.
    $node = $this
      ->drupalCreateNode(array(
      'type' => 'article',
    ));
    $this
      ->drupalGet('node/' . $node->nid . '/nodequeue');
    $this
      ->assertText('Add to queue', t('"Add to queue" link is present.'), t('Nodequeue'));
    $this
      ->clickLink('Add to queue');
    $this
      ->assertRaw('"nodequeue-in-queue">' . (count($nodes) + 1), t('Nodequeue table reports correct number of elements in queue.'), t('Nodequeue'));
    $this
      ->assertText('Remove from queue', t('"Remove from queue" link is present.'), t('Nodequeue'));

    // fill up the queue
    $node = $this
      ->drupalCreateNode(array(
      'type' => 'article',
    ));
    $this
      ->drupalGet('node/' . $node->nid . '/nodequeue');
    $this
      ->assertText('Add to queue', t('"Add to queue" link is present.'), t('Nodequeue'));
    $this
      ->clickLink('Add to queue');
    $this
      ->assertRaw('"nodequeue-in-queue">Queue full', t('Nodequeue table reports the queue as full.'), t('Nodequeue'));
  }
  function testNodequeueRemoveNode() {

    // create and populate a nodequeue
    $queue = $this
      ->createNodequeue(array(
      'page',
      'article',
    ), array(
      2,
    ), 1);
    $nodes = $this
      ->populateNodequeue($queue->qid, 1);
    $nids = array_keys($nodes);

    // remove a node by clicking the "Remove" link
    $this
      ->drupalGet('node/' . $nids[0] . '/nodequeue');
    $this
      ->assertRaw('"nodequeue-in-queue">Queue full', t('Nodequeue table reports the queue as full.'), t('Nodequeue'));
    $this
      ->clickLink('Remove from queue');
    $this
      ->assertText('Queue empty', t('Nodequeue table reports the queue as empty.'), t('Nodequeue'));
    $this
      ->assertText('Add to queue', t('"Add to queue" link is present.'), t('Nodequeue'));
  }
  function testNodequeueAccess() {

    // create two nodequeues; one the user can access and one she can't access.
    $queue1 = $this
      ->createNodequeue(array(
      'page',
      'article',
    ), array(
      2,
    ));
    $queue2 = $this
      ->createNodequeue(array(
      'page',
      'article',
    ), array());
    $node = $this
      ->drupalCreateNode(array(
      'type' => 'article',
      'promote' => 1,
    ));

    // create a new queue that this user doesn't have access to.
    $this
      ->drupalGet('node');
    $this
      ->assertNoText('Add to ' . $queue2->title, t('Nodequeue link is not present on front page.'), t('Nodequeue'));

    // delete the first queue and make sure the nodequeue tab doesn't show up
    // (since the user doesn't have access to the remaining queue).
    nodequeue_delete($queue1->qid);

    //$this->drupalGet('node/'. $node->nid);

    //$this->assertNoRaw('nodequeue">Nodequeue</a>', t('Nodequeue tab is not present on node page.'), t('Nodequeue'));
  }

}
class NodequeueManipulateAllTestCase extends NodequeueWebTestCase {
  public static function getInfo() {
    return array(
      'name' => t('Privileged user'),
      'description' => t('Manipulate all nodequeues.'),
      'group' => t('Nodequeue'),
    );
  }
  function setUp() {
    parent::setUp('nodequeue');
    $this->user = $this
      ->drupalCreateUser(array(
      'manipulate queues',
      'manipulate all queues',
    ));
    $this
      ->drupalLogin($this->user);
  }

  // @TODO: Find out why this fails. It seems like it should be passing.

  /*
  function testNodequeueAccess() {
    // create and populate a nodequeue not associated with any roles.
    $queue = $this->createNodequeue(array('page', 'article'), array());
    $node = $this->drupalCreateNode(array('type' => 'article', 'promote' => 1));

    // user should still have access to add nodes to the queue.
    $this->drupalGet('node');
    $this->assertText('Add to '. $queue->title, t('Nodequeue link present on front page.'), t('Nodequeue'));

    // do we have access to the nodequeue tab on a node page?
    menu_rebuild();
    $this->drupalGet('node/' . $node->nid);
    $this->assertRaw('<a href="' . url('node/' . $node->nid . '/nodequeue') . '>Nodequeue', t('Nodequeue tab is present on node page.'), t('Nodequeue'));
  }
  */
  function testNodequeueAddNode() {

    // create two nodequeues; one associated with no roles and one associated
    // with the authenticated user role.
    $queue1 = $this
      ->createNodequeue(array(
      'page',
      'article',
    ), array());
    $queue2 = $this
      ->createNodequeue(array(
      'page',
      'article',
    ), array(
      2,
    ));
    $node = $this
      ->drupalCreateNode(array(
      'type' => 'article',
      'promote' => 1,
    ));

    // Sort by title ascending, which is the default table sort for the nodequeue tab.
    $queues = array(
      $queue1->title => $queue1,
      $queue2->title => $queue2,
    );
    ksort($queues);
    $queue1 = array_shift($queues);
    $queue2 = array_shift($queues);

    // add the node to both queues.
    $this
      ->drupalGet('node/' . $node->nid . '/nodequeue');
    $this
      ->clickLink('Add to queue', 0);
    $this
      ->assertRaw('"nodequeue-count-' . $queue1->qid . '" class="nodequeue-in-queue">1', t('Nodequeue table reports correct number of elements in queue.'), t('Nodequeue'));
    $this
      ->assertText('Remove from queue', t('"Remove from queue" link is present.'), t('Nodequeue'));
    $this
      ->clickLink('Add to queue', 0);

    // since the first link has changed
    $this
      ->assertRaw('"nodequeue-count-' . $queue2->qid . '" class="nodequeue-in-queue">1', t('Nodequeue table reports correct number of elements in queue.'), t('Nodequeue'));
  }

}
class NodequeueAdministerTestCase extends NodequeueWebTestCase {
  protected $user;
  public static function getInfo() {
    return array(
      'name' => t('Administrator'),
      'description' => t('Administer nodequeues.'),
      'group' => t('Nodequeue'),
    );
  }
  function setUp() {
    parent::setUp('nodequeue');
    $this->user = $this
      ->drupalCreateUser(array(
      'access administration pages',
      'manipulate queues',
      'manipulate all queues',
      'administer nodequeue',
    ));
  }
  function testNodequeueAddQueue() {
    $this
      ->drupalLogin($this->user);

    // make sure we can access the administration page
    $this
      ->drupalGet('admin/structure/nodequeue');
    $this
      ->assertText('Add simple queue', t('"Add simple queue" link is present.'), t('Nodequeue'));
    $this
      ->assertText('Settings', t('"Settings" link is present.'), t('Nodequeue'));
    $this
      ->assertText('No queues exist. ', t('Nodequeue table is empty.'), t('Nodequeue'));

    // create a nodequeue...
    $edit = array(
      'title' => 'Testqueue',
      'name' => 'testqueue',
      'size' => 10,
      'link' => 'Add to %subqueue',
      'link_remove' => 'Remove from %subqueue',
      //      'roles[2]'     => '2', // FIXME: this makes the test fail...
      'types[article]' => 'article',
      'types[page]' => 'page',
    );
    $this
      ->drupalPost('admin/structure/nodequeue/add/nodequeue', $edit, 'Save');

    // ...and make sure we can add a node to it
    $node = $this
      ->drupalCreateNode(array(
      'type' => 'article',
      'promote' => 1,
    ));

    /*
        $this->drupalGet('node/'. $node->nid);
        $this->assertRaw('<a href="' . url('node/1/nodequeue', array('absolute' => true)) . '">Nodequeue', t('Nodequeue tab is present.'), t('Nodequeue'));
    */

    // add the node to the queue
    $this
      ->drupalGet('node/' . $node->nid . '/nodequeue');
    $this
      ->assertText('Testqueue', t('Nodequeue is shown in table.'), t('Nodequeue'));
    $this
      ->assertText('Queue empty', t('Nodequeue is currently empty.'), t('Nodequeue'));
    $this
      ->clickLink('Add to queue');
    $this
      ->assertRaw('class="nodequeue-in-queue">1', t('Nodequeue table reports correct number of elements in queue.'), t('Nodequeue'));

    // try sorting by queue size
    // TODO: This breaks on Drupal.org. We need to figure out why.

    /*
        $this->drupalGet('admin/structure/nodequeue');
        $this->clickLink('Max nodes');
        $this->assertRaw('Max nodes<img typeof="foaf:Image" src="' . url('misc/arrow-desc.png', array('absolute' => true)) . '"', t('Nodequeue table is sorted by max rows descending.'), t('Nodequeue'));

        $this->drupalGet('admin/structure/nodequeue');
        $this->clickLink('Subqueues');
        $this->assertRaw('Subqueues<img typeof="foaf:Image" src="' . url('misc/arrow-desc.png', array('absolute' => true)) . '"', t('Nodequeue table is sorted by subqueues descending.'), t('Nodequeue'));
    */
  }
  function testNodequeueAddQueueNoTitle() {
    $this
      ->drupalLogin($this->user);

    // make sure we can access the administration page
    $this
      ->drupalGet('admin/structure/nodequeue');
    $this
      ->assertText('Add simple queue', t('"Add simple queue" link is present.'), t('Nodequeue'));
    $this
      ->assertText('Settings', t('"Settings" link is present.'), t('Nodequeue'));
    $this
      ->assertText('No queues exist. ', t('Nodequeue table is empty.'), t('Nodequeue'));

    // create a nodequeue with no title...
    $edit = array(
      'title' => '',
      'size' => 10,
      'link' => 'Add to %subqueue',
      'link_remove' => 'Remove from %subqueue',
      'types[article]' => 'article',
      'types[page]' => 'page',
    );
    $this
      ->drupalPost('admin/structure/nodequeue/add/nodequeue', $edit, 'Save');
    $this
      ->assertText('Title field is required.', t("We got an error because we didn't supply a title."), t('Nodequeue'));
    $this
      ->assertText('Machine-readable name field is required.', t("We got an error because we didn't supply a machine name."), t('Nodequeue'));
  }
  function testNodequeueEditForm() {
    $this
      ->drupalLogin($this->user);
    $queue = $this
      ->createNodequeue(array(
      'page',
      'article',
    ), array(
      2,
    ));
    $nodes = $this
      ->populateNodequeue($queue->qid);
    $this
      ->drupalGet('admin/structure/nodequeue/' . $queue->qid . '/edit');
    $this
      ->assertTitle(strtr('@title | Drupal', array(
      '@title' => "Nodequeue '" . $queue->title . "'",
    )), t('Got correct page title on edit form.'), t('Nodequeue'));
  }

  // make sure that the label of the nodequeue tab can be modified
  function testNodequeueModifyLabel() {
    $this
      ->drupalLogin($this->user);
    $queue = $this
      ->createNodequeue(array(
      'page',
      'article',
    ), array(
      2,
    ));
    $nodes = $this
      ->populateNodequeue($queue->qid);
    $nids = array_keys($nodes);

    // modify the label of the nodequeue tab...
    $edit = array(
      'nodequeue_use_tab' => TRUE,
      'nodequeue_tab_name' => 'Nodequeue Test Label',
    );
    $this
      ->drupalPost('admin/structure/nodequeue/settings', $edit, 'Save configuration');

    // ...clear the menu cache...
    menu_rebuild();

    // ...and make sure the new label shows up on the node page
    $this
      ->drupalGet('node/' . $nids[0]);
    $this
      ->assertRaw('<a href="' . url('node/' . $nids[0] . '/nodequeue') . '">Nodequeue Test Label', t('Nodequeue tab label has been set.'), t('Nodequeue'));
  }

  // make sure menu tab is not shown if it is disabled under settings
  function testNodequeueMenuTab() {
    $this
      ->drupalLogin($this->user);
    $queue = $this
      ->createNodequeue(array(
      'page',
      'article',
    ), array(
      2,
    ));
    $nodes = $this
      ->populateNodequeue($queue->qid);
    $nids = array_keys($nodes);

    // make sure that the tab is present
    menu_rebuild();
    $this
      ->drupalGet('node/' . $nids[0]);
    $this
      ->assertRaw('<a href="' . url('node/' . $nids[0] . '/nodequeue') . '">Nodequeue', t('Nodequeue tab is present.'), t('Nodequeue'));

    // now hide the menu tab
    $edit = array(
      'nodequeue_use_tab' => FALSE,
      'nodequeue_tab_name' => 'Nodequeue Test Label',
    );
    $this
      ->drupalPost('admin/structure/nodequeue/settings', $edit, 'Save configuration');

    // make sure that the tab is not present
    menu_rebuild();
    $this
      ->drupalGet('node/' . $nids[0]);
    $this
      ->assertNoText('Nodequeue', t('Nodequeue tab is not present.'), t('Nodequeue'));
    $this
      ->assertText('Remove from ' . $queue->title, t('Nodequeue link is present.'), t('Nodequeue'));
  }
  function testNodequeueTableSort() {
    $this
      ->drupalLogin($this->user);
    $queue = $this
      ->createNodequeue(array(
      'page',
      'article',
    ), array(
      2,
    ));

    // create two subqueues
    nodequeue_add_subqueue($queue, 'Subqueue 1');
    nodequeue_add_subqueue($queue, 'Subqueue 2', 42);
    $this
      ->drupalGet('admin/structure/nodequeue/' . $queue->qid . '/view');
    $this
      ->assertText('Subqueue 1', t('Subqueue 1 is present in subqueue table.'), t('Nodequeue'));
    $this
      ->assertText('Subqueue 2', t('Subqueue 1 is present in subqueue table.'), t('Nodequeue'));
  }

  // @TODO: Figure out why this is failing.

  /*
  function testNodequeueEditFormRoles() {
    $this->drupalLogin($this->user);

    $queue = $this->createNodequeue(array('page', 'article'), array());
    $nodes = $this->populateNodequeue($queue->qid);

    $this->drupalLogout();
    $user = $this->drupalCreateUser(array('access administration pages', 'administer nodequeue'));
    $this->drupalLogin($user);

    // remove any existing roles with permission to manipulate queues
    $rids = db_query("SELECT r.rid FROM {role} r LEFT JOIN {role_permission} p ON p.rid = r.rid WHERE p.permission LIKE '%manipulate queues%' ORDER BY r.name");
    foreach ($rids as $rid) {
      db_query('DELETE FROM {role} WHERE rid = :rid', array(':rid' => $rid));
      db_query('DELETE FROM {role_permission} WHERE rid = :rid', array(':rid' => $rid));
    }

    $this->drupalGet('admin/structure/nodequeue/'. $queue->qid .'/edit');
    $this->assertText('No roles have the "manipulate queues" permission', t('No roles have permission to modify this nodequeue.'), t('Nodequeue'));
  }
  */
  function testNodequeueDeleteConfirm() {
    $this
      ->drupalLogin($this->user);
    $queue = $this
      ->createNodequeue(array(
      'page',
      'article',
    ), array(
      2,
    ));
    $nodes = $this
      ->populateNodequeue($queue->qid);
    $this
      ->drupalGet('admin/structure/nodequeue/' . $queue->qid . '/delete');
    $this
      ->assertTitle(strtr('@title | Drupal', array(
      '@title' => 'Are you sure you want to delete "' . $queue->title . '"?',
    )), t('Delete confirmation form displayed.'), t('Nodequeue'));
  }

  // TODO: test nodequeue_admin_delete_submit()
  function testNodequeueViewSubqueue() {
    $this
      ->drupalLogin($this->user);

    // create and populate a nodequeue
    $queue = $this
      ->createNodequeue(array(
      'page',
      'article',
    ), array(
      2,
    ));
    $nodes = $this
      ->populateNodequeue($queue->qid, 4);
    $subqueues = nodequeue_load_subqueues_by_queue($queue->qid);
    $subqueue = array_shift($subqueues);
    $this
      ->drupalGet('admin/structure/nodequeue/' . $queue->qid . '/view/' . $subqueue->sqid);
  }
  function testNodequeueAddNode() {
    $this
      ->drupalLogin($this->user);
    $queue = $this
      ->createNodequeue(array(
      'page',
      'article',
    ), array(
      2,
    ));
    $subqueues = nodequeue_load_subqueues_by_queue($queue->qid);
    $subqueue = array_shift($subqueues);
    $path = 'admin/structure/nodequeue/' . $queue->qid . '/view/' . $subqueue->sqid;
    $node1 = $this
      ->drupalCreateNode(array(
      'title' => 'Bar',
      'type' => 'article',
      'promote' => 1,
    ));
    $node2 = $this
      ->drupalCreateNode(array(
      'title' => 'Baz',
      'type' => 'article',
      'promote' => 1,
    ));

    // deliberately use an ambiguous title
    $this
      ->drupalGet($path);
    $this
      ->drupalPost($path, array(
      'add[nid]' => 'B',
    ), 'Add content');
    $this
      ->assertRaw('Please enter a valid node title.', t('Got an error message.'), t('Nodequeue'));
    $this
      ->drupalPost($path, array(
      'add[nid]' => 'Unknown',
    ), 'Add content');
    $this
      ->assertRaw('Please enter a valid node title.', t('Got an error message.'), t('Nodequeue'));
    $this
      ->drupalPost($path, array(
      'add[nid]' => $node1->title . ' [nid: ' . $node1->nid . ']',
    ), 'Add content');
    $this
      ->assertRaw('<a href="' . url('node/' . $node1->nid) . '">' . $node1->title . '</a>', t('Node has been added to the nodequeue.'), t('Nodequeue'));
    $this
      ->drupalPost($path, array(
      'add[nid]' => $node2->title . ' [nid: ' . $node2->nid . ']',
    ), 'Add content');
    $this
      ->assertRaw('<a href="' . url('node/' . $node2->nid) . '">' . $node2->title . '</a>', t('Node has been added to the nodequeue.'), t('Nodequeue'));
  }

}
class NodequeueAPIAccessUnitTest extends NodequeueWebTestCase {
  public static function getInfo() {
    return array(
      'name' => t('Access'),
      'description' => t('User access restrictions.'),
      'group' => t('Nodequeue API'),
    );
  }
  function setUp() {
    parent::setUp('nodequeue');
  }
  function testNodequeueNodeTabAccess() {
    global $user;
    $user = $this
      ->drupalCreateUser();

    // create and populate a nodequeue
    $queue = $this
      ->createNodequeue(array(
      'page',
      'article',
    ), array(
      2,
    ), 6);
    $nodes = $this
      ->populateNodequeue($queue->qid, 4);
    $this
      ->assertFalse(nodequeue_node_tab_access($nodes[1]), t("Don't run queries unless user has 'manipulate queues' permission."), t('Nodequeue'));

    // create a user with permission to manipulate queues
    $user = $this
      ->drupalCreateUser(array(
      'access administration pages',
      'manipulate queues',
      'administer nodequeue',
    ));
    $this
      ->assertTrue(nodequeue_node_tab_access($nodes[1]), t("User is granted access to the node tab."), t('Nodequeue'));

    // TODO: case where subqueue is empty
    //       case where user doesn't have access to subqueue (nodequeue_api_subqueue_access)
  }
  function testNodequeueQueueAccess() {

    // create and populate a nodequeue
    $queue = $this
      ->createNodequeue(array(
      'page',
      'article',
    ), array(
      2,
    ));
    $nodes = $this
      ->populateNodequeue($queue->qid, 4);
    $subqueues = nodequeue_load_subqueues_by_queue($queue->qid);
    $subqueue = array_shift($subqueues);

    // test using the currenlty logged in user
    $this
      ->assertTrue(nodequeue_queue_access($queue), t('Access granted to currently logged in user.'), t('Nodequeue'));
    $this
      ->assertTrue(nodequeue_queue_access($queue, $subqueue), t('Access granted to currently logged in user.'), t('Nodequeue'));

    // a user without nodequeue-related permissions should be denied access
    $user = $this
      ->drupalCreateUser();
    $this
      ->assertFalse(nodequeue_queue_access($queue, NULL, $user), t('Access denied because of missing permissions.'), t('Nodequeue'));
    $this
      ->assertFalse(nodequeue_queue_access($queue, $subqueue, $user), t('Access denied because of missing permissions.'), t('Nodequeue'));

    // create a user with permission to manipulate queues
    $user = $this
      ->drupalCreateUser(array(
      'manipulate all queues',
    ));
    $this
      ->assertTrue(nodequeue_queue_access($queue, NULL, $user), t('Access granted because of permission.'), t('Nodequeue'));
    $this
      ->assertTrue(nodequeue_queue_access($queue, $subqueue, $user), t('Access granted because of permission.'), t('Nodequeue'));

    // TODO: case where nodequeue_api_queue_access() returns FALSE
  }
  function testNodequeueNodeAndQueueAccess() {

    // TODO: nodequeue_node_and_queue_access($node, $queue, $subqueue = NULL)
  }
  function testNodequeueNodeAccess() {

    // TODO: nodequeue_node_access($type, $location = NULL, $account = NULL)
  }

}
class NodequeueAPICRUDUnitTest extends NodequeueWebTestCase {
  public static function getInfo() {
    return array(
      'name' => t('Nodequeue API CRUD'),
      'description' => t('Basic Create, Read, Update, Delete functionality.'),
      'group' => t('Nodequeue'),
    );
  }
  function setUp() {
    parent::setUp('nodequeue');
  }
  function testNodequeueModify() {
    $queue = $this
      ->createNodequeue(array(
      'article',
    ), array(
      2,
    ));
    $this
      ->assertTrue(variable_get('nodequeue_links', FALSE), t('hook_link is enabled.'), t('Nodequeue'));

    // update the nodequeue
    $queue = nodequeue_load($queue->qid);
    $queue->title = 'New title';
    $queue->size = 5;
    $queue->link = '';
    $qid = nodequeue_save($queue);
    $this
      ->assertTrue(is_numeric($qid), t('Nodequeue was updated.'), t('Nodequeue'));
    $this
      ->assertFalse(variable_get('nodequeue_links', FALSE), t('hook_link is disabled.'), t('Nodequeue'));

    // load the nodequeue and compare it to the one we saved.
    // this also tests nodequeue_load_queues().
    $compare = nodequeue_load($qid);
    $this
      ->assertEqual($queue->title, $compare->title, t('Nodequeue titles are equal.'), t('Nodequeue'));
    $this
      ->assertEqual($queue->size, $compare->size, t('Nodequeue sizes are equal.'), t('Nodequeue'));

    // delete the nodequeue
    nodequeue_delete($qid);
    $deleted = nodequeue_load_queues(array(
      $qid,
    ), TRUE);
    $this
      ->assertTrue(empty($deleted), t('Nodequeue has been deleted.'), t('Nodequeue'));

    // TODO: case for nodequeue_load_queues() with $bypass_cache = FALSE
  }
  function testNodequeueSubqueueLoad() {

    // TODO: subqueue_load($sqid)
  }
  function testNodequeueAddSubqueue() {

    // TODO: nodequeue_add_subqueue($queue, $title, $reference = NULL)
  }
  function testNodequeueSubqueueUpdateTitle() {

    // TODO: nodequeue_subqueue_update_title($sqid, $title)
  }
  function testNodequeueRemoveSubqueue() {

    // TODO: nodequeue_remove_subqueue($sqid)
  }
  function testNodequeueLoadQueue() {

    // TODO:
    // nodequeue_load_queues_by_type($type, $location = NULL, $account = NULL, $bypass_cache = FALSE)
    // nodequeue_load_subqueues($sqids, $bypass_cache = FALSE)
    // nodequeue_load_subqueue($sqid, $bypass_cache = FALSE)
    // nodequeue_load_subqueues_by_queue($qids, $page_size = 0)
    // nodequeue_load_subqueues_by_reference($references, $bypass_cache = FALSE)
  }
  function testNodequeueGetQIDs() {

    // TODO: nodequeue_get_qids($type, $account = NULL, $bypass_cache = FALSE)
  }
  function testNodequeueGetAllQIDs() {

    // TODO: nodequeue_get_all_qids($page_size = 25, $pager_element = 0, $bypass_cache = FALSE)
  }
  function testNodequeueFilterQIDs() {

    // TODO: nodequeue_filter_qids($qids, $location)
  }

}
class NodequeueAPISubqueueUnitTest extends NodequeueWebTestCase {
  public static function getInfo() {
    return array(
      'name' => t('Subqueue'),
      'description' => t('Manipulate subqueue elements.'),
      'group' => t('Nodequeue API'),
    );
  }
  function setUp() {
    parent::setUp('nodequeue');
  }
  function testNodequeueSubqueueAdd() {
    $queue = $this
      ->createNodequeue(array(
      'page',
      'article',
    ), array(
      2,
    ), 3);
    $subqueues = nodequeue_load_subqueues_by_queue($queue->qid);
    $subqueue = array_shift($subqueues);
    $nodes = array();
    for ($i = 0; $i < 4; $i++) {
      $nodes[] = $this
        ->drupalCreateNode(array(
        'type' => 'article',
      ));
    }
    nodequeue_subqueue_add($queue, $subqueue, $nodes[0]->nid);
    $this
      ->assertEqual($subqueue->count, 1, t('Subqueue contains 1 element.'), t('Nodequeue'));
    nodequeue_subqueue_add($queue, $subqueue, $nodes[1]->nid);
    $this
      ->assertEqual($subqueue->count, 2, t('Subqueue is full.'), t('Nodequeue'));
    nodequeue_subqueue_add($queue, $subqueue, $nodes[2]->nid);
    $this
      ->assertEqual($subqueue->count, 3, t('Subqueue is full.'), t('Nodequeue'));
    nodequeue_subqueue_add($queue, $subqueue, $nodes[3]->nid);
    $this
      ->assertEqual($subqueue->count, 3, t('Subqueue is full.'), t('Nodequeue'));
    $pos = nodequeue_subqueue_position($subqueue->sqid, $nodes[0]->nid);
    $this
      ->assertFalse($pos, t('First node has been pushed out of the queue.'), t('Nodequeue'));
    $pos = nodequeue_subqueue_position($subqueue->sqid, $nodes[1]->nid);
    $this
      ->assertEqual($pos, 1, t('Second node is now at the front of the queue.'), t('Nodequeue'));
  }
  function testNodequeueSubqueueRemove() {
    $queue = $this
      ->createNodequeue(array(
      'page',
      'article',
    ), array(
      2,
    ), 3);
    $subqueues = nodequeue_load_subqueues_by_queue($queue->qid);
    $subqueue = array_shift($subqueues);
    $nodes = array();
    for ($i = 0; $i < 4; $i++) {
      $nodes[] = $this
        ->drupalCreateNode(array(
        'type' => 'article',
      ));
    }
    nodequeue_subqueue_add($queue, $subqueue, $nodes[0]->nid);
    $this
      ->assertEqual($subqueue->count, 1, t('Subqueue contains one element.'), t('Nodequeue'));
    nodequeue_subqueue_add($queue, $subqueue, $nodes[1]->nid);
    $this
      ->assertEqual($subqueue->count, 2, t('Subqueue contains two elements.'), t('Nodequeue'));
    nodequeue_subqueue_add($queue, $subqueue, $nodes[2]->nid);
    $this
      ->assertEqual($subqueue->count, 3, t('Subqueue is full.'), t('Nodequeue'));
    nodequeue_subqueue_remove($subqueue->sqid, 3);
    $count = db_query('SELECT COUNT(*) FROM {nodequeue_nodes} WHERE sqid = :sqid', array(
      ':sqid' => $subqueue->sqid,
    ))
      ->fetchField();
    $this
      ->assertEqual($count, 2, t('Subqueue contains two elements.'), t('Nodequeue'));
    nodequeue_subqueue_add($queue, $subqueue, $nodes[3]->nid);
    $pos = db_query('SELECT position FROM {nodequeue_nodes} WHERE sqid = :sqid AND nid = :nid', array(
      ':sqid' => $subqueue->sqid,
      ':nid' => $nodes[3]->nid,
    ))
      ->fetchField();
    $this
      ->assertEqual($pos, 3, t('New element added to back of queue.'), t('Nodequeue'));
    nodequeue_subqueue_remove($subqueue->sqid, 1, 2);
    $pos = db_query('SELECT position FROM {nodequeue_nodes} WHERE sqid = :sqid AND nid = :nid', array(
      ':sqid' => $subqueue->sqid,
      ':nid' => $nodes[3]->nid,
    ))
      ->fetchField();
    $this
      ->assertEqual($pos, 1, t('Remaining element moved to position 1.'), t('Nodequeue'));
  }
  function testNodequeueSubqueueRemoveNode() {
    $queue = $this
      ->createNodequeue(array(
      'page',
      'article',
    ), array(
      2,
    ), 3);
    $subqueues = nodequeue_load_subqueues_by_queue($queue->qid);
    $subqueue = array_shift($subqueues);
    $nodes = array();
    for ($i = 0; $i < 3; $i++) {
      $node = $this
        ->drupalCreateNode(array(
        'type' => 'article',
      ));
      nodequeue_subqueue_add($queue, $subqueue, $node->nid);
      $nodes[] = $node;
    }
    $this
      ->assertEqual($subqueue->count, 3, t('Subqueue contains three elements.'), t('Nodequeue'));
    nodequeue_subqueue_remove_node($subqueue->sqid, $nodes[0]->nid);
    $count = db_query('SELECT COUNT(*) FROM {nodequeue_nodes} WHERE sqid = :sqid', array(
      ':sqid' => $subqueue->sqid,
    ))
      ->fetchField();
    $this
      ->assertEqual($count, 2, t('Subqueue contains two elements.'), t('Nodequeue'));
    $pos = db_query('SELECT position FROM {nodequeue_nodes} WHERE sqid = :sqid AND nid = :nid', array(
      ':sqid' => $subqueue->sqid,
      ':nid' => $nodes[1]->nid,
    ))
      ->fetchField();
    $this
      ->assertEqual($pos, 1, t('Remaining nodes have been moved closer to the front of the queue.'), t('Nodequeue'));
  }
  function testNodequeueQueueClear() {
    $queue = $this
      ->createNodequeue(array(
      'page',
      'article',
    ), array(
      2,
    ), 3);
    $subqueues = nodequeue_load_subqueues_by_queue($queue->qid);
    $subqueue = array_shift($subqueues);
    $nodes = array();
    for ($i = 0; $i < 3; $i++) {
      $node = $this
        ->drupalCreateNode(array(
        'type' => 'article',
      ));
      nodequeue_subqueue_add($queue, $subqueue, $node->nid);
      $nodes[] = $node;
    }
    $this
      ->assertEqual($subqueue->count, 3, t('Subqueue contains three elements.'), t('Nodequeue'));
    nodequeue_queue_clear($subqueue->sqid);
    $count = db_query('SELECT COUNT(*) FROM {nodequeue_nodes} WHERE sqid = :sqid', array(
      ':sqid' => $subqueue->sqid,
    ))
      ->fetchField();
    $this
      ->assertEqual($count, 0, t('Subqueue contains no elements.'), t('Nodequeue'));
  }
  function testNodequeueCheckSubqueueSize() {

    // TODO: nodequeue_check_subqueue_size($queue, $subqueue, $size = NULL)
  }
  function testNodequeueCheckSubqueueSizes() {

    // TODO: nodequeue_check_subqueue_sizes($queue)
    $queue = $this
      ->createNodequeue(array(
      'page',
      'article',
    ), array(
      2,
    ), 3);
    $rv = nodequeue_check_subqueue_sizes($queue);
    $this
      ->assertNull($rv, t('Subqueue has infinite size.'), t('Nodequeue'));
  }
  function testNodequeueQueueSwap() {

    // create and populate a nodequeue
    $queue = $this
      ->createNodequeue(array(
      'page',
      'article',
    ), array(
      2,
    ), 4);
    $nodes = $this
      ->populateNodequeue($queue->qid, 4);
    $nids = array_keys($nodes);
    $subqueues = nodequeue_load_subqueues_by_queue($queue->qid);
    $subqueue = array_shift($subqueues);
    nodequeue_queue_swap($subqueue, 1, 4);
    $pos = nodequeue_get_subqueue_position($subqueue->sqid, $nids[0]);
    $this
      ->assertEqual($pos, 4, t('First node got a new position.'), t('Nodequeue'));
    $pos = nodequeue_get_subqueue_position($subqueue->sqid, $nids[3]);
    $this
      ->assertEqual($pos, 1, t('Last node got a new position.'), t('Nodequeue'));
  }
  function testNodequeueQueueUp() {

    // create and populate a nodequeue
    $queue = $this
      ->createNodequeue(array(
      'page',
      'article',
    ), array(
      2,
    ), 4);
    $nodes = $this
      ->populateNodequeue($queue->qid, 4);
    $nids = array_keys($nodes);
    $subqueues = nodequeue_load_subqueues_by_queue($queue->qid);
    $subqueue = array_shift($subqueues);
    nodequeue_queue_up($subqueue, 3);
    $pos = nodequeue_get_subqueue_position($subqueue->sqid, $nids[2]);
    $this
      ->assertEqual($pos, 2, t('Node was moved one position up.'), t('Nodequeue'));
    $rv = nodequeue_queue_up($subqueue, 1);
    $this
      ->assertNull($rv, t('No action if position is 1.'), t('Nodequeue'));
    $rv = nodequeue_queue_up($subqueue, 42);
    $this
      ->assertNull($rv, t('No action if position is out of bounds.'), t('Nodequeue'));
  }
  function testNodequeueQueueDown() {

    // create and populate a nodequeue
    $queue = $this
      ->createNodequeue(array(
      'page',
      'article',
    ), array(
      2,
    ), 4);
    $nodes = $this
      ->populateNodequeue($queue->qid, 4);
    $nids = array_keys($nodes);
    $subqueues = nodequeue_load_subqueues_by_queue($queue->qid);
    $subqueue = array_shift($subqueues);
    nodequeue_queue_down($subqueue, 2);
    $pos = nodequeue_get_subqueue_position($subqueue->sqid, $nids[1]);
    $this
      ->assertEqual($pos, 3, t('Node was moved one position down.'), t('Nodequeue'));
    $rv = nodequeue_queue_down($subqueue, 0);
    $this
      ->assertNull($rv, t('No action if position is out of bounds.'), t('Nodequeue'));
    $rv = nodequeue_queue_down($subqueue, 42);
    $this
      ->assertNull($rv, t('No action if position is out of bounds.'), t('Nodequeue'));
  }
  function testNodequeueQueueFront() {

    // create and populate a nodequeue
    $queue = $this
      ->createNodequeue(array(
      'page',
      'article',
    ), array(
      2,
    ), 4);
    $nodes = $this
      ->populateNodequeue($queue->qid, 4);
    $nids = array_keys($nodes);
    $subqueues = nodequeue_load_subqueues_by_queue($queue->qid);
    $subqueue = array_shift($subqueues);
    nodequeue_queue_front($subqueue, 3);
    $pos = nodequeue_get_subqueue_position($subqueue->sqid, $nids[2]);
    $this
      ->assertEqual($pos, 1, t('Node was moved to the front of the queue.'), t('Nodequeue'));
    $rv = nodequeue_queue_front($subqueue, 1);
    $this
      ->assertNull($rv, t('No action if position is 1.'), t('Nodequeue'));
    $rv = nodequeue_queue_front($subqueue, 42);
    $this
      ->assertNull($rv, t('No action if position is out of bounds.'), t('Nodequeue'));
  }
  function testNodequeueQueueBack() {

    // create and populate a nodequeue
    $queue = $this
      ->createNodequeue(array(
      'page',
      'article',
    ), array(
      2,
    ), 4);
    $nodes = $this
      ->populateNodequeue($queue->qid, 4);
    $nids = array_keys($nodes);
    $subqueues = nodequeue_load_subqueues_by_queue($queue->qid);
    $subqueue = array_shift($subqueues);
    nodequeue_queue_back($subqueue, 2);
    $pos = nodequeue_get_subqueue_position($subqueue->sqid, $nids[1]);
    $this
      ->assertEqual($pos, 4, t('Node was moved to the back of the queue.'), t('Nodequeue'));
    $rv = nodequeue_queue_down($subqueue, 0);
    $this
      ->assertNull($rv, t('No action if position is out of bounds.'), t('Nodequeue'));
    $rv = nodequeue_queue_down($subqueue, 42);
    $this
      ->assertNull($rv, t('No action if position is out of bounds.'), t('Nodequeue'));
  }
  function testNodequeueSubqueueShuffle() {

    // create and populate a nodequeue
    $queue = $this
      ->createNodequeue(array(
      'page',
      'article',
    ), array(
      2,
    ), 4);
    $nodes = $this
      ->populateNodequeue($queue->qid, 4);
    $nids = array_keys($nodes);
    $subqueues = nodequeue_load_subqueues_by_queue($queue->qid);
    $subqueue = array_shift($subqueues);
    nodequeue_subqueue_shuffle($subqueue);
    $shuffled = FALSE;
    for ($i = 0; $i < 4; $i++) {
      $pos = nodequeue_get_subqueue_position($subqueue->sqid, $nids[$i]);
      if ($pos != $i + 1) {
        $shuffled = TRUE;
      }
    }
    $this
      ->assertTrue($shuffled, t('Node has been moved to a new position.'), t('Nodequeue'));
  }

}
class NodequeueAPINodeUnitTest extends NodequeueWebTestCase {
  public static function getInfo() {
    return array(
      'name' => t('Node'),
      'description' => t('Get node-related info from subqueues.'),
      'group' => t('Nodequeue API'),
    );
  }
  function setUp() {
    parent::setUp('nodequeue');
  }
  function testNodequeueGetSubqueuePosition() {

    // TODO: nodequeue_get_subqueue_position($sqid, $nid)
  }
  function testNodequeueGetSubqueuePositions() {

    // TODO: nodequeue_set_subqueue_positions($subqueues, $nid)
  }
  function testNodequeueGetSubqueueByNode() {

    // TODO: nodequeue_get_subqueues_by_node($queues, $node)
  }

}
class NodequeueAPIMiscUnitTest extends NodequeueWebTestCase {
  public static function getInfo() {
    return array(
      'name' => t('Misc'),
      'description' => t('Miscellaneous API functions.'),
      'group' => t('Nodequeue API'),
    );
  }
  function setUp() {
    parent::setUp('nodequeue');
  }
  function testNodequeueGetSubqueueSizeText() {

    // TODO: nodequeue_subqueue_size_text($max, $count, $long = TRUE)
  }
  function testNodequeueTitleSubstitute() {

    // TODO: nodequeue_title_substitute($text, $queue, $subqueue)
  }
  function testNodequeueAutocomplete() {
    $queue = $this
      ->createNodequeue(array(
      'page',
      'article',
    ), array(
      2,
    ), 6);
    $nodes = $this
      ->populateNodequeue($queue->qid, 4);
    $subqueues = nodequeue_load_subqueues_by_queue($queue->qid);
    $subqueue = array_shift($subqueues);
    $rv = nodequeue_api_autocomplete(NULL, NULL, '');
    $this
      ->assertTrue(empty($rv), t('No qid or sqid. No nodes returned.'), t('Nodequeue'));
    $rv = nodequeue_api_autocomplete($queue, $subqueue, '');
    $this
      ->assertTrue(empty($rv), t('No string. No nodes returned.'), t('Nodequeue'));
    $unknown_queue = $queue;
    $unknown_queue->qid = 42;
    $rv = nodequeue_api_autocomplete($unknown_queue, $subqueue, 'Foo');
    $this
      ->assertTrue(empty($rv), t('Unknown qid. No nodes returned.'), t('Nodequeue'));
    $unknown_subqueue = $subqueue;
    $unknown_subqueue->sqid = 42;
    $rv = nodequeue_api_autocomplete($queue, $unknown_subqueue, 'Foo');
    $this
      ->assertTrue(empty($rv), t('Unknown sqid. No nodes returned.'), t('Nodequeue'));
    $rv = nodequeue_api_autocomplete($queue, $subqueue, substr($nodes[1]->title, 0, 16));
    $this
      ->assertTrue(count($rv) > 0, t('At least one node returned.'), t('Nodequeue'));
  }

}
class NodequeueHooksUnitTest extends NodequeueWebTestCase {
  public static function getInfo() {
    return array(
      'name' => t('Hooks'),
      'description' => t('Test hook implementations.'),
      'group' => t('Nodequeue'),
    );
  }
  function setUp() {
    parent::setUp('nodequeue');
  }
  function testNodequeueViewsAPI() {
    $info = nodequeue_views_api();
    $this
      ->assertEqual($info['api'], 2, t('Correct API version reported.'), t('Nodequeue'));
    $this
      ->assertEqual($info['path'], drupal_get_path('module', 'nodequeue') . '/includes/views', t('Correct API version reported.'), t('Nodequeue'));
  }
  function testNodequeueNodeAPIDelete() {

    // create and populate a nodequeue
    $queue = $this
      ->createNodequeue(array(
      'page',
      'article',
    ), array(
      2,
    ), 4);
    $nodes = $this
      ->populateNodequeue($queue->qid, 4);
    $nids = array_keys($nodes);
    $subqueues = nodequeue_load_subqueues_by_queue($queue->qid);
    $subqueue = array_shift($subqueues);
    $pos = nodequeue_get_subqueue_position($subqueue->sqid, $nids[2]);
    $this
      ->assertTrue(is_numeric($pos), t('Node has a position in the nodequeue.'), t('Nodequeue'));
    node_delete($nids[2]);
    $pos = db_query('SELECT position FROM  {nodequeue_nodes} WHERE sqid = :sqid AND nid = :nid', array(
      ':sqid' => $subqueue->sqid,
      ':nid' => $nids[2],
    ))
      ->fetchField();
    $this
      ->assertEqual($pos, 0, t('Node is no longer in the nodequeue.'), t('Nodequeue'));
  }

}

// @TODO: Fix Apache Solr tests.

/*
class NodequeueApacheSolrUnitTest extends NodequeueWebTestCase {

  public static function getInfo() {
    return array(
      'name' => t('Apache Solr'),
      'description' => t('Test Apache Solr utility functions.'),
      'group' => t('Nodequeue ApacheSolr'),
    );
  }

  function setUp() {
    parent::setUp('nodequeue', 'apachesolr');
  }

  function testNodequeueSolrQIDKey() {
    $key = _nodequeue_solr_qid_key();
    $this->assertNotNull($key, t('Got an Apache Solr index key.'), t('Nodequeue'));
  }

  function testNodequeueApacheSolrUpdateIndex() {
    $queue = $this->createNodequeue(array('page', 'article'), array(2), 4);
    $nodes = $this->populateNodequeue($queue->qid, 4);

    $document = new stdClass();

    nodequeue_apachesolr_update_index($document, $nodes[1]);

    $this->assertEqual($document->sim_nodequeue, 1, t('Got expected key on document object.'), t('Nodequeue'));
  }

  function testNodequeueApacheSolrModifyQuery() {
    $queue = $this->createNodequeue(array('page', 'article'), array(2), 4);
    $nodes = $this->populateNodequeue($queue->qid, 4);
    $nids  = array_keys($nodes);

    $subqueues = nodequeue_load_subqueues_by_queue($queue->qid);
    $subqueue = array_shift($subqueues);

    variable_set('nodequeue_apachesolr_boost_'. $subqueue->sqid, '2.0');

    $params = array();

    nodequeue_apachesolr_modify_query('', $params, '');

    $this->assertTrue(isset($params['bq']), t('Apachesolr bq has been set.'), t('Nodequeue'));
    $this->assertTrue(isset($params['facet.field']), t('Apachesolr facet.field has been set.'), t('Nodequeue'));
  }

  // FIXME: move to class with functional tests?
  function testNodequeueApacheSolrFormAlter() {
    $queue = $this->createNodequeue(array('page', 'article'), array(2), 4);
    $nodes = $this->populateNodequeue($queue->qid, 4);

    $form = $form_state = array();

    nodequeue_form_apachesolr_search_bias_form_alter($form, $form_state);

    $this->assertTrue(!empty($form['biasing']['nodequeue_boost']), t('Nodequeue boost fieldset exists.'), t('Nodequeue'));
  }
}
*/
class NodequeueExternalFetchingUnitTest extends NodequeueWebTestCase {
  public static function getInfo() {
    return array(
      'name' => t('External'),
      'description' => t('External queue fetching.'),
      'group' => t('Nodequeue API'),
    );
  }
  function setUp() {
    parent::setUp('nodequeue');
  }
  function testNodequeueNodeTitles() {
    $queue = $this
      ->createNodequeue(array(
      'page',
      'article',
    ), array(
      2,
    ), 4);
    $nodes = $this
      ->populateNodequeue($queue->qid, 4);
    $subqueues = nodequeue_load_subqueues_by_queue($queue->qid);
    $subqueue = array_shift($subqueues);
    $rv = nodequeue_node_titles($subqueue->sqid, 'Queue title');
    $rv = drupal_render($rv);
    $this
      ->assertTrue(strpos($rv, 'Queue title'), t('Found list header.'), t('Nodequeue'));
    $this
      ->assertTrue(strpos($rv, $nodes[1]->title), t('Found a node.'), t('Nodequeue'));
    $rv = nodequeue_node_titles($subqueue->sqid, 'Queue title', TRUE, 0, 2);
    $rv = drupal_render($rv);
    $this
      ->assertTrue(strpos($rv, $nodes[4]->title), t('Found the first node in the queue.'), t('Nodequeue'));
    $this
      ->assertFalse(strpos($rv, $nodes[1]->title), t('Node outside the limit is not in the queue.'), t('Nodequeue'));
    $rv = nodequeue_node_titles($subqueue->sqid, 'Queue title', TRUE, 0, 0);
    $rv = drupal_render($rv);
    $this
      ->assertTrue(strpos($rv, $nodes[1]->title), t('Got all nodes.'), t('Nodequeue'));
  }
  function testNodequeueViewNodes() {
    $queue = $this
      ->createNodequeue(array(
      'page',
      'article',
    ), array(
      2,
    ), 4);
    $nodes = $this
      ->populateNodequeue($queue->qid, 4);
    $subqueues = nodequeue_load_subqueues_by_queue($queue->qid);
    $subqueue = array_shift($subqueues);
    $rv = nodequeue_view_nodes($subqueue->sqid);
    $rv = drupal_render($rv);
    $this
      ->assertTrue(strpos($rv, $nodes[1]->title), t('Found a node.'), t('Nodequeue'));
    $rv = nodequeue_view_nodes($subqueue->sqid, TRUE, TRUE, TRUE, 0, 2);
    $rv = drupal_render($rv);
    $this
      ->assertTrue(strpos($rv, $nodes[4]->title), t('Found the first node in the queue.'), t('Nodequeue'));
    $this
      ->assertFalse(strpos($rv, $nodes[1]->title), t('Node outside the limit is not in the queue.'), t('Nodequeue'));
  }
  function testNodequeueLoadNodes() {
    $queue = $this
      ->createNodequeue(array(
      'page',
      'article',
    ), array(
      2,
    ), 4);
    $nodes = $this
      ->populateNodequeue($queue->qid, 4);
    $subqueues = nodequeue_load_subqueues_by_queue($queue->qid);
    $subqueue = array_shift($subqueues);

    // FIXME: use title for comparison instead of nid
    $rv = nodequeue_load_nodes($subqueue->sqid);
    $this
      ->assertEqual($rv[$nodes[1]->nid]->title, $nodes[1]->title, t('Found the first node in the queue.'), t('Nodequeue'));
    $rv = nodequeue_load_nodes($subqueue->sqid, FALSE, 0, 0);
    $this
      ->assertTrue(count($rv) == 4, t('Got all nodes from nodequeue.'), t('Nodequeue'));
  }
  function testNodequeueLoadFrontBack() {
    $queue = $this
      ->createNodequeue(array(
      'page',
      'article',
    ), array(
      2,
    ), 4);
    $nodes = $this
      ->populateNodequeue($queue->qid, 4);
    $subqueues = nodequeue_load_subqueues_by_queue($queue->qid);
    $subqueue = array_shift($subqueues);
    $rv = nodequeue_load_front($subqueue->sqid);
    $this
      ->assertEqual($rv->title, $nodes[1]->title, t('Got the front node.'), t('Nodequeue'));
    $rv = nodequeue_load_back($subqueue->sqid);
    $this
      ->assertEqual($rv->title, $nodes[4]->title, t('Got the back node.'), t('Nodequeue'));
  }
  function testNodequeueViewRandom() {
    $queue = $this
      ->createNodequeue(array(
      'page',
      'article',
    ), array(
      2,
    ), 4);
    $nodes = $this
      ->populateNodequeue($queue->qid, 4);
    $subqueues = nodequeue_load_subqueues_by_queue($queue->qid);
    $subqueue = array_shift($subqueues);
    $rv = nodequeue_view_random_node($subqueue->sqid);
    $rv = drupal_render($rv);
    $found = FALSE;
    foreach ($nodes as $node) {
      if (strpos($rv, $node->title)) {
        $found = TRUE;
        break;
      }
    }
    $this
      ->assertTrue($found, t('Got a node from the queue.'), t('Nodequeue'));
  }
  function testNodequeueLoadRandom() {
    $queue = $this
      ->createNodequeue(array(
      'page',
      'article',
    ), array(
      2,
    ), 4);
    $nodes = $this
      ->populateNodequeue($queue->qid, 4);
    $subqueues = nodequeue_load_subqueues_by_queue($queue->qid);
    $subqueue = array_shift($subqueues);
    $rv = nodequeue_load_random_node($subqueue->sqid);
    $found = FALSE;
    foreach ($nodes as $node) {
      if ($rv->title == $node->title) {
        $found = TRUE;
        break;
      }
    }
    $this
      ->assertTrue($found, t('Got a node object from the queue.'), t('Nodequeue'));
  }
  function testNodequeueQueuePosition() {
    $queue = $this
      ->createNodequeue(array(
      'page',
      'article',
    ), array(
      2,
    ), 4);
    $nodes = $this
      ->populateNodequeue($queue->qid, 4);
    $subqueues = nodequeue_load_subqueues_by_queue($queue->qid);
    $subqueue = array_shift($subqueues);
    $rv = nodequeue_queue_position($subqueue->sqid, 3);
    $this
      ->assertEqual($rv, 3, t('Got a node object from the queue.'), t('Nodequeue'));
  }

}

// TODO: nodequeue_view_subqueues($queue)