You are here

user_relationships.test in User Relationships 7

User Relationships API tests @author Alex Karshakevich http://drupal.org/user/183217

File

user_relationships.test
View source
<?php

/**
 * @file
 * User Relationships API tests
 * @author Alex Karshakevich http://drupal.org/user/183217
 */

/**
 * Base class for all UR test cases, provides various helper methods.
 */
class UserRelationshipsBaseTestCase extends DrupalWebTestCase {

  /**
   * Array of created and loaded users.
   *
   * @var array
   */
  protected $users = array();

  /**
   * Array of relationship types.
   *
   * Created by UserRelationshipsBaseTestCase::createDefaultRelationships().
   *
   * @var array
   */
  protected $rtypes = array();

  /**
   * Create a number of relationship types.
   *
   * The created types are stored in $this->rtypes with the keys oneway, twoway,
   * approval, approval_oneway, approval_reciprocal.
   *
   * @param $create_types
   *   An array of type identifiers which should be created. Defaults to all.
   */
  function createDefaultRelationshipTypes($create_types = array()) {
    $this->rtypes = array();
    if (empty($create_types)) {
      $create_types = array(
        'oneway',
        'twoway',
        'approval',
        'approval_oneway',
        'approval_reciprocal',
      );
    }

    // Flush static cache.
    drupal_static_reset('user_relationships_types_load');
    if (in_array('oneway', $create_types)) {
      $rtype = new StdClass();
      $rtype->name = 'oneway';
      $rtype->machine_name = 'oneway';
      $rtype->plural_name = 'oneways';
      $rtype->is_oneway = TRUE;
      $rtype->requires_approval = FALSE;
      $rtype->expires_val = 0;
      user_relationships_type_save($rtype);
      $this->rtypes['oneway'] = $rtype;
    }
    if (in_array('twoway', $create_types)) {
      $rtype = new StdClass();
      $rtype->name = 'twoway';
      $rtype->plural_name = 'twoways';
      $rtype->is_oneway = FALSE;
      $rtype->requires_approval = FALSE;
      $rtype->expires_val = 0;
      user_relationships_type_save($rtype);
      $this->rtypes['twoway'] = $rtype;
    }
    if (in_array('approval', $create_types)) {
      $rtype = new StdClass();
      $rtype->name = 'approval';
      $rtype->machine_name = 'approval';
      $rtype->plural_name = 'approvals';
      $rtype->is_oneway = FALSE;
      $rtype->requires_approval = TRUE;
      $rtype->expires_val = 0;
      user_relationships_type_save($rtype);
      $this->rtypes['approval'] = $rtype;
    }
    if (in_array('approval_oneway', $create_types)) {
      $rtype = new StdClass();
      $rtype->name = 'approval-oneway';
      $rtype->machine_name = 'approval_oneway';
      $rtype->plural_name = 'approvals-oneway';
      $rtype->is_oneway = TRUE;
      $rtype->requires_approval = TRUE;
      $rtype->expires_val = 0;
      user_relationships_type_save($rtype);
      $this->rtypes['approval_oneway'] = $rtype;
    }

    //#348025 reciprocal one-way relationships
    if (in_array('approval_reciprocal', $create_types)) {
      $rtype = new StdClass();
      $rtype->name = 'approval-reciprocal';
      $rtype->machine_name = 'approval_reciprocal';
      $rtype->plural_name = 'approvals-reciprocal';
      $rtype->is_oneway = TRUE;
      $rtype->is_reciprocal = TRUE;
      $rtype->requires_approval = TRUE;
      $rtype->expires_val = 0;
      user_relationships_type_save($rtype);
      $this->rtypes['approval_reciprocal'] = $rtype;
    }

    // Flush static cache.
    drupal_static_reset('user_relationships_types_load');

    // Flush permission cache.
    user_relationships_types_load();
    $this
      ->checkPermissions(array(), TRUE);
  }

}

/**
 * Test cases für UR API.
 */
class UserRelationshipsTestCase extends UserRelationshipsBaseTestCase {

  /**
   * Implements getInfo().
   */
  function getInfo() {
    return array(
      'name' => t('User Relationships API implementation'),
      'description' => t('Checks correctness of some UR API functions.'),
      'group' => t('User Relationships'),
    );
  }

  /**
   * Enable modules.
   */
  function setUp() {
    parent::setUp('user_relationships');
  }

