'Feedback functionality',
     'description' => 'Tests basic Feedback module functionality.',
     'group' => 'Feedback',
    );
  }
  function setUp() {
    parent::setUp(array('feedback', 'trigger'));
    $this->admin_user = $this->drupalCreateUser(array('access feedback form', 'view feedback messages', 'administer feedback'));
    $this->web_user = $this->drupalCreateUser(array('access feedback form'));
    $this->drupalLogin($this->web_user);
  }
  /**
   * Test a basic feedback message.
   */
  function testFeedbackMessage() {
    $message = $this->randomString();
    $edit = array(
      'message' => $message,
    );
    $this->drupalPost('node', $edit, t('Send feedback'));
    // Verify the message was recorded.
    $this->drupalLogin($this->admin_user);
    $this->drupalGet('admin/reports/feedback');
    $this->assertRaw(check_plain($message), t('Message found.'));
    $this->assertText('node', t('Originating system path found.'));
    $this->assertLinkByHref(url('node', array('absolute' => TRUE)), 0, t('Originating absolute URL found.'));
    // Verify that we can process the message.
    $edit = array(
      'feedback-messages[0][1]' => TRUE,
    );
    $this->drupalPost(NULL, $edit, t('Update'));
    $this->assertFieldByName('feedback-messages[1][1]', 1, t('Processed message found.'));
  }
  /**
   * Test visibility settings.
   */
   function testFeedbackVisibility() {
     $this->drupalLogin($this->admin_user);
     $this->drupalGet('user');
     $this->assertRaw('' . t('Feedback') . '', t('Feedback form shown.'));
     $edit = array(
       'feedback_excluded_paths' => 'user*',
     );
     $this->drupalPost('admin/config/user-interface/feedback', $edit, t('Save configuration'));
     $this->drupalGet('user');
     $this->assertNoRaw('' . t('Feedback') . '', t('Feedback form not shown.'));
   }
 /**
  * Test feedback deletion.
  */
  function testFeedbackDelete() {
    $this->drupalLogin($this->admin_user);
    $message = $this->randomString();
    $edit = array(
      'message' => $message,
    );
    $this->drupalPost('node', $edit, t('Send feedback'));
    // Verify a delete link is shown.
    $this->drupalGet('admin/reports/feedback');
    $this->assertLinkByHref('admin/reports/feedback/1/delete');
    // Verify deletion.
    $this->drupalPost('admin/reports/feedback/1/delete', array(), t('Delete'));
    $this->assertRaw(t('The feedback entry was deleted'), t('Feedback deletion message shown.'));
    $this->assertNoLinkByHref('admin/reports/feedback/1/delete');
    $this->assertNoRaw(check_plain($message), t('Message not found.'));
  }
  /**
   * Test the feedback triggers and actions.
   */
  function testFeedbackEmailAction() {
    $test_user = $this->drupalCreateUser(array('administer actions', 'administer feedback', 'access feedback form'));
    $this->drupalLogin($test_user);
    $this->assignFeedbackEmailAction('feedback_insert', $test_user->mail);
    // Insert a feedback entry.
    $message = $this->randomString();
    $edit = array(
      'message' => $message,
    );
    $this->drupalPost('node', $edit, t('Send feedback'));
    $this->assertFeedbackEmailTokenReplacement($test_user->mail, $message);
    $this->assignFeedbackEmailAction('feedback_update', $test_user->mail);
    // Update a feedback entry.
    $fid = db_query("SELECT fid FROM {feedback} LIMIT 0,1")->fetchField();
    $entry = feedback_load($fid);
    feedback_save($entry);
    $this->assertFeedbackEmailTokenReplacement($test_user->mail, $entry->message);
  }
  /**
   * Assigns a system_send_email_action to the passed-in trigger.
   *
   * @param $trigger
   *   For example, 'user_login'
   */
  function assignFeedbackEmailAction($trigger, $mail) {
    $form_name = "trigger_{$trigger}_assign_form";
    $form_html_id = strtr($form_name, '_', '-');
    $edit = array(
      'actions_label' => $trigger . "_feedback_send_email_action",
      'recipients' => $mail,
      'subject' => $this->randomName(),
      'message' => '!message',
    );
    $hash = drupal_hash_base64('feedback_send_email_action');
    $this->drupalPost("admin/config/system/actions/configure/$hash", $edit, t('Save'));
    $this->assertText(t('The action has been successfully saved.'));
    // Now we have to find out the action ID of what we created.
    $aid = db_query('SELECT aid FROM {actions} WHERE callback = :callback AND label = :label', array(':callback' => 'feedback_send_email_action', ':label' => $edit['actions_label']))->fetchField();
    $edit = array('aid' => drupal_hash_base64($aid));
    $this->drupalPost('admin/structure/trigger/feedback', $edit, t('Assign'), array(), array(), $form_html_id);
  }
  /**
   * Asserts correct token replacement for the given trigger and account.
   *
   * @param $account
   *   The user account which triggered the action.
   * @param $email_depth
   *   Number of emails to scan, starting with most recent.
   */
  function assertFeedbackEmailTokenReplacement($mail, $message, $email_depth = 1) {
    $this->verboseEmail($email_depth);
    $this->assertMailString('body', $message, $email_depth);
    $this->assertMail('to', $mail, t('Mail sent to correct destination'));
  }
}