projectdx-subdomain_routes 0.3.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.
- data/.document +5 -0
- data/.gitignore +7 -0
- data/.rvmrc +1 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +40 -0
- data/LICENSE +20 -0
- data/README.textile +421 -0
- data/Rakefile +59 -0
- data/VERSION.yml +5 -0
- data/history.txt +18 -0
- data/lib/subdomain_routes.rb +13 -0
- data/lib/subdomain_routes/assertions.rb +68 -0
- data/lib/subdomain_routes/config.rb +5 -0
- data/lib/subdomain_routes/mapper.rb +43 -0
- data/lib/subdomain_routes/request.rb +11 -0
- data/lib/subdomain_routes/resources.rb +49 -0
- data/lib/subdomain_routes/routes.rb +97 -0
- data/lib/subdomain_routes/split_host.rb +32 -0
- data/lib/subdomain_routes/url_writer.rb +92 -0
- data/lib/subdomain_routes/validations.rb +42 -0
- data/rails/init.rb +1 -0
- data/spec/assertions_spec.rb +193 -0
- data/spec/extraction_spec.rb +73 -0
- data/spec/mapping_spec.rb +168 -0
- data/spec/recognition_spec.rb +78 -0
- data/spec/resources_spec.rb +33 -0
- data/spec/routes_spec.rb +13 -0
- data/spec/spec_helper.rb +77 -0
- data/spec/test_unit_matcher.rb +46 -0
- data/spec/url_writing_spec.rb +262 -0
- data/spec/validations_spec.rb +27 -0
- data/subdomain_routes.gemspec +85 -0
- metadata +124 -0
@@ -0,0 +1,42 @@
|
|
1
|
+
module SubdomainRoutes
|
2
|
+
def self.valid_subdomain?(subdomain)
|
3
|
+
subdomain.to_s =~ /^([a-z]|[a-z][a-z0-9]|[a-z]([a-z0-9]|\-[a-z0-9])*)$/
|
4
|
+
end
|
5
|
+
|
6
|
+
# # Alternatively, we use URI::parse instead. This gives more lenient subdomains however:
|
7
|
+
# def self.valid_subdomain?(subdomain)
|
8
|
+
# URI.parse "http://#{subdomain}.example.com"
|
9
|
+
# rescue URI::InvalidURIError
|
10
|
+
# false
|
11
|
+
# end
|
12
|
+
|
13
|
+
module Validations
|
14
|
+
module ClassMethods
|
15
|
+
def validates_subdomain_format_of(*attr_names)
|
16
|
+
configuration = { :on => :save }
|
17
|
+
configuration.update(attr_names.extract_options!)
|
18
|
+
|
19
|
+
validates_each(attr_names, configuration) do |record, attr_name, value|
|
20
|
+
unless SubdomainRoutes.valid_subdomain?(value)
|
21
|
+
record.errors.add(attr_name, :not_a_valid_subdomain, :default => configuration[:message], :value => value)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def validates_subdomain_not_reserved(*attr_names)
|
27
|
+
configuration = { :on => :save }
|
28
|
+
configuration.update(attr_names.extract_options!)
|
29
|
+
|
30
|
+
validates_each(attr_names, configuration) do |record, attr_name, value|
|
31
|
+
if ActionController::Routing::Routes.reserved_subdomains.include? value
|
32
|
+
record.errors.add(attr_name, :is_a_reserved_subdomain, :default => configuration[:message], :value => value)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
if defined? ActiveRecord::Base
|
41
|
+
ActiveRecord::Base.send :extend, SubdomainRoutes::Validations::ClassMethods
|
42
|
+
end
|
data/rails/init.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'subdomain_routes'
|
@@ -0,0 +1,193 @@
|
|
1
|
+
require 'test/unit/testresult'
|
2
|
+
require 'spec_helper'
|
3
|
+
|
4
|
+
class HomesController < ActionController::Base
|
5
|
+
end
|
6
|
+
|
7
|
+
describe "routing assertions" do
|
8
|
+
context "for single-subdomain route" do
|
9
|
+
before(:each) do
|
10
|
+
map_subdomain :admin, :name => nil do |admin|
|
11
|
+
admin.resource :home
|
12
|
+
end
|
13
|
+
@options = { :controller => "homes", :action => "show", :subdomains => [ "admin" ] }
|
14
|
+
end
|
15
|
+
|
16
|
+
context "recognition" do
|
17
|
+
it "should correctly succeed with a :host option and a subdomain route" do
|
18
|
+
test = lambda { assert_recognizes_with_host(@options, { :path => "/home", :host => "admin.example.com" }) }
|
19
|
+
test.should_not have_errors
|
20
|
+
test.should_not fail
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should correctly fail with a :host option and a subdomain route" do
|
24
|
+
test = lambda { assert_recognizes_with_host(@options, { :path => "/home", :host => "www.example.com" } ) }
|
25
|
+
test.should have_errors
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context "generation" do
|
30
|
+
it "should correctly succeed with :host and :path options and a subdomain route which changes the subdomain and no subdomain is specified" do
|
31
|
+
test = lambda { assert_generates_with_host({ :path => "/home", :host => "admin.example.com" }, @options, "www.example.com") }
|
32
|
+
test.should_not have_errors
|
33
|
+
test.should_not fail
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should correctly fail with :host and :path options and a subdomain route which changes the subdomain and the wrong subdomain is specified" do
|
37
|
+
test = lambda { assert_generates_with_host({ :path => "/home", :host => "admin.example.com" }, @options.merge(:subdomain => "other"), "www.example.com") }
|
38
|
+
test.should have_errors
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should correctly fail with :host and :path options and a subdomain route which changes the subdomain and the correct subdomain is specified" do
|
42
|
+
test = lambda { assert_generates_with_host({ :path => "/home", :host => "admin.example.com" }, @options.merge(:subdomain => "admin"), "www.example.com") }
|
43
|
+
test.should_not have_errors
|
44
|
+
test.should_not fail
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should correctly fail with :host and :path options and a subdomain route which doesn't change the subdomain" do
|
48
|
+
test = lambda { assert_generates_with_host({ :path => "/home", :host => "admin.example.com" }, @options, "admin.example.com") }
|
49
|
+
test.should_not have_errors
|
50
|
+
test.should fail
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should correctly succeed with a path and a subdomain route which doesn't change the subdomain" do
|
54
|
+
test = lambda { assert_generates_with_host("/home", @options, "admin.example.com") }
|
55
|
+
test.should_not have_errors
|
56
|
+
test.should_not fail
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should correctly fail with a path and a subdomain route which changes the subdomain" do
|
60
|
+
test = lambda { assert_generates_with_host("/home", @options, "www.example.com") }
|
61
|
+
test.should_not have_errors
|
62
|
+
test.should fail
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
context "for multiple-subdomain route" do
|
68
|
+
before(:each) do
|
69
|
+
@subdomains = [ "admin", "support" ]
|
70
|
+
map_subdomain *(@subdomains + [ { :name => nil } ]) do |media|
|
71
|
+
media.resource :home
|
72
|
+
end
|
73
|
+
@options = { :controller => "homes", :action => "show", :subdomains => @subdomains }
|
74
|
+
end
|
75
|
+
|
76
|
+
context "recognition" do
|
77
|
+
it "should correctly succeed with a :host option and a subdomain route" do
|
78
|
+
@subdomains.each do |subdomain|
|
79
|
+
test = lambda { assert_recognizes_with_host(@options, { :path => "/home", :host => "#{subdomain}.example.com" }) }
|
80
|
+
test.should_not have_errors
|
81
|
+
test.should_not fail
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
it "should correctly fail with a :host option and a subdomain route" do
|
86
|
+
test = lambda { assert_recognizes_with_host(@options, { :path => "/home", :host => "www.example.com" } ) }
|
87
|
+
test.should have_errors
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
context "generation" do
|
92
|
+
it "should correctly fail with :host and :path options and a subdomain route which changes the subdomain and no subdomain is specified" do
|
93
|
+
@subdomains.each do |subdomain|
|
94
|
+
test = lambda { assert_generates_with_host({ :path => "/home", :host => "#{subdomain}.example.com" }, @options, "www.example.com") }
|
95
|
+
test.should have_errors
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
it "should correctly fail with :host and :path options and a subdomain route which changes the subdomain and the wrong subdomain is specified" do
|
100
|
+
@subdomains.each do |subdomain|
|
101
|
+
test = lambda { assert_generates_with_host({ :path => "/home", :host => "#{subdomain}.example.com" }, @options.merge(:subdomain => "other"), "www.example.com") }
|
102
|
+
test.should have_errors
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
it "should correctly succeed with :host and :path options and a subdomain route which changes the subdomain and a correct subdomain is specified" do
|
107
|
+
@subdomains.each do |subdomain|
|
108
|
+
test = lambda { assert_generates_with_host({ :path => "/home", :host => "#{subdomain}.example.com" }, @options.merge(:subdomain => subdomain), "www.example.com") }
|
109
|
+
test.should_not have_errors
|
110
|
+
test.should_not fail
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
it "should correctly fail with :host and :path options and a subdomain route which doesn't change the subdomain" do
|
115
|
+
@subdomains.each do |subdomain|
|
116
|
+
test = lambda { assert_generates_with_host({ :path => "/home", :host => "#{subdomain}.example.com" }, @options, "#{subdomain}.example.com") }
|
117
|
+
test.should_not have_errors
|
118
|
+
test.should fail
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
it "should correctly succeed with a path and a subdomain route which doesn't change the subdomain" do
|
123
|
+
@subdomains.each do |subdomain|
|
124
|
+
test = lambda { assert_generates_with_host("/home", @options, "#{subdomain}.example.com") }
|
125
|
+
test.should_not have_errors
|
126
|
+
test.should_not fail
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
it "should correctly fail with a path and a subdomain route which changes the subdomain" do
|
131
|
+
@subdomains.each do |subdomain|
|
132
|
+
test = lambda { assert_generates_with_host("/home", @options.merge(:subdomain => subdomain), "www.example.com") }
|
133
|
+
test.should_not have_errors
|
134
|
+
test.should fail
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
context "for model-based subdomain route" do
|
141
|
+
before(:each) do
|
142
|
+
map_subdomain :model => :city, :namespace => nil do |city|
|
143
|
+
city.resource :home
|
144
|
+
end
|
145
|
+
@options = { :controller => "homes", :action => "show", :subdomains => :city_id, :city_id => "canberra" }
|
146
|
+
end
|
147
|
+
|
148
|
+
context "recognition" do
|
149
|
+
it "should correctly succeed with a :host option and a subdomain route" do
|
150
|
+
test = lambda { assert_recognizes_with_host(@options, { :path => "/home", :host => "canberra.example.com" }) }
|
151
|
+
test.should_not have_errors
|
152
|
+
test.should_not fail
|
153
|
+
end
|
154
|
+
|
155
|
+
it "should correctly fail with a :host option and a subdomain route for the wrong subdomain" do
|
156
|
+
test = lambda { assert_recognizes_with_host(@options, { :path => "/home", :host => "boston.example.com" }) }
|
157
|
+
test.should_not have_errors
|
158
|
+
test.should fail
|
159
|
+
end
|
160
|
+
|
161
|
+
it "should correctly fail with a :host option and a subdomain route for no subdomain" do
|
162
|
+
test = lambda { assert_recognizes_with_host(@options, { :path => "/home", :host => "example.com" }) }
|
163
|
+
test.should have_errors
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
context "generation" do
|
168
|
+
it "should correctly succeed with :host and :path options and a subdomain route which changes the subdomain" do
|
169
|
+
test = lambda { assert_generates_with_host({ :path => "/home", :host => "canberra.example.com" }, @options, "boston.example.com") }
|
170
|
+
test.should_not have_errors
|
171
|
+
test.should_not fail
|
172
|
+
end
|
173
|
+
|
174
|
+
it "should correctly fail with :host and :path options and a subdomain route which doesn't change the subdomain" do
|
175
|
+
test = lambda { assert_generates_with_host({ :path => "/home", :host => "canberra.example.com" }, @options, "canberra.example.com") }
|
176
|
+
test.should_not have_errors
|
177
|
+
test.should fail
|
178
|
+
end
|
179
|
+
|
180
|
+
it "should correctly succeed with :host and :path options and a subdomain route which doesn't change the subdomain" do
|
181
|
+
test = lambda { assert_generates_with_host("/home", @options, "canberra.example.com") }
|
182
|
+
test.should_not have_errors
|
183
|
+
test.should_not fail
|
184
|
+
end
|
185
|
+
|
186
|
+
it "should correctly fail with :host and :path options and a subdomain route which changes the subdomain" do
|
187
|
+
test = lambda { assert_generates_with_host("/home", @options, "www.example.com") }
|
188
|
+
test.should_not have_errors
|
189
|
+
test.should fail
|
190
|
+
end
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "subdomain extraction" do
|
4
|
+
include SubdomainRoutes::SplitHost
|
5
|
+
|
6
|
+
it "should add a subdomain method to requests" do
|
7
|
+
request = ActionController::TestRequest.new
|
8
|
+
request.host = "admin.example.com"
|
9
|
+
request.subdomain.should == "admin"
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should raise an error if no host is supplied" do
|
13
|
+
lambda { split_host(nil) }.should raise_error(SubdomainRoutes::HostNotSupplied)
|
14
|
+
end
|
15
|
+
|
16
|
+
context "when the domain length is not set" do
|
17
|
+
before(:each) do
|
18
|
+
SubdomainRoutes::Config.stub!(:domain_length).and_return(nil)
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should always find a subdomain and a domain" do
|
22
|
+
split_host("example.com").should == [ "example", "com" ]
|
23
|
+
split_host("www.example.com").should == [ "www", "example.com" ]
|
24
|
+
split_host("blah.www.example.com").should == [ "blah", "www.example.com" ]
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should raise an error if a nil subdomain is mapped" do
|
28
|
+
lambda { map_subdomain(nil) }.should raise_error(ArgumentError)
|
29
|
+
lambda { map_subdomain(nil, :www) }.should raise_error(ArgumentError)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context "when domain length is set" do
|
34
|
+
before(:each) do
|
35
|
+
SubdomainRoutes::Config.stub!(:domain_length).and_return(2)
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should find the domain" do
|
39
|
+
domain_for_host("www.example.com").should == "example.com"
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should find the subdomain when it is present" do
|
43
|
+
subdomain_for_host("www.example.com").should == "www"
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should return an empty string when subdomain is absent" do
|
47
|
+
subdomain_for_host("example.com").should == ""
|
48
|
+
end
|
49
|
+
|
50
|
+
context "and multi-level subdomains are found" do
|
51
|
+
before(:each) do
|
52
|
+
@host = "blah.www.example.com"
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should raise an error" do
|
56
|
+
lambda { subdomain_for_host(@host) }.should raise_error(SubdomainRoutes::TooManySubdomains)
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should raise an error when generating URLs" do
|
60
|
+
map_subdomain(:admin) { |admin| admin.resources :users }
|
61
|
+
with_host(@host) do
|
62
|
+
lambda { admin_users_path }.should raise_error(SubdomainRoutes::TooManySubdomains)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should raise an error when recognising URLs" do
|
67
|
+
request = ActionController::TestRequest.new
|
68
|
+
request.host = @host
|
69
|
+
lambda { recognize_path(request) }.should raise_error(SubdomainRoutes::TooManySubdomains)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,168 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "subdomain route mapping" do
|
4
|
+
it "should check the validity of each subdomain" do
|
5
|
+
SubdomainRoutes.should_receive(:valid_subdomain?).twice.and_return(true, true)
|
6
|
+
lambda { map_subdomain(:www, :www1) { } }.should_not raise_error
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should check the validity of each subdomain and raise an error if any are invalid" do
|
10
|
+
SubdomainRoutes.should_receive(:valid_subdomain?).twice.and_return(true, false)
|
11
|
+
lambda { map_subdomain(:www, :www!) { } }.should raise_error(ArgumentError)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should check not the validity of a nil subdomain" do
|
15
|
+
SubdomainRoutes.should_not_receive(:valid_subdomain?)
|
16
|
+
map_subdomain(nil) { }
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should accept a nil subdomain" do
|
20
|
+
map_subdomain(nil) { |map| map.options[:subdomains].should == [ "" ] }
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should accept a blank subdomain" do
|
24
|
+
map_subdomain("") { |map| map.options[:subdomains].should == [ "" ] }
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should accept a single specified subdomain" do
|
28
|
+
map_subdomain(:admin) { |admin| admin.options[:subdomains].should == [ "admin" ] }
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should accept strings or symbols as subdomains" do
|
32
|
+
map_subdomain(:admin) { |admin| admin.options[:subdomains].should == [ "admin" ] }
|
33
|
+
map_subdomain("admin") { |admin| admin.options[:subdomains].should == [ "admin" ] }
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should accept multiple subdomains" do
|
37
|
+
map_subdomain(:admin, :support) { |map| map.options[:subdomains].should == [ "admin", "support" ] }
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should downcase the subdomains" do
|
41
|
+
map_subdomain(:Admin, "SUPPORT") { |map| map.options[:subdomains].should == [ "admin", "support" ] }
|
42
|
+
end
|
43
|
+
|
44
|
+
it "should raise ArgumentError if a nil :model option is specified as the subdomain" do
|
45
|
+
lambda { map_subdomain(:model => "") { } }.should raise_error(ArgumentError)
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should raise ArgumentError if no subdomain is specified" do
|
49
|
+
lambda { map_subdomain }.should raise_error(ArgumentError)
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should not include repeated subdomains in the options" do
|
53
|
+
map_subdomain(:admin, :support, :admin) { |map| map.options[:subdomains].should == [ "admin", "support" ] }
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should be invoked by map.subdomains as well as map.subdomain" do
|
57
|
+
ActionController::Routing::Routes.draw do |map|
|
58
|
+
map.subdomains(:admin, :support) { |sub| sub.options[:subdomains].should == [ "admin", "support" ] }
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
[ [ :admin ], [ :support, :admin ] ].each do |subdomains|
|
63
|
+
context "mapping #{subdomains.size} subdomains" do
|
64
|
+
it "should set the first subdomain as a namespace" do
|
65
|
+
map_subdomain(*subdomains) { |map| map.options[:namespace].should == "#{subdomains.first}/" }
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should prefix the first subdomain to named routes" do
|
69
|
+
map_subdomain(*subdomains) { |map| map.options[:name_prefix].should == "#{subdomains.first}_" }
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should instead set a namespace to the name if specified" do
|
73
|
+
args = subdomains + [ :name => :something ]
|
74
|
+
map_subdomain(*args) { |map| map.options[:namespace].should == "something/" }
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should instead prefix the name to named routes if specified" do
|
78
|
+
args = subdomains + [ :name => :something ]
|
79
|
+
map_subdomain(*args) { |map| map.options[:name_prefix].should == "something_" }
|
80
|
+
end
|
81
|
+
|
82
|
+
it "should not set a namespace if name is specified as nil" do
|
83
|
+
args = subdomains + [ :name => nil ]
|
84
|
+
map_subdomain(*args) { |map| map.options[:namespace].should be_nil }
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should not set a named route prefix if name is specified as nil" do
|
88
|
+
args = subdomains + [ :name => nil ]
|
89
|
+
map_subdomain(*args) { |map| map.options[:name_prefix].should be_nil }
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
it "should strip bad characters from the namespace and name prefix" do
|
95
|
+
map_subdomain("just-do-it") { |map| map.options[:namespace].should == "just_do_it/" }
|
96
|
+
map_subdomain("just-do-it") { |map| map.options[:name_prefix].should == "just_do_it_" }
|
97
|
+
map_subdomain(nil, :name => "just-do-it") { |map| map.options[:namespace].should == "just_do_it/" }
|
98
|
+
map_subdomain(nil, :name => "just-do-it") { |map| map.options[:name_prefix].should == "just_do_it_" }
|
99
|
+
map_subdomain(nil, :name => "Just do it!") { |map| map.options[:namespace].should == "just_do_it/" }
|
100
|
+
map_subdomain(nil, :name => "Just do it!") { |map| map.options[:name_prefix].should == "just_do_it_" }
|
101
|
+
end
|
102
|
+
|
103
|
+
context "mapping the nil subdomain" do
|
104
|
+
it "should not set a namespace" do
|
105
|
+
[ nil, "" ].each do |none|
|
106
|
+
map_subdomain(none) { |map| map.options[:namespace].should be_nil }
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
it "should not set a named route prefix" do
|
111
|
+
[ nil, "" ].each do |none|
|
112
|
+
map_subdomain(none) { |map| map.options[:name_prefix].should be_nil }
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
context "mapping nil and other subdomains" do
|
118
|
+
it "should set the first non-nil subdomain as a namespace" do
|
119
|
+
[ nil, "" ].each do |none|
|
120
|
+
map_subdomain(none, :www) { |map| map.options[:namespace].should == "www/" }
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
it "should prefix the first non-nil subdomain to named routes" do
|
125
|
+
[ nil, "" ].each do |none|
|
126
|
+
map_subdomain(none, :www) { |map| map.options[:name_prefix].should == "www_" }
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
context "for a :model subdomain" do
|
132
|
+
it "should accept a :model option as the subdomain and turn it into a foreign key symbol" do
|
133
|
+
map_subdomain(:model => :city) { |city| city.options[:subdomains].should == :city_id }
|
134
|
+
end
|
135
|
+
|
136
|
+
it "should singularize a plural model name" do
|
137
|
+
map_subdomain(:model => :cities) { |city| city.options[:subdomains].should == :city_id }
|
138
|
+
end
|
139
|
+
|
140
|
+
it "should accept a string model name" do
|
141
|
+
map_subdomain(:model => "city") { |city| city.options[:subdomains].should == :city_id }
|
142
|
+
end
|
143
|
+
|
144
|
+
it "should set the model name as a namespace" do
|
145
|
+
map_subdomain(:model => :city) { |city| city.options[:namespace].should == "city/" }
|
146
|
+
end
|
147
|
+
|
148
|
+
it "should prefix the model name to named routes" do
|
149
|
+
map_subdomain(:model => :city) { |city| city.options[:name_prefix].should == "city_" }
|
150
|
+
end
|
151
|
+
|
152
|
+
it "should instead set a namespace to the name if specified" do
|
153
|
+
map_subdomain(:model => :city, :name => :something) { |map| map.options[:namespace].should == "something/" }
|
154
|
+
end
|
155
|
+
|
156
|
+
it "should instead prefix the name to named routes if specified" do
|
157
|
+
map_subdomain(:model => :city, :name => :something) { |map| map.options[:name_prefix].should == "something_" }
|
158
|
+
end
|
159
|
+
|
160
|
+
it "should not set a namespace if name is specified as nil" do
|
161
|
+
map_subdomain(:model => :city, :name => nil) { |map| map.options[:namespace].should be_nil }
|
162
|
+
end
|
163
|
+
|
164
|
+
it "should not set a named route prefix if name is specified as nil" do
|
165
|
+
map_subdomain(:model => :city, :name => nil) { |map| map.options[:name_prefix].should be_nil }
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|