? overlay_subtabs_invisible.png
Index: privatemsg.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/privatemsg/privatemsg.module,v
retrieving revision 1.70.2.30.2.91.2.64.2.70
diff -u -p -r1.70.2.30.2.91.2.64.2.70 privatemsg.module
--- privatemsg.module	9 Jul 2010 20:21:52 -0000	1.70.2.30.2.91.2.64.2.70
+++ privatemsg.module	10 Jul 2010 20:59:13 -0000
@@ -2433,5 +2433,5 @@ function privatemsg_user_autocomplete($f
   return _privatemsg_assemble_query('autocomplete', $fragment, $names)
     ->range(0, 10)
     ->execute()
-    ->fetchField();
+    ->fetchCol();
 }
Index: privatemsg.pages.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/privatemsg/privatemsg.pages.inc,v
retrieving revision 1.1.2.11
diff -u -p -r1.1.2.11 privatemsg.pages.inc
--- privatemsg.pages.inc	7 Jul 2010 09:55:15 -0000	1.1.2.11
+++ privatemsg.pages.inc	10 Jul 2010 20:59:13 -0000
@@ -312,7 +312,7 @@ function privatemsg_new($form, &$form_st
       }
     }
     $description = t('Enter the recipient, separate recipients with commas.');
-    $description .= theme('item_list', $description_array);
+    $description .= theme('item_list', array('items' => $description_array));
 
     $form['recipient'] = array(
       '#type'               => 'textfield',
@@ -520,8 +520,8 @@ function privatemsg_user_name_autocomple
       if (isset($type['autocomplete']) && is_callable($type['autocomplete']) && privatemsg_recipient_access($name, 'write')) {
         $function = $type['autocomplete'];
         $return = $function($fragment, $names, $remaining);
-        if (is_array($return)) {
-          $matches += $return;
+        if (is_array($return) && !empty($return)) {
+          $matches = array_merge($matches, $return);
         }
         $remaining = 10 - count($matches);
         if ($remaining <= 0) {
Index: privatemsg.test
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/privatemsg/privatemsg.test,v
retrieving revision 1.2.2.1.2.27
diff -u -p -r1.2.2.1.2.27 privatemsg.test
--- privatemsg.test	8 Jul 2010 09:41:57 -0000	1.2.2.1.2.27
+++ privatemsg.test	10 Jul 2010 20:59:14 -0000
@@ -740,6 +740,44 @@ class PrivatemsgTestCase extends DrupalW
   }
 
   /**
+   * Test autocomplete.
+   */
+  function testAutocomplete() {
+    $current = $this->drupalCreateUser(array('read privatemsg', 'write privatemsg'));
+    $user1 = $this->drupalCreateUser(array('read privatemsg', 'write privatemsg'));
+    $user2 = $this->drupalCreateUser(array('read privatemsg', 'write privatemsg'));
+    $user3 = $this->drupalCreateUser(array('read privatemsg', 'write privatemsg'));
+
+    $this->drupalLogin($current);
+
+    // Use specific names to be able to test for specific name combinations.
+    user_save($current, array('name' => 'wathever'));
+    user_save($user1, array('name' => 'aaaa'));
+    user_save($user2, array('name' => 'aaab'));
+    user_save($user3, array('name' => 'bbbb'));
+
+    $json = $this->drupalGet('messages/user-name-autocomplete/aa');
+    $autocomplete = (array)json_decode($json);
+    $this->assertEqual(count($autocomplete), 2, t('Autocomplete object contains two suggestions.'));
+    $this->assertEqual($autocomplete['aaaa, '], 'aaaa');
+    $this->assertEqual($autocomplete['aaab, '], 'aaab');
+
+    $json = $this->drupalGet('messages/user-name-autocomplete/bb');
+    $autocomplete = (array)json_decode($json);
+    $this->assertEqual(count($autocomplete), 1, t('Autocomplete object contains one suggestion.'));
+    $this->assertEqual($autocomplete['bbbb, '], 'bbbb');
+
+    $json = $this->drupalGet('messages/user-name-autocomplete/cc');
+    $autocomplete = (array)json_decode($json);
+    $this->assertEqual(count($autocomplete), 0, t('Autocomplete object contains no suggestions.'));
+
+    $json = $this->drupalGet('messages/user-name-autocomplete/aaaa, a');
+    $autocomplete = (array)json_decode($json);
+    $this->assertEqual(count($autocomplete), 1, t('Autocomplete object contains one suggestion.'));
+    $this->assertEqual($autocomplete['aaaa, aaab, '], 'aaab');
+  }
+
+  /**
    * Implements tearDown().
    */
   function tearDown() {
Index: privatemsg_roles/privatemsg_roles.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/privatemsg/privatemsg_roles/privatemsg_roles.module,v
retrieving revision 1.1.2.2
diff -u -p -r1.1.2.2 privatemsg_roles.module
--- privatemsg_roles/privatemsg_roles.module	7 Jul 2010 09:55:16 -0000	1.1.2.2
+++ privatemsg_roles/privatemsg_roles.module	10 Jul 2010 20:59:14 -0000
@@ -103,10 +103,14 @@ function privatemsg_roles_count_recipien
  * Provides autocomplete suggestions for roles.
  */
 function privatemsg_roles_autocomplete($fragment, $names, $limit) {
-  return (array)_privatemsg_assemble_query(array('autocomplete_roles', 'privatemsg_roles'), $fragment, $names)
+  $result = _privatemsg_assemble_query(array('autocomplete_roles', 'privatemsg_roles'), $fragment, $names)
     ->range(0, $limit)
-    ->execute()
-    ->fetchCol();
+    ->execute();
+  $roles = array();
+  foreach ($result->fetchCol() as $role) {
+    $roles[] = $role . ' ' . t('[role]');
+  }
+  return $roles;
 }
 
 /**
@@ -114,7 +118,7 @@ function privatemsg_roles_autocomplete($
  */
 function privatemsg_roles_privatemsg_name_lookup($string) {
   // Remove optonal role specifier.
-  $string = str_replace('[role]', '', $string);
+  $string = str_replace(t('[role]'), '', $string);
   $role = db_query("SELECT *, rid AS recipient FROM {role} WHERE name = :name", array(':name' => trim($string)))->fetchObject();
   if ($role) {
     $role->type = 'role';
@@ -139,7 +143,7 @@ function privatemsg_roles_sql_autocomple
     ->condition('role.rid', DRUPAL_ANONYMOUS_RID, '<>')
     ->orderBy('role.name', 'ASC');
   if (!empty($names)) {
-    $query->condition('role_name', $names, 'NOT IN');
+    $query->condition('role.name', $names, 'NOT IN');
   }
   return $query;
 }
Index: privatemsg_roles/privatemsg_roles.test
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/privatemsg/privatemsg_roles/privatemsg_roles.test,v
retrieving revision 1.1.2.2
diff -u -p -r1.1.2.2 privatemsg_roles.test
--- privatemsg_roles/privatemsg_roles.test	7 Jul 2010 09:55:16 -0000	1.1.2.2
+++ privatemsg_roles/privatemsg_roles.test	10 Jul 2010 20:59:14 -0000
@@ -22,7 +22,7 @@ class PrivatemsgRolesTestCase extends Dr
     parent::setUp('privatemsg', 'privatemsg_roles', 'privatemsg_filter', 'pm_block_user');
   }
 
-  function dtestSendMessagetoRoleAPI() {
+  function testSendMessagetoRoleAPI() {
     $admin = $this->drupalCreateUser(array('read privatemsg', 'write privatemsg', 'write privatemsg to roles'));
     $user1 = $this->drupalCreateUser(array('read privatemsg', 'write privatemsg'));
     $user2 = $this->drupalCreateUser();
@@ -44,7 +44,7 @@ class PrivatemsgRolesTestCase extends Dr
     $this->assertText($body, t('Thread starter body displayed.'));
   }
 
-  function dtestSendMessagetoRoleCron() {
+  function testSendMessagetoRoleCron() {
     $admin = $this->drupalCreateUser(array('read privatemsg', 'write privatemsg', 'write privatemsg to roles'));
     $user1 = $this->drupalCreateUser(array('read privatemsg', 'write privatemsg'));
 
@@ -97,7 +97,7 @@ class PrivatemsgRolesTestCase extends Dr
     }
   }
 
-  function dtestSendMessagetoRoleBatch() {
+  function testSendMessagetoRoleBatch() {
     $admin = $this->drupalCreateUser(array('read privatemsg', 'write privatemsg', 'write privatemsg to roles'));
     $user1 = $this->drupalCreateUser(array('read privatemsg', 'write privatemsg'));
 
@@ -132,7 +132,7 @@ class PrivatemsgRolesTestCase extends Dr
     }
   }
 
-  function dtestPermission() {
+  function testPermission() {
     $user1 = $this->drupalCreateUser(array('read privatemsg', 'write privatemsg'));
     $user2 = $this->drupalCreateUser(array('read privatemsg', 'write privatemsg'));
     $this->drupalLogin($user1);
@@ -157,9 +157,15 @@ class PrivatemsgRolesTestCase extends Dr
     user_save($user2, $edit);
     $this->drupalLogin($admin);
 
+    // Verify autocomplete feature.
+    $role_name = user_role_load($user1->roles[5])->name;
+    $json = $this->drupalGet('messages/user-name-autocomplete/' . drupal_substr($role_name, 0, 2));
+    $autocomplete = (array)json_decode($json);
+    $this->assertEqual($autocomplete[$role_name . ' [role], '], $role_name);
+
     // Send a message to the role of user 1 and 2.
     $edit = array(
-      'recipient' => user_role_load($user1->roles[5])->name . '[role]',
+      'recipient' => $role_name . '[role]',
       'subject' => $this->randomName(10),
       'body[value]' => $this->randomName(50),
     );
@@ -176,7 +182,7 @@ class PrivatemsgRolesTestCase extends Dr
     $this->assertText($edit['body[value]'], t('Thread starter body displayed.'));
 
     // Make sure that the user does not see the role.
-    $this->assertNoText(t('@role (role)', array('@role' => user_role_load($user1->roles[5])->name)));
+    $this->assertNoText(t('@role (role)', array('@role' => $role_name)));
 
     // Reply to the message, only admin should see this.
     $reply1 = array(
@@ -206,14 +212,14 @@ class PrivatemsgRolesTestCase extends Dr
     $this->drupalGet('messages');
     $this->assertRaw($edit['subject'] . '</a> <span class="marker">new</span>', t('Message is displayed as new'));
     $this->clickLink($edit['subject']);
-    $this->assertText(t('@role (role)', array('@role' => user_role_load($user1->roles[5])->name)));
+    $this->assertText(t('@role (role)', array('@role' => $role_name)));
 
     $this->assertText($edit['body[value]'], t('Thread starter body is displayed'));
     $this->assertNoText($reply1['body[value]'], t('Reply1 is not displayed'));
     $this->assertText($reply2['body[value]'], t('Reply2 is displayed'));
   }
 
-  function dtestSendMessageToRoleBlocked() {
+  function testSendMessageToRoleBlocked() {
     $admin = $this->drupalCreateUser(array('read privatemsg', 'write privatemsg', 'write privatemsg to roles'));
     $user1 = $this->drupalCreateUser(array('read privatemsg', 'write privatemsg'));
     $user2 = $this->drupalCreateUser();
@@ -256,7 +262,7 @@ class PrivatemsgRolesTestCase extends Dr
     $this->assertNoText($edit['subject'], t('Message is not displayed'));
   }
 
-  function dtestNewUser() {
+  function testNewUser() {
     $admin = $this->drupalCreateUser(array('read privatemsg', 'write privatemsg', 'write privatemsg to roles'));
     $user1 = $this->drupalCreateUser(array('read privatemsg', 'write privatemsg'));
 
