Skip to content
This repository was archived by the owner on Mar 19, 2026. It is now read-only.

Commit d88cec5

Browse files
authored
Add tests (#16)
1 parent 5a62dad commit d88cec5

11 files changed

Lines changed: 275 additions & 38 deletions

.github/workflows/php-cs-fixer.yml

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
name: Check & fix styling
2+
3+
on: [ push ]
4+
5+
jobs:
6+
style:
7+
runs-on: ubuntu-latest
8+
9+
steps:
10+
- name: Checkout code
11+
uses: actions/checkout@v2
12+
13+
- name: Fix style
14+
uses: docker://oskarstark/php-cs-fixer-ga
15+
with:
16+
args: --config=.php_cs --allow-risky=yes
17+
18+
- name: Extract branch name
19+
shell: bash
20+
run: echo "##[set-output name=branch;]$(echo ${GITHUB_REF#refs/heads/})"
21+
id: extract_branch
22+
23+
- name: Commit changes
24+
uses: stefanzweifel/git-auto-commit-action@v4
25+
with:
26+
commit_message: Fix styling
27+
branch: ${{ steps.extract_branch.outputs.branch }}
28+
env:
29+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,5 @@ composer.lock
66
coverage
77
docs
88
vendor
9+
.php_cs.cache
10+
coverage

.php_cs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
$finder = Symfony\Component\Finder\Finder::create()
4+
->in([
5+
__DIR__ . '/src',
6+
__DIR__ . '/tests',
7+
])
8+
->name('*.php')
9+
->ignoreDotFiles(true)
10+
->ignoreVCS(true);
11+
12+
return PhpCsFixer\Config::create()
13+
->setRules([
14+
'@PSR2' => true,
15+
'array_syntax' => ['syntax' => 'short'],
16+
'ordered_imports' => ['sortAlgorithm' => 'alpha'],
17+
'no_unused_imports' => true,
18+
'not_operator_with_successor_space' => false,
19+
'trailing_comma_in_multiline_array' => true,
20+
'phpdoc_scalar' => true,
21+
'unary_operator_spaces' => true,
22+
'binary_operator_spaces' => true,
23+
'blank_line_before_statement' => [
24+
'statements' => ['break', 'continue', 'declare', 'return', 'throw', 'try'],
25+
],
26+
'phpdoc_single_line_var_spacing' => true,
27+
'phpdoc_var_without_name' => true,
28+
'method_argument_space' => [
29+
'on_multiline' => 'ensure_fully_multiline',
30+
'keep_multiple_spaces_after_comma' => true,
31+
]
32+
])
33+
->setFinder($finder);

composer.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@
2727
},
2828
"require-dev": {
2929
"phpunit/phpunit": "^8.4|^9.0",
30-
"orchestra/testbench": "^4.0|^5.0|^6.0"
30+
"orchestra/testbench": "^4.0|^5.0|^6.0",
31+
"friendsofphp/php-cs-fixer": "^2.16"
3132
},
3233
"autoload": {
3334
"psr-4": {
@@ -43,7 +44,7 @@
4344
"psalm": "vendor/bin/psalm",
4445
"test": "vendor/bin/phpunit",
4546
"test-coverage": "vendor/bin/phpunit --coverage-html coverage",
46-
"format": "vendor/bin/php-cs-fixer fix --allow-risky=yes"
47+
"format": "vendor/bin/php-cs-fixer fix --allow-risky=yes --config=.php_cs"
4748
},
4849
"config": {
4950
"sort-packages": true

config/prerender.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,10 @@
3535
|
3636
| By default Prerender returns soft HTTP codes. If you would like it to
3737
| return the real ones in case of Redirection (3xx) or status Not Found (404),
38-
| set this parameter to false.
38+
| set this parameter to false.
3939
| Keep in mind that returning real HTTP codes requires appropriate meta tags
4040
| to be set. For more details, see github.com/prerender/prerender#httpheaders
41-
|
41+
|
4242
*/
4343

4444
'prerender_soft_http_codes' => env('PRERENDER_SOFT_HTTP_STATUS_CODES', true),

phpunit.xml.dist

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@
1010
stopOnFailure="false"
1111
verbose="true"
1212
>
13+
<coverage>
14+
<include>
15+
<directory suffix=".php">src/</directory>
16+
</include>
17+
</coverage>
1318
<testsuites>
1419
<testsuite name="codebar Test Suite">
1520
<directory>tests</directory>

src/LaravelPrerenderServiceProvider.php

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
<?php namespace CodebarAg\LaravelPrerender;
1+
<?php
2+
3+
namespace CodebarAg\LaravelPrerender;
24

35
use Illuminate\Support\ServiceProvider;
46

@@ -14,7 +16,7 @@ class LaravelPrerenderServiceProvider extends ServiceProvider
1416
public function boot()
1517
{
1618
$this->publishes([
17-
__DIR__ . '/../config/prerender.php' => config_path('prerender.php')
19+
__DIR__ . '/../config/prerender.php' => config_path('prerender.php'),
1820
], 'config');
1921

2022
if ($this->app['config']->get('prerender.enable')) {
@@ -33,5 +35,4 @@ public function register()
3335
{
3436
$this->mergeConfigFrom(__DIR__ . '/../config/prerender.php', 'prerender');
3537
}
36-
37-
}
38+
}

src/PrerenderMiddleware.php

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
11
<?php
22

3-
43
namespace CodebarAg\LaravelPrerender;
54

6-
75
use App;
86
use Closure;
9-
use Illuminate\Support\Arr;
10-
use Illuminate\Support\Str;
11-
use Redirect;
7+
use GuzzleHttp\Client as Guzzle;
128
use GuzzleHttp\Exception\RequestException;
139
use Illuminate\Contracts\Foundation\Application;
14-
use GuzzleHttp\Client as Guzzle;
10+
use Illuminate\Support\Arr;
11+
use Illuminate\Support\Str;
1512
use Psr\Http\Message\ResponseInterface;
13+
use Redirect;
1614
use Symfony\Bridge\PsrHttpMessage\Factory\HttpFoundationFactory;
1715
use Symfony\Component\HttpFoundation\Response;
1816

@@ -122,6 +120,7 @@ public function handle($request, Closure $next)
122120

123121
if (!$this->returnSoftHttpCodes && $statusCode >= 300 && $statusCode < 400) {
124122
$headers = $prerenderedResponse->getHeaders();
123+
125124
return Redirect::to(array_change_key_case($headers, CASE_LOWER)['location'][0], $statusCode);
126125
}
127126

@@ -135,23 +134,30 @@ public function handle($request, Closure $next)
135134
/**
136135
* Returns whether the request must be prerendered.
137136
*
138-
* @param $request
137+
* @param \Illuminate\Http\Request $request
139138
* @return bool
140139
*/
141140
private function shouldShowPrerenderedPage($request)
142141
{
143142
$userAgent = strtolower($request->server->get('HTTP_USER_AGENT'));
144143
$bufferAgent = $request->server->get('X-BUFFERBOT');
144+
145145
$requestUri = $request->getRequestUri();
146146
$referer = $request->headers->get('Referer');
147147

148148
$isRequestingPrerenderedPage = false;
149149

150-
if (!$userAgent) return false;
151-
if (!$request->isMethod('GET')) return false;
150+
if (!$userAgent) {
151+
return false;
152+
}
153+
if (!$request->isMethod('GET')) {
154+
return false;
155+
}
152156

153157
// prerender if _escaped_fragment_ is in the query string
154-
if ($request->query->has('_escaped_fragment_')) $isRequestingPrerenderedPage = true;
158+
if ($request->query->has('_escaped_fragment_')) {
159+
$isRequestingPrerenderedPage = true;
160+
}
155161

156162
// prerender if a crawler is detected
157163
foreach ($this->crawlerUserAgents as $crawlerUserAgent) {
@@ -160,9 +166,13 @@ private function shouldShowPrerenderedPage($request)
160166
}
161167
}
162168

163-
if ($bufferAgent) $isRequestingPrerenderedPage = true;
169+
if ($bufferAgent) {
170+
$isRequestingPrerenderedPage = true;
171+
}
164172

165-
if (!$isRequestingPrerenderedPage) return false;
173+
if (!$isRequestingPrerenderedPage) {
174+
return false;
175+
}
166176

167177
// only check whitelist if it is not empty
168178
if ($this->whitelist) {
@@ -175,7 +185,9 @@ private function shouldShowPrerenderedPage($request)
175185
if ($this->blacklist) {
176186
$uris[] = $requestUri;
177187
// we also check for a blacklisted referer
178-
if ($referer) $uris[] = $referer;
188+
if ($referer) {
189+
$uris[] = $referer;
190+
}
179191
if ($this->isListed($uris, $this->blacklist)) {
180192
return false;
181193
}
@@ -210,9 +222,10 @@ private function getPrerenderedPageResponse($request)
210222
if ($path === '/') {
211223
$path = '';
212224
}
225+
213226
return $this->client->get($this->prerenderUri . '/' . urlencode($protocol.'://'.$host.'/'.$path), compact('headers'));
214227
} catch (RequestException $exception) {
215-
if(!$this->returnSoftHttpCodes && !empty($exception->getResponse()) && $exception->getResponse()->getStatusCode() === 404) {
228+
if (!$this->returnSoftHttpCodes && !empty($exception->getResponse()) && $exception->getResponse()->getStatusCode() === 404) {
216229
App::abort(404);
217230
}
218231
// In case of an exception, we only throw the exception if we are in debug mode. Otherwise,
@@ -221,6 +234,7 @@ private function getPrerenderedPageResponse($request)
221234
if ($this->app['config']->get('app.debug')) {
222235
throw $exception;
223236
}
237+
224238
return null;
225239
}
226240
}
@@ -254,7 +268,7 @@ private function isListed($needles, $list)
254268
}
255269
}
256270
}
271+
257272
return false;
258273
}
259-
260-
}
274+
}

