LaravelでIP制限/IPをモックして自動テスト
環境
- laravel 5.5 on laradock
ミドルウェアでIP制限
ミドルウェアつくる
php artisan make:middleware IpRestriction
app/Http/Middleware/IpRestriction.php をよしなに書く
<?php namespace App\Http\Middleware; use Closure; class IpRestriction { public function handle($request, Closure $next) { // 許すIP // configに書いてあったりDBから取ってきたり $ips = collect(['11.23.58.13']); // 許すIPリストに含まれなければリダイレクト if (!$ips->contains($request->ip()) { return redirect('/'); } return $next($request); } }
app/Http/Kernel.php でミドルウェアに名前をつける
<?php // ... protected $routeMiddleware = [ // ... 'ip_restriction' => \App\Http\Middleware\IpRestriction::class, ];
routes/web.php でよしなに使う
<?php Route::middleware('ip_restriction')->get('/hoge', function () {/*...*/});
IPをモックしてテスト(本題)
- 以下を自動テストしたくなる
- 許可したIPでアクセスできる
- 許可しないIPでアクセスするとリダイレクトされる
How to mock the clients Ip address
php artisan make:test IpTest
tests/Feature/IpTest.php
<?php /** * @test */ public function 許可したIPでアクセスできる() { $response = $this->call( 'GET', '/hoge' // IP制限のあるルート [], [], [], ['REMOTE_ADDR' => '11.23.58.13'] // 許可するIP ); $response->assertStatus(200); } /** * @test */ public function 許可しないIPでアクセスするとリダイレクトされる() { $response = $this->call( 'GET', '/hoge' // IP制限のあるルート [], [], [], ['REMOTE_ADDR' => '127.0.0.1'] // 許可しないIP ); $response->assertRedirect(); }
思い出したままに書いてるから動作未検証
大筋は合ってるはず