summaryrefslogtreecommitdiff
path: root/tests/Unit/RouterTest.php
blob: 5d084411353867ad900ccd4edac16fa5a746135b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
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();
});