diff options
Diffstat (limited to 'tests/Unit/RouterTest.php')
| -rw-r--r-- | tests/Unit/RouterTest.php | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/tests/Unit/RouterTest.php b/tests/Unit/RouterTest.php new file mode 100644 index 0000000..5d08441 --- /dev/null +++ b/tests/Unit/RouterTest.php @@ -0,0 +1,90 @@ +<?php + +declare(strict_types=1); + +use Lightscale\Router\Enums\PathSegmentType; +use Lightscale\Router\PathSegment; +use Lightscale\Router\Router; + +it('initializes') + ->expect(fn () => new Router()) + ->toBeInstanceOf(Router::class); + +it('has root') + ->expect(fn () => (new Router())->root()) + ->toBeInstanceOf(PathSegment::class) + ->getType()->toBe(PathSegmentType::Root); + +it('finds root segment with :dataset path', function (string $path) { + $router = new Router(); + expect($router->findSegment($path))->segment->toBe($router->root()); +})->with(['', '/']); + +it('finds segment one level', function () { + $router = new Router(); + $c1 = $router->root()->child($p1 = 'test1'); + $c2 = $router->root()->child($p2 = 'test2'); + + expect($router->findSegment("/{$p1}"))->segment->toBe($c1); + expect($router->findSegment("/{$p2}"))->segment->toBe($c2); +}); + +it('finds segment one level parameter', function () { + $router = new Router(); + $c1 = $router->root()->child('test2', PathSegmentType::Parameter); + + expect($router->findSegment('/anything')) + ->segment->toBe($c1) + ->parameters->{'test2'}->toBe('anything'); +}); + +it('finds segment one falls back to parameter', function () { + $router = new Router(); + $c1 = $router->root()->child($p1 = 'test1'); + $c2 = $router->root()->child('test2', PathSegmentType::Parameter); + + expect($router->findSegment("/{$p1}"))->segment->toBe($c1); + expect($router->findSegment('/anything')) + ->segment->toBe($c2) + ->parameters->{'test2'}->toBe('anything'); +}); + +it('finds segments in complex routes', function () { + $router = new Router(); + + $r = $router->root(); + + $s1 = $r->child('level1-1')->child('level2-1'); + $s2 = $r->child('level1-1')->child('level2-2'); + $s3 = $r->child('level1-2')->child('level2-3'); + $s4 = $r->child('level1-1')->child('level2-2')->child('level3-1'); + $s5 = $r->child('level1-1'); + $s6 = $r->child('level1-3')->child('level2-4', PathSegmentType::Parameter); + $s7 = $s6->child('level3-2'); + $s8 = $s6->child('level3-3'); + + expect($router->findSegment('/level1-1')?->segment)->toBe($s5); + expect($router->findSegment('/level1-2/level2-3')?->segment)->toBe($s3); + expect($router->findSegment('/level1-1/level2-2/level3-1')?->segment)->toBe($s4); + expect($router->findSegment('/level1-1/level2-1')?->segment)->toBe($s1); + expect($router->findSegment('/level1-1/level2-2')?->segment)->toBe($s2); + expect($router->findSegment('/level1-3/param1')) + ->segment->toBe($s6) + ->parameters->{'level2-4'}->toBe('param1'); + expect($router->findSegment('/level1-3/param2/level3-2')) + ->segment->toBe($s7) + ->parameters->{'level2-4'}->toBe('param2'); + expect($router->findSegment('/level1-3/param3/level3-3')) + ->segment->toBe($s8) + ->parameters->{'level2-4'}->toBe('param3'); +}); + +it('return null when segment not found', function () { + $router = new Router(); + $r = $router->root(); + $r->child('level1-1')->child('level2-1'); + $r->child('level1-1')->child('level2-2'); + $r->child('level1-2')->child('level2-3'); + + expect($router->findSegment('/testing/testing'))->toBeNull(); +}); |
