Jelajahi Sumber

Updated userTimeline() API call to accept additional parameters currently acceptable by Twitter API and to ignore invalid parameters phased out in Apr 2009. Added unit tests. Fixes ZF-7781

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@18231 44c647ce-9c0f-0410-b52a-842ac1e357ba
padraic 16 tahun lalu
induk
melakukan
870d30d219
2 mengubah file dengan 85 tambahan dan 22 penghapusan
  1. 28 21
      library/Zend/Service/Twitter.php
  2. 57 1
      tests/Zend/Service/TwitterTest.php

+ 28 - 21
library/Zend/Service/Twitter.php

@@ -198,6 +198,7 @@ class Zend_Service_Twitter extends Zend_Rest_Client
      * Set date header
      * Set date header
      *
      *
      * @param  int|string $value
      * @param  int|string $value
+     * @deprecated Not supported by Twitter since April 08, 2009
      * @return void
      * @return void
      */
      */
     protected function _setDate ($value)
     protected function _setDate ($value)
@@ -228,7 +229,6 @@ class Zend_Service_Twitter extends Zend_Rest_Client
      * $params may include one or more of the following keys
      * $params may include one or more of the following keys
      * - id: ID of a friend whose timeline you wish to receive
      * - id: ID of a friend whose timeline you wish to receive
      * - count: how many statuses to return
      * - count: how many statuses to return
-     * - since: return results only after the date specified
      * - since_id: return results only after the specific tweet
      * - since_id: return results only after the specific tweet
      * - page: return page X of results
      * - page: return page X of results
      *
      *
@@ -255,9 +255,6 @@ class Zend_Service_Twitter extends Zend_Rest_Client
                 case 'since_id':
                 case 'since_id':
                     $_params['since_id'] = $this->_validInteger($value);
                     $_params['since_id'] = $this->_validInteger($value);
                     break;
                     break;
-                case 'since':
-                    $this->_setDate($value);
-                    break;
                 case 'page':
                 case 'page':
                     $_params['page'] = (int) $value;
                     $_params['page'] = (int) $value;
                     break;
                     break;
@@ -274,9 +271,12 @@ class Zend_Service_Twitter extends Zend_Rest_Client
      *
      *
      * $params may include one or more of the following keys
      * $params may include one or more of the following keys
      * - id: ID of a friend whose timeline you wish to receive
      * - id: ID of a friend whose timeline you wish to receive
-     * - since: return results only after the date specified
+     * - since_id: return results only after the tweet id specified
      * - page: return page X of results
      * - page: return page X of results
      * - count: how many statuses to return
      * - count: how many statuses to return
+     * - max_id: returns only statuses with an ID less than or equal to the specified ID
+     * - user_id: specfies the ID of the user for whom to return the user_timeline
+     * - screen_name: specfies the screen name of the user for whom to return the user_timeline
      *
      *
      * @throws Zend_Http_Client_Exception if HTTP request fails or times out
      * @throws Zend_Http_Client_Exception if HTTP request fails or times out
      * @return Zend_Rest_Client_Result
      * @return Zend_Rest_Client_Result
@@ -304,12 +304,16 @@ class Zend_Service_Twitter extends Zend_Rest_Client
                     $_params['count'] = $count;
                     $_params['count'] = $count;
                     break;
                     break;
                 case 'user_id':
                 case 'user_id':
+                    $_params['user_id'] = $this->_validInteger($value);
                     break;
                     break;
                 case 'screen_name':
                 case 'screen_name':
+                    $_params['screen_name'] = $this->_validateScreenName($value);
                     break;
                     break;
-                case 'since_id':
+                case 'since_id':
+                    $_params['since_id'] = $this->_validInteger($value);
                     break;
                     break;
                 case 'max_id':
                 case 'max_id':
+                    $_params['max_id'] = $this->_validInteger($value);
                     break;
                     break;
                 default:
                 default:
                     break;
                     break;
