Skip to content

Commit bd34e15

Browse files
percymamedyjoaorobertopb
authored andcommitted
Issue #97 - Always exclude StreamedResponse (#101)
Always exclude StreamedResponse - Closes #97 - Always exclude StreamedResponse similar to BinaryFileResponse as it cannot be handled. - Refactored CollapseWhitespaceTest by removing methods which belonged to ShouldNotProcessResponseTest - Improved ShouldNotProcessResponseTest
1 parent 5e7cb32 commit bd34e15

File tree

3 files changed

+163
-41
lines changed

3 files changed

+163
-41
lines changed

src/Middleware/PageSpeed.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace RenatoMarinho\LaravelPageSpeed\Middleware;
44

55
use Closure;
6+
use Symfony\Component\HttpFoundation\StreamedResponse;
67
use Symfony\Component\HttpFoundation\BinaryFileResponse;
78

89
abstract class PageSpeed
@@ -79,6 +80,10 @@ protected function shouldProcessPageSpeed($request, $response)
7980
return false;
8081
}
8182

83+
if ($response instanceof StreamedResponse) {
84+
return false;
85+
}
86+
8287
foreach ($patterns as $pattern) {
8388
if ($request->is($pattern)) {
8489
return false;

tests/Middleware/CollapseWhitespaceTest.php

Lines changed: 1 addition & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,11 @@
22

33
namespace RenatoMarinho\LaravelPageSpeed\Test\Middleware;
44

5-
use Illuminate\Http\Request;
6-
use Mockery as m;
7-
use RenatoMarinho\LaravelPageSpeed\Middleware\CollapseWhitespace;
85
use RenatoMarinho\LaravelPageSpeed\Test\TestCase;
9-
use Symfony\Component\HttpFoundation\BinaryFileResponse;
10-
use Symfony\Component\HttpFoundation\File\UploadedFile;
6+
use RenatoMarinho\LaravelPageSpeed\Middleware\CollapseWhitespace;
117

128
class CollapseWhitespaceTest extends TestCase
139
{
14-
public function tearDown()
15-
{
16-
parent::tearDown();
17-
m::close();
18-
}
19-
2010
protected function getMiddleware()
2111
{
2212
$this->middleware = new CollapseWhitespace();
@@ -31,34 +21,4 @@ public function testCollapseWhitespace()
3121

3222
$this->assertSame($compress, trim($partial[0]));
3323
}
34-
35-
public function testSkipBinaryFileResponse()
36-
{
37-
$request = Request::create('/', 'GET', [], [], ['file' => new UploadedFile(__FILE__, 'foo.php')]);
38-
39-
$response = $this->middleware->handle($request, function ($request) {
40-
return response()->download($request->file);
41-
});
42-
43-
$this->assertInstanceOf(BinaryFileResponse::class, $response);
44-
}
45-
46-
public function testExpectLogicExceptionInBinaryFileResponse()
47-
{
48-
$this->expectException('LogicException');
49-
50-
$mock = m::mock(CollapseWhitespace::class)
51-
->shouldAllowMockingProtectedMethods()
52-
->makePartial();
53-
54-
$mock->shouldReceive('shouldProcessPageSpeed')
55-
->once()
56-
->andReturn(true);
57-
58-
$request = Request::create('/', 'GET', [], [], ['file' => new UploadedFile(__FILE__, 'foo.php')]);
59-
60-
$response = $mock->handle($request, function ($request) {
61-
return response()->download($request->file);
62-
});
63-
}
6424
}
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
<?php
2+
3+
namespace RenatoMarinho\LaravelPageSpeed\Test\Middleware;
4+
5+
use Mockery as m;
6+
use Illuminate\Http\Request;
7+
use RenatoMarinho\LaravelPageSpeed\Test\TestCase;
8+
use Symfony\Component\HttpFoundation\StreamedResponse;
9+
use Symfony\Component\HttpFoundation\File\UploadedFile;
10+
use Symfony\Component\HttpFoundation\BinaryFileResponse;
11+
use RenatoMarinho\LaravelPageSpeed\Middleware\PageSpeed;
12+
use RenatoMarinho\LaravelPageSpeed\Middleware\CollapseWhitespace;
13+
14+
class ShouldNotProcessResponseTest extends TestCase
15+
{
16+
/**
17+
* PageSpeed middleware instance.
18+
*
19+
* @var \RenatoMarinho\LaravelPageSpeed\Middleware\PageSpeed
20+
*/
21+
protected $middleware;
22+
23+
/**
24+
* Clean up the testing environment before the next test.
25+
*
26+
* @return void
27+
*/
28+
protected function tearDown()
29+
{
30+
parent::tearDown();
31+
m::close();
32+
}
33+
34+
/**
35+
* Test that a BinaryFileResponse is ignored by any middleware.
36+
*
37+
* @return void
38+
*/
39+
public function testSkipBinaryFileResponse()
40+
{
41+
$request = Request::create('/', 'GET', [], [], ['file' => new UploadedFile(__FILE__, 'foo.php')]);
42+
43+
$response = $this->middleware->handle($request, $this->getNextBinaryFileResponse());
44+
45+
$this->assertInstanceOf(BinaryFileResponse::class, $response);
46+
}
47+
48+
/**
49+
* Test that a StreamedResponse is ignored by any middleware.
50+
*
51+
* @return void
52+
*/
53+
public function testSkipStreamedResponse()
54+
{
55+
$request = Request::create('/', 'GET');
56+
57+
$response = $this->middleware->handle($request, $this->getNextStreamedResponse());
58+
59+
$this->assertInstanceOf(StreamedResponse::class, $response);
60+
}
61+
62+
/**
63+
* Test a LogicException is throw when trying to process a
64+
* BinaryFileResponse.
65+
*
66+
* @return void
67+
*
68+
* @expectedException \LogicException
69+
*/
70+
public function testExpectLogicExceptionInBinaryFileResponse()
71+
{
72+
$request = Request::create('/', 'GET', [], [], ['file' => new UploadedFile(__FILE__, 'foo.php')]);
73+
74+
$middleware = $this->mockMiddlewareWhichAllowsPageSpeedProcess();
75+
76+
$middleware->handle($request, $this->getNextBinaryFileResponse());
77+
}
78+
79+
/**
80+
* Test a LogicException is throw when trying to process a
81+
* StreamedResponse.
82+
*
83+
* @return void
84+
*
85+
* @expectedException \LogicException
86+
*/
87+
public function testExpectLogicExceptionInStreamedResponse()
88+
{
89+
$request = Request::create('/', 'GET');
90+
91+
$middleware = $this->mockMiddlewareWhichAllowsPageSpeedProcess();
92+
93+
$middleware->handle($request, $this->getNextStreamedResponse());
94+
}
95+
96+
/**
97+
* Mock a BinaryFileResponse.
98+
*
99+
* @return \Closure
100+
*/
101+
protected function getNextBinaryFileResponse()
102+
{
103+
return function ($request) {
104+
return response()->download($request->file);
105+
};
106+
}
107+
108+
/**
109+
* Mock a StreamedResponse.
110+
*
111+
* @return \Closure
112+
*/
113+
protected function getNextStreamedResponse()
114+
{
115+
return function ($request) {
116+
$response = new StreamedResponse(function () {
117+
echo "I am Streamed";
118+
});
119+
120+
$response->headers->set('Content-Disposition', $response->headers->makeDisposition(
121+
'attachment',
122+
'foo.txt'
123+
));
124+
125+
return $response;
126+
};
127+
}
128+
129+
/**
130+
* Return an instance of the middleware which always
131+
* allows processing of response.
132+
*
133+
* @return m\Mock|PageSpeed
134+
*/
135+
protected function mockMiddlewareWhichAllowsPageSpeedProcess()
136+
{
137+
$mock = m::mock(CollapseWhitespace::class)
138+
->shouldAllowMockingProtectedMethods()
139+
->makePartial();
140+
141+
$mock->shouldReceive('shouldProcessPageSpeed')
142+
->once()
143+
->andReturn(true);
144+
145+
return $mock;
146+
}
147+
148+
/**
149+
* Middleware used during this test.
150+
*
151+
* @return void
152+
*/
153+
protected function getMiddleware()
154+
{
155+
$this->middleware = new CollapseWhitespace();
156+
}
157+
}

0 commit comments

Comments
 (0)