Skip to content

Commit b4b7144

Browse files
committed
Fix multi classDirectories and tests
1 parent 8cf09cc commit b4b7144

3 files changed

Lines changed: 84 additions & 18 deletions

File tree

src/Builder/RouterBuilder.php

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,15 @@ public function build(): Router
3232
return $router;
3333
}
3434

35-
foreach ($this->classDirectories as $classDirectory) {
36-
$routeProvider = new RouteProvider($classDirectory);
37-
38-
$routes = $routeProvider->getRoutes();
39-
40-
$this->mapRoutes($router, $routes);
35+
$allRoutes = [];
4136

42-
$this->cache?->set($this->cacheKey, $routes);
37+
foreach ($this->classDirectories as $classDirectory) {
38+
$allRoutes = array_merge($allRoutes, (new RouteProvider($classDirectory))->getRoutes());
4339
}
4440

41+
$this->mapRoutes($router, $allRoutes);
42+
$this->cache?->set($this->cacheKey, $allRoutes);
43+
4544
return $router;
4645
}
4746

tests/Builder/RouterBuilderTest.php

Lines changed: 64 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,80 @@
44

55
namespace MarekSkopal\Router\Tests\Builder;
66

7+
use League\Route\Route;
78
use League\Route\Router;
89
use MarekSkopal\Router\Builder\RouterBuilder;
10+
use MarekSkopal\Router\Tests\TestFile\TestFileClassAndMethod;
11+
use MarekSkopal\Router\Tests\TestFile\TestFileOneClass;
12+
use MarekSkopal\Router\Tests\TestFile\TestFileOneMethod;
13+
use MarekSkopal\Router\Tests\TestFile\TestFileTwoMethod;
914
use PHPUnit\Framework\Attributes\CoversClass;
1015
use PHPUnit\Framework\TestCase;
16+
use ReflectionClass;
1117

1218
#[CoversClass(RouterBuilder::class)]
1319
class RouterBuilderTest extends TestCase
1420
{
15-
public function testConstruct(): void
21+
public function testBuildReturnsRouter(): void
1622
{
17-
$routerBuilder = new RouterBuilder();
18-
$routerBuilder->setClassDirectories([__DIR__ . '/../TestFile']);
19-
20-
$router = $routerBuilder->build();
23+
$router = (new RouterBuilder())
24+
->setClassDirectories([__DIR__ . '/../TestFile'])
25+
->build();
2126

2227
self::assertInstanceOf(Router::class, $router);
2328
}
29+
30+
public function testBuildRegistersAllRoutes(): void
31+
{
32+
$router = (new RouterBuilder())
33+
->setClassDirectories([__DIR__ . '/../TestFile'])
34+
->build();
35+
36+
/** @var Route[] $routes */
37+
$routes = (new ReflectionClass($router))->getProperty('routes')->getValue($router);
38+
self::assertIsArray($routes);
39+
40+
self::assertCount(8, $routes);
41+
}
42+
43+
public function testBuildMergesRoutesFromMultipleDirectories(): void
44+
{
45+
$testFileDir = __DIR__ . '/../TestFile';
46+
47+
// Same directory twice: identical class+method keys are merged, so count stays 8
48+
$router = (new RouterBuilder())
49+
->setClassDirectories([$testFileDir, $testFileDir])
50+
->build();
51+
52+
/** @var Route[] $routes */
53+
$routes = (new ReflectionClass($router))->getProperty('routes')->getValue($router);
54+
self::assertIsArray($routes);
55+
56+
self::assertCount(8, $routes);
57+
}
58+
59+
public function testBuildRegistersCorrectPaths(): void
60+
{
61+
$router = (new RouterBuilder())
62+
->setClassDirectories([__DIR__ . '/../TestFile'])
63+
->build();
64+
65+
/** @var Route[] $routes */
66+
$routes = (new ReflectionClass($router))->getProperty('routes')->getValue($router);
67+
self::assertIsArray($routes);
68+
69+
$pathsByHandler = [];
70+
foreach ($routes as $route) {
71+
$handler = (new ReflectionClass($route))->getProperty('handler')->getValue($route);
72+
self::assertIsString($handler);
73+
$pathsByHandler[$handler] = $route->getPath();
74+
}
75+
76+
self::assertSame('/test-one-class', $pathsByHandler[TestFileOneClass::class . '::__invoke']);
77+
self::assertSame('/action-get', $pathsByHandler[TestFileOneMethod::class . '::actionGet']);
78+
self::assertSame('/action-get-one', $pathsByHandler[TestFileTwoMethod::class . '::actionGetOne']);
79+
self::assertSame('/action-get-two', $pathsByHandler[TestFileTwoMethod::class . '::actionGetTwo']);
80+
self::assertSame('/test-one-class', $pathsByHandler[TestFileClassAndMethod::class . '::__invoke']);
81+
self::assertSame('/action', $pathsByHandler[TestFileClassAndMethod::class . '::action']);
82+
}
2483
}

