Skip to content

Instantly share code, notes, and snippets.

@kmuenkel
Last active November 17, 2020 16:10
Show Gist options
  • Save kmuenkel/1a5061b95e18f24544d4ddd2b6f1e2bb to your computer and use it in GitHub Desktop.
Save kmuenkel/1a5061b95e18f24544d4ddd2b6f1e2bb to your computer and use it in GitHub Desktop.
Obtain a response from a Controller object without needing routes, for the purposes of testing
<?php
namespace Tests;
use Orchestra\Testbench\TestCase;
use Illuminate\Http\{Request, Response};
use Illuminate\Routing\{Controller, ControllerDispatcher, Pipeline, Route, Router};
/**
* Trait AnonymousResponse
* @package Tests
* @mixin TestCase
*/
trait AnonymousResponse
{
/**
* @param Controller $controller
* @param string $methodName
* @param Request|null $request
* @return Response
*/
protected function generateResponse(Controller $controller, string $methodName, Request $request = null)
{
$request = $request ?: Request::create(config('app.url'));
$route = $this->applyRoute($request, $controller, $methodName);
$this->applyMiddleware($request, $controller, $methodName);
return $route->run();
}
/**
* @param Request $request
* @param Controller $controller
* @param string $methodName
* @return Route
*/
protected function applyRoute(Request $request, Controller $controller, string $methodName)
{
$action = ['as' => $methodName, 'uses' => "@$methodName"];
$route = app(Router::class)->addRoute(['GET'], $methodName, $action)->bind($request);
$route->controller = $controller;
$this->app->instance('request', $request->setRouteResolver(function () use ($route) {
return $route;
}));
return $route;
}
/**
* @param Request $request
* @param Controller $controller
* @param string $methodName
* @return Response
*/
protected function applyMiddleware(Request $request, Controller $controller, string $methodName)
{
$middleware = app(ControllerDispatcher::class)->getMiddleware($controller, $methodName);
$pipeline = app(Pipeline::class, ['container' => $this->app])->send($request)->through($middleware);
return $pipeline->then(function (Request $request) {
return $request;
});
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment