wubbleyou/laravel-access-control-checker

用于验证路由中间件和策略边界的自动测试生成

v0.0.2 2024-04-23 10:40 UTC

This package is auto-updated.

Last update: 2024-09-23 11:29:46 UTC


README

界限是一个DX工具,用于生成单元测试,以自动测试您的路由是否满足开发者设定的规则。

界限默认提供了两个规则,分别是MiddlewareRulePolicyRule

安装

使用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