  /**
   * Test API functions for relationship types.
   */
  function testTypeAPI() {
    $this
      ->createDefaultRelationshipTypes();

    // Test loading by a different column than name or plural_name.
    $rtype = user_relationships_type_load(array(
      'is_reciprocal' => 1,
    ));
    $this
      ->assertEqual('approval-reciprocal', $rtype->name);

    // Enforce uniqueness of relationship type name.
    $rtype = new StdClass();
    $rtype->name = 'oneway';
    $rtype->machine_name = 'oneway';
    $rtype->plural_name = 'oneways';
    $rtype->is_oneway = TRUE;
    $rtype->requires_approval = FALSE;
    $rtype->expires_val = 0;
    $this
      ->assertFalse(user_relationships_type_save($rtype));

    // Verify default value of expires_val.
    $rtype = new StdClass();
    $rtype->name = 'expires_default_test';
    $rtype->machine_name = 'expires_default_test';
    $rtype->plural_name = 'expires_default_test_plural';
    $rtype->is_oneway = TRUE;
    $rtype->requires_approval = FALSE;
    user_relationships_type_save($rtype);
    $this
      ->assertEqual(0, $rtype->expires_val);

    // Delete a relationship type.
    user_relationships_type_delete($rtype->rtid);
    $this
      ->assertFalse(db_query('SELECT name FROM {user_relationship_types} WHERE rtid = :rtid', array(
      ':rtid' => $rtype->rtid,
    ))
      ->fetchField());
    $this
      ->assertFalse(user_relationships_type_load($rtype->rtid));
  }

  /**
   * Test various relationship APi functions and params.
   *
   * This test case concentrates on parts which aren't covered
   * by others tests already.
   */
  function testRelationshipAPI() {
    $this
      ->createDefaultRelationshipTypes();
    $permissions = array(
      'can have ' . $this->rtypes['oneway']->machine_name . ' relationships',
      'can request ' . $this->rtypes['oneway']->machine_name . ' relationships',
      'can have ' . $this->rtypes['twoway']->machine_name . ' relationships',
      'can request ' . $this->rtypes['twoway']->machine_name . ' relationships',
      'can have ' . $this->rtypes['approval_oneway']->machine_name . ' relationships',
      'can request ' . $this->rtypes['approval_oneway']->machine_name . ' relationships',
      'can have ' . $this->rtypes['approval']->machine_name . ' relationships',
      'can request ' . $this->rtypes['approval']->machine_name . ' relationships',
      'can have ' . $this->rtypes['approval_reciprocal']->machine_name . ' relationships',
      'can request ' . $this->rtypes['approval_reciprocal']->machine_name . ' relationships',
    );
    $u1 = $this
      ->drupalCreateUser($permissions);
    $u2 = $this
      ->drupalCreateUser($permissions);

    // Test the exclude_rtids param for loading relationships. Create two
    // relationships of a different type and then try to exclude on rtid.
    user_relationships_request_relationship($u1, $u2, $this->rtypes['oneway']);
    user_relationships_request_relationship($u1, $u2, $this->rtypes['twoway']);

    // First, load without exclude param, check that both relationships are
    // listed.
    $relationships = user_relationships_load(array(
      'between' => array(
        $u1->uid,
        $u2->uid,
      ),
    ));
    $this
      ->assertEqual(2, count($relationships));

    // Second, exclude the twoway relationship type.
    $relationships = user_relationships_load(array(
      'between' => array(
        $u1->uid,
        $u2->uid,
      ),
      'exclude_rtids' => array(
        $this->rtypes['twoway']->rtid,
      ),
    ));
    $this
      ->assertEqual(1, count($relationships));
    $this
      ->assertEqual($this->rtypes['oneway']->rtid, array_shift($relationships)->rtid);

    // Include user info.
    $relationships = user_relationships_load(array(
      'between' => array(
        $u1->uid,
        $u2->uid,
      ),
    ), array(
      'include_user_info' => TRUE,
    ));
    $this
      ->assertEqual(2, count($relationships));

    // Assert returned user info.
    foreach ($relationships as $relationship) {

      // Requester.
      $this
        ->assertEqual($u1->name, $relationship->requester->name);
      $this
        ->assertEqual($u1->mail, $relationship->requester->mail);
      $this
        ->assertEqual($u1->uid, $relationship->requester->uid);

      // Requestee.
      $this
        ->assertEqual($u2->name, $relationship->requestee->name);
      $this
        ->assertEqual($u2->mail, $relationship->requestee->mail);
      $this
        ->assertEqual($u2->uid, $relationship->requestee->uid);
    }

    // Order relationships by rtid, default direction (ASC).
    $relationships = user_relationships_load(array(
      'between' => array(
        $u1->uid,
        $u2->uid,
      ),
    ), array(
      'order' => 'ur.rtid',
    ));
    $this
      ->assertEqual(2, count($relationships));
    $this
      ->assertEqual($this->rtypes['oneway']->rtid, array_shift($relationships)->rtid, t('First relationship is of type oneway'));
    $this
      ->assertEqual($this->rtypes['twoway']->rtid, array_shift($relationships)->rtid, t('Second relationship is of type twoway'));

    // Order relationships by rtid, DESC.
    $relationships = user_relationships_load(array(
      'between' => array(
        $u1->uid,
        $u2->uid,
      ),
    ), array(
      'order' => array(
        'ur.rtid',
        'DESC',
      ),
    ));
    $this
      ->assertEqual(2, count($relationships));
    $this
      ->assertEqual($this->rtypes['twoway']->rtid, array_shift($relationships)->rtid, t('First relationship is of type twoway'));
    $this
      ->assertEqual($this->rtypes['oneway']->rtid, array_shift($relationships)->rtid, t('Second relationship is of type oneway'));

    // Create a relationship which is not approved automatically.
    $relationship = user_relationships_request_relationship($u1, $u2, $this->rtypes['approval']);
    $this
      ->assertFalse($relationship->approved);
    user_relationships_save_relationship($relationship, 'approve');
    $this
      ->assertTrue($relationship->approved);
    $relationships = user_relationships_load(array(
      'user' => $u2->uid,
      'rtid' => array(
        $this->rtypes['approval']->rtid,
      ),
    ));
    debug($relationships);
    debug(db_query('SELECT * FROM {user_relationships} WHERE rtid = :rtid', array(
      ':rtid' => $this->rtypes['approval']->rtid,
    ))
      ->fetchAll());
    $relationship = array_shift($relationships);
    $this
      ->assertTrue($relationship->approved);
  }

