summaryrefslogtreecommitdiff
path: root/tests/Unit/RouterTest.php
diff options
context:
space:
mode:
authorSam Light <sam@lightscale.co.uk>2026-06-10 19:00:32 +0100
committerSam Light <sam@lightscale.co.uk>2026-06-10 19:00:32 +0100
commit5fe7c87967ff29c4a8f03a9186918d8359f4887e (patch)
treedfdd4fdc7a4e96266305f82f5846750ab2efabc9 /tests/Unit/RouterTest.php
parent01eac9658c3bc486d2d42a18557fdb82a536348e (diff)
big update
Diffstat (limited to 'tests/Unit/RouterTest.php')
-rw-r--r--tests/Unit/RouterTest.php90
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();
+});