Skip to content

Commit 85ab5ba

Browse files
committed
Implement expected Route::is() behavior with Route::isLocalized()
1 parent 6695309 commit 85ab5ba

File tree

2 files changed

+239
-2
lines changed

2 files changed

+239
-2
lines changed

src/Macros/IsLocalizedMacro.php

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace CodeZero\LocalizedRoutes\Macros;
44

55
use CodeZero\LocalizedRoutes\LocalizedUrlGenerator;
6+
use Illuminate\Support\Collection;
67
use Illuminate\Support\Facades\App;
78
use Illuminate\Support\Facades\Route;
89

@@ -15,8 +16,21 @@ class IsLocalizedMacro
1516
*/
1617
public static function register()
1718
{
18-
Route::macro('isLocalized', function () {
19-
return App::make(LocalizedUrlGenerator::class)->isLocalized();
19+
Route::macro('isLocalized', function ($patterns = null, $locales = '*') {
20+
if ($patterns === null) {
21+
return App::make(LocalizedUrlGenerator::class)->isLocalized();
22+
}
23+
24+
$locales = Collection::make($locales);
25+
$names = Collection::make();
26+
27+
Collection::make($patterns)->each(function ($name) use ($locales, $names) {
28+
Collection::make($locales)->each(function ($locale) use ($name, $names) {
29+
$names->push($locale . '.' . $name);
30+
});
31+
});
32+
33+
return Route::is($names->all());
2034
});
2135
}
2236
}
Lines changed: 223 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,223 @@
1+
<?php
2+
3+
namespace CodeZero\LocalizedRoutes\Tests\Unit\Macros;
4+
5+
use CodeZero\LocalizedRoutes\Tests\TestCase;
6+
use Illuminate\Support\Facades\Route;
7+
8+
class IsLocalizedMacroTest extends TestCase
9+
{
10+
/** @test */
11+
public function it_checks_if_the_current_route_is_localized()
12+
{
13+
$this->withoutExceptionHandling();
14+
$this->setSupportedLocales(['en', 'nl']);
15+
16+
Route::localized(function () {
17+
Route::get('localized-route', function () {
18+
return Route::isLocalized();
19+
})->middleware(['web']);
20+
});
21+
22+
Route::get('non-localized-route', function () {
23+
return Route::isLocalized();
24+
})->middleware(['web']);
25+
26+
$response = $this->call('GET', '/en/localized-route');
27+
$response->assertOk();
28+
$this->assertEquals(true, $response->original);
29+
30+
$response = $this->call('GET', '/nl/localized-route');
31+
$response->assertOk();
32+
$this->assertEquals(true, $response->original);
33+
34+
$response = $this->call('GET', '/non-localized-route');
35+
$response->assertOk();
36+
$this->assertEquals(false, $response->original);
37+
}
38+
39+
/** @test */
40+
public function it_checks_if_the_current_route_has_a_name_with_any_locale_prefix()
41+
{
42+
$this->withoutExceptionHandling();
43+
$this->setSupportedLocales(['en', 'nl']);
44+
45+
Route::localized(function () {
46+
Route::get('route-one', function () {
47+
return Route::isLocalized('route-one');
48+
})->name('route-one')->middleware(['web']);
49+
50+
Route::get('route-two', function () {
51+
return Route::isLocalized('route-one');
52+
})->name('route-two')->middleware(['web']);
53+
});
54+
55+
$response = $this->call('GET', '/en/route-one');
56+
$response->assertOk();
57+
$this->assertEquals(true, $response->original);
58+
59+
$response = $this->call('GET', '/nl/route-one');
60+
$response->assertOk();
61+
$this->assertEquals(true, $response->original);
62+
63+
$response = $this->call('GET', '/en/route-two');
64+
$response->assertOk();
65+
$this->assertEquals(false, $response->original);
66+
67+
$response = $this->call('GET', '/nl/route-two');
68+
$response->assertOk();
69+
$this->assertEquals(false, $response->original);
70+
}
71+
72+
/** @test */
73+
public function it_checks_if_the_current_route_has_a_name_with_a_specific_locale_prefix()
74+
{
75+
$this->withoutExceptionHandling();
76+
$this->setSupportedLocales(['en', 'nl']);
77+
78+
Route::localized(function () {
79+
Route::get('route-one', function () {
80+
return Route::isLocalized('route-one', 'en');
81+
})->name('route-one')->middleware(['web']);
82+
});
83+
84+
$response = $this->call('GET', '/en/route-one');
85+
$response->assertOk();
86+
$this->assertEquals(true, $response->original);
87+
88+
$response = $this->call('GET', '/nl/route-one');
89+
$response->assertOk();
90+
$this->assertEquals(false, $response->original);
91+
}
92+
93+
/** @test */
94+
public function it_checks_if_the_current_route_has_a_name_that_is_in_an_array_of_names_with_any_locale_prefix()
95+
{
96+
$this->withoutExceptionHandling();
97+
$this->setSupportedLocales(['en', 'nl']);
98+
99+
Route::localized(function () {
100+
Route::get('route-one', function () {
101+
return Route::isLocalized(['route-one', 'route-two']);
102+
})->name('route-one')->middleware(['web']);
103+
104+
Route::get('route-two', function () {
105+
return Route::isLocalized(['route-one', 'route-two']);
106+
})->name('route-two')->middleware(['web']);
107+
108+
Route::get('route-three', function () {
109+
return Route::isLocalized(['route-one', 'route-two']);
110+
})->name('route-three')->middleware(['web']);
111+
});
112+
113+
$response = $this->call('GET', '/en/route-one');
114+
$response->assertOk();
115+
$this->assertEquals(true, $response->original);
116+
117+
$response = $this->call('GET', '/nl/route-one');
118+
$response->assertOk();
119+
$this->assertEquals(true, $response->original);
120+
121+
$response = $this->call('GET', '/en/route-two');
122+
$response->assertOk();
123+
$this->assertEquals(true, $response->original);
124+
125+
$response = $this->call('GET', '/nl/route-two');
126+
$response->assertOk();
127+
$this->assertEquals(true, $response->original);
128+
129+
$response = $this->call('GET', '/en/route-three');
130+
$response->assertOk();
131+
$this->assertEquals(false, $response->original);
132+
133+
$response = $this->call('GET', '/nl/route-three');
134+
$response->assertOk();
135+
$this->assertEquals(false, $response->original);
136+
}
137+
138+
/** @test */
139+
public function it_checks_if_the_current_route_has_a_name_that_is_in_an_array_of_names_with_a_specific_locale_prefix()
140+
{
141+
$this->withoutExceptionHandling();
142+
$this->setSupportedLocales(['en', 'nl']);
143+
144+
Route::localized(function () {
145+
Route::get('route-one', function () {
146+
return Route::isLocalized(['route-one', 'route-two'], 'en');
147+
})->name('route-one')->middleware(['web']);
148+
149+
Route::get('route-two', function () {
150+
return Route::isLocalized(['route-one', 'route-two'], 'en');
151+
})->name('route-two')->middleware(['web']);
152+
153+
Route::get('route-three', function () {
154+
return Route::isLocalized(['route-one', 'route-two'], 'en');
155+
})->name('route-three')->middleware(['web']);
156+
});
157+
158+
$response = $this->call('GET', '/en/route-one');
159+
$response->assertOk();
160+
$this->assertEquals(true, $response->original);
161+
162+
$response = $this->call('GET', '/nl/route-one');
163+
$response->assertOk();
164+
$this->assertEquals(false, $response->original);
165+
166+
$response = $this->call('GET', '/en/route-two');
167+
$response->assertOk();
168+
$this->assertEquals(true, $response->original);
169+
170+
$response = $this->call('GET', '/nl/route-two');
171+
$response->assertOk();
172+
$this->assertEquals(false, $response->original);
173+
174+
$response = $this->call('GET', '/en/route-three');
175+
$response->assertOk();
176+
$this->assertEquals(false, $response->original);
177+
178+
$response = $this->call('GET', '/nl/route-three');
179+
$response->assertOk();
180+
$this->assertEquals(false, $response->original);
181+
}
182+
183+
/** @test */
184+
public function it_checks_if_the_current_route_has_a_name_with_a_locale_prefix_in_an_array()
185+
{
186+
$this->withoutExceptionHandling();
187+
$this->setSupportedLocales(['en', 'nl', 'fr']);
188+
189+
Route::localized(function () {
190+
Route::get('route-one', function () {
191+
return Route::isLocalized('route-one', ['en', 'nl']);
192+
})->name('route-one')->middleware(['web']);
193+
194+
Route::get('route-two', function () {
195+
return Route::isLocalized('route-one', ['en', 'nl']);
196+
})->name('route-two')->middleware(['web']);
197+
});
198+
199+
$response = $this->call('GET', '/en/route-one');
200+
$response->assertOk();
201+
$this->assertEquals(true, $response->original);
202+
203+
$response = $this->call('GET', '/nl/route-one');
204+
$response->assertOk();
205+
$this->assertEquals(true, $response->original);
206+
207+
$response = $this->call('GET', '/fr/route-one');
208+
$response->assertOk();
209+
$this->assertEquals(false, $response->original);
210+
211+
$response = $this->call('GET', '/en/route-two');
212+
$response->assertOk();
213+
$this->assertEquals(false, $response->original);
214+
215+
$response = $this->call('GET', '/nl/route-two');
216+
$response->assertOk();
217+
$this->assertEquals(false, $response->original);
218+
219+
$response = $this->call('GET', '/fr/route-two');
220+
$response->assertOk();
221+
$this->assertEquals(false, $response->original);
222+
}
223+
}

0 commit comments

Comments
 (0)