  /**
   * Test the load functions if there are no one way relationship types.
   */
  function testNoOnewayRelationships() {
    $this
      ->createDefaultRelationshipTypes(array(
      'twoway',
    ));
    $permissions = array(
      'can have ' . $this->rtypes['twoway']->machine_name . ' relationships',
      'can request ' . $this->rtypes['twoway']->machine_name . ' relationships',
    );
    $u1 = $this
      ->drupalCreateUser($permissions);
    $u2 = $this
      ->drupalCreateUser($permissions);
    $u3 = $this
      ->drupalCreateUser($permissions);
    user_relationships_request_relationship($u1, $u2, $this->rtypes['twoway']);
    user_relationships_request_relationship($u3, $u1, $this->rtypes['twoway']);

    // Load all relationships of this
    $relationships = user_relationships_load(array(
      'user' => $u1->uid,
    ));
    $this
      ->assertEqual(2, count($relationships));
  }

  //Test #479486 duplicate records for two-way relationships
  function testUserRelationshipsLoadDuplicates() {
    $this
      ->createDefaultRelationshipTypes();
    $permissions = array(
      'can have ' . $this->rtypes['oneway']->machine_name . ' relationships',
      'can request ' . $this->rtypes['oneway']->machine_name . ' relationships',
      'can have ' . $this->rtypes['twoway']->machine_name . ' relationships',
      'can request ' . $this->rtypes['twoway']->machine_name . ' relationships',
      'can have ' . $this->rtypes['approval_oneway']->machine_name . ' relationships',
      'can request ' . $this->rtypes['approval_oneway']->machine_name . ' relationships',
      'can have ' . $this->rtypes['approval']->machine_name . ' relationships',
      'can request ' . $this->rtypes['approval']->machine_name . ' relationships',
    );
    $u1 = $this
      ->drupalCreateUser($permissions);
    $u2 = $this
      ->drupalCreateUser($permissions);
    $u3 = $this
      ->drupalCreateUser($permissions);
    $u4 = $this
      ->drupalCreateUser($permissions);

    // Create relationships.
    $this
      ->assertTrue((bool) user_relationships_request_relationship($u1, $u2, $this->rtypes['oneway']->rtid, FALSE));
    $this
      ->assertTrue((bool) user_relationships_request_relationship($u1, $u3, $this->rtypes['oneway']->rtid, FALSE));

    // user_relationships_request_relationship($u3, $u1, $this->rtypes['oneway']->rtid, FALSE);//this is a no-op
    $this
      ->assertTrue((bool) user_relationships_request_relationship($u1, $u2, $this->rtypes['twoway']->rtid, FALSE));
    $this
      ->assertTrue((bool) user_relationships_request_relationship($u1, $u3, $this->rtypes['twoway']->rtid, FALSE));
    $this
      ->assertTrue((bool) user_relationships_request_relationship($u4, $u1, $this->rtypes['twoway']->rtid, FALSE));

    //test between
    $result = user_relationships_load(array(
      'between' => array(
        $u1->uid,
        $u2->uid,
      ),
    ));
    $this
      ->assertEqual(count($result), 2);
    $result = user_relationships_load(array(
      'between' => array(
        $u1->uid,
        $u2->uid,
      ),
    ), array(
      'include_twoway_reverse' => 1,
    ));
    $this
      ->assertEqual(count($result), 2);

    //sort by rtid and here reverse relationships will show up
    $result = user_relationships_load(array(
      'between' => array(
        $u1->uid,
        $u2->uid,
      ),
    ), array(
      'sort' => 'rtid',
    ));
    $this
      ->assertEqual(count($result[$this->rtypes['oneway']->rtid]), 1);
    $this
      ->assertEqual(count($result[$this->rtypes['twoway']->rtid]), 1);
    $result = user_relationships_load(array(
      'between' => array(
        $u1->uid,
        $u2->uid,
      ),
    ), array(
      'sort' => 'rtid',
      'include_twoway_reverse' => 1,
    ));
    $this
      ->assertEqual(count($result[$this->rtypes['oneway']->rtid]), 1);
    $this
      ->assertEqual(count($result[$this->rtypes['twoway']->rtid]), 2);

    //test user
    $result = user_relationships_load(array(
      'user' => $u1->uid,
    ));
    $this
      ->assertEqual(count($result), 5);
    $result = user_relationships_load(array(
      'user' => $u1->uid,
    ), array(
      'include_twoway_reverse' => 1,
    ));
    $this
      ->assertEqual(count($result), 5);
    $result = user_relationships_load(array(
      'user' => $u1->uid,
    ), array(
      'sort' => 'rtid',
    ));
    $this
      ->assertEqual(count($result[$this->rtypes['oneway']->rtid]), 2);
    $this
      ->assertEqual(count($result[$this->rtypes['twoway']->rtid]), 3);
    $result = user_relationships_load(array(
      'user' => $u1->uid,
    ), array(
      'sort' => 'rtid',
      'include_twoway_reverse' => 1,
    ));
    $this
      ->assertEqual(count($result[$this->rtypes['oneway']->rtid]), 2);
    $this
      ->assertEqual(count($result[$this->rtypes['twoway']->rtid]), 6);

    //test rtid
    $result = user_relationships_load(array(
      'rtid' => $this->rtypes['twoway']->rtid,
    ));
    $this
      ->assertEqual(count($result), 3);
    $result = user_relationships_load(array(
      'rtid' => $this->rtypes['twoway']->rtid,
    ), array(
      'include_twoway_reverse' => 1,
    ));
    $this
      ->assertEqual(count($result), 3);
    $result = user_relationships_load(array(
      'rtid' => $this->rtypes['twoway']->rtid,
    ), array(
      'sort' => 'rtid',
    ));
    $this
      ->assertFalse(isset($result[$this->rtypes['oneway']->rtid]));
    $this
      ->assertEqual(count($result[$this->rtypes['twoway']->rtid]), 3);
    $result = user_relationships_load(array(
      'rtid' => $this->rtypes['twoway']->rtid,
    ), array(
      'sort' => 'rtid',
      'include_twoway_reverse' => 1,
    ));
    $this
      ->assertFalse(isset($result[$this->rtypes['oneway']->rtid]));
    $this
      ->assertEqual(count($result[$this->rtypes['twoway']->rtid]), 6);

    //test approved

    //load pending records
    $this
      ->assertTrue(user_relationships_can_request($u1, $this->rtypes['approval_oneway']));
    user_relationships_request_relationship($u1, $u2, $this->rtypes['approval_oneway']->rtid, FALSE);
    $this
      ->assertTrue(user_relationships_can_request($u3, $this->rtypes['approval_oneway']));
    user_relationships_request_relationship($u3, $u1, $this->rtypes['approval_oneway']->rtid, FALSE);
    $result = user_relationships_load(array(
      'approved' => 1,
    ));
    $this
      ->assertEqual(count($result), 5);
    $result = user_relationships_load(array(
      'approved' => 1,
    ), array(
      'include_twoway_reverse' => 1,
    ));
    $this
      ->assertEqual(count($result), 5);
    $result = user_relationships_load(array(
      'approved' => 1,
    ), array(
      'sort' => 'rtid',
    ));
    $this
      ->assertEqual(count($result[$this->rtypes['oneway']->rtid]), 2);
    $this
      ->assertEqual(count($result[$this->rtypes['twoway']->rtid]), 3);
    $this
      ->assertFalse(isset($result[$this->rtypes['approval_oneway']->rtid]));
    $result = user_relationships_load(array(
      'approved' => 1,
    ), array(
      'sort' => 'rtid',
      'include_twoway_reverse' => 1,
    ));
    $this
      ->assertEqual(count($result[$this->rtypes['oneway']->rtid]), 2);
    $this
      ->assertEqual(count($result[$this->rtypes['twoway']->rtid]), 6);
    $this
      ->assertFalse(isset($result[$this->rtypes['approval_oneway']->rtid]));

    //test pending
    $result = user_relationships_load(array(
      'approved' => 0,
    ));
    $this
      ->assertEqual(count($result), 2);
    $result = user_relationships_load(array(
      'approved' => 0,
    ), array(
      'include_twoway_reverse' => 1,
    ));
    $this
      ->assertEqual(count($result), 2);
    $result = user_relationships_load(array(
      'approved' => 0,
    ), array(
      'sort' => 'rtid',
    ));
    $this
      ->assertEqual(count($result), 1);
    $this
      ->assertEqual(count($result[$this->rtypes['approval_oneway']->rtid]), 2);
    $result = user_relationships_load(array(
      'approved' => 0,
    ), array(
      'sort' => 'rtid',
      'include_twoway_reverse' => 1,
    ));
    $this
      ->assertEqual(count($result), 1);
    $this
      ->assertEqual(count($result[$this->rtypes['approval_oneway']->rtid]), 2);

    //test user and pending
    $result = user_relationships_load(array(
      'user' => $u1->uid,
      'approved' => 0,
    ));
    $this
      ->assertEqual(count($result), 2);
    $result = user_relationships_load(array(
      'user' => $u1->uid,
      'approved' => 0,
    ), array(
      'include_twoway_reverse' => 1,
    ));
    $this
      ->assertEqual(count($result), 2);
    $result = user_relationships_load(array(
      'requester_id' => $u1->uid,
      'approved' => 0,
    ));
    $this
      ->assertEqual(count($result), 1);
    $result = user_relationships_load(array(
      'requester_id' => $u1->uid,
      'approved' => 0,
    ), array(
      'include_twoway_reverse' => 1,
    ));
    $this
      ->assertEqual(count($result), 1);

    //test user and approved
    $result = user_relationships_load(array(
      'user' => $u1->uid,
      'approved' => 1,
    ));
    $this
      ->assertEqual(count($result), 5);
    $result = user_relationships_load(array(
      'user' => $u1->uid,
      'approved' => 1,
    ), array(
      'include_twoway_reverse' => 1,
    ));
    $this
      ->assertEqual(count($result), 5);
    $result = user_relationships_load(array(
      'requester_id' => $u1->uid,
      'approved' => 1,
    ));
    $this
      ->assertEqual(count($result), 5);
    $result = user_relationships_load(array(
      'requester_id' => $u1->uid,
      'approved' => 1,
    ), array(
      'include_twoway_reverse' => 1,
    ));
    $this
      ->assertEqual(count($result), 5);
    $result = user_relationships_load(array(
      'requestee_id' => $u1->uid,
      'approved' => 1,
    ));
    $this
      ->assertEqual(count($result), 3);
    $result = user_relationships_load(array(
      'requestee_id' => $u1->uid,
      'approved' => 1,
    ), array(
      'include_twoway_reverse' => 1,
    ));
    $this
      ->assertEqual(count($result), 3);

    //add more pending records
    $this
      ->assertTrue(user_relationships_can_request($u1, $this->rtypes['approval']));
    $this
      ->assertTrue(user_relationships_can_request($u3, $this->rtypes['approval']));
    $this
      ->assertTrue(user_relationships_can_request($u4, $this->rtypes['approval']));
    $this
      ->assertTrue(user_relationships_can_request($u4, $this->rtypes['approval_oneway']));
    user_relationships_request_relationship($u4, $u2, $this->rtypes['approval_oneway']->rtid, FALSE);
    user_relationships_request_relationship($u3, $u4, $this->rtypes['approval_oneway']->rtid, FALSE);
    user_relationships_request_relationship($u1, $u2, $this->rtypes['approval']->rtid, FALSE);
    user_relationships_request_relationship($u4, $u2, $this->rtypes['approval']->rtid, FALSE);
    user_relationships_request_relationship($u3, $u4, $this->rtypes['approval']->rtid, FALSE);
    user_relationships_request_relationship($u3, $u1, $this->rtypes['approval']->rtid, FALSE);

    //test pending and requester
    $result = user_relationships_load(array(
      'requester_id' => $u3->uid,
      'approved' => 0,
    ));
    $this
      ->assertEqual(count($result), 4);
    $result = user_relationships_load(array(
      'requester_id' => $u3->uid,
      'approved' => 0,
    ), array(
      'include_twoway_reverse' => 1,
    ));
    $this
      ->assertEqual(count($result), 4);

    //test pending and requestee
    $result = user_relationships_load(array(
      'requestee_id' => $u2->uid,
      'approved' => 0,
    ));
    $this
      ->assertEqual(count($result), 4);
    $result = user_relationships_load(array(
      'requestee_id' => $u2->uid,
      'approved' => 0,
    ), array(
      'include_twoway_reverse' => 1,
    ));
    $this
      ->assertEqual(count($result), 4);

    //test pending and user
    $result = user_relationships_load(array(
      'user' => $u3->uid,
      'approved' => 0,
    ));
    $this
      ->assertEqual(count($result), 4);
    $result = user_relationships_load(array(
      'user' => $u3->uid,
      'approved' => 0,
    ), array(
      'include_twoway_reverse' => 1,
    ));
    $this
      ->assertEqual(count($result), 4);
    $result = user_relationships_load(array(
      'user' => $u2->uid,
      'approved' => 0,
    ));
    $this
      ->assertEqual(count($result), 4);
    $result = user_relationships_load(array(
      'user' => $u2->uid,
      'approved' => 0,
    ), array(
      'include_twoway_reverse' => 1,
    ));
    $this
      ->assertEqual(count($result), 4);

    //test between and pending
    $result = user_relationships_load(array(
      'between' => array(
        $u3->uid,
        $u1->uid,
      ),
      'approved' => 0,
    ));
    $this
      ->assertEqual(count($result), 2);
    $result = user_relationships_load(array(
      'between' => array(
        $u3->uid,
        $u1->uid,
      ),
      'approved' => 0,
    ), array(
      'include_twoway_reverse' => 1,
    ));
    $this
      ->assertEqual(count($result), 2);
    $result = user_relationships_load(array(
      'between' => array(
        $u3->uid,
        $u4->uid,
      ),
      'approved' => 0,
    ));
    $this
      ->assertEqual(count($result), 2);
    $result = user_relationships_load(array(
      'between' => array(
        $u3->uid,
        $u4->uid,
      ),
      'approved' => 0,
    ), array(
      'include_twoway_reverse' => 1,
    ));
    $this
      ->assertEqual(count($result), 2);

    //#520392 test just between
    $result = user_relationships_load(array(
      'between' => array(
        $u3->uid,
        $u1->uid,
      ),
    ));
    $this
      ->assertEqual(count($result), 4);
    $result = user_relationships_load(array(
      'between' => array(
        $u3->uid,
        $u1->uid,
      ),
    ), array(
      'include_twoway_reverse' => 1,
    ));
    $this
      ->assertEqual(count($result), 4);
    $result = user_relationships_load(array(
      'between' => array(
        $u1->uid,
        $u3->uid,
      ),
    ));
    $this
      ->assertEqual(count($result), 4);
    $result = user_relationships_load(array(
      'between' => array(
        $u1->uid,
        $u3->uid,
      ),
    ), array(
      'include_twoway_reverse' => 1,
    ));
    $this
      ->assertEqual(count($result), 4);

    // #1211060: Make sure that exactly one reverse relationship is created when
    // a twoway relationship is approved.
    // Make sure only an unapproved relationship from u4 to u2 exists.
    $unapproved_relationship = user_relationships_load(array(
      'requestee_id' => $u2->uid,
      'requester_id' => $u4->uid,
      'rtid' => $this->rtypes['approval']->rtid,
    ));
    $unapproved_relationship = reset($unapproved_relationship);
    $this
      ->assertFalse($unapproved_relationship->approved);
    $this
      ->assertFalse(user_relationships_load(array(
      'requester_id' => $u2->uid,
      'requestee_id' => $u4->uid,
      'rtid' => $this->rtypes['approval']->rtid,
    )));

    // Approve the relationship.
    user_relationships_save_relationship($unapproved_relationship, 'approve');

    // Make sure the relationship was approved and exists both ways.
    $relationship = user_relationships_load(array(
      'requestee_id' => $u2->uid,
      'requester_id' => $u4->uid,
      'rtid' => $this->rtypes['approval']->rtid,
    ));
    $relationship = reset($relationship);
    $this
      ->assertTrue($relationship->approved);
    $relationship = user_relationships_load(array(
      'requester_id' => $u2->uid,
      'requestee_id' => $u4->uid,
      'rtid' => $this->rtypes['approval']->rtid,
    ));
    $relationship = reset($relationship);
    $this
      ->assertTrue($relationship->approved);

    // Update the relationship again, make sure that only a single entry for
    // both directions exists.
    user_relationships_save_relationship($relationship, 'update');
    $arguments_array = array(
      array(
        ':requestee_id' => $u2->uid,
        ':requester_id' => $u4->uid,
        ':rtid' => $this->rtypes['approval']->rtid,
      ),
      array(
        ':requester_id' => $u2->uid,
        ':requestee_id' => $u4->uid,
        ':rtid' => $this->rtypes['approval']->rtid,
      ),
    );
    foreach ($arguments_array as $arguments) {
      $this
        ->assertEqual(1, db_query('SELECT COUNT(*) FROM {user_relationships} WHERE requester_id = :requester_id AND requestee_id = :requestee_id AND rtid = :rtid', $arguments)
        ->fetchField());
    }
  }

