AuthorizesResourcesTest.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. <?php
  2. namespace Illuminate\Tests\Auth;
  3. use Closure;
  4. use Illuminate\Events\Dispatcher;
  5. use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
  6. use Illuminate\Http\Request;
  7. use Illuminate\Routing\Controller;
  8. use Illuminate\Routing\Router;
  9. use PHPUnit\Framework\TestCase;
  10. class AuthorizesResourcesTest extends TestCase
  11. {
  12. public function testCreateMethod()
  13. {
  14. $controller = new AuthorizesResourcesController;
  15. $this->assertHasMiddleware($controller, 'create', 'can:create,App\User');
  16. $controller = new AuthorizesResourcesWithArrayController;
  17. $this->assertHasMiddleware($controller, 'create', 'can:create,App\User,App\Post');
  18. }
  19. public function testStoreMethod()
  20. {
  21. $controller = new AuthorizesResourcesController;
  22. $this->assertHasMiddleware($controller, 'store', 'can:create,App\User');
  23. $controller = new AuthorizesResourcesWithArrayController;
  24. $this->assertHasMiddleware($controller, 'store', 'can:create,App\User,App\Post');
  25. }
  26. public function testShowMethod()
  27. {
  28. $controller = new AuthorizesResourcesController;
  29. $this->assertHasMiddleware($controller, 'show', 'can:view,user');
  30. $controller = new AuthorizesResourcesWithArrayController;
  31. $this->assertHasMiddleware($controller, 'show', 'can:view,user,post');
  32. }
  33. public function testEditMethod()
  34. {
  35. $controller = new AuthorizesResourcesController;
  36. $this->assertHasMiddleware($controller, 'edit', 'can:update,user');
  37. $controller = new AuthorizesResourcesWithArrayController;
  38. $this->assertHasMiddleware($controller, 'edit', 'can:update,user,post');
  39. }
  40. public function testUpdateMethod()
  41. {
  42. $controller = new AuthorizesResourcesController;
  43. $this->assertHasMiddleware($controller, 'update', 'can:update,user');
  44. $controller = new AuthorizesResourcesWithArrayController;
  45. $this->assertHasMiddleware($controller, 'update', 'can:update,user,post');
  46. }
  47. public function testDestroyMethod()
  48. {
  49. $controller = new AuthorizesResourcesController;
  50. $this->assertHasMiddleware($controller, 'destroy', 'can:delete,user');
  51. $controller = new AuthorizesResourcesWithArrayController;
  52. $this->assertHasMiddleware($controller, 'destroy', 'can:delete,user,post');
  53. }
  54. /**
  55. * Assert that the given middleware has been registered on the given controller for the given method.
  56. *
  57. * @param \Illuminate\Routing\Controller $controller
  58. * @param string $method
  59. * @param string $middleware
  60. * @return void
  61. */
  62. protected function assertHasMiddleware($controller, $method, $middleware)
  63. {
  64. $router = new Router(new Dispatcher);
  65. $router->aliasMiddleware('can', AuthorizesResourcesMiddleware::class);
  66. $router->get($method)->uses(get_class($controller).'@'.$method);
  67. $this->assertSame(
  68. 'caught '.$middleware,
  69. $router->dispatch(Request::create($method, 'GET'))->getContent(),
  70. "The [{$middleware}] middleware was not registered for method [{$method}]"
  71. );
  72. }
  73. }
  74. class AuthorizesResourcesController extends Controller
  75. {
  76. use AuthorizesRequests;
  77. public function __construct()
  78. {
  79. $this->authorizeResource('App\User', 'user');
  80. }
  81. public function index()
  82. {
  83. //
  84. }
  85. public function create()
  86. {
  87. //
  88. }
  89. public function store()
  90. {
  91. //
  92. }
  93. public function show()
  94. {
  95. //
  96. }
  97. public function edit()
  98. {
  99. //
  100. }
  101. public function update()
  102. {
  103. //
  104. }
  105. public function destroy()
  106. {
  107. //
  108. }
  109. }
  110. class AuthorizesResourcesWithArrayController extends Controller
  111. {
  112. use AuthorizesRequests;
  113. public function __construct()
  114. {
  115. $this->authorizeResource(['App\User', 'App\Post'], ['user', 'post']);
  116. }
  117. public function index()
  118. {
  119. //
  120. }
  121. public function create()
  122. {
  123. //
  124. }
  125. public function store()
  126. {
  127. //
  128. }
  129. public function show()
  130. {
  131. //
  132. }
  133. public function edit()
  134. {
  135. //
  136. }
  137. public function update()
  138. {
  139. //
  140. }
  141. public function destroy()
  142. {
  143. //
  144. }
  145. }
  146. class AuthorizesResourcesMiddleware
  147. {
  148. public function handle($request, Closure $next, $method, $parameter, ...$models)
  149. {
  150. $params = array_merge([$parameter], $models);
  151. return "caught can:{$method},".implode(',', $params);
  152. }
  153. }