wubbleyou / laravel-access-control-checker
用于验证路由中间件和策略边界的自动测试生成
README
界限是一个DX工具,用于生成单元测试,以自动测试您的路由是否满足开发者设定的规则。
界限默认提供了两个规则,分别是MiddlewareRule
和PolicyRule
安装
使用Composer正常安装该包
composer require wubbleyou/boundaries
使用方法
要开始,您需要运行以下命令以生成基本测试文件
php/sail artisan wubbleyou:generate-test
配置
现在您已经生成了测试并在tests\Feature\Boundaries\BoundaryTest.php
中保存,您可能会注意到在app\Traits\BoundaryRouteTrait.php
中放置了一个特质,它包含两个方法,请阅读下面的附加信息以了解为什么需要提供这些。
getWhitelist()
getWhitelist()
方法允许您返回一个数组,其中包含您希望由Wubbleyou\Boundaries忽略的所有路由。
return [
'login',
'register',
'homepage',
'about',
];
getRoutes()
getRoutes()
方法允许您返回一个数组,以指定应在每个路由上运行的精确断言。以下是一个示例
$admin = User::factory()->create(['is_admin', true]);
$userOne = User::factory()->create();
$userTwo = User::factory()->create();
return [
'users.change-password' => [
new MiddlewareRule(['web', 'auth', 'incorrect']),
new PolicyRule('get', 403, $userOne, ['user' => $userTwo]),
]
];
MiddlewareRule
中间件规则会测试您的路由是否与一组特定的中间件匹配,如果不匹配所有这些中间件,测试将失败。
MiddlewareRule还有一个可选的第二个参数$strict
(默认:false
)。如果启用严格模式,提供的期望中间件数组必须与路由上存在的中间件完全匹配。如果没有启用严格模式,路由上存在的中间件必须包含所有期望的中间件,但也可能包含我们未测试的其他中间件。
new MiddlewareRule(['web', 'auth'], true),
PolicyRule
策略规则会对特定路由执行测试以测试HTTP状态码。您需要提供
- 请求类型(get/post等)
- 期望的HTTP状态码响应(200、404、403等)
- 用于测试路由的用户(这可以设置为NULL以测试未认证)(默认:null)
- 路由期望的参数(可选)(默认:[])
然后它将测试该路由,如果响应代码与您提供的不匹配,将返回错误。
自定义BoundaryRules
您还可以使用以下命令生成自定义BoundaryRules
php/sail artisan wubbleyou:generate-rule RuleName
一个示例BoundaryRule可能如下所示
<?php
namespace App\BoundaryRules;
use Wubbleyou\Boundaries\BoundaryRules\BoundaryRule;
use Illuminate\Routing\Route;
use Tests\TestCase;
class TestingRule extends BoundaryRule {
public function handle(Route $route, TestCase $test, string $routeName): array
{
return ['This test failed because this array is not empty'];
}
}
Closures
您还可以提供闭包作为BoundaryRule
function(Route $route) {
if($route->getName() !== 'hello') {
return ['Route name is not hello'];
}
return [];
},
附加信息
如果每个路由都没有在getWhitelist()
或getRoutes()
中考虑,界限测试将失败,如果您想生成不在这两个中的路由列表,请运行以下命令
php/sail artisan wubbleyou:missing-routes
请注意,此命令需要您已生成BoundaryRouteTrait才能正常工作,如果您需要仅生成特质而不生成任何测试,可以运行
php/sail artisan wubbleyou:generate-route-trait