allow only the site locales to be passed as a query string parameter (?locale=<locale>)
did
committed Mar 08, 2017
commit ac021b95c593064badd58a37c5904c69ba0502e3
Showing 6
changed files with
67 additions
and 7 deletions
Gemfile
+3
-3
| @@ | @@ -31,10 +31,10 @@ group :test do |
| gem 'rack-test', '~> 0.6.3' | |
| - | gem 'codeclimate-test-reporter', '~> 0.4.7', require: false |
| - | gem 'coveralls', '~> 0.8.1', require: false |
| + | gem 'codeclimate-test-reporter', '~> 0.4.7', require: false |
| + | gem 'coveralls', '~> 0.8.1', require: false |
| end | |
| platform :ruby do | |
| - | ruby '2.3.0' |
| + | ruby '2.3.3' |
| end | |
Gemfile.lock
+2
-2
| @@ | @@ -217,7 +217,7 @@ DEPENDENCIES |
| timecop (~> 0.8.0) | |
| RUBY VERSION | |
| - | ruby 2.3.0p0 |
| + | ruby 2.3.3p222 |
| BUNDLED WITH | |
| - | 1.12.5 |
| + | 1.14.6 |
locomotive/steam/middlewares/locale.rb b/lib/locomotive/steam/middlewares/locale.rb
+5
-1
| @@ | @@ -28,7 +28,7 @@ module Locomotive::Steam |
| protected | |
| def extract_locale | |
| - | _locale = params[:locale] || default_locale |
| + | _locale = locale_from_params || default_locale |
| _path = request.path_info | |
| if _path =~ /^\/(#{site.locales.join('|')})+(\/|$)/ | |
| @@ | @@ -44,6 +44,10 @@ module Locomotive::Steam |
| env['steam.locale'] = services.locale = _locale | |
| end | |
| + | def locale_from_params |
| + | locales.include?(params[:locale]) ? params[:locale] : nil |
| + | end |
| + | |
| end | |
| end | |
| end | |
locomotive/steam/middlewares/renderer.rb b/lib/locomotive/steam/middlewares/renderer.rb
+1
-1
| @@ | @@ -20,7 +20,7 @@ module Locomotive::Steam |
| redirect_to(page.redirect_url, page.redirect_type) | |
| else | |
| content = parse_and_render_liquid | |
| - | render_response(content, page.not_found? ? 404: 200, page.response_type) |
| + | render_response(content, page.not_found? ? 404 : 200, page.response_type) |
| end | |
| end | |
locomotive/steam/middlewares/thread_safe.rb b/lib/locomotive/steam/middlewares/thread_safe.rb
+4
-0
| @@ | @@ -57,6 +57,10 @@ module Locomotive::Steam::Middlewares |
| @liquid_assigns ||= env.fetch('steam.liquid_assigns') | |
| end | |
| + | def locales |
| + | site.locales |
| + | end |
| + | |
| def default_locale | |
| site.default_locale | |
| end | |
spec/unit/middlewares/locale_spec.rb
+52
-0
| @@ | @@ -0,0 +1,52 @@ |
| + | require 'spec_helper' |
| + | |
| + | require_relative '../../../lib/locomotive/steam/middlewares/thread_safe' |
| + | require_relative '../../../lib/locomotive/steam/middlewares/helpers' |
| + | require_relative '../../../lib/locomotive/steam/middlewares/locale' |
| + | |
| + | describe Locomotive::Steam::Middlewares::Locale do |
| + | |
| + | let(:site) { instance_double('Site', default_locale: :de, locales: %w(de fr)) } |
| + | let(:url) { 'http://models.example.com' } |
| + | let(:app) { ->(env) { [200, env, 'app'] } } |
| + | let(:services) { instance_double('Services', :locale= => 'en') } |
| + | let(:middleware) { Locomotive::Steam::Middlewares::Locale.new(app) } |
| + | |
| + | subject do |
| + | env = env_for(url, 'steam.site' => site) |
| + | env['steam.request'] = Rack::Request.new(env) |
| + | env['steam.services'] = services |
| + | code, env = middleware.call(env) |
| + | env['steam.locale'] |
| + | end |
| + | |
| + | describe 'locale asked in the request params' do |
| + | |
| + | context 'the locale is blank' do |
| + | |
| + | let(:url) { 'http://models.example.com?locale=' } |
| + | |
| + | it { is_expected.to eq :de } |
| + | |
| + | end |
| + | |
| + | context 'the locale exists' do |
| + | |
| + | let(:url) { 'http://models.example.com?locale=fr' } |
| + | |
| + | it { is_expected.to eq 'fr' } |
| + | |
| + | end |
| + | |
| + | context 'the locale is unknown' do |
| + | |
| + | let(:url) { 'http://models.example.com?locale=onload' } |
| + | |
| + | it { is_expected.to eq :de } |
| + | |
| + | end |
| + | |
| + | |
| + | end |
| + | |
| + | end |