Skip to content

Commit 1aa881d

Browse files
committed
Pass 100% test
1 parent 93fb52f commit 1aa881d

File tree

4 files changed

+120
-7
lines changed

4 files changed

+120
-7
lines changed

composer.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,17 @@
33
"require": {
44
"zendframework/zend-diactoros": "1.*"
55
},
6+
"require-dev": {
7+
"phpunit/phpunit": "^4.8.6"
8+
},
69
"autoload": {
710
"psr-4": {
811
"PhpMiddleware\\RequestSimulator\\": "src/"
912
}
13+
},
14+
"autoload-dev": {
15+
"psr-4": {
16+
"PhpMiddlewareTest\\RequestSimulator\\": "test/"
17+
}
1018
}
1119
}

phpunit.xml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
3+
<phpunit bootstrap="./vendor/autoload.php" colors="true">
4+
<testsuites>
5+
<testsuite>
6+
<directory>./test</directory>
7+
</testsuite>
8+
</testsuites>
9+
<filter>
10+
<whitelist processUncoveredFilesFromWhitelist="true">
11+
<directory suffix=".php">./src</directory>
12+
</whitelist>
13+
</filter>
14+
</phpunit>

src/RequestSimulatorMiddleware.php

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,22 @@
77
use Zend\Diactoros\Request\Serializer as RequestSerializer;
88
use Zend\Diactoros\Response\HtmlResponse;
99
use Zend\Diactoros\Response\Serializer as ResponseSerializer;
10+
use Zend\Diactoros\ServerRequest;
1011

11-
class RequestSimulatorMiddleware
12+
final class RequestSimulatorMiddleware
1213
{
1314
const PARAM = 'simulated-request';
1415

1516
public function __invoke(ServerRequestInterface $request, ResponseInterface $response, callable $next)
1617
{
17-
$parsedBody = $request->getParsedBody();
18-
19-
if ($request->getMethod() === 'POST' && is_array($parsedBody) && isset($parsedBody[self::PARAM])) {
20-
$requestToSimulate = $parsedBody[self::PARAM];
21-
$request = RequestSerializer::fromString($requestToSimulate);
18+
if ($request->getMethod() === 'POST') {
19+
$parsedBody = $this->parseBody($request->getBody());
20+
21+
if (is_array($parsedBody) && isset($parsedBody[self::PARAM])) {
22+
$requestToSimulate = $parsedBody[self::PARAM];
23+
$deserializedRequest = RequestSerializer::fromString($requestToSimulate);
24+
$request = new ServerRequest($request->getServerParams(), $request->getUploadedFiles(), $deserializedRequest->getUri(), $deserializedRequest->getMethod(), $deserializedRequest->getBody(), $deserializedRequest->getHeaders());
25+
}
2226
}
2327

2428
$requestAsString = RequestSerializer::toString($request);
@@ -32,6 +36,14 @@ public function __invoke(ServerRequestInterface $request, ResponseInterface $res
3236
return new HtmlResponse($html);
3337
}
3438

39+
private function parseBody($body)
40+
{
41+
$params = [];
42+
parse_str($body, $params);
43+
44+
return $params;
45+
}
46+
3547
private function getHtmlTemplate()
3648
{
3749
return '<html>'
@@ -47,4 +59,4 @@ private function getHtmlTemplate()
4759
. '</body>'
4860
. '</html>';
4961
}
50-
}
62+
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
<?php
2+
3+
namespace PhpMiddlewareTest\RequestSimulator;
4+
5+
use PhpMiddleware\RequestSimulator\RequestSimulatorMiddleware;
6+
use PHPUnit_Framework_TestCase;
7+
use Psr\Http\Message\ResponseInterface;
8+
use Psr\Http\Message\ServerRequestInterface;
9+
use Zend\Diactoros\Response;
10+
use Zend\Diactoros\ServerRequest;
11+
use Zend\Diactoros\Stream;
12+
use Zend\Diactoros\Uri;
13+
14+
class RequestSimulatorMiddlewareTest extends PHPUnit_Framework_TestCase
15+
{
16+
private $middleware;
17+
18+
protected function setUp()
19+
{
20+
$this->middleware = new RequestSimulatorMiddleware();
21+
}
22+
23+
public function testNotSimulateRequest()
24+
{
25+
$request = new ServerRequest([], [], new Uri(), 'GET');
26+
27+
$responseBody = json_encode(['boo' => 'foo']);
28+
$response = new Response('php://memory', 200, ['content-type' => 'application/json']);
29+
$response->getBody()->write($responseBody);
30+
31+
$next = function (ServerRequestInterface $request, ResponseInterface $response) {
32+
return $response;
33+
};
34+
35+
/* @var $result ResponseInterface */
36+
$result = call_user_func($this->middleware, $request, $response, $next);
37+
38+
$body = (string) $result->getBody();
39+
40+
$this->assertContains('text/html', $result->getHeaderLine('Content-type'));
41+
$this->assertContains('{"boo":"foo"}', $body);
42+
$this->assertContains('<html>', $body);
43+
}
44+
45+
46+
public function testSimulateRequest()
47+
{
48+
$simulatedRequest = "DELETE / HTTP/1.1\r\nBar: faz\r\nHost: php-middleware.com";
49+
$postBody = http_build_query([RequestSimulatorMiddleware::PARAM => $simulatedRequest]);
50+
51+
$stream = new Stream('php://memory', 'wb+');
52+
$stream->write($postBody);
53+
54+
$request = new ServerRequest([], [], new Uri(), 'POST', $stream, ['Content-type' => 'application/x-www-form-urlencoded']);
55+
56+
$responseBody = json_encode(['boo' => 'foo']);
57+
$response = new Response('php://memory', 200, ['content-type' => 'application/json']);
58+
$response->getBody()->write($responseBody);
59+
60+
61+
62+
$next = function (ServerRequestInterface $request, ResponseInterface $response) {
63+
$this->assertSame('DELETE', $request->getMethod());
64+
$this->assertSame('faz', $request->getHeaderLine('Bar'));
65+
66+
return $response;
67+
};
68+
69+
/* @var $result ResponseInterface */
70+
$result = call_user_func($this->middleware, $request, $response, $next);
71+
72+
$body = (string) $result->getBody();
73+
74+
$this->assertContains('text/html', $result->getHeaderLine('Content-type'));
75+
$this->assertContains('{"boo":"foo"}', $body);
76+
$this->assertContains('<html>', $body);
77+
$this->assertContains('DELETE / HTTP/1.1', $body);
78+
}
79+
}

0 commit comments

Comments
 (0)