routing-filter 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,25 @@
1
+ require 'test_helper'
2
+ require 'filters/all_filters/generation'
3
+ require 'filters/all_filters/recognition'
4
+
5
+ class AllFiltersTest < Test::Unit::TestCase
6
+ attr_reader :routes, :params, :uuid
7
+
8
+ def setup
9
+ I18n.locale = nil
10
+ I18n.default_locale = :en
11
+ I18n.available_locales = %w(de en)
12
+
13
+ RoutingFilter::Locale.include_default_locale = false
14
+
15
+ @params = { :controller => 'some', :action => 'index' }
16
+ @uuid = 'd00fbbd1-82b6-4c1a-a57d-098d529d6854'
17
+
18
+ @routes = draw_routes do
19
+ filter :uuid, :pagination ,:locale, :extension
20
+ match 'some', :to => 'some#index'
21
+ end
22
+ end
23
+
24
+ include Recognition, Generation
25
+ end
@@ -0,0 +1,54 @@
1
+ require 'test_helper'
2
+
3
+ class ForceExtensionTest < Test::Unit::TestCase
4
+ attr_reader :routes, :params
5
+
6
+ def setup
7
+ @routes = draw_routes do
8
+ filter :extension, :exclude => %r(^/(admin|$))
9
+ match '/', :to => 'some#index'
10
+ match 'some/:id(.:format)', :to => 'some#show'
11
+ match '/admin/some/new', :to => 'some#new'
12
+ end
13
+ @params = { :controller => 'some', :action => 'show', :id => '1' }
14
+ end
15
+
16
+ test 'recognizes the path some/1.html and strips the extension' do
17
+ assert_nil routes.recognize_path('/some/1.html')[:format]
18
+ end
19
+
20
+ test 'recognizes the path some/1.xml but does not strip the extension' do
21
+ assert 'xml', routes.recognize_path('/some/1.xml')[:format]
22
+ end
23
+
24
+ test 'appends the extension .html to the generated path' do
25
+ assert_equal '/some/1.html', routes.generate(params)
26
+ end
27
+
28
+ test 'does not touch existing extensions in generated paths' do
29
+ assert_equal '/some/1.xml', routes.generate(params.merge(:format => 'xml'))
30
+ end
31
+
32
+ test 'does not touch url query params in generated paths' do
33
+ assert_equal '/some/1.html?foo=bar', routes.generate(params.merge(:foo => 'bar'))
34
+ end
35
+
36
+ test 'excludes / by default' do
37
+ assert_equal '/', routes.generate(:controller => 'some', :action => 'index')
38
+ end
39
+
40
+ test 'excludes / by default (with url query params)' do
41
+ assert_equal '/?foo=bar', routes.generate(:controller => 'some', :action => 'index', :foo => 'bar')
42
+ end
43
+
44
+ test 'excludes with custom regexp' do
45
+ assert_equal '/admin/some/new', routes.generate(:controller => 'some', :action => 'new')
46
+ end
47
+
48
+ # TODO - why would anyone want to have this?
49
+ #
50
+ # test 'does not exclude / when :exclude => false was passed' do
51
+ # routes.filters.first.instance_variable_set(:@exclude, false)
52
+ # assert_equal '/.html', routes.generate(:controller => 'some', :action => 'index')
53
+ # end
54
+ end
@@ -0,0 +1,69 @@
1
+ require 'test_helper'
2
+
3
+ class LocaleTest < Test::Unit::TestCase
4
+ attr_reader :routes, :show_params, :index_params
5
+
6
+ def setup
7
+ I18n.locale = nil
8
+ I18n.default_locale = :en
9
+ I18n.available_locales = %w(de en)
10
+
11
+ RoutingFilter::Locale.include_default_locale = true
12
+
13
+ @index_params = { :controller => 'some', :action => 'index' }
14
+ @show_params = { :controller => 'some', :action => 'show', :id => '1' }
15
+
16
+ @routes = draw_routes do
17
+ filter :locale
18
+ match 'products/:id', :to => 'some#show'
19
+ match '/', :to => 'some#index'
20
+ end
21
+ end
22
+
23
+ test 'recognizes the path /en' do
24
+ assert_equal index_params.merge(:locale => 'en'), routes.recognize_path('/en')
25
+ end
26
+
27
+ test 'recognizes the path /en/' do
28
+ assert_equal index_params.merge(:locale => 'en'), routes.recognize_path('/en/')
29
+ end
30
+
31
+ test 'recognizes the path /en/products/1' do
32
+ assert_equal show_params.merge(:locale => 'en'), routes.recognize_path('/en/products/1')
33
+ end
34
+
35
+ test 'recognizes the path /de/products/1' do
36
+ assert_equal show_params.merge(:locale => 'de'), routes.recognize_path('/de/products/1')
37
+ end
38
+
39
+
40
+ test 'prepends the segments /:locale to the generated path / if the current locale is not the default locale' do
41
+ I18n.locale = 'de'
42
+ assert_equal '/de', routes.generate(index_params)
43
+ end
44
+
45
+ test 'prepends the segments /:locale to the generated path /products/1 if the current locale is not the default locale' do
46
+ I18n.locale = 'de'
47
+ assert_equal '/de/products/1', routes.generate(show_params)
48
+ end
49
+
50
+ test 'prepends the segments /:locale to the generated path if it was passed as a param' do
51
+ assert_equal '/de/products/1', routes.generate(show_params.merge(:locale => 'de'))
52
+ end
53
+
54
+ test 'prepends the segments /:locale if the given locale is the default_locale and include_default_locale is true' do
55
+ assert RoutingFilter::Locale.include_default_locale?
56
+ assert_equal '/en/products/1', routes.generate(show_params.merge(:locale => 'en'))
57
+ end
58
+
59
+ test 'does not prepend the segments /:locale if the current locale is the default_locale and include_default_locale is false' do
60
+ I18n.locale = 'en'
61
+ RoutingFilter::Locale.include_default_locale = false
62
+ assert_equal '/products/1', routes.generate(show_params)
63
+ end
64
+
65
+ test 'does not prepend the segments /:locale if the given locale is the default_locale and include_default_locale is false' do
66
+ RoutingFilter::Locale.include_default_locale = false
67
+ assert_equal '/products/1', routes.generate(show_params.merge(:locale => I18n.default_locale))
68
+ end
69
+ end
@@ -0,0 +1,29 @@
1
+ require 'test_helper'
2
+
3
+ class PaginationTest < Test::Unit::TestCase
4
+ attr_reader :routes, :params
5
+
6
+ def setup
7
+ @routes = draw_routes do
8
+ filter :pagination
9
+ match 'some', :to => 'some#index'
10
+ end
11
+ @params = { :controller => 'some', :action => 'index', :page => 2 }
12
+ end
13
+
14
+ test 'recognizes the path some/page/2' do
15
+ assert_equal params, routes.recognize_path('/some/page/2')
16
+ end
17
+
18
+ test 'appends the segments /page/:page to the generated path if the passed :page param does not equal 1' do
19
+ assert_equal '/some/page/2', routes.generate(params)
20
+ end
21
+
22
+ test 'does not append anything to the generated path if the passed :page param equals 1' do
23
+ assert_equal '/some', routes.generate(params.merge(:page => 1))
24
+ end
25
+
26
+ test 'appends the segments /page/:page to the generated path but respects url query params' do
27
+ assert_equal '/some/page/2?foo=bar', routes.generate(params.merge(:foo => 'bar'))
28
+ end
29
+ end
@@ -0,0 +1,40 @@
1
+ require 'test_helper'
2
+
3
+ class UuidTest < Test::Unit::TestCase
4
+ attr_reader :routes, :uuid, :params
5
+
6
+ def setup
7
+ @routes = draw_routes do
8
+ filter :uuid
9
+ match 'some/:id', :to => 'some#show'
10
+ end
11
+ @uuid = 'd00fbbd1-82b6-4c1a-a57d-098d529d6854'
12
+ @params = { :controller => 'some', :action => 'show', :id => '1', :uuid => uuid }
13
+ end
14
+
15
+ test 'recognizes the path :uuid/product/1' do
16
+ assert_equal params, routes.recognize_path("/#{uuid}/some/1")
17
+ end
18
+
19
+ test 'prepends the :uuid segment to the generated path if passed as a param' do
20
+ assert_equal "/#{uuid}/some/1", routes.generate(params)
21
+ end
22
+
23
+ test 'matches uuid segments' do
24
+ pattern = Uuid::UUID_SEGMENT
25
+ uuids = %w(
26
+ d00fbbd1-82b6-4c1a-a57d-098d529d6854 cdb33760-94da-11df-981c-0800200c9a66
27
+ 0c65a6ec-6491-4316-a137-0021cf4e6471 cbbd44c3-c195-48e5-be04-3cc8a6578f51
28
+ )
29
+ uuids.each { |uuid| assert pattern.match("/#{uuid}/"), "does not match /#{uuid}/ but should" }
30
+ end
31
+
32
+ test 'does not match non-uuid segments' do
33
+ pattern = Uuid::UUID_SEGMENT
34
+ uuids = %w(
35
+ !aaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa aaaa-aaaaaaaa-aaaa-aaaa-aaaaaaaaaaaa
36
+ aaaaaaaa_aaaa_aaaa_aaaa_aaaaaaaaaaaa aaaaaaaa-aaaa-aaaa-aaaaaaaaaaaa
37
+ )
38
+ uuids.each { |uuid| assert !pattern.match("/#{uuid}/"), "matches /#{uuid}/ but shouldn't" }
39
+ end
40
+ end
@@ -0,0 +1,73 @@
1
+ require 'test_helper'
2
+
3
+ if ActionPack::VERSION::MAJOR == 3
4
+ require "rails"
5
+ require 'rack/test'
6
+
7
+ class Rails3Test < Test::Unit::TestCase
8
+ include ::Rack::Test::Methods
9
+
10
+ I18n.available_locales = [:en, :de]
11
+
12
+ APP = Class.new(Rails::Application).tap do |app|
13
+ app.config.secret_token = "3b7cd727ee24e8444053437c36cc66c4"
14
+ app.config.session_store :cookie_store, :key => "_myapp_session"
15
+ app.config.active_support.deprecation = :log
16
+ app.routes.draw do
17
+ match "/" => "rails3_test/tests#index"
18
+ filter :uuid, :pagination ,:locale, :extension
19
+ end
20
+ app.initialize!
21
+ end
22
+
23
+ class TestsController < ActionController::Base
24
+ include Rails.application.routes.url_helpers
25
+
26
+ def index
27
+ url = url_for(params.merge(:only_path => true))
28
+ render :text => params.merge(:url => url).inspect
29
+ end
30
+ end
31
+
32
+ def app
33
+ APP
34
+ end
35
+
36
+ def params
37
+ last_response.status == 200 ? eval(last_response.body).symbolize_keys : {}
38
+ end
39
+
40
+ test "get to /" do
41
+ get '/'
42
+ assert_nil params[:locale]
43
+ assert_nil params[:page]
44
+ assert_nil params[:uuid]
45
+ assert_equal '/en.html', params[:url]
46
+ end
47
+
48
+ test "get to /de" do
49
+ get '/de'
50
+ assert_equal 'de', params[:locale]
51
+ assert_nil params[:page]
52
+ assert_nil params[:uuid]
53
+ assert_equal '/de.html', params[:url]
54
+ end
55
+
56
+ test "get to /page/2" do
57
+ get '/page/2'
58
+ assert_nil params[:locale]
59
+ assert_equal 2, params[:page]
60
+ assert_nil params[:uuid]
61
+ assert_equal '/en/page/2.html', params[:url]
62
+ end
63
+
64
+ test "get to /:uuid" do
65
+ uuid = 'd00fbbd1-82b6-4c1a-a57d-098d529d6854'
66
+ get "/#{uuid}"
67
+ assert_nil params[:locale]
68
+ assert_nil params[:page]
69
+ assert_equal uuid, params[:uuid]
70
+ assert_equal "/en/#{uuid}.html", params[:url]
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,31 @@
1
+ require 'test_helper'
2
+
3
+ class RoutesTest < Test::Unit::TestCase
4
+ class RoutingFilter::Test < Filter
5
+ def around_recognize(path, env, &block)
6
+ 'recognized'
7
+ end
8
+
9
+ def around_generate(*args, &block)
10
+ 'generated'
11
+ end
12
+ end
13
+
14
+ attr_reader :routes
15
+
16
+ def setup
17
+ @routes = draw_routes { |set| set.filter :test }
18
+ end
19
+
20
+ test "routes.filter instantiates and registers a filter" do
21
+ assert routes.instance_variable_get(:@set).filters.first.is_a?(RoutingFilter::Test)
22
+ end
23
+
24
+ # test "filter.around_recognize is being called" do
25
+ # assert_equal 'recognized', routes.recognize_path('/')
26
+ # end
27
+
28
+ test "filter.around_generate is being called" do
29
+ assert_equal 'generated', routes.generate({})
30
+ end
31
+ end
@@ -0,0 +1,47 @@
1
+ require 'test_helper'
2
+
3
+ include RoutingFilter
4
+
5
+ class RoutingFilterTest < Test::Unit::TestCase
6
+ class FooFilter < Filter
7
+ attr_reader :name
8
+
9
+ def initialize(name)
10
+ @name = name
11
+ end
12
+
13
+ def foo(log, &block)
14
+ log << name
15
+ yield
16
+ end
17
+ end
18
+
19
+ attr_reader :chain
20
+
21
+ def setup
22
+ @chain = Chain.new
23
+ @chain.unshift FooFilter.new('custom filter')
24
+ @chain.unshift FooFilter.new('common filter')
25
+ end
26
+
27
+ test "filter.previous is nil for the first filter in the chain" do
28
+ assert_nil chain.first.previous
29
+ end
30
+
31
+ test "filter.previous returns the previous filter in the chain" do
32
+ assert_equal chain.first, chain.last.previous
33
+ end
34
+
35
+ test "filter.next is nil for the last filter in the chain" do
36
+ assert_nil chain.last.next
37
+ end
38
+
39
+ test "filter.next returns the next filter in the chain" do
40
+ assert_equal chain.last, chain.first.next
41
+ end
42
+
43
+ test "chain.run calls the given method on registered filters in reverse order" do
44
+ log = []
45
+ assert_equal 'common filter, custom filter, finalizer', chain.run(:foo, log, &lambda { log << 'finalizer' }).join(', ')
46
+ end
47
+ end
@@ -0,0 +1,42 @@
1
+ ENV['RAILS_ENV'] = 'test'
2
+
3
+ require 'rubygems'
4
+ # gem 'actionpack', '~> 2.3' if ENV['RAILS_2']
5
+ require 'test/unit'
6
+ require 'bundler/setup'
7
+
8
+ require 'i18n'
9
+ require 'action_pack'
10
+ require 'active_support'
11
+ require 'action_controller'
12
+ require 'active_support/core_ext/enumerable.rb'
13
+ require 'test_declarative'
14
+ require 'routing_filter'
15
+
16
+ include RoutingFilter
17
+
18
+ class SomeController < ActionController::Base
19
+ end
20
+
21
+ class Test::Unit::TestCase
22
+ def draw_routes(&block)
23
+ normalized_block = rails_2? ? lambda { |set| set.instance_eval(&block) } : block
24
+ klass = rails_2? ? ActionController::Routing::RouteSet : ActionDispatch::Routing::RouteSet
25
+ klass.new.tap { |set| set.draw(&normalized_block) }
26
+ end
27
+
28
+ def rails_2?
29
+ ActionPack::VERSION::MAJOR == 2
30
+ end
31
+ end
32
+
33
+ if ActionPack::VERSION::MAJOR == 2
34
+ ActionController::Routing::RouteSet::Mapper.class_eval do
35
+ def match(pattern, options)
36
+ pattern.gsub!('(.:format)', '.:format')
37
+ controller, action = options.delete(:to).split('#')
38
+ options.merge!(:controller => controller, :action => action)
39
+ connect(pattern, options)
40
+ end
41
+ end
42
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: routing-filter
3
3
  version: !ruby/object:Gem::Version