tests/RouteProvider/RouteProviderTest.php

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@
55
namespace MarekSkopal\Router\Tests\RouteProvider;
66

77
use MarekSkopal\Router\Provider\RouteProvider;
8+
use MarekSkopal\Router\Tests\TestFile\TestFileClassAndMethod;
9+
use MarekSkopal\Router\Tests\TestFile\TestFileOneClass;
10+
use MarekSkopal\Router\Tests\TestFile\TestFileOneMethod;
11+
use MarekSkopal\Router\Tests\TestFile\TestFileThreeClass;
12+
use MarekSkopal\Router\Tests\TestFile\TestFileTwoClass;
13+
use MarekSkopal\Router\Tests\TestFile\TestFileTwoMethod;
814
use PHPUnit\Framework\Attributes\CoversClass;
915
use PHPUnit\Framework\TestCase;
1016

@@ -17,11 +23,13 @@ public function testGetRoutes(): void
1723
$routes = $routeProvider->getRoutes();
1824

1925
$this->assertCount(8, $routes);
20-
$this->assertArrayHasKey('MarekSkopal\Router\Tests\TestFile\TestFileOneClass::__invoke', $routes);
21-
$this->assertArrayHasKey('MarekSkopal\Router\Tests\TestFile\TestFileTwoClass::__invoke', $routes);
22-
$this->assertArrayHasKey('MarekSkopal\Router\Tests\TestFile\TestFileThreeClass::__invoke', $routes);
23-
$this->assertArrayHasKey('MarekSkopal\Router\Tests\TestFile\TestFileOneMethod::actionGet', $routes);
24-
$this->assertArrayHasKey('MarekSkopal\Router\Tests\TestFile\TestFileTwoMethod::actionGetOne', $routes);
25-
$this->assertArrayHasKey('MarekSkopal\Router\Tests\TestFile\TestFileTwoMethod::actionGetTwo', $routes);
26+
$this->assertArrayHasKey(TestFileOneClass::class . '::__invoke', $routes);
27+
$this->assertArrayHasKey(TestFileTwoClass::class . '::__invoke', $routes);
28+
$this->assertArrayHasKey(TestFileThreeClass::class . '::__invoke', $routes);
29+
$this->assertArrayHasKey(TestFileOneMethod::class . '::actionGet', $routes);
30+
$this->assertArrayHasKey(TestFileTwoMethod::class . '::actionGetOne', $routes);
31+
$this->assertArrayHasKey(TestFileTwoMethod::class . '::actionGetTwo', $routes);
32+
$this->assertArrayHasKey(TestFileClassAndMethod::class . '::__invoke', $routes);
33+
$this->assertArrayHasKey(TestFileClassAndMethod::class . '::action', $routes);
2634
}
2735
}

0 commit comments

Comments
 (0)