route_translator 3.2.4 → 4.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/route_translator.rb +5 -5
- data/lib/route_translator/extensions/action_controller.rb +15 -21
- data/lib/route_translator/extensions/mapper.rb +6 -1
- data/lib/route_translator/host.rb +6 -10
- data/lib/route_translator/translator.rb +41 -19
- data/lib/route_translator/version.rb +1 -1
- data/test/dummy/Rakefile +7 -0
- data/test/dummy/app/controllers/dummy_controller.rb +6 -0
- data/test/dummy/app/views/dummy/show.html.erb +1 -0
- data/test/dummy/config/application.rb +7 -0
- data/test/dummy/config/locales/all.yml +3 -0
- data/test/dummy/config/routes.rb +4 -1
- data/test/host_test.rb +33 -24
- data/test/integration/generated_path_test.rb +37 -0
- data/test/{integration_test.rb → integration/host_locales_test.rb} +19 -30
- data/test/integration/routing_test.rb +22 -0
- data/test/integration/thread_safety_test.rb +16 -0
- data/test/routing_test.rb +93 -65
- data/test/support/assertion_helper.rb +27 -0
- data/test/support/configuration_helper.rb +51 -0
- data/test/support/i18n_helper.rb +24 -0
- data/test/support/integration_helper.rb +6 -0
- data/test/support/routes_helper.rb +60 -0
- data/test/test_helper.rb +3 -96
- metadata +54 -24
- data/test/dummy/config/initializers/route_translator.rb +0 -4
@@ -0,0 +1,22 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
require File.expand_path('../../test_helper', __FILE__)
|
3
|
+
|
4
|
+
class RoutingTest < integration_test_suite_parent_class
|
5
|
+
|
6
|
+
include RouteTranslator::ConfigurationHelper
|
7
|
+
|
8
|
+
def test_set_locale_from_params
|
9
|
+
config_default_locale_settings 'en'
|
10
|
+
|
11
|
+
get '/es/dummy'
|
12
|
+
assert_equal 'es', @response.body
|
13
|
+
assert_response :success
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_mounted_apps_work_with_correct_path
|
17
|
+
get '/dummy_mounted_app'
|
18
|
+
assert_equal "Good", @response.body
|
19
|
+
assert_response :success
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
require File.expand_path('../../test_helper', __FILE__)
|
3
|
+
|
4
|
+
class ThreadSafetyTest < integration_test_suite_parent_class
|
5
|
+
|
6
|
+
include RouteTranslator::ConfigurationHelper
|
7
|
+
|
8
|
+
def test_i18n_locale_thread_safe
|
9
|
+
config_default_locale_settings 'en'
|
10
|
+
get '/es/dummy'
|
11
|
+
assert_equal 'es', @response.body
|
12
|
+
|
13
|
+
assert_equal :en, I18n.locale
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
data/test/routing_test.rb
CHANGED
@@ -1,31 +1,29 @@
|
|
1
1
|
#encoding: utf-8
|
2
|
-
require File.expand_path(
|
2
|
+
require File.expand_path('../test_helper', __FILE__)
|
3
3
|
|
4
4
|
class PeopleController < ActionController::Base; end
|
5
5
|
class ProductsController < ActionController::Base; end
|
6
6
|
|
7
7
|
class TranslateRoutesTest < ActionController::TestCase
|
8
|
+
|
8
9
|
include ActionDispatch::Assertions::RoutingAssertions
|
9
|
-
include RouteTranslator::
|
10
|
+
include RouteTranslator::AssertionHelper
|
11
|
+
include RouteTranslator::ConfigurationHelper
|
12
|
+
include RouteTranslator::I18nHelper
|
13
|
+
include RouteTranslator::RoutesHelper
|
10
14
|
|
11
15
|
def setup
|
16
|
+
setup_config
|
17
|
+
setup_i18n
|
12
18
|
@routes = ActionDispatch::Routing::RouteSet.new
|
13
|
-
I18n.backend = I18n::Backend::Simple.new
|
14
|
-
I18n.load_path = [ File.expand_path('../locales/routes.yml', __FILE__) ]
|
15
|
-
I18n.reload!
|
16
19
|
end
|
17
20
|
|
18
21
|
def teardown
|
19
|
-
|
20
|
-
|
21
|
-
config_generate_unlocalized_routes false
|
22
|
-
config_default_locale_settings("en")
|
23
|
-
config_generate_unnamed_unlocalized_routes false
|
24
|
-
config_host_locales({})
|
22
|
+
teardown_i18n
|
23
|
+
teardown_config
|
25
24
|
end
|
26
25
|
|
27
26
|
def test_unnamed_root_route
|
28
|
-
config_default_locale_settings 'en'
|
29
27
|
draw_routes do
|
30
28
|
localized do
|
31
29
|
root :to => 'people#index'
|
@@ -141,8 +139,6 @@ class TranslateRoutesTest < ActionController::TestCase
|
|
141
139
|
end
|
142
140
|
|
143
141
|
def test_unnamed_untranslated_route
|
144
|
-
config_default_locale_settings 'en'
|
145
|
-
|
146
142
|
draw_routes do
|
147
143
|
localized do
|
148
144
|
get 'foo', :to => 'people#index'
|
@@ -169,7 +165,6 @@ class TranslateRoutesTest < ActionController::TestCase
|
|
169
165
|
end
|
170
166
|
|
171
167
|
def test_unnamed_translated_route_on_non_default_locale
|
172
|
-
config_default_locale_settings 'en'
|
173
168
|
draw_routes do
|
174
169
|
localized do
|
175
170
|
get 'people', :to => 'people#index'
|
@@ -181,8 +176,6 @@ class TranslateRoutesTest < ActionController::TestCase
|
|
181
176
|
end
|
182
177
|
|
183
178
|
def test_named_translated_route_with_prefix_must_have_locale_as_static_segment
|
184
|
-
config_default_locale_settings 'en'
|
185
|
-
|
186
179
|
draw_routes do
|
187
180
|
localized do
|
188
181
|
get 'people', :to => 'people#index'
|
@@ -259,12 +252,9 @@ class TranslateRoutesTest < ActionController::TestCase
|
|
259
252
|
end
|
260
253
|
end
|
261
254
|
|
262
|
-
config_default_locale_settings 'en'
|
263
|
-
|
264
255
|
assert_routing '/people', :controller => 'people', :action => 'index', :locale => 'en'
|
265
256
|
assert_routing '/es/gente', :controller => 'people', :action => 'index', :locale => 'es'
|
266
257
|
|
267
|
-
|
268
258
|
assert_helpers_include :people_en, :people_es, :people
|
269
259
|
end
|
270
260
|
|
@@ -309,8 +299,6 @@ class TranslateRoutesTest < ActionController::TestCase
|
|
309
299
|
end
|
310
300
|
|
311
301
|
def test_i18n_based_translations_setting_locales
|
312
|
-
config_default_locale_settings 'en'
|
313
|
-
|
314
302
|
draw_routes do
|
315
303
|
localized do
|
316
304
|
get 'people', :to => 'people#index', :as => 'people'
|
@@ -325,21 +313,24 @@ class TranslateRoutesTest < ActionController::TestCase
|
|
325
313
|
end
|
326
314
|
|
327
315
|
def test_translations_depend_on_available_locales
|
328
|
-
|
316
|
+
available_locales = I18n.available_locales
|
317
|
+
begin
|
318
|
+
I18n.available_locales = [:es, :en, :fr]
|
329
319
|
|
330
|
-
I18n.stub(:available_locales, [:es, :en, :fr]) do
|
331
320
|
draw_routes do
|
332
321
|
localized do
|
333
322
|
get 'people', :to => 'people#index', :as => 'people'
|
334
323
|
end
|
335
324
|
end
|
336
|
-
end
|
337
325
|
|
338
|
-
|
339
|
-
|
340
|
-
|
326
|
+
assert_routing '/fr/people', :controller => 'people', :action => 'index', :locale => 'fr'
|
327
|
+
assert_routing '/es/gente', :controller => 'people', :action => 'index', :locale => 'es'
|
328
|
+
assert_routing '/people', :controller => 'people', :action => 'index', :locale => 'en'
|
341
329
|
|
342
|
-
|
330
|
+
assert_helpers_include :people_fr, :people_en, :people_es, :people
|
331
|
+
ensure
|
332
|
+
I18n.available_locales = available_locales
|
333
|
+
end
|
343
334
|
end
|
344
335
|
|
345
336
|
def test_2_localized_blocks
|
@@ -371,8 +362,6 @@ class TranslateRoutesTest < ActionController::TestCase
|
|
371
362
|
end
|
372
363
|
|
373
364
|
def test_force_locale
|
374
|
-
I18n.locale = 'en'
|
375
|
-
config_default_locale_settings 'en'
|
376
365
|
config_force_locale true
|
377
366
|
|
378
367
|
draw_routes do
|
@@ -385,14 +374,13 @@ class TranslateRoutesTest < ActionController::TestCase
|
|
385
374
|
assert_unrecognized_route '/people', :controller => 'people', :action => 'index'
|
386
375
|
assert_equal '/en/people', @routes.url_helpers.people_en_path
|
387
376
|
assert_equal '/en/people', @routes.url_helpers.people_path
|
388
|
-
I18n.
|
389
|
-
|
390
|
-
|
377
|
+
I18n.with_locale :es do
|
378
|
+
# The dynamic route maps to the current locale
|
379
|
+
assert_equal '/es/gente', @routes.url_helpers.people_path
|
380
|
+
end
|
391
381
|
end
|
392
382
|
|
393
383
|
def test_generate_unlocalized_routes
|
394
|
-
I18n.locale = 'en'
|
395
|
-
config_default_locale_settings 'en'
|
396
384
|
config_generate_unlocalized_routes true
|
397
385
|
|
398
386
|
draw_routes do
|
@@ -405,14 +393,14 @@ class TranslateRoutesTest < ActionController::TestCase
|
|
405
393
|
assert_routing '/people', :controller => 'people', :action => 'index'
|
406
394
|
assert_equal '/en/people', @routes.url_helpers.people_en_path
|
407
395
|
assert_equal '/people', @routes.url_helpers.people_path
|
408
|
-
|
409
|
-
|
410
|
-
|
396
|
+
|
397
|
+
I18n.with_locale :es do
|
398
|
+
# The dynamic route maps to the default locale, not the current
|
399
|
+
assert_equal '/people', @routes.url_helpers.people_path
|
400
|
+
end
|
411
401
|
end
|
412
402
|
|
413
403
|
def test_generate_unnamed_unlocalized_routes
|
414
|
-
I18n.locale = 'en'
|
415
|
-
config_default_locale_settings 'en'
|
416
404
|
config_generate_unnamed_unlocalized_routes true
|
417
405
|
|
418
406
|
draw_routes do
|
@@ -426,28 +414,48 @@ class TranslateRoutesTest < ActionController::TestCase
|
|
426
414
|
assert_equal '/en/people', @routes.url_helpers.people_en_path
|
427
415
|
assert_equal '/en/people', @routes.url_helpers.people_path
|
428
416
|
|
429
|
-
I18n.
|
430
|
-
|
431
|
-
|
417
|
+
I18n.with_locale :es do
|
418
|
+
# The dynamic route maps to the current locale
|
419
|
+
assert_equal '/es/gente', @routes.url_helpers.people_path
|
420
|
+
end
|
432
421
|
end
|
433
422
|
|
434
423
|
def test_blank_localized_routes
|
435
|
-
I18n.locale = 'en'
|
436
|
-
config_default_locale_settings 'en'
|
437
|
-
|
438
424
|
draw_routes do
|
439
425
|
localized do
|
440
426
|
get 'people/blank', :to => 'people#index', :as => 'people'
|
441
427
|
end
|
442
428
|
end
|
443
429
|
|
444
|
-
I18n.
|
445
|
-
|
446
|
-
|
430
|
+
I18n.with_locale :en do
|
431
|
+
assert_routing '/people/blank', :controller => 'people', :action => 'index', :locale => 'en'
|
432
|
+
assert_equal '/people/blank', @routes.url_helpers.people_en_path
|
433
|
+
end
|
447
434
|
|
448
|
-
I18n.
|
449
|
-
|
450
|
-
|
435
|
+
I18n.with_locale :es do
|
436
|
+
assert_routing '/es/gente', :controller => 'people', :action => 'index', :locale => 'es'
|
437
|
+
assert_equal '/es/gente', @routes.url_helpers.people_es_path
|
438
|
+
end
|
439
|
+
end
|
440
|
+
|
441
|
+
def test_path_helper_arguments
|
442
|
+
config_default_locale_settings 'es'
|
443
|
+
I18n.with_locale :es do
|
444
|
+
config_host_locales({ '*.es' => 'es', '*.com' => 'en' })
|
445
|
+
|
446
|
+
draw_routes do
|
447
|
+
localized do
|
448
|
+
resources :products
|
449
|
+
end
|
450
|
+
end
|
451
|
+
|
452
|
+
assert_equal '/productos', @routes.url_helpers.products_path
|
453
|
+
assert_equal '/productos/some_product', @routes.url_helpers.product_path('some_product')
|
454
|
+
assert_equal '/productos/some_product?some=param', @routes.url_helpers.product_path('some_product', :some => 'param')
|
455
|
+
assert_equal '/en/products', @routes.url_helpers.products_path(:locale => 'en')
|
456
|
+
assert_equal '/en/products/some_product', @routes.url_helpers.product_path('some_product', :locale => 'en')
|
457
|
+
assert_equal '/en/products/some_product?some=param', @routes.url_helpers.product_path('some_product', :locale => 'en', :some => 'param')
|
458
|
+
end
|
451
459
|
end
|
452
460
|
|
453
461
|
def test_dont_add_locale_to_routes_if_local_param_present
|
@@ -467,7 +475,6 @@ class TranslateRoutesTest < ActionController::TestCase
|
|
467
475
|
end
|
468
476
|
|
469
477
|
def test_config_hide_locale
|
470
|
-
config_default_locale_settings 'en'
|
471
478
|
config_hide_locale true
|
472
479
|
|
473
480
|
draw_routes do
|
@@ -510,17 +517,40 @@ class TranslateRoutesTest < ActionController::TestCase
|
|
510
517
|
def test_action_view_gets_locale_suffix_helper
|
511
518
|
ActionView::Base.instance_methods.include?('locale_suffix')
|
512
519
|
end
|
520
|
+
|
521
|
+
# See https://github.com/enriclluelles/route_translator/issues/69
|
522
|
+
def test_no_side_effects
|
523
|
+
draw_routes do
|
524
|
+
localized do
|
525
|
+
resources :people
|
526
|
+
end
|
527
|
+
|
528
|
+
scope "(:locale)", :locale => /(en|es)/ do
|
529
|
+
get '*id' => 'products#show', :as => 'product'
|
530
|
+
end
|
531
|
+
end
|
532
|
+
|
533
|
+
assert_routing '/es/gente', :controller => 'people', :action => 'index', :locale => 'es'
|
534
|
+
assert_routing '/people', :controller => 'people', :action => 'index', :locale => 'en'
|
535
|
+
|
536
|
+
assert_routing '/es/path/to/a/product', :controller => 'products', :action => 'show', :locale => 'es', :id => 'path/to/a/product'
|
537
|
+
assert_routing '/path/to/another/product', :controller => 'products', :action => 'show', :id => 'path/to/another/product'
|
538
|
+
end
|
539
|
+
|
513
540
|
end
|
514
541
|
|
515
542
|
class ProductsControllerTest < ActionController::TestCase
|
543
|
+
|
544
|
+
include RouteTranslator::ConfigurationHelper
|
545
|
+
include RouteTranslator::I18nHelper
|
516
546
|
include ActionDispatch::Assertions::RoutingAssertions
|
517
|
-
include RouteTranslator::
|
547
|
+
include RouteTranslator::RoutesHelper
|
518
548
|
|
519
549
|
def setup
|
550
|
+
setup_config
|
551
|
+
setup_i18n
|
552
|
+
|
520
553
|
@routes = ActionDispatch::Routing::RouteSet.new
|
521
|
-
I18n.backend = I18n::Backend::Simple.new
|
522
|
-
I18n.load_path = [ File.expand_path('../locales/routes.yml', __FILE__) ]
|
523
|
-
I18n.reload!
|
524
554
|
|
525
555
|
config_default_locale_settings 'es'
|
526
556
|
config_host_locales({:es => 'es'})
|
@@ -533,19 +563,17 @@ class ProductsControllerTest < ActionController::TestCase
|
|
533
563
|
end
|
534
564
|
|
535
565
|
def teardown
|
536
|
-
|
537
|
-
|
538
|
-
config_generate_unlocalized_routes false
|
539
|
-
config_default_locale_settings("en")
|
540
|
-
config_generate_unnamed_unlocalized_routes false
|
541
|
-
config_host_locales({})
|
566
|
+
teardown_i18n
|
567
|
+
teardown_config
|
542
568
|
end
|
543
569
|
|
544
570
|
def test_url_helpers_are_included
|
545
571
|
#doing it this way because assert_nothing_raised doesn't work on all rails versions
|
572
|
+
controller = ProductsController.new
|
573
|
+
controller.request = OpenStruct.new(:host => 'example.com') # mocking request
|
546
574
|
%w(product_path product_url product_es_path product_es_url product_native_es_path product_native_es_url).each do |method|
|
547
575
|
begin
|
548
|
-
send(method)
|
576
|
+
controller.send(method)
|
549
577
|
rescue Exception => e
|
550
578
|
raise e if e.is_a?(NameError) #swallow anything that isn't a NameError
|
551
579
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
|
2
|
+
module RouteTranslator
|
3
|
+
module AssertionHelper
|
4
|
+
|
5
|
+
def assert_helpers_include(*helpers)
|
6
|
+
controller = ActionController::Base.new
|
7
|
+
view = ActionView::Base.new
|
8
|
+
helpers.each do |helper|
|
9
|
+
['url', 'path'].each do |suffix|
|
10
|
+
[controller, view].each { |obj| assert_respond_to obj, "#{helper}_#{suffix}".to_sym }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
# Hack for compatibility between Rails 4 and Rails 3
|
16
|
+
def assert_unrecognized_route(route_path, options)
|
17
|
+
assert_raise ActionController::RoutingError do
|
18
|
+
begin
|
19
|
+
assert_routing route_path, options
|
20
|
+
rescue Minitest::Assertion => m
|
21
|
+
raise ActionController::RoutingError.new("")
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
|
2
|
+
module RouteTranslator
|
3
|
+
module ConfigurationHelper
|
4
|
+
|
5
|
+
def config_reset
|
6
|
+
config_force_locale false
|
7
|
+
config_hide_locale false
|
8
|
+
config_generate_unlocalized_routes false
|
9
|
+
config_generate_unnamed_unlocalized_routes false
|
10
|
+
config_host_locales(host_locales_config_hash)
|
11
|
+
|
12
|
+
config_default_locale_settings(:en)
|
13
|
+
end
|
14
|
+
|
15
|
+
alias :setup_config :config_reset
|
16
|
+
alias :teardown_config :config_reset
|
17
|
+
|
18
|
+
def config_default_locale_settings(locale)
|
19
|
+
I18n.default_locale = locale
|
20
|
+
end
|
21
|
+
|
22
|
+
def config_force_locale(boolean)
|
23
|
+
RouteTranslator.config.force_locale = boolean
|
24
|
+
end
|
25
|
+
|
26
|
+
def config_hide_locale(boolean)
|
27
|
+
RouteTranslator.config.hide_locale = boolean
|
28
|
+
end
|
29
|
+
|
30
|
+
def config_generate_unlocalized_routes(boolean)
|
31
|
+
RouteTranslator.config.generate_unlocalized_routes = boolean
|
32
|
+
end
|
33
|
+
|
34
|
+
def config_generate_unnamed_unlocalized_routes(boolean)
|
35
|
+
RouteTranslator.config.generate_unnamed_unlocalized_routes = boolean
|
36
|
+
end
|
37
|
+
|
38
|
+
def config_host_locales(hash)
|
39
|
+
RouteTranslator.config.host_locales = hash
|
40
|
+
end
|
41
|
+
|
42
|
+
def host_locales_config_hash
|
43
|
+
if RUBY_VERSION < '1.9'
|
44
|
+
::ActiveSupport::OrderedHash.new
|
45
|
+
else
|
46
|
+
::Hash.new
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
|
2
|
+
module RouteTranslator
|
3
|
+
module I18nHelper
|
4
|
+
|
5
|
+
def setup_i18n
|
6
|
+
@i18n_backend = I18n.backend
|
7
|
+
@i18n_load_path = I18n.load_path
|
8
|
+
|
9
|
+
I18n.locale = I18n.default_locale
|
10
|
+
I18n.backend = I18n::Backend::Simple.new
|
11
|
+
I18n.load_path = [ File.expand_path('../../locales/routes.yml', __FILE__) ]
|
12
|
+
|
13
|
+
I18n.reload!
|
14
|
+
end
|
15
|
+
|
16
|
+
def teardown_i18n
|
17
|
+
I18n.backend = @i18n_backend
|
18
|
+
I18n.load_path = @i18n_load_path
|
19
|
+
|
20
|
+
I18n.reload!
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|