| Viewing file:  MakeRequestTest.php (11.88 KB)      -rwxr-xr-x Select action/file-type:
 
  (+) |  (+) |  (+) | Code (+) | Session (+) |  (+) | SDB (+) |  (+) |  (+) |  (+) |  (+) |  (+) | 
 
<?php/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
 
 /**
 * Provides an implementation of RemoteContentFetcher which can be controlled
 * by unit tests and does not actually make any external requests.
 * RemoteContentRequest objects added to this class are added to an internal
 * FIFO queue.  Every time a request is sent to fetchRequest, the next
 * RemoteContentRequest object in the queue is returned as a response.
 * Requests sent to fetchRequest are also stored in a queue for later retrieval
 * and examination.
 */
 class MockMakeRequestFetcher extends RemoteContentFetcher {
 private $responses;
 private $requests;
 
 /**
 * Constructor.
 */
 public function __construct() {
 $this->responses = array();
 $this->requests = array();
 }
 
 /**
 * Adds a response object to an internal queue of responses.
 * @param RemoteContentRequest $response The response to return.
 */
 public function enqueueResponse(RemoteContentRequest $response) {
 $this->responses[] = $response;
 }
 
 /**
 * Returns a request object that was sent to fetchRequest.  If multiple
 * requests have been sent to fetchRequest, they are returned by this
 * method in the order they were requested.
 * @return RemoteContentRequest
 */
 public function dequeueRequest() {
 return array_shift($this->requests);
 }
 
 /**
 * Fakes a content request to a remote server.
 * @param RemoteContentRequest $request  The external request information.
 * @return RemoteContentRequest The next response which was enqueued by
 *     calling enqueueResponse.
 */
 public function fetchRequest(RemoteContentRequest $request) {
 $this->requests[] = $request;
 return array_shift($this->responses);
 }
 
 /**
 * Fakes multiple requests to a remote server.  Calls fetchRequest for
 * each request passed to this method.
 * @param array $requests An array of RemoteContentRequests.
 * @return An array of RemoteContentRequests corresponging to the responses
 *    returned for each of the request inputs.
 */
 public function multiFetchRequest(Array $requests) {
 $responses = array();
 foreach ($requests as $key => $request) {
 $responses[$key] = $this->fetchRequest($request);
 }
 return $responses;
 }
 }
 
 /**
 * Unit tests for the MakeRequest class.
 */
 class MakeRequestTest extends PHPUnit_Framework_TestCase {
 private $fetcher;
 private $makeRequest;
 private $context;
 private $response;
 
 /**
 * Prepares the environment before running a test.
 */
 protected function setUp() {
 parent::setUp();
 $this->fetcher = new MockMakeRequestFetcher();
 $this->makeRequest = new MakeRequest($this->fetcher);
 $this->context = new GadgetContext('GADGET');
 
 $this->response = new RemoteContentRequest('http://www.example.com');
 $this->response->setHttpCode(200);
 $this->response->setResponseContent("Basic response");
 }
 
 /**
 * Cleans up the environment after running a test.
 */
 protected function tearDown() {
 parent::tearDown();
 }
 
 /**
 * Executes a makeRequest call and returns the request object which would
 * have been sent externally (as opposed to the response).
 *
 * @param MakeRequestOptions $params
 * @param RemoteContentRequest $response The response to return for this
 *     request.
 * @return RemoteContentRequest The request object.
 */
 protected function catchRequest(MakeRequestOptions $params, RemoteContentRequest $response) {
 $this->fetcher->enqueueResponse($response);
 $result = $this->makeRequest->fetch($this->context, $params);
 return $this->fetcher->dequeueRequest();
 }
 
 /**
 * Tests that makeRequest calls with an invalid url throw an exception.
 */
 public function testInvalidUrl() {
 try {
 $params = new MakeRequestOptions('invalidurl');
 $this->makeRequest->fetch($params);
 $this->fail("Calling makeRequest with an invalid url should throw an exception.");
 } catch (Exception $ex) { }
 }
 
 /**
 * Tests that normal requests specify a GET to the supplied URL.
 */
 public function testBasicRequest() {
 $params = new MakeRequestOptions('http://www.example.com');
 $params->setNoCache(true);
 
 $request = $this->catchRequest($params, $this->response);
 $this->assertContains($request->getUrl(), 'http://www.example.com');
 $this->assertEquals('GET', $request->getMethod());
 }
 
 /**
 * Tests that signed requests generate appropriate oauth_ and opensocial_
 * parameters.
 */
 public function testSignedRequest() {
 $token = BasicSecurityToken::createFromValues('owner', 'viewer', 'app', 'domain', 'appUrl', '1', 'default');
 $params = new MakeRequestOptions('http://www.example.com');
 $params->setAuthz('SIGNED')
 ->setNoCache(true)
 ->setSecurityTokenString(urlencode(base64_encode($token->toSerialForm())));
 
 $request = $this->catchRequest($params, $this->response);
 
 $this->assertContains('oauth_signature', $request->getUrl());
 $this->assertContains('oauth_signature_method=RSA-SHA1', $request->getUrl());
 $this->assertContains('opensocial_app_url=appUrl', $request->getUrl());
 $this->assertContains('opensocial_viewer_id=viewer', $request->getUrl());
 $this->assertContains('opensocial_owner_id=owner', $request->getUrl());
 $this->assertEquals('GET', $request->getMethod());
 }
 
 /**
 * Tests that setting "sign_viewer" = false does not include viewer
 * information in the request.
 */
 public function testSignedNoViewerRequest() {
 $token = BasicSecurityToken::createFromValues('owner', 'viewer', 'app', 'domain', 'appUrl', '1', 'default');
 $params = new MakeRequestOptions('http://www.example.com');
 $params->setAuthz('SIGNED')
 ->setNoCache(true)
 ->setSignViewer(false)
 ->setSecurityTokenString(urlencode(base64_encode($token->toSerialForm())));
 
 $request = $this->catchRequest($params, $this->response);
 
 $this->assertContains('oauth_signature', $request->getUrl());
 $this->assertNotContains('opensocial_viewer_id=viewer', $request->getUrl());
 $this->assertContains('opensocial_owner_id=owner', $request->getUrl());
 }
 
 /**
 * Tests that setting "format" = "FEED" parses an atom feed into a JSON
 * structure.
 */
 public function testFeedRequest() {
 $params = new MakeRequestOptions('http://www.example.com');
 $params->setResponseFormat('FEED')
 ->setNoCache(true)
 ->setNumEntries(2);
 
 $sampleAtomPath = realpath(dirname(__FILE__) . "/../misc/sampleAtomFeed.xml");
 $sampleAtom = file_get_contents($sampleAtomPath);
 $this->response->setResponseContent($sampleAtom);
 $this->fetcher->enqueueResponse($this->response);
 $result = $this->makeRequest->fetch($this->context, $params);
 $feedJson = json_decode($result->getResponseContent(), true);
 
 $this->assertArrayHasKey('Entry', $feedJson);
 $this->assertEquals(2, count($feedJson['Entry']));
 $this->assertArrayHasKey('Title', $feedJson['Entry'][0]);
 $this->assertEquals("Atom-Powered Robots Run Amok", $feedJson['Entry'][0]['Title']);
 }
 
 /**
 * Tests that setting request headers are passed in the outgoing request.
 */
 public function testRequestHeaders(){
 $params = new MakeRequestOptions('http://www.example.com');
 $params->setRequestHeaders(array(
 "Content-Type" => "application/json",
 "Accept-Language" => "en-us"
 ));
 $params->setNoCache(true);
 
 $request = $this->catchRequest($params, $this->response);
 $this->assertTrue($request->hasHeaders());
 $this->assertEquals('application/json', $request->getHeader('Content-Type'));
 $this->assertEquals('en-us', $request->getHeader('Accept-Language'));
 }
 
 /**
 * Tests that setting invalid request headers are not passed in the outgoing
 * request.
 */
 public function testInvalidRequestHeaders(){
 $params = new MakeRequestOptions('http://www.example.com');
 $params->setRequestHeaders(array(
 "Content-Type" => "application/json",
 "Accept-Language" => "en-us",
 "Host" => "http://www.evil.com",
 "host" => "http://www.evil.com",
 "HOST" => "http://www.evil.com",
 "Accept" => "blah",
 "Accept-Encoding" => "blah"
 ));
 $params->setNoCache(true);
 
 $request = $this->catchRequest($params, $this->response);
 $this->assertTrue($request->hasHeaders());
 $this->assertEquals('application/json', $request->getHeader('Content-Type'));
 $this->assertEquals('en-us', $request->getHeader('Accept-Language'));
 
 $this->assertNull($request->getHeader('Host'));
 $this->assertNull($request->getHeader('Accept'));
 $this->assertNull($request->getHeader('Accept-Encoding'));
 }
 
 /**
 * Tests that setting request headers in a form urlencoded way are passed in the outgoing request.
 */
 public function testFormEncodedRequestHeaders(){
 $params = new MakeRequestOptions('http://www.example.com');
 $params->setFormEncodedRequestHeaders("Content-Type=application%2Fx-www-form-urlencoded&Accept-Language=en-us");
 $params->setNoCache(true);
 
 $request = $this->catchRequest($params, $this->response);
 $this->assertTrue($request->hasHeaders());
 $this->assertEquals('application/x-www-form-urlencoded', $request->getHeader('Content-Type'));
 }
 
 public function testResponseHeaders() {
 $params = new MakeRequestOptions('http://www.example.com');
 $params->setNoCache(true);
 
 $headers = array(
 'Content-Type' => 'text/plain'
 );
 $this->response->setResponseHeaders($headers);
 $this->fetcher->enqueueResponse($this->response);
 
 $result = $this->makeRequest->fetch($this->context, $params);
 $response_headers = $result->getResponseHeaders();
 
 $this->assertArrayHasKey('Content-Type', $response_headers);
 $this->assertEquals('text/plain', $response_headers['Content-Type']);
 }
 
 public function testCleanResponseHeaders() {
 $response_headers = array(
 'Content-Type' => 'text/plain',
 'Set-Cookie' => 'blah',
 'set-cookie' => 'blah',
 'SET-COOKIE' => 'blah',
 'sEt-cOoKiE' => 'blah',
 'Accept-Ranges' => 'blah',
 'Vary' => 'blah',
 'Expires' => 'blah',
 'Date' => 'blah',
 'Pragma' => 'blah',
 'Cache-Control' => 'blah',
 'Transfer-Encoding' => 'blah',
 'WWW-Authenticate' => 'blah'
 );
 
 $cleaned_headers = $this->makeRequest->cleanResponseHeaders($response_headers);
 
 $this->assertArrayHasKey('Content-Type', $cleaned_headers);
 $this->assertEquals('text/plain', $cleaned_headers['Content-Type']);
 $this->assertArrayNotHasKey('Set-Cookie', $cleaned_headers);
 $this->assertArrayNotHasKey('set-cookie', $cleaned_headers);
 $this->assertArrayNotHasKey('SET-COOKIE', $cleaned_headers);
 $this->assertArrayNotHasKey('sEt-cOoKiE', $cleaned_headers);
 $this->assertArrayNotHasKey('Accept-Ranges', $cleaned_headers);
 $this->assertArrayNotHasKey('Vary', $cleaned_headers);
 $this->assertArrayNotHasKey('Expires', $cleaned_headers);
 $this->assertArrayNotHasKey('Date', $cleaned_headers);
 $this->assertArrayNotHasKey('Pragma', $cleaned_headers);
 $this->assertArrayNotHasKey('Cache-Control', $cleaned_headers);
 $this->assertArrayNotHasKey('Transfer-Encoding', $cleaned_headers);
 $this->assertArrayNotHasKey('WWW-Authenticate', $cleaned_headers);
 }
 }
 
 
 |