wellrested/test/tests/unit/Message/ServerRequestTest.php

415 lines
13 KiB
PHP

<?php
namespace WellRESTed\Test\Unit\Message;
use WellRESTed\Message\ServerRequest;
/**
* @uses WellRESTed\Message\ServerRequest
* @uses WellRESTed\Message\Request
* @uses WellRESTed\Message\Message
* @uses WellRESTed\Message\HeaderCollection
* @uses WellRESTed\Stream\Stream
*/
class ServerRequestTest extends \PHPUnit_Framework_TestCase
{
/**
* @covers WellRESTed\Message\ServerRequest::__construct
*/
public function testCreatesInstance()
{
$request = new ServerRequest();
$this->assertNotNull($request);
}
/**
* @covers WellRESTed\Message\ServerRequest::getServerRequest
* @covers WellRESTed\Message\ServerRequest::getServerRequestHeaders
* @covers WellRESTed\Message\ServerRequest::readFromServerRequest
* @covers WellRESTed\Message\ServerRequest::getStreamForBody
* @preserveGlobalState disabled
*/
public function testGetServerRequestReadsFromRequest()
{
$_SERVER = [
"HTTP_HOST" => "localhost",
"HTTP_ACCEPT" => "application/json",
"HTTP_CONTENT_TYPE" => "application/x-www-form-urlencoded",
"QUERY_STRING" => "guinea_pig=Claude&hamster=Fizzgig"
];
$_COOKIE = [
"cat" => "Molly"
];
$_FILES = [
"file" => [
"name" => "MyFile.jpg",
"type" => "image/jpeg",
"tmp_name" => "/tmp/php/php6hst32",
"error" => "UPLOAD_ERR_OK",
"size" => 98174
]
];
$_POST = [
"dog" => "Bear"
];
$attributes = ["guinea_pig" => "Claude"];
$request = ServerRequest::getServerRequest($attributes);
$this->assertNotNull($request);
return $request;
}
/**
* @covers WellRESTed\Message\ServerRequest::getServerParams
* @depends testGetServerRequestReadsFromRequest
*/
public function testServerRequestProvidesServerParams($request)
{
/** @var ServerRequest $request */
$this->assertEquals("localhost", $request->getServerParams()["HTTP_HOST"]);
}
/**
* @covers WellRESTed\Message\ServerRequest::getCookieParams
* @depends testGetServerRequestReadsFromRequest
*/
public function testServerRequestProvidesCookieParams($request)
{
/** @var ServerRequest $request */
$this->assertEquals("Molly", $request->getCookieParams()["cat"]);
}
/**
* @covers WellRESTed\Message\ServerRequest::getQueryParams
* @depends testGetServerRequestReadsFromRequest
*/
public function testServerRequestProvidesQueryParams($request)
{
/** @var ServerRequest $request */
$this->assertEquals("Claude", $request->getQueryParams()["guinea_pig"]);
}
/**
* @covers WellRESTed\Message\ServerRequest::getFileParams
* @depends testGetServerRequestReadsFromRequest
*/
public function testServerRequestProvidesFilesParams($request)
{
/** @var ServerRequest $request */
$this->assertEquals("MyFile.jpg", $request->getFileParams()["file"]["name"]);
}
/**
* @covers WellRESTed\Message\ServerRequest::getHeader
* @depends testGetServerRequestReadsFromRequest
*/
public function testServerRequestProvidesHeaders($request)
{
/** @var ServerRequest $request */
$this->assertEquals(["application/json"], $request->getHeader("Accept"));
}
public function testServerRequestProvidesBody()
{
$body = $this->prophesize('Psr\Http\Message\StreamInterface');
MockServerRequestTest::$bodyStream = $body->reveal();
$request = MockServerRequestTest::getServerRequest();
$this->assertSame($body->reveal(), $request->getBody());
}
/**
* @covers WellRESTed\Message\ServerRequest::getAttribute
* @depends testGetServerRequestReadsFromRequest
*/
public function testServerRequestProvidesAttributesIfPassed($request)
{
/** @var ServerRequest $request */
$this->assertEquals("Claude", $request->getAttribute("guinea_pig"));
}
/**
* @covers WellRESTed\Message\ServerRequest::withCookieParams
* @depends testGetServerRequestReadsFromRequest
*/
public function testWithCookieParamsCreatesNewInstance($request1)
{
/** @var ServerRequest $request1 */
$request2 = $request1->withCookieParams([
"cat" => "Oscar"
]);
$this->assertEquals("Molly", $request1->getCookieParams()["cat"]);
$this->assertEquals("Oscar", $request2->getCookieParams()["cat"]);
}
/**
* @covers WellRESTed\Message\ServerRequest::withQueryParams
* @depends testGetServerRequestReadsFromRequest
*/
public function testWithQueryParamsCreatesNewInstance($request1)
{
/** @var ServerRequest $request1 */
$request2 = $request1->withQueryParams([
"guinea_pig" => "Clyde"
]);
$this->assertEquals("Claude", $request1->getQueryParams()["guinea_pig"]);
$this->assertEquals("Clyde", $request2->getQueryParams()["guinea_pig"]);
}
/**
* @covers WellRESTed\Message\ServerRequest::withParsedBody
* @depends testGetServerRequestReadsFromRequest
*/
public function testWithParsedBodyCreatesNewInstance($request1)
{
/** @var ServerRequest $request1 */
$body1 = $request1->getParsedBody();
$request2 = $request1->withParsedBody([
"guinea_pig" => "Clyde"
]);
$body2 = $request2->getParsedBody();
$this->assertEquals("Bear", $body1["dog"]);
$this->assertEquals("Clyde", $body2["guinea_pig"]);
}
/**
* @covers WellRESTed\Message\ServerRequest::getServerRequest
* @covers WellRESTed\Message\ServerRequest::getParsedBody
* @preserveGlobalState disabled
* @dataProvider formContentTypeProvider
*/
public function testGetServerRequestParsesFormBody($contentType)
{
$_SERVER = [
"HTTP_HOST" => "localhost",
"HTTP_CONTENT_TYPE" => $contentType,
];
$_COOKIE = [];
$_FILES = [];
$_POST = [
"dog" => "Bear"
];
$request = ServerRequest::getServerRequest();
$this->assertEquals("Bear", $request->getParsedBody()["dog"]);
}
public function formContentTypeProvider()
{
return [
["application/x-www-form-urlencoded"],
["multipart/form-data"]
];
}
/**
* @covers WellRESTed\Message\ServerRequest::__clone
*/
public function testCloneMakesDeepCopiesOfParsedBody()
{
$body = (object) [
"cat" => "Dog"
];
$request1 = new ServerRequest();
$request1 = $request1->withParsedBody($body);
$request2 = $request1->withHeader("X-extra", "hello world");
$this->assertEquals($request1->getParsedBody(), $request2->getParsedBody());
$this->assertNotSame($request1->getParsedBody(), $request2->getParsedBody());
}
/**
* @covers WellRESTed\Message\ServerRequest::withAttribute
* @covers WellRESTed\Message\ServerRequest::getAttribute
*/
public function testWithAttributeCreatesNewInstance()
{
$request = new ServerRequest();
$request = $request->withAttribute("cat", "Molly");
$this->assertEquals("Molly", $request->getAttribute("cat"));
}
/**
* @covers WellRESTed\Message\ServerRequest::withAttribute
*/
public function testWithAttributePreserversOtherAttributes()
{
$request = new ServerRequest();
$request = $request->withAttribute("cat", "Molly");
$request = $request->withAttribute("dog", "Bear");
$this->assertEquals("Molly", $request->getAttribute("cat"));
$this->assertEquals("Bear", $request->getAttribute("dog"));
}
/**
* @covers WellRESTed\Message\ServerRequest::getAttribute
*/
public function testGetAttributeReturnsDefaultIfNotSet()
{
$request = new ServerRequest();
$this->assertEquals("Oscar", $request->getAttribute("cat", "Oscar"));
}
/**
* @covers WellRESTed\Message\ServerRequest::withoutAttribute
*/
public function testWithoutAttributeCreatesNewInstance()
{
$request = new ServerRequest();
$request = $request->withAttribute("cat", "Molly");
$request = $request->withoutAttribute("cat");
$this->assertEquals("Oscar", $request->getAttribute("cat", "Oscar"));
}
/**
* @covers WellRESTed\Message\ServerRequest::withoutAttribute
*/
public function testWithoutAttributePreservesOtherAttributes()
{
$request = new ServerRequest();
$request = $request->withAttribute("cat", "Molly");
$request = $request->withAttribute("dog", "Bear");
$request = $request->withoutAttribute("cat");
$this->assertEquals("Bear", $request->getAttribute("dog"));
$this->assertEquals("Oscar", $request->getAttribute("cat", "Oscar"));
}
/**
* @covers WellRESTed\Message\ServerRequest::getAttributes
*/
public function testGetAttributesReturnsAllAttributes()
{
$request = new ServerRequest();
$request = $request->withAttribute("cat", "Molly");
$request = $request->withAttribute("dog", "Bear");
$attributes = $request->getAttributes();
$this->assertEquals("Molly", $attributes["cat"]);
$this->assertEquals("Bear", $attributes["dog"]);
}
/**
* @covers WellRESTed\Message\ServerRequest::getServerRequestHeaders
* @runInSeparateProcess
* @preserveGlobalState disabled
*/
public function testReadsApacheRequestHeaders()
{
// This file adds a dummy apache_request_headers in the global namespace.
require_once(__DIR__ . "/../../../src/apache_request_headers.php");
$_SERVER = [
"HTTP_HOST" => "localhost",
"HTTP_ACCEPT" => "application/json",
"QUERY_STRING" => "guinea_pig=Claude&hamster=Fizzgig"
];
$_COOKIE = [
"cat" => "Molly"
];
$_FILES = [
"file" => [
"name" => "MyFile.jpg",
"type" => "image/jpeg",
"tmp_name" => "/tmp/php/php6hst32",
"error" => "UPLOAD_ERR_OK",
"size" => 98174
]
];
$_POST = [
"dog" => "Bear"
];
$request = ServerRequest::getServerRequest();
$headers = $request->getHeaders();
$this->assertNotNull($headers);
}
/**
* @covers WellRESTed\Message\ServerRequest::readFromServerRequest
* @preserveGlobalState disabled
* @dataProvider protocolVersionProvider
*/
public function testReadsProtocolVersionFromFromRequest($expectedProtocol, $serverProtocol)
{
$_SERVER = [
"HTTP_HOST" => "localhost",
"SERVER_PROTOCOL" => $serverProtocol,
"REQUEST_METHOD" => "GET"
];
$request = ServerRequest::getServerRequest();
$this->assertEquals($expectedProtocol, $request->getProtocolVersion());
}
public function protocolVersionProvider()
{
return [
["1.1", "HTTP/1.1"],
["1.0", "HTTP/1.0"],
["1.1", null],
["1.1", "INVALID"]
];
}
/**
* @covers WellRESTed\Message\ServerRequest::readFromServerRequest
* @preserveGlobalState disabled
* @dataProvider methodProvider
*/
public function testReadsMethodFromFromRequest($exectedMethod, $serverMethod)
{
$_SERVER = [
"HTTP_HOST" => "localhost",
"REQUEST_METHOD" => $serverMethod
];
$request = ServerRequest::getServerRequest();
$this->assertEquals($exectedMethod, $request->getMethod());
}
public function methodProvider()
{
return [
["GET", "GET"],
["POST", "POST"],
["DELETE", "DELETE"],
["PUT", "PUT"],
["OPTIONS", "OPTIONS"],
["GET", null]
];
}
/**
* @covers WellRESTed\Message\ServerRequest::readFromServerRequest
* @preserveGlobalState disabled
* @dataProvider requestTargetProvider
*/
public function testReadsRequestTargetFromServer($exectedRequestTarget, $serverRequestUri)
{
$_SERVER = [
"HTTP_HOST" => "localhost",
"REQUEST_URI" => $serverRequestUri
];
$request = ServerRequest::getServerRequest();
$this->assertEquals($exectedRequestTarget, $request->getRequestTarget());
}
public function requestTargetProvider()
{
return [
["/", "/"],
["/hello", "/hello"],
["/my/path.txt", "/my/path.txt"],
["/", null]
];
}
}
// ----------------------------------------------------------------------------
class MockServerRequestTest extends ServerRequest
{
public static $bodyStream;
protected function getStreamForBody()
{
return self::$bodyStream;
}
}