  //Test #348025 that user_relationship_load_types will load is_reciprocal flag
  function testUserRelationshipsReciprocalTypes() {
    $this
      ->createDefaultRelationshipTypes();
    $rtypes = user_relationships_types_load();
    $rtype = $rtypes[$this->rtypes['approval_reciprocal']->rtid];
    $this
      ->assertTrue($rtype->is_reciprocal);
    $rtype = $rtypes[$this->rtypes['approval_oneway']->rtid];
    $this
      ->assertFalse($rtype->is_reciprocal);
    $rtype = $rtypes[$this->rtypes['approval']->rtid];
    $this
      ->assertFalse($rtype->is_reciprocal);
  }

}

/**
 * User Relationship type tests.
 */
class UserRelationshipsTypesTestCase extends DrupalWebTestCase {

  /**
   * Implements getInfo().
   */
  function getInfo() {
    return array(
      'name' => t('User Relationships Types'),
      'description' => t('Checks various user relationship types functions.'),
      'group' => t('User Relationships'),
    );
  }

  /**
   * Enable modules.
   */
  function setUp() {
    parent::setUp('user_relationships');
  }
  function testNames() {

    // Create relationship type.
    $relationship_type = (object) array(
      'name' => $this
        ->randomName(),
      'machine_name' => strtolower($this
        ->randomName()),
      'plural_name' => $this
        ->randomName(),
      'reverse_name' => $this
        ->randomName(),
      'reverse_plural_name' => $this
        ->randomName(),
      'name_capitalized' => $this
        ->randomName(),
      'plural_name_capitalized' => $this
        ->randomName(),
      'reverse_name_capitalized' => $this
        ->randomName(),
      'reverse_plural_name_capitalized' => $this
        ->randomName(),
      'requires_approval' => FALSE,
      'expires_val' => 0,
    );

    // First, check all names.
    $this
      ->assertEqual($relationship_type->name, user_relationships_type_get_name($relationship_type));
    $this
      ->assertEqual($relationship_type->plural_name, user_relationships_type_get_name($relationship_type, TRUE));
    $this
      ->assertEqual($relationship_type->reverse_name, user_relationships_type_get_name($relationship_type, FALSE, TRUE));
    $this
      ->assertEqual($relationship_type->reverse_plural_name, user_relationships_type_get_name($relationship_type, TRUE, TRUE));
    $this
      ->assertEqual($relationship_type->name_capitalized, user_relationships_type_get_name($relationship_type, FALSE, FALSE, TRUE));
    $this
      ->assertEqual($relationship_type->plural_name_capitalized, user_relationships_type_get_name($relationship_type, TRUE, FALSE, TRUE));
    $this
      ->assertEqual($relationship_type->reverse_name_capitalized, user_relationships_type_get_name($relationship_type, FALSE, TRUE, TRUE));
    $this
      ->assertEqual($relationship_type->reverse_plural_name_capitalized, user_relationships_type_get_name($relationship_type, TRUE, TRUE, TRUE));
  }

}

