From d7ff66eab4f7845783915d8129225c7a9fd09de6 Mon Sep 17 00:00:00 2001
From: capuleto <capuleto@2511836.no-reply.drupal.org>
Date: Fri, 13 Jun 2014 21:19:12 +0200
Subject: [PATCH] Added last uid to subscribe_options array

---
 message_subscribe.module | 11 ++++++++++-
 message_subscribe.test   | 45 ++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 54 insertions(+), 2 deletions(-)

diff --git a/message_subscribe.module b/message_subscribe.module
index da35358..1596a02 100755
--- a/message_subscribe.module
+++ b/message_subscribe.module
@@ -123,7 +123,16 @@ function message_subscribe_send_message($entity_type, $entity, Message $message,
   if ($subscribe_options['uids']) {
     // We got a list of user IDs directly from the implementing module,
     // However we need to adhere to the range.
-    $uids = $subscribe_options['range'] ? array_slice($subscribe_options['uids'], 0, $subscribe_options['range'], TRUE) : $subscribe_options['uids'];
+    // If 'last uid' is provided, we need to start from next 'uid' key in array.
+    if (!empty($subscribe_options['last uid'])) {
+      $index = array_search($subscribe_options['last uid'], array_keys($subscribe_options['uids'])) + 1;
+    }
+    // Otherwise we start from the very beginning.
+    else {
+      $index = 0;
+    }
+
+    $uids = $subscribe_options['range'] ? array_slice($subscribe_options['uids'], $index, $subscribe_options['range'], TRUE) : $subscribe_options['uids'];
   }
 
   if (empty($uids) && !$uids = message_subscribe_get_subscribers($entity_type, $entity, $message, $subscribe_options, $context)) {
diff --git a/message_subscribe.test b/message_subscribe.test
index dc04f6a..09a2347 100644
--- a/message_subscribe.test
+++ b/message_subscribe.test
@@ -471,4 +471,47 @@ class MessageSubscribeQueueTest extends DrupalWebTestCase {
     $this->cronRun();
     $this->assertEqual($queue->numberOfItems(), 0, 'Message item 2 processed by cron.');
   }
-}
+
+  /**
+   * Test that if we get a list of user IDs directly from
+   * the implementing module, the messages are sent respecting
+   * the range value.
+   */
+  function testProvidedUserIdsAreSplitAccordingToRangeValue() {
+
+    $user1 = $this->drupalCreateUser();
+    $user2 = $this->drupalCreateUser();
+    $user3 = $this->drupalCreateUser();
+
+    $message = message_create('foo', array());
+
+    $subscribe_options = array(
+      'uids' => array(
+        $user1->uid => array('notifiers' => array('email')),
+        $user2->uid => array('notifiers' => array('email')),
+        $user3->uid => array('notifiers' => array('email')),
+      ),
+      'skip context' => TRUE,
+      'range' => 1,
+      'last uid' => $user1->uid,
+    );
+
+    message_subscribe_send_message('node', $this->node, $message, array(), $subscribe_options);
+
+    // Run cron.
+    $this->cronRun();
+
+    $captured_emails = variable_get('drupal_test_email_collector', array());
+    $this->assertEqual(2, count($captured_emails), 'The amount of recipients is the same as amount of emails captured according to "subscribe_options".');
+
+    $recipients = array();
+    foreach ($captured_emails as $captured_email) {
+      $recipients[] = $captured_email['to'];
+    }
+
+    $this->assertFalse(in_array($user1->mail, $recipients), 'User 1 mail is not in the recipient list as it was defined as "last uid".');
+    $this->assertTrue(in_array($user2->mail, $recipients), 'User 2 mail is in the recipient list.');
+    $this->assertTrue(in_array($user3->mail, $recipients), 'User 3 mail is in the recipient list.');
+  }
+
+}
\ No newline at end of file
-- 
1.7.12.4 (Apple Git-37)

