You are here

user_relationships_ui.test in User Relationships 7

User Relationships UI tests

File

user_relationships_ui/user_relationships_ui.test
View source
<?php

/**
 * @file
 * User Relationships UI tests
 */

/**
 * Tests for user settings.
 */
class UserRelationshipUserSettings extends DrupalWebTestCase {

  /**
   * Implements getInfo().
   */
  function getInfo() {
    return array(
      'name' => t('User Relationships User settings'),
      'description' => t('Check if user settings work as expected.'),
      'group' => t('User Relationships'),
    );
  }

  /**
   * Set up the test case.
   */
  function setUp() {
    parent::setUp(array(
      'user_relationships',
      'user_relationships_ui',
      'user_relationship_mailer',
    ));

    // Create relationship 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;
    $rtype = new StdClass();
    $rtype->name = 'twoway';
    $rtype->machine_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;
    unset($rtype);
    $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;
    unset($rtype);
    $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;
    drupal_static_reset('user_relationships_types_load');

    // Allow users to auto approve relationships.
    variable_set('user_relationships_allow_auto_approve', TRUE);

    // Allow users to disable e-mail notifications.
    variable_set('user_relationship_mailer_send_mail', TRUE);

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

  /**
   * Test the various user settings.
   */
  function testAutoApprovalSettings() {
    $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',
      'view own twoway relationships',
      'view own oneway relationships',
    );

    // User without maintain permission.
    $u1 = $this
      ->drupalCreateUser($permissions);

    // User without permission for an approval relationship.
    $permissions[] = 'maintain twoway relationships';
    $permissions[] = 'maintain oneway relationships';
    $u2 = $this
      ->drupalCreateUser($permissions);

    // Two users with all required permissions.
    $permissions[] = 'can have ' . $this->rtypes['approval_oneway']->machine_name . ' relationships';
    $permissions[] = 'can request ' . $this->rtypes['approval_oneway']->machine_name . ' relationships';
    $permissions[] = 'can have ' . $this->rtypes['approval']->machine_name . ' relationships';
    $permissions[] = 'can request ' . $this->rtypes['approval']->machine_name . ' relationships';
    $permissions[] = 'maintain approval relationships';
    $permissions[] = 'maintain approval_oneway relationships';
    $permissions[] = 'view own approval relationships';
    $permissions[] = 'view own approval_oneway relationships';
    $u3 = $this
      ->drupalCreateUser($permissions);
    $u4 = $this
      ->drupalCreateUser($permissions);

    // First user does not have maintain permission, should not see any
    // Relationships options.
    $this
      ->drupalLogin($u1);
    $this
      ->drupalGet('user/' . $u1->uid . '/edit');
    $this
      ->assertNoText(t('Automatically approve relationship requests from other users'));
    $this
      ->assertNoText(t('Receive e-mail notification of relationship activity'));

    // Make sure that there is no empty relationship fieldset.
    // Because the relationships tab is always there, use unique text to ensure
    // that no other text like this is present.
    // @todo: Find a better way to deal with this.
    $this
      ->assertUniqueText(T('Relationship'));

    // Second user is not allowed to have relationships of types which require
    // approval, no options should be displayed. He is however allowed to
    // disable e-mail notifications.
    $this
      ->drupalLogin($u2);
    $this
      ->drupalGet('user/' . $u2->uid . '/edit');
    $this
      ->assertNoText(t('Automatically approve relationship requests from other users'));
    $this
      ->assertText(t('Receive e-mail notification of relationship activity'));

    // Disable e-mail notifications of this user.
    $edit = array(
      'user_relationship_mailer_send_mail' => FALSE,
    );
    $this
      ->drupalPost(NULL, $edit, t('Save'));

    // The third user is allowed to see the settings, but only for the types
    // which require approval
    $this
      ->drupalLogin($u3);
    $this
      ->drupalGet('user/' . $u3->uid . '/edit');
    $this
      ->assertText(t('Automatically approve relationship requests from other users'));
    $this
      ->assertText(t('Receive e-mail notification of relationship activity'));
    $this
      ->assertFieldByName('user_relationships_ui_auto_approve[' . $this->rtypes['approval']->rtid . ']');
    $this
      ->assertFieldByName('user_relationships_ui_auto_approve[' . $this->rtypes['approval_oneway']->rtid . ']');
    $this
      ->assertNoFieldByName('user_relationships_ui_auto_approve[' . $this->rtypes['oneway']->rtid . ']');
    $this
      ->assertNoFieldByName('user_relationships_ui_auto_approve[' . $this->rtypes['twoway']->rtid . ']');

    // Enable auto approval for the approval_oneway type.
    $edit = array(
      'user_relationships_ui_auto_approve[' . $this->rtypes['approval_oneway']->rtid . ']' => TRUE,
    );
    $this
      ->drupalPost(NULL, $edit, t('Save'));

    // Verify that the defaults are set correctly.
    $this
      ->assertFieldChecked('edit-user-relationships-ui-auto-approve-' . $this->rtypes['approval_oneway']->rtid);
    $this
      ->assertNoFieldChecked('edit-user-relationships-ui-auto-approve-' . $this->rtypes['approval']->rtid);

    // Finally, actually verify that the settings work.
    $this
      ->drupalLogin($u4);

    // Request approval relationship, should not approve automatically.
    $this
      ->drupalPost('relationship/' . $u3->uid . '/request/' . $this->rtypes['approval']->rtid, array(), t('Send'));
    $this
      ->assertText(t('Your approval request has been sent to @user.', array(
      '@user' => $u3->name,
    )));

    // Request approval_oneway relationships, should approve automatically.
    $this
      ->drupalPost('relationship/' . $u3->uid . '/request/' . $this->rtypes['approval_oneway']->rtid, array(), t('Send'));
    $this
      ->assertText(t("You are @user's newest approval-oneway.", array(
      '@user' => $u3->name,
    )));

    // Load relationships between these two users.
    $relationships = user_relationships_load(array(
      'between' => array(
        $u3->uid,
        $u4->uid,
      ),
    ));
    $this
      ->assertEqual(count($relationships), 2);
    foreach ($relationships as $relationship) {
      if ($relationship->rtid == $this->rtypes['approval_oneway']->rtid) {
        $this
          ->assertTrue((bool) $relationship->approved);
      }
      elseif ($relationship->rtid == $this->rtypes['approval']->rtid) {
        $this
          ->assertFalse((bool) $relationship->approved);
      }
      else {
        $this
          ->fail('Unexpected relationship type @type', array(
          '@type' => $relationship->rtid,
        ));
      }
    }

    // Verify that two mails have been sent.
    $this
      ->assertEqual(count($this
      ->drupalGetMails()), 2);

    // Request a oneway relationship with user 2, this should not generate a
    // mail notification.
    $this
      ->drupalPost('relationship/' . $u2->uid . '/request/' . $this->rtypes['oneway']->rtid, array(), t('Send'));
    $this
      ->assertText(t("You are @user's newest oneway.", array(
      '@user' => $u2->name,
    )));

    // Verify that no additional mails have been sent.
    $this
      ->assertEqual(count($this
      ->drupalGetMails()), 2);
  }

}

Classes

Namesort descending Description
UserRelationshipUserSettings Tests for user settings.