tests/ExampleTest.php

Lines changed: 0 additions & 14 deletions
This file was deleted.

tests/PrerenderMiddlewareTest.php

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
<?php
2+
3+
namespace CodebarAg\LaravelPrerender\Tests;
4+
5+
class PrerenderMiddlewareTest extends TestCase
6+
{
7+
/**
8+
* @test
9+
*/
10+
public function it_should_prerender_page_on_get_request()
11+
{
12+
$this->allowSymfonyUserAgent();
13+
14+
$this->get('/test-middleware')
15+
->assertHeader('prerender.io-mock', true)
16+
->assertSuccessful();
17+
}
18+
19+
/**
20+
* @test
21+
*/
22+
public function it_should_not_prerender_page_when_user_agent_does_not_in_list()
23+
{
24+
$this->get('/test-middleware')
25+
->assertSuccessful()
26+
->assertHeaderMissing('prerender.io-mock')
27+
->assertSee('GET - Success');
28+
}
29+
30+
/**
31+
* @test
32+
*/
33+
public function it_should_prerender_page_with_escaped_fragment_in_query_string()
34+
{
35+
$this->get('/test-middleware?_escaped_fragment_')
36+
->assertHeader('prerender.io-mock', true)
37+
->assertSuccessful();
38+
}
39+
40+
/**
41+
* @test
42+
*/
43+
public function it_should_prerender_page_with_url_in_whitelist()
44+
{
45+
config()->set('prerender.whitelist', ['/test-middleware*']);
46+
$this->get('/test-middleware?_escaped_fragment_')
47+
->assertHeader('prerender.io-mock', true)
48+
->assertSuccessful();
49+
}
50+
51+
/**
52+
* @test
53+
*/
54+
public function is_should_not_prerender_page_in_blacklist()
55+
{
56+
config()->set('prerender.blacklist', ['/test-middleware*']);
57+
$this->get('/test-middleware?_escaped_fragment_')
58+
->assertSuccessful()
59+
->assertHeaderMissing('prerender.io-mock')
60+
->assertSee('GET - Success');
61+
}
62+
63+
/**
64+
* @test
65+
*/
66+
public function it_should_not_prrender_page_on_non_get_request()
67+
{
68+
$this->allowSymfonyUserAgent();
69+
70+
$this->post('/test-middleware')
71+
->assertSuccessful()
72+
->assertSee('Success');
73+
}
74+
75+
/**
76+
* @test
77+
*/
78+
public function it_should_not_prerender_page_when_missing_useg_agent()
79+
{
80+
$this->get('/test-middleware', ['User-Agent' => null])
81+
->assertHeaderMissing('prerender.io-mock')
82+
->assertSee('GET - Success');
83+
}
84+
85+
/**
86+
*
87+
*/
88+
private function allowSymfonyUserAgent()
89+
{
90+
config()->set('prerender.crawler_user_agents', ['symfony']);
91+
}
92+
}

0 commit comments

Comments
 (0)