4
- hash: 21
4
+ hash: 19
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 2
9
- - 1
10
- version: 0.2.1
9
+ - 2
10
+ version: 0.2.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Sven Fuchs
@@ -82,8 +82,34 @@ extensions: []
82
82
 
83
83
  extra_rdoc_files: []
84
84
 
85
- files: []
86
-
85
+ files:
86
+ - lib/routing-filter.rb
87
+ - lib/routing_filter/adapters/rails_2.rb
88
+ - lib/routing_filter/adapters/rails_3.rb
89
+ - lib/routing_filter/chain.rb
90
+ - lib/routing_filter/filter.rb
91
+ - lib/routing_filter/filters/extension.rb
92
+ - lib/routing_filter/filters/locale.rb
93
+ - lib/routing_filter/filters/pagination.rb
94
+ - lib/routing_filter/filters/uuid.rb
95
+ - lib/routing_filter/version.rb
96
+ - lib/routing_filter.rb
97
+ - test/all.rb
98
+ - test/filters/all_filters/generation.rb
99
+ - test/filters/all_filters/recognition.rb
100
+ - test/filters/all_filters_test.rb
101
+ - test/filters/extension_test.rb
102
+ - test/filters/locale_test.rb
103
+ - test/filters/pagination_test.rb
104
+ - test/filters/uuid_test.rb
105
+ - test/rails_3_test.rb
106
+ - test/routes_test.rb
107
+ - test/routing_filter_test.rb
108
+ - test/test_helper.rb
109
+ - Gemfile
110
+ - Gemfile.lock
111
+ - MIT-LICENSE
112
+ - README.markdown
87
113
  has_rdoc: true
88
114
  homepage: http://github.com/svenfuchs/routing-filter
89
115
  licenses: []