LaravelでIP制限/IPをモックして自動テスト

LaravelPHP

環境

  • 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

bash

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();
}

思い出したままに書いてるから動作未検証
大筋は合ってるはず