@@ -366,7 +370,6 @@ class Zend_Service_Twitter extends Zend_Rest_Client
      * Get status replies
      * Get status replies
      *
      *
      * $params may include one or more of the following keys
      * $params may include one or more of the following keys
-     * - since: return results only after the date specified
      * - since_id: return results only after the specified tweet id
      * - since_id: return results only after the specified tweet id
      * - page: return page X of results
      * - page: return page X of results
      *
      *
@@ -380,9 +383,6 @@ class Zend_Service_Twitter extends Zend_Rest_Client
         $_params = array();
         $_params = array();
         foreach ($params as $key => $value) {
         foreach ($params as $key => $value) {
             switch (strtolower($key)) {
             switch (strtolower($key)) {
-                case 'since':
-                    $this->_setDate($value);
-                    break;
                 case 'since_id':
                 case 'since_id':
                     $_params['since_id'] = $this->_validInteger($value);
                     $_params['since_id'] = $this->_validInteger($value);
                     break;
                     break;
@@ -427,9 +427,6 @@ class Zend_Service_Twitter extends Zend_Rest_Client
                 case 'id':
                 case 'id':
                     $path .= '/' . $this->_validInteger($value);
                     $path .= '/' . $this->_validInteger($value);
                     break;
                     break;
-                case 'since':
-                    $this->_setDate($value);
-                    break;
                 case 'page':
                 case 'page':
                     $_params['page'] = (int) $value;
                     $_params['page'] = (int) $value;
                     break;
                     break;
@@ -489,7 +486,6 @@ class Zend_Service_Twitter extends Zend_Rest_Client
      * Retrieve direct messages for the current user
      * Retrieve direct messages for the current user
      *
      *
      * $params may include one or more of the following keys
      * $params may include one or more of the following keys
-     * - since: return results only after the date specified
      * - since_id: return statuses only greater than the one specified
      * - since_id: return statuses only greater than the one specified
      * - page: return page X of results
      * - page: return page X of results
      *
      *
@@ -504,9 +500,6 @@ class Zend_Service_Twitter extends Zend_Rest_Client
         $_params = array();
         $_params = array();
         foreach ($params as $key => $value) {
         foreach ($params as $key => $value) {
             switch (strtolower($key)) {
             switch (strtolower($key)) {
-                case 'since':
-                    $this->_setDate($value);
-                    break;
                 case 'since_id':
                 case 'since_id':
                     $_params['since_id'] = $this->_validInteger($value);
                     $_params['since_id'] = $this->_validInteger($value);
                     break;
                     break;
@@ -524,7 +517,6 @@ class Zend_Service_Twitter extends Zend_Rest_Client
      * Retrieve list of direct messages sent by current user
      * Retrieve list of direct messages sent by current user
      *
      *
      * $params may include one or more of the following keys
      * $params may include one or more of the following keys
-     * - since: return results only after the date specified
      * - since_id: return statuses only greater than the one specified
      * - since_id: return statuses only greater than the one specified
      * - page: return page X of results
      * - page: return page X of results
      *
      *
@@ -539,9 +531,6 @@ class Zend_Service_Twitter extends Zend_Rest_Client
         $_params = array();
         $_params = array();
         foreach ($params as $key => $value) {
         foreach ($params as $key => $value) {
             switch (strtolower($key)) {
             switch (strtolower($key)) {
-                case 'since':
-                    $this->_setDate($value);
-                    break;
                 case 'since_id':
                 case 'since_id':
                     $_params['since_id'] = $this->_validInteger($value);
                     $_params['since_id'] = $this->_validInteger($value);
                     break;
                     break;
@@ -743,5 +732,23 @@ class Zend_Service_Twitter extends Zend_Rest_Client
             return $int;
             return $int;
         }
         }
         return 0;
         return 0;
+    }
+
+    /**
+     * Validate a screen name using Twitter rules
+     *
+     * @param string $name
+     * @throws Zend_Service_Twitter_Exception
+     * @return string
+     */
+    protected function _validateScreenName($name)
+    {
+        if (!preg_match('/^[a-z0-9_]{0,20}$/', $name)) {
+            require_once 'Zend/Service/Twitter/Exception.php';
+            throw new Zend_Service_Twitter_Exception('Screen name, "'
+            . $name . '" should only contain alphanumeric characters and'
+            . ' underscores, and not exceed 15 characters.');
+        }
+        return $name;
     }
     }
 }
 }

+ 57 - 1
tests/Zend/Service/TwitterTest.php

@@ -83,6 +83,62 @@ class Zend_Service_TwitterTest extends PHPUnit_Framework_TestCase
     }
     }
 
 
     /**
     /**
+     * @issue ZF-7781
+     */
+    public function testValidationOfScreenNames_NoError()
+    {
+        $response = $this->twitter->status->userTimeline(array('screen_name'=>'abc123_abc123_abc123'));
+    }
+
+    /**
+     * @issue ZF-7781
+     */
+    public function testValidationOfScreenNames_InvalidChar()
+    {
+        $this->setExpectedException('Zend_Service_Twitter_Exception');
+        $response = $this->twitter->status->userTimeline(array('screen_name'=>'abc.def'));
+    }
+
+    /**
+     * @issue ZF-7781
+     */
+    public function testValidationOfScreenNames_InvalidLength()
+    {
+        $this->setExpectedException('Zend_Service_Twitter_Exception');
+        $response = $this->twitter->status->userTimeline(array('screen_name'=>'abcdef_abc123_abc123x'));
+    }
+
+    /**
+     * @issue ZF-7781
+     */
+    public function testStatusUserTimelineConstructsExpectedGetUriAndOmitsInvalidParams()
+    {
+        $client = new Zend_Http_Client;
+        $client->setAdapter(new Zend_Http_Client_Adapter_Test);
+        Zend_Service_Twitter::setHttpClient($client);
+        $twitter = new Zend_Service_Twitter(
+            TESTS_ZEND_SERVICE_TWITTER_USER,
+            TESTS_ZEND_SERVICE_TWITTER_PASS
+        );
+        try {
+            $twitter->status->userTimeline(array(
+                'id' => '123',
+                'since' => '+2 days', /* invalid param since Apr 2009 */
+                'page' => '1',
+                'count' => '123',
+                'user_id' => '123',
+                'since_id' => '123',
+                'max_id' => '123',
+                'screen_name'=>'abcdef'
+            ));
+        } catch (Zend_Rest_Client_Result_Exception $e) {}
+        $this->assertContains(
+            'GET /statuses/user_timeline/123.xml?page=1&count=123&user_id=123&since_id=123&max_id=123&screen_name=abcdef',
+            $client->getLastRequest()
+        );
+    }
+
+    /**
      * @return void
      * @return void
      */
      */
     public function testConstructorShouldSetUsernameAndPassword()
     public function testConstructorShouldSetUsernameAndPassword()
@@ -573,7 +629,7 @@ class Zend_Service_TwitterTest extends PHPUnit_Framework_TestCase
 
 
     public function testStatusRepliesReturnsResults()
     public function testStatusRepliesReturnsResults()
     {
     {
-        $response = $this->twitter->status->replies(array('since' => '-800 days', 'page' => 1, 'since_id' => 10000, 'invalid_option' => 'doh'));
+        $response = $this->twitter->status->replies(array('page' => 1, 'since_id' => 10000, 'invalid_option' => 'doh'));
         $this->assertTrue($response instanceof Zend_Rest_Client_Result);
         $this->assertTrue($response instanceof Zend_Rest_Client_Result);
         $httpClient    = Zend_Service_Twitter::getHttpClient();
         $httpClient    = Zend_Service_Twitter::getHttpClient();
         $httpRequest   = $httpClient->getLastRequest();
         $httpRequest   = $httpClient->getLastRequest();