Skip to content

Commit 2df25ec

Browse files
committed
improved tests
1 parent 2d22cb5 commit 2df25ec

File tree

9 files changed

+834
-63
lines changed

9 files changed

+834
-63
lines changed

tests/Route/api.phpt

Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
<?php
2+
3+
/**
4+
* Test: Nette\Routing\Route public API methods
5+
*/
6+
7+
declare(strict_types=1);
8+
9+
use Nette\Routing\Route;
10+
use Tester\Assert;
11+
12+
13+
require __DIR__ . '/../bootstrap.php';
14+
15+
16+
test('getMask() returns original mask string', function () {
17+
$route = new Route('<presenter>/<action>/<id>');
18+
Assert::same('<presenter>/<action>/<id>', $route->getMask());
19+
20+
$route = new Route('//example.com/<path>');
21+
Assert::same('//example.com/<path>', $route->getMask());
22+
23+
$route = new Route('index[.html]');
24+
Assert::same('index[.html]', $route->getMask());
25+
});
26+
27+
28+
test('getMask() with complex patterns', function () {
29+
$mask = '<presenter>/<action>[/<id \d+>][/<slug [-a-z]+>]';
30+
$route = new Route($mask);
31+
Assert::same($mask, $route->getMask());
32+
});
33+
34+
35+
test('getMask() with query parameters', function () {
36+
$mask = '<presenter> ? id=<id> & cat=<categoryId>';
37+
$route = new Route($mask);
38+
Assert::same($mask, $route->getMask());
39+
});
40+
41+
42+
test('getMask() with host patterns', function () {
43+
$mask = '//%domain%/<presenter>/<action>';
44+
$route = new Route($mask);
45+
Assert::same($mask, $route->getMask());
46+
});
47+
48+
49+
test('getDefaults() returns all parameters with default values', function () {
50+
$route = new Route('<presenter>/<action>', [
51+
'action' => 'default',
52+
'id' => null,
53+
]);
54+
55+
Assert::same(['action' => 'default', 'id' => null], $route->getDefaults());
56+
});
57+
58+
59+
test('getDefaults() with various default types - converts to strings', function () {
60+
$route = new Route('<presenter>/<action>/<page>', [
61+
'action' => 'view',
62+
'page' => 1,
63+
'lang' => 'en',
64+
'debug' => false,
65+
]);
66+
67+
Assert::same([
68+
'action' => 'view',
69+
'page' => '1',
70+
'lang' => 'en',
71+
'debug' => '0',
72+
], $route->getDefaults());
73+
});
74+
75+
76+
test('getDefaults() excludes parameters without defaults', function () {
77+
$route = new Route('<presenter>/<action>', [
78+
'action' => 'default',
79+
]);
80+
81+
$defaults = $route->getDefaults();
82+
Assert::same(['action' => 'default'], $defaults);
83+
Assert::false(array_key_exists('presenter', $defaults));
84+
});
85+
86+
87+
test('getConstantParameters() returns only fixed constant values', function () {
88+
$route = new Route('api/<version>', [
89+
'module' => 'Api',
90+
'version' => 'v1',
91+
]);
92+
93+
Assert::same(['module' => 'Api'], $route->getConstantParameters());
94+
});
95+
96+
97+
test('getConstantParameters() with multiple constants', function () {
98+
$route = new Route('blog/<slug>', [
99+
'presenter' => 'Blog',
100+
'action' => 'detail',
101+
'module' => 'Front',
102+
]);
103+
104+
Assert::same([
105+
'presenter' => 'Blog',
106+
'action' => 'detail',
107+
'module' => 'Front',
108+
], $route->getConstantParameters());
109+
});
110+
111+
112+
test('getConstantParameters() excludes variable parameters', function () {
113+
$route = new Route('<presenter>/<action=default>/<id>', [
114+
'action' => 'default',
115+
'module' => 'Front',
116+
]);
117+
118+
$constants = $route->getConstantParameters();
119+
Assert::same(['module' => 'Front'], $constants);
120+
Assert::false(array_key_exists('action', $constants));
121+
Assert::false(array_key_exists('presenter', $constants));
122+
Assert::false(array_key_exists('id', $constants));
123+
});
124+
125+
126+
test('getConstantParameters() with empty result', function () {
127+
$route = new Route('<presenter>/<action>', [
128+
'action' => 'default',
129+
]);
130+
131+
Assert::same([], $route->getConstantParameters());
132+
});
133+
134+
135+
test('API methods work together consistently', function () {
136+
$route = new Route('<presenter>/<action=default>/<id>', [
137+
'action' => 'default',
138+
'module' => 'Admin',
139+
'secure' => true,
140+
]);
141+
142+
Assert::same('<presenter>/<action=default>/<id>', $route->getMask());
143+
144+
Assert::same([
145+
'action' => 'default',
146+
'module' => 'Admin',
147+
'secure' => '1',
148+
], $route->getDefaults());
149+
150+
Assert::same([
151+
'module' => 'Admin',
152+
'secure' => '1',
153+
], $route->getConstantParameters());
154+
});

tests/Route/filter.query.phpt

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,49 @@
77
declare(strict_types=1);
88

99
use Nette\Routing\Route;
10+
use Tester\Assert;
1011

1112

1213
require __DIR__ . '/../bootstrap.php';
1314

1415

