Sfoglia il codice sorgente

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 anni fa
parent
commit
870d30d219
2 ha cambiato i file con 85 aggiunte e 22 eliminazioni
  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
      *
      * @param  int|string $value
+     * @deprecated Not supported by Twitter since April 08, 2009
      * @return void
      */
     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
      * - id: ID of a friend whose timeline you wish to receive
      * - count: how many statuses to return
-     * - since: return results only after the date specified
      * - since_id: return results only after the specific tweet
      * - page: return page X of results
      *
@@ -255,9 +255,6 @@ class Zend_Service_Twitter extends Zend_Rest_Client
                 case 'since_id':
                     $_params['since_id'] = $this->_validInteger($value);
                     break;
-                case 'since':
-                    $this->_setDate($value);
-                    break;
                 case 'page':
                     $_params['page'] = (int) $value;
                     break;
@@ -274,9 +271,12 @@ class Zend_Service_Twitter extends Zend_Rest_Client
      *
      * $params may include one or more of the following keys
      * - 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
      * - 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
      * @return Zend_Rest_Client_Result
@@ -304,12 +304,16 @@ class Zend_Service_Twitter extends Zend_Rest_Client
                     $_params['count'] = $count;
                     break;
                 case 'user_id':
+                    $_params['user_id'] = $this->_validInteger($value);
                     break;
                 case 'screen_name':
+                    $_params['screen_name'] = $this->_validateScreenName($value);
                     break;
-                case 'since_id':
+                case 'since_id':
+                    $_params['since_id'] = $this->_validInteger($value);
                     break;
                 case 'max_id':
+                    $_params['max_id'] = $this->_validInteger($value);
                     break;
                 default:
                     break;
@@ -366,7 +370,6 @@ class Zend_Service_Twitter extends Zend_Rest_Client
      * Get status replies
      *
      * $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
      * - page: return page X of results
      *
@@ -380,9 +383,6 @@ class Zend_Service_Twitter extends Zend_Rest_Client
         $_params = array();
         foreach ($params as $key => $value) {
             switch (strtolower($key)) {
-                case 'since':
-                    $this->_setDate($value);
-                    break;
                 case 'since_id':
                     $_params['since_id'] = $this->_validInteger($value);
                     break;
@@ -427,9 +427,6 @@ class Zend_Service_Twitter extends Zend_Rest_Client
                 case 'id':
                     $path .= '/' . $this->_validInteger($value);
                     break;
-                case 'since':
-                    $this->_setDate($value);
-                    break;
                 case 'page':
                     $_params['page'] = (int) $value;
                     break;
@@ -489,7 +486,6 @@ class Zend_Service_Twitter extends Zend_Rest_Client
      * Retrieve direct messages for the current user
      *
      * $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
      * - page: return page X of results
      *
@@ -504,9 +500,6 @@ class Zend_Service_Twitter extends Zend_Rest_Client
         $_params = array();
         foreach ($params as $key => $value) {
             switch (strtolower($key)) {
-                case 'since':
-                    $this->_setDate($value);
-                    break;
                 case 'since_id':
                     $_params['since_id'] = $this->_validInteger($value);
                     break;
@@ -524,7 +517,6 @@ class Zend_Service_Twitter extends Zend_Rest_Client
      * Retrieve list of direct messages sent by current user
      *
      * $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
      * - page: return page X of results
      *
@@ -539,9 +531,6 @@ class Zend_Service_Twitter extends Zend_Rest_Client
         $_params = array();
         foreach ($params as $key => $value) {
             switch (strtolower($key)) {
-                case 'since':
-                    $this->_setDate($value);
-                    break;
                 case 'since_id':
                     $_params['since_id'] = $this->_validInteger($value);
                     break;
@@ -743,5 +732,23 @@ class Zend_Service_Twitter extends Zend_Rest_Client
             return $int;
         }
         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
      */
     public function testConstructorShouldSetUsernameAndPassword()
@@ -573,7 +629,7 @@ class Zend_Service_TwitterTest extends PHPUnit_Framework_TestCase
 
     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);
         $httpClient    = Zend_Service_Twitter::getHttpClient();
         $httpRequest   = $httpClient->getLastRequest();