routes/tests/Feature/RouteRegistrationTest.php

146 lines
4.7 KiB
PHP
Raw Normal View History

<?php
namespace Jltx\Routes\Tests\Feature;
use Jltx\Routes\Attribute\Get;
use Jltx\Routes\Attribute\Middleware;
use Jltx\Routes\Attribute\Post;
use Jltx\Routes\Attribute\Prefix;
use Jltx\Routes\Attribute\Version;
use Jltx\Routes\Tests\Fixtures\Controllers\TestController;
use Jltx\Routes\Tests\TestCase;
use ReflectionClass;
class RouteRegistrationTest extends TestCase
{
/** @test */
public function it_can_scan_controller_and_extract_attributes()
{
// 测试控制器类的属性提取
$reflection = new ReflectionClass(TestController::class);
// 检查类级别的属性
$prefixAttrs = $reflection->getAttributes(Prefix::class);
$versionAttrs = $reflection->getAttributes(Version::class);
$middlewareAttrs = $reflection->getAttributes(Middleware::class);
$this->assertCount(1, $prefixAttrs);
$this->assertCount(1, $versionAttrs);
$this->assertCount(1, $middlewareAttrs);
// 检查方法级别的属性
$methods = $reflection->getMethods();
// 查找 getUsers 方法
$getUsersMethod = null;
foreach ($methods as $method) {
if ($method->getName() === 'getUsers') {
$getUsersMethod = $method;
break;
}
}
$this->assertNotNull($getUsersMethod);
$getAttrs = $getUsersMethod->getAttributes(Get::class);
$this->assertCount(1, $getAttrs);
}
/** @test */
public function it_can_create_route_attribute_instances()
{
// 测试创建路由属性实例
$reflection = new ReflectionClass(TestController::class);
$methods = $reflection->getMethods();
// 查找 createUser 方法
$createUserMethod = null;
foreach ($methods as $method) {
if ($method->getName() === 'createUser') {
$createUserMethod = $method;
break;
}
}
$this->assertNotNull($createUserMethod);
// 获取 Post 属性实例
$postAttrs = $createUserMethod->getAttributes(Post::class);
$this->assertCount(1, $postAttrs);
$postInstance = $postAttrs[0]->newInstance();
$this->assertInstanceOf(Post::class, $postInstance);
$this->assertEquals('users', $postInstance->path);
}
/** @test */
public function it_supports_multiple_middleware_attributes()
{
// 测试重复的中间件属性支持
$reflection = new ReflectionClass(TestController::class);
$methods = $reflection->getMethods();
// 查找 createUser 方法(应该有两个中间件:类级别的 auth 和方法级别的 admin
$createUserMethod = null;
foreach ($methods as $method) {
if ($method->getName() === 'createUser') {
$createUserMethod = $method;
break;
}
}
$this->assertNotNull($createUserMethod);
$middlewareAttrs = $createUserMethod->getAttributes(Middleware::class);
// 方法级别应该有一个 Middleware 属性
$this->assertCount(1, $middlewareAttrs);
// 类级别的 Middleware 属性也需要被检测到
$classMiddlewareAttrs = $reflection->getAttributes(Middleware::class);
$this->assertCount(1, $classMiddlewareAttrs);
}
/** @test */
public function it_can_override_version_attribute()
{
// 测试版本属性覆盖
$reflection = new ReflectionClass(TestController::class);
$methods = $reflection->getMethods();
// 查找 getPost 方法(应该覆盖类级别的版本)
$getPostMethod = null;
foreach ($methods as $method) {
if ($method->getName() === 'getPost') {
$getPostMethod = $method;
break;
}
}
$this->assertNotNull($getPostMethod);
$versionAttrs = $getPostMethod->getAttributes(Version::class);
$this->assertCount(1, $versionAttrs);
$versionInstance = $versionAttrs[0]->newInstance();
$this->assertEquals('v3', $versionInstance->version);
}
/** @test */
public function it_can_parse_class_file_for_namespace_and_class_name()
{
// 测试从文件中解析命名空间和类名
$content = file_get_contents(__DIR__.'/../Fixtures/Controllers/TestController.php');
$namespace = null;
$class = null;
if (preg_match('/namespace\s+(.+?);/', $content, $ns) &&
preg_match('/class\s+(\w+)/', $content, $cls)) {
$namespace = $ns[1];
$class = $cls[1];
}
$this->assertEquals('Jltx\Routes\Tests\Fixtures\Controllers', $namespace);
$this->assertEquals('TestController', $class);
}
}