Как протестировать промежуточное ПО с phpunit в laravel 5.5?
Как я могу протестировать свое промежуточное ПО? Здесь я проверяю, может ли администратор получить доступ к защищенному маршруту промежуточного программного обеспечения, который возвращает 500, если у пользователя нет привилегированного ip - промежуточное программное обеспечение возвращает 401 (не авторизовано) при попытке доступа к /500
страница
Мой тест:
use App\Http\Middleware\OnlyAdminIp;
use Illuminate\Http\Request;
use Tests\TestCase;
use Illuminate\Foundation\Testing\DatabaseTransactions;
class HttpTests extends TestCase
{
use DatabaseTransactions;
/** @test */
public function if_a_500_page_returns_a_500_response_for_admin()
{
$request = Request::create(config('app.url') . '500', 'GET');
$middleware = new OnlyAdminIp();
$response = $middleware->handle($request, function () {});
$this->assertEquals($response->getStatusCode(), 401);
}
}
Мое промежуточное программное обеспечение:
namespace App\Http\Middleware;
use App\IpList;
use Closure;
class OnlyAdminIp
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$client_ip = $_SERVER["HTTP_CF_CONNECTING_IP"] ?? $request->ip(); // CDN(Cloudflare) provides the real client ip, a safeguard is used to prevent critical error if CDN is removed/changed.
$ipList = IpList::all()
->pluck('ip')
->toArray();
if (!in_array($client_ip, $ipList)) {
abort(401);
}
return $next($request);
}
}
И просто для большей наглядности - маршрут 500 (в web.php) .
Route::group(['middleware' => 'admin.ip'], function () {
Route::get('500', function () {
abort(500);
});
});
С этой настройкой я получаю Call to a member function getStatusCode() on null
Заранее спасибо!
1 ответ
Решение
Я придумал решение, которое работает.
$request = Request::create(config('app.url') . '500', 'GET',[],[],[],['REMOTE_ADDR'=>'127.0.0.2']);
$middleware = new OnlyAdminIp();
$expectedStatusCode = 401;
try {
$middleware->handle($request, function () {});
}catch(\Symfony\Component\HttpKernel\Exception\HttpException $e){
$this->assertEquals(
$expectedStatusCode,
$e->getStatusCode(),
sprintf("Expected an HTTP status of %d but got %d.", $expectedStatusCode, $e->getStatusCode())
);
}