/**
 * User Relationship type tests.
 */
class UserRelationshipsI18nTestCase extends DrupalWebTestCase {

  /**
   * Implements getInfo().
   */
  function getInfo() {
    return array(
      'name' => t('User Relationships Internationalization'),
      'description' => t('Asserts integration with I18n'),
      'group' => t('User Relationships'),
      'dependencies' => array(
        'i18n',
      ),
    );
  }

  /**
   * Enable modules.
   */
  function setUp() {
    parent::setUp('user_relationships', 'i18n_string', 'user_relationships_ui');
  }

  /**
   * Sets the proper environment.
   *
   * Currently just adds a new language.
   *
   * @param string $langcode
   *   The language code.
   */
  function addLanguage($langcode) {

    // Add the language.
    $edit = array(
      'langcode' => $langcode,
    );
    $this
      ->drupalPost('admin/config/regional/language/add', $edit, t('Add language'));
    $this
      ->assertText($langcode, t('Language added successfully.'));
    $this
      ->drupalPost('admin/config/regional/language/edit/' . $langcode, array(
      'prefix' => $langcode,
    ), t('Save language'));

    // This is needed to refresh the static cache of the language list.
    drupal_static_reset('language_list');
  }

  /**
   * Test translation of types.
   */
  function testTypeTranslation() {
    $admin = $this
      ->drupalCreateUser(array(
      'administer languages',
      'access administration pages',
      'administer user relationships',
      'translate interface',
      'translate user-defined strings',
    ));
    $this
      ->drupalLogin($admin);
    $this
      ->addLanguage('de');
    $this
      ->drupalPost('admin/config/regional/language/configure', array(
      'language[enabled][locale-url]' => TRUE,
    ), t('Save settings'));
    $this
      ->drupalGet('admin/config/people/relationships');
    $this
      ->clickLink(t('Add relationship type'));

    // Create relationship type.
    $edit = array(
      'name' => $this
        ->randomName(),
      'machine_name' => strtolower($this
        ->randomName()),
      'plural_name' => $this
        ->randomName(),
      'reverse_name' => $this
        ->randomName(),
      'reverse_plural_name' => $this
        ->randomName(),
      'name_capitalized' => $this
        ->randomName(),
      'plural_name_capitalized' => $this
        ->randomName(),
      'reverse_name_capitalized' => $this
        ->randomName(),
      'reverse_plural_name_capitalized' => $this
        ->randomName(),
      'requires_approval' => FALSE,
      'ui_settings_show_tab' => TRUE,
    );
    $this
      ->drupalPost(NULL, $edit, t('Add and translate'));
    $this
      ->clickLink(t('translate'));

    // Get the subscriber id from the path.
    $this
      ->assertTrue(preg_match('|admin/config/people/relationships/(\\d+)/translate$|', $this
      ->getUrl(), $matches), 'Type id found');
    $rtid = $matches[1];

    // strings[user_relationships:type:1:name]
    // Translate the type.
    $translations = array(
      "strings[user_relationships:type:{$rtid}:name]" => $this
        ->randomName(),
      "strings[user_relationships:type:{$rtid}:plural_name]" => $this
        ->randomName(),
      "strings[user_relationships:type:{$rtid}:reverse_name]" => $this
        ->randomName(),
      "strings[user_relationships:type:{$rtid}:reverse_plural_name]" => $this
        ->randomName(),
      "strings[user_relationships:type:{$rtid}:name_capitalized]" => $this
        ->randomName(),
      "strings[user_relationships:type:{$rtid}:plural_name_capitalized]" => $this
        ->randomName(),
      "strings[user_relationships:type:{$rtid}:reverse_name_capitalized]" => $this
        ->randomName(),
      "strings[user_relationships:type:{$rtid}:reverse_plural_name_capitalized]" => $this
        ->randomName(),
    );
    $this
      ->drupalPost(NULL, $translations, t('Save translation'));
    $this
      ->drupalGet('de/admin/config/people/relationships');

    // The translated name should now be shown.
    $this
      ->assertNoText($edit['name']);
    $this
      ->assertText($translations["strings[user_relationships:type:{$rtid}:name]"]);
    $this
      ->drupalGet('de/relationships');
    $this
      ->assertNoText($edit['plural_name_capitalized']);
    $this
      ->assertText($translations["strings[user_relationships:type:{$rtid}:plural_name_capitalized]"]);
  }

}

Classes

Namesort descending Description
UserRelationshipsBaseTestCase Base class for all UR test cases, provides various helper methods.
UserRelationshipsI18nTestCase User Relationship type tests.
UserRelationshipsTestCase Test cases für UR API.
UserRelationshipsTypesTestCase User Relationship type tests.