15-
$route = new Route(' ? action=<presenter>', [
16-
'presenter' => [
17-
Route::FilterIn => fn($s) => strrev($s),
18-
Route::FilterOut => fn($s) => strtoupper(strrev($s)),
19-
],
20-
]);
16+
test('FilterIn and FilterOut work on query parameters', function () {
17+
$route = new Route(' ? action=<presenter>', [
18+
'presenter' => [
19+
Route::FilterIn => fn($s) => strrev($s),
20+
Route::FilterOut => fn($s) => strtoupper(strrev($s)),
21+
],
22+
]);
2123

22-
testRouteIn($route, '/?action=abc', [
23-
'presenter' => 'cba',
24-
'test' => 'testvalue',
25-
], '/?action=ABC&test=testvalue');
24+
testRouteIn($route, '/?action=abc', [
25+
'presenter' => 'cba',
26+
'test' => 'testvalue',
27+
], '/?action=ABC&test=testvalue');
28+
});
29+
30+
31+
test('FilterIn can return non-string value', function () {
32+
$route = new Route('<presenter>', [
33+
'presenter' => [
34+
Route::FilterIn => fn($s) => 123, // Returns int
35+
],
36+
]);
37+
38+
$url = new Nette\Http\UrlScript('http://example.com/test');
39+
$httpRequest = new Nette\Http\Request($url);
40+
41+
$result = $route->match($httpRequest);
42+
Assert::notNull($result);
43+
Assert::same(123, $result['presenter']); // Filter can return any type
44+
});
45+
46+
47+
test('FilterOut returning null rejects URL generation', function () {
48+
$route = new Route('<presenter>', [
49+
'presenter' => [
50+
Route::FilterOut => fn($s) => null,
51+
],
52+
]);
53+
54+
Assert::null(testRouteOut($route, ['presenter' => 'test']));
55+
});

tests/Route/filterTable.url.phpt

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,23 +12,28 @@ use Nette\Routing\Route;
1212
require __DIR__ . '/../bootstrap.php';
1313

1414

15-
$route = new Route('<presenter>', [
16-
'presenter' => [
17-
Route::FilterTable => [
18-
'produkt' => 'product',
19-
'kategorie' => 'category',
20-
'zakaznik' => 'customer',
21-
'kosik' => 'basket',
15+
test('FilterTable translates values bidirectionally', function () {
16+
$route = new Route('<lang>', [
17+
'lang' => [
18+
Route::FilterTable => [
19+
'cs' => 'czech',
20+
'en' => 'english',
21+
],
2222
],
23-
],
24-
]);
25-
26-
testRouteIn($route, '/kategorie/', [
27-
'presenter' => 'category',
28-
'test' => 'testvalue',
29-
], '/kategorie?test=testvalue');
30-
31-
testRouteIn($route, '/other/', [
32-
'presenter' => 'other',
33-
'test' => 'testvalue',
34-
], '/other?test=testvalue');
23+
]);
24+
25+
// URL value 'cs' is translated to 'czech' in params
26+
testRouteIn($route, '/cs', [
27+
'lang' => 'czech',
28+
'test' => 'testvalue',
29+
], '/cs?test=testvalue');
30+
31+
// Param value 'czech' is translated back to 'cs' in URL
32+
Assert::same('http://example.com/cs', testRouteOut($route, ['lang' => 'czech']));
33+
34+
// Non-table values pass through unchanged
35+
testRouteIn($route, '/de', [
36+
'lang' => 'de',
37+
'test' => 'testvalue',
38+
], '/de?test=testvalue');
39+
});

tests/Route/fooParameter.phpt

Lines changed: 48 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,56 @@ use Nette\Routing\Route;
1212
require __DIR__ . '/../bootstrap.php';
1313

1414

15-
$route = new Route('index<?.xml>/', [
16-
'presenter' => 'defaultPresenter',
17-
]);
15+
test('basic foo parameter with single extension', function () {
16+
$route = new Route('index<?.xml>/', [
17+
'presenter' => 'defaultPresenter',
18+
]);
1819

20+
testRouteIn($route, '/index.');
1921

20-
testRouteIn($route, '/index.');
22+
testRouteIn($route, '/index.xml', [
23+
'presenter' => 'defaultPresenter',
24+
'test' => 'testvalue',
25+
], '/index.xml/?test=testvalue');
2126

22-
testRouteIn($route, '/index.xml', [
23-
'presenter' => 'defaultPresenter',
24-
'test' => 'testvalue',
25-
], '/index.xml/?test=testvalue');
27+
testRouteIn($route, '/index.php');
2628

27-
testRouteIn($route, '/index.php');
29+
testRouteIn($route, '/index');
30+
});
2831

29-
testRouteIn($route, '/index');
32+
33+
test('foo parameter with multiple extensions - both required', function () {
34+
$route = new Route('file<?.xml><?.gz>', [
35+
'presenter' => 'File',
36+
]);
37+
38+
testRouteIn($route, '/file.xml.gz', [
39+
'presenter' => 'File',
40+
'test' => 'testvalue',
41+
], '/file.xml.gz?test=testvalue');
42+
43+
// Only .xml doesn't match - both patterns required
44+
testRouteIn($route, '/file.xml');
45+
46+
// No extension doesn't match
47+
testRouteIn($route, '/file');
48+
});
49+
50+
51+
test('foo parameter combined with named parameters', function () {
52+
$route = new Route('<name>[<?.html>]', [
53+
'presenter' => 'Page',
54+
]);
55+
56+
testRouteIn($route, '/about.html', [
57+
'name' => 'about',
58+
'presenter' => 'Page',
59+
'test' => 'testvalue',
60+
], '/about?test=testvalue'); // Foo parameter not generated in URL
61+
62+
testRouteIn($route, '/contact', [
63+
'name' => 'contact',
64+
'presenter' => 'Page',
65+
'test' => 'testvalue',
66+
], '/contact?test=testvalue');
67+
});

0 commit comments

Comments
 (0)