jordanyeo-simple-navigation 3.11.0
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/CHANGELOG +265 -0
- data/Gemfile +17 -0
- data/README +22 -0
- data/Rakefile +47 -0
- data/VERSION +1 -0
- data/generators/navigation_config/USAGE +1 -0
- data/generators/navigation_config/navigation_config_generator.rb +8 -0
- data/generators/navigation_config/templates/config/navigation.rb +76 -0
- data/lib/generators/navigation_config/navigation_config_generator.rb +12 -0
- data/lib/simple-navigation.rb +1 -0
- data/lib/simple_navigation.rb +167 -0
- data/lib/simple_navigation/adapters.rb +10 -0
- data/lib/simple_navigation/adapters/base.rb +37 -0
- data/lib/simple_navigation/adapters/nanoc.rb +45 -0
- data/lib/simple_navigation/adapters/padrino.rb +20 -0
- data/lib/simple_navigation/adapters/rails.rb +93 -0
- data/lib/simple_navigation/adapters/sinatra.rb +69 -0
- data/lib/simple_navigation/core.rb +5 -0
- data/lib/simple_navigation/core/configuration.rb +72 -0
- data/lib/simple_navigation/core/item.rb +144 -0
- data/lib/simple_navigation/core/item_adapter.rb +63 -0
- data/lib/simple_navigation/core/item_container.rb +147 -0
- data/lib/simple_navigation/core/items_provider.rb +35 -0
- data/lib/simple_navigation/rails_controller_methods.rb +144 -0
- data/lib/simple_navigation/rendering.rb +12 -0
- data/lib/simple_navigation/rendering/helpers.rb +123 -0
- data/lib/simple_navigation/rendering/renderer/base.rb +107 -0
- data/lib/simple_navigation/rendering/renderer/breadcrumbs.rb +59 -0
- data/lib/simple_navigation/rendering/renderer/json.rb +29 -0
- data/lib/simple_navigation/rendering/renderer/links.rb +32 -0
- data/lib/simple_navigation/rendering/renderer/list.rb +29 -0
- data/lib/simple_navigation/rendering/renderer/text.rb +26 -0
- data/rails/init.rb +1 -0
- data/spec/lib/simple_navigation/adapters/padrino_spec.rb +31 -0
- data/spec/lib/simple_navigation/adapters/rails_spec.rb +287 -0
- data/spec/lib/simple_navigation/adapters/sinatra_spec.rb +80 -0
- data/spec/lib/simple_navigation/core/configuration_spec.rb +128 -0
- data/spec/lib/simple_navigation/core/item_adapter_spec.rb +212 -0
- data/spec/lib/simple_navigation/core/item_container_spec.rb +451 -0
- data/spec/lib/simple_navigation/core/item_spec.rb +566 -0
- data/spec/lib/simple_navigation/core/items_provider_spec.rb +60 -0
- data/spec/lib/simple_navigation/rails_controller_methods_spec.rb +249 -0
- data/spec/lib/simple_navigation/rendering/helpers_spec.rb +276 -0
- data/spec/lib/simple_navigation/rendering/renderer/base_spec.rb +199 -0
- data/spec/lib/simple_navigation/rendering/renderer/breadcrumbs_spec.rb +101 -0
- data/spec/lib/simple_navigation/rendering/renderer/json_spec.rb +48 -0
- data/spec/lib/simple_navigation/rendering/renderer/links_spec.rb +64 -0
- data/spec/lib/simple_navigation/rendering/renderer/list_spec.rb +211 -0
- data/spec/lib/simple_navigation/rendering/renderer/text_spec.rb +41 -0
- data/spec/lib/simple_navigation_spec.rb +307 -0
- data/spec/spec_helper.rb +108 -0
- metadata +199 -0
@@ -0,0 +1,199 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe SimpleNavigation::Renderer::Base do
|
4
|
+
before(:each) do
|
5
|
+
@options = stub(:options).as_null_object
|
6
|
+
@adapter = stub(:adapter)
|
7
|
+
SimpleNavigation.stub!(:adapter => @adapter)
|
8
|
+
@base_renderer = SimpleNavigation::Renderer::Base.new(@options)
|
9
|
+
end
|
10
|
+
|
11
|
+
describe 'delegated methods' do
|
12
|
+
it {@base_renderer.should respond_to(:link_to)}
|
13
|
+
it {@base_renderer.should respond_to(:content_tag)}
|
14
|
+
end
|
15
|
+
|
16
|
+
describe 'initialize' do
|
17
|
+
it {@base_renderer.adapter.should == @adapter}
|
18
|
+
it {@base_renderer.options.should == @options}
|
19
|
+
end
|
20
|
+
|
21
|
+
describe 'render' do
|
22
|
+
it "be subclass responsability" do
|
23
|
+
lambda {@base_renderer.render(:container)}.should raise_error('subclass responsibility')
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe 'expand_all?' do
|
28
|
+
context 'option is set' do
|
29
|
+
context 'expand_all is true' do
|
30
|
+
before(:each) do
|
31
|
+
@base_renderer.stub!(:options => {:expand_all => true})
|
32
|
+
end
|
33
|
+
it {@base_renderer.expand_all?.should be_true}
|
34
|
+
end
|
35
|
+
context 'expand_all is false' do
|
36
|
+
before(:each) do
|
37
|
+
@base_renderer.stub!(:options => {:expand_all => false})
|
38
|
+
end
|
39
|
+
it {@base_renderer.expand_all?.should be_false}
|
40
|
+
end
|
41
|
+
end
|
42
|
+
context 'option is not set' do
|
43
|
+
before(:each) do
|
44
|
+
@base_renderer.stub!(:options => {})
|
45
|
+
end
|
46
|
+
it {@base_renderer.expand_all?.should be_false}
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe 'skip_if_empty?' do
|
51
|
+
context 'option is set' do
|
52
|
+
context 'skip_if_empty is true' do
|
53
|
+
before(:each) do
|
54
|
+
@base_renderer.stub!(:options => {:skip_if_empty => true})
|
55
|
+
end
|
56
|
+
it {@base_renderer.skip_if_empty?.should be_true}
|
57
|
+
end
|
58
|
+
context 'skip_if_empty is false' do
|
59
|
+
before(:each) do
|
60
|
+
@base_renderer.stub!(:options => {:skip_if_empty => false})
|
61
|
+
end
|
62
|
+
it {@base_renderer.skip_if_empty?.should be_false}
|
63
|
+
end
|
64
|
+
end
|
65
|
+
context 'option is not set' do
|
66
|
+
before(:each) do
|
67
|
+
@base_renderer.stub!(:options => {})
|
68
|
+
end
|
69
|
+
it {@base_renderer.skip_if_empty?.should be_false}
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
describe 'level' do
|
74
|
+
context 'options[level] is set' do
|
75
|
+
before(:each) do
|
76
|
+
@base_renderer.stub!(:options => {:level => 1})
|
77
|
+
end
|
78
|
+
it {@base_renderer.level.should == 1}
|
79
|
+
end
|
80
|
+
context 'options[level] is not set' do
|
81
|
+
before(:each) do
|
82
|
+
@base_renderer.stub!(:options => {})
|
83
|
+
end
|
84
|
+
it {@base_renderer.level.should == :all}
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
describe 'consider_sub_navigation?' do
|
89
|
+
before(:each) do
|
90
|
+
@item = stub(:item)
|
91
|
+
end
|
92
|
+
context 'item has no subnavigation' do
|
93
|
+
before(:each) do
|
94
|
+
@item.stub!(:sub_navigation => nil)
|
95
|
+
end
|
96
|
+
it {@base_renderer.send(:consider_sub_navigation?, @item).should be_false}
|
97
|
+
end
|
98
|
+
context 'item has subnavigation' do
|
99
|
+
before(:each) do
|
100
|
+
@sub_navigation = stub(:sub_navigation)
|
101
|
+
@item.stub!(:sub_navigation => @sub_navigation)
|
102
|
+
end
|
103
|
+
context 'level is something unknown' do
|
104
|
+
before(:each) do
|
105
|
+
@base_renderer.stub!(:level => 'unknown')
|
106
|
+
end
|
107
|
+
it {@base_renderer.send(:consider_sub_navigation?, @item).should be_false}
|
108
|
+
end
|
109
|
+
context 'level is :all' do
|
110
|
+
before(:each) do
|
111
|
+
@base_renderer.stub!(:level => :all)
|
112
|
+
end
|
113
|
+
it {@base_renderer.send(:consider_sub_navigation?, @item).should be_true}
|
114
|
+
end
|
115
|
+
context 'level is an Integer' do
|
116
|
+
before(:each) do
|
117
|
+
@base_renderer.stub!(:level => 2)
|
118
|
+
end
|
119
|
+
it {@base_renderer.send(:consider_sub_navigation?, @item).should be_false}
|
120
|
+
end
|
121
|
+
context 'level is a Range' do
|
122
|
+
before(:each) do
|
123
|
+
@base_renderer.stub!(:level => 2..3)
|
124
|
+
end
|
125
|
+
context 'subnavs level > range.max' do
|
126
|
+
before(:each) do
|
127
|
+
@sub_navigation.stub!(:level => 4)
|
128
|
+
end
|
129
|
+
it {@base_renderer.send(:consider_sub_navigation?, @item).should be_false}
|
130
|
+
end
|
131
|
+
context 'subnavs level = range.max' do
|
132
|
+
before(:each) do
|
133
|
+
@sub_navigation.stub!(:level => 3)
|
134
|
+
end
|
135
|
+
it {@base_renderer.send(:consider_sub_navigation?, @item).should be_true}
|
136
|
+
|
137
|
+
end
|
138
|
+
context 'subnavs level < range.max' do
|
139
|
+
before(:each) do
|
140
|
+
@sub_navigation.stub!(:level => 2)
|
141
|
+
end
|
142
|
+
it {@base_renderer.send(:consider_sub_navigation?, @item).should be_true}
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
describe 'include_sub_navigation?' do
|
149
|
+
before(:each) do
|
150
|
+
@item = stub(:item)
|
151
|
+
end
|
152
|
+
context 'consider_sub_navigation? is true' do
|
153
|
+
before(:each) do
|
154
|
+
@base_renderer.stub!(:consider_sub_navigation? => true)
|
155
|
+
end
|
156
|
+
context 'expand_sub_navigation? is true' do
|
157
|
+
before(:each) do
|
158
|
+
@base_renderer.stub!(:expand_sub_navigation? => true)
|
159
|
+
end
|
160
|
+
it {@base_renderer.include_sub_navigation?(@item).should be_true}
|
161
|
+
end
|
162
|
+
context 'expand_sub_navigation? is false' do
|
163
|
+
before(:each) do
|
164
|
+
@base_renderer.stub!(:expand_sub_navigation? => false)
|
165
|
+
end
|
166
|
+
it {@base_renderer.include_sub_navigation?(@item).should be_false}
|
167
|
+
end
|
168
|
+
end
|
169
|
+
context 'consider_sub_navigation is false' do
|
170
|
+
before(:each) do
|
171
|
+
@base_renderer.stub!(:consider_sub_navigation? => false)
|
172
|
+
end
|
173
|
+
context 'expand_sub_navigation? is true' do
|
174
|
+
before(:each) do
|
175
|
+
@base_renderer.stub!(:expand_sub_navigation? => true)
|
176
|
+
end
|
177
|
+
it {@base_renderer.include_sub_navigation?(@item).should be_false}
|
178
|
+
end
|
179
|
+
context 'expand_sub_navigation? is false' do
|
180
|
+
before(:each) do
|
181
|
+
@base_renderer.stub!(:expand_sub_navigation? => false)
|
182
|
+
end
|
183
|
+
it {@base_renderer.include_sub_navigation?(@item).should be_false}
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
describe 'render_sub_navigation_for' do
|
189
|
+
before(:each) do
|
190
|
+
@sub_navigation = stub(:sub_navigation)
|
191
|
+
@item = stub(:item, :sub_navigation => @sub_navigation)
|
192
|
+
end
|
193
|
+
it "should call render on the sub_navigation (passing the options)" do
|
194
|
+
@sub_navigation.should_receive(:render).with(@options)
|
195
|
+
@base_renderer.render_sub_navigation_for(@item)
|
196
|
+
end
|
197
|
+
end
|
198
|
+
|
199
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'html/document'# unless defined? HTML::Document
|
3
|
+
|
4
|
+
describe SimpleNavigation::Renderer::Breadcrumbs do
|
5
|
+
|
6
|
+
describe 'render' do
|
7
|
+
|
8
|
+
def render(current_nav=nil, options={:level => :all})
|
9
|
+
primary_navigation = primary_container
|
10
|
+
select_item(current_nav) if current_nav
|
11
|
+
setup_renderer_for SimpleNavigation::Renderer::Breadcrumbs, :rails, options
|
12
|
+
HTML::Document.new(@renderer.render(primary_navigation)).root
|
13
|
+
end
|
14
|
+
|
15
|
+
context 'regarding result' do
|
16
|
+
|
17
|
+
it "should render a div-tag around the items" do
|
18
|
+
HTML::Selector.new('div').select(render).should have(1).entries
|
19
|
+
end
|
20
|
+
it "the rendered div-tag should have the specified dom_id" do
|
21
|
+
HTML::Selector.new('div#nav_dom_id').select(render).should have(1).entries
|
22
|
+
end
|
23
|
+
it "the rendered div-tag should have the specified class" do
|
24
|
+
HTML::Selector.new('div.nav_dom_class').select(render).should have(1).entries
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'without current_navigation set' do
|
28
|
+
it "should not render any a-tag in the div-tag" do
|
29
|
+
HTML::Selector.new('div a').select(render).should have(0).entries
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context 'with current_navigation set' do
|
34
|
+
before(:each) do
|
35
|
+
@selection = HTML::Selector.new('div a').select(render(:invoices))
|
36
|
+
end
|
37
|
+
it "should render the selected a tags" do
|
38
|
+
@selection.should have(1).entries
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should not render class or id" do
|
42
|
+
@selection.each do |tag|
|
43
|
+
raise unless tag.name == "a"
|
44
|
+
tag["id"].should be_nil
|
45
|
+
tag["class"].should be_nil
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
context 'with allow_classes_and_ids option' do
|
50
|
+
before(:each) do
|
51
|
+
@selection = HTML::Selector.new('div a').select(render(:users, :level => :all, :allow_classes_and_ids => true))
|
52
|
+
end
|
53
|
+
it "should render class and id" do
|
54
|
+
@selection.each do |tag|
|
55
|
+
raise unless tag.name == "a"
|
56
|
+
tag["id"].should_not be_nil
|
57
|
+
tag["class"].should_not be_nil
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
context 'with prefix option' do
|
63
|
+
it 'should render prefix before breadcrumbs' do
|
64
|
+
selection = HTML::Selector.new('div').select(render(:subnav1, :level => :all, :prefix => 'You are here: '))
|
65
|
+
raise unless selection.count == 1
|
66
|
+
tag = selection.first
|
67
|
+
tag.to_s.should =~ /^\<div.+\>You are here\: /
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'should not render prefix if there is no available breadcrumb' do
|
71
|
+
allow_message_expectations_on_nil
|
72
|
+
selection = HTML::Selector.new('div').select(render('', :prefix => 'You are here: '))
|
73
|
+
tag = selection.first
|
74
|
+
tag.to_s.should =~ /^\<div.+\>\<\/div\>/
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
context 'with static_leaf option' do
|
79
|
+
before(:each) do
|
80
|
+
@selection = HTML::Selector.new('div *').select(render(:subnav1, :level => :all, :static_leaf => true))
|
81
|
+
end
|
82
|
+
it "should render link for non-leaes" do
|
83
|
+
@selection[0..-2].each do |tag|
|
84
|
+
tag.name.should == 'a'
|
85
|
+
end
|
86
|
+
end
|
87
|
+
it "should not render link for leaf" do
|
88
|
+
@selection.last.name.should == 'span'
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
|
94
|
+
context 'nested sub_navigation' do
|
95
|
+
it "should add an a tag for each selected item" do
|
96
|
+
HTML::Selector.new('div a').select(render(:subnav1)).should have(2).entries
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe SimpleNavigation::Renderer::Json do
|
4
|
+
|
5
|
+
describe 'render' do
|
6
|
+
|
7
|
+
def render(current_nav=nil, options={})
|
8
|
+
primary_navigation = primary_container
|
9
|
+
select_item(current_nav)
|
10
|
+
setup_renderer_for SimpleNavigation::Renderer::Json, :rails, options
|
11
|
+
@renderer.render(primary_navigation)
|
12
|
+
end
|
13
|
+
|
14
|
+
def prerendered_menu
|
15
|
+
'[{"name":"users","url":"first_url","selected":false,"items":null},{"name":"invoices","url":"second_url","selected":true,"items":[{"name":"subnav1","url":"subnav1_url","selected":false,"items":null},{"name":"subnav2","url":"subnav2_url","selected":false,"items":null}]},{"name":"accounts","url":"third_url","selected":false,"items":null},{"name":"miscellany","url":null,"selected":false,"items":null}]'
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'regarding result' do
|
19
|
+
|
20
|
+
it "should return a string" do
|
21
|
+
render(:invoices).class.should == String
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should render the selected page" do
|
25
|
+
json = parse_json(render(:invoices))
|
26
|
+
found = json.any? do |item|
|
27
|
+
item["name"] == "invoices" and item["selected"]
|
28
|
+
end
|
29
|
+
found.should == true
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
context 'regarding hash result' do
|
35
|
+
it "should return a hash" do
|
36
|
+
render(:invoices, :as_hash => true).class.should == Array
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should render the selected page" do
|
40
|
+
found = render(:invoices, :as_hash => true).any? do |item|
|
41
|
+
item[:name] == "invoices" and item[:selected]
|
42
|
+
end
|
43
|
+
found.should == true
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'html/document' unless defined? HTML::Document
|
3
|
+
|
4
|
+
describe SimpleNavigation::Renderer::Links do
|
5
|
+
|
6
|
+
|
7
|
+
describe 'render' do
|
8
|
+
|
9
|
+
def render(current_nav=nil, options={:level => :all})
|
10
|
+
primary_navigation = primary_container
|
11
|
+
select_item(current_nav) if current_nav
|
12
|
+
setup_renderer_for SimpleNavigation::Renderer::Links, :rails, options
|
13
|
+
HTML::Document.new(@renderer.render(primary_navigation)).root
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'regarding result' do
|
17
|
+
|
18
|
+
it "should render a div-tag around the items" do
|
19
|
+
HTML::Selector.new('div').select(render).should have(1).entries
|
20
|
+
end
|
21
|
+
it "the rendered div-tag should have the specified dom_id" do
|
22
|
+
HTML::Selector.new('div#nav_dom_id').select(render).should have(1).entries
|
23
|
+
end
|
24
|
+
it "the rendered div-tag should have the specified class" do
|
25
|
+
HTML::Selector.new('div.nav_dom_class').select(render).should have(1).entries
|
26
|
+
end
|
27
|
+
it "should render an a-tag for each item" do
|
28
|
+
HTML::Selector.new('a').select(render).should have(3).entries
|
29
|
+
end
|
30
|
+
it "should pass the specified html_options to the a element" do
|
31
|
+
HTML::Selector.new('a[style=float:right]').select(render).should have(1).entries
|
32
|
+
end
|
33
|
+
it "should give the a-tag the id specified in the html_options" do
|
34
|
+
HTML::Selector.new('a#my_id').select(render).should have(1).entries
|
35
|
+
end
|
36
|
+
it "should give the a-tag the default id (stringified key) if no id is specified in the html_options" do
|
37
|
+
HTML::Selector.new('a#invoices').select(render).should have(1).entries
|
38
|
+
end
|
39
|
+
it "should not apply the the default id where there is an id specified in the html_options" do
|
40
|
+
HTML::Selector.new('a#users').select(render).should be_empty
|
41
|
+
end
|
42
|
+
|
43
|
+
context 'with current_navigation set' do
|
44
|
+
it "should mark the matching a-item as selected (with the css_class specified in configuration)" do
|
45
|
+
HTML::Selector.new('a.selected').select(render(:invoices)).should have(1).entries
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
context 'without current_navigation set' do
|
50
|
+
it "should not mark any of the items as selected" do
|
51
|
+
HTML::Selector.new('a.selected').select(render).should be_empty
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context 'with a custom seperator specified' do
|
56
|
+
it "should separate the items with the separator" do
|
57
|
+
HTML::Selector.new('div').select_first(render(:subnav1, :join_with => " | ")).to_s.split(" | ").should have(4).entries
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,211 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'html/document' unless defined? HTML::Document
|
3
|
+
|
4
|
+
describe SimpleNavigation::Renderer::List do
|
5
|
+
|
6
|
+
describe 'render' do
|
7
|
+
|
8
|
+
def render(current_nav=nil, options={:level => :all})
|
9
|
+
primary_navigation = primary_container
|
10
|
+
select_item(current_nav) if current_nav
|
11
|
+
setup_renderer_for SimpleNavigation::Renderer::List, :rails, options
|
12
|
+
HTML::Document.new(@renderer.render(primary_navigation)).root
|
13
|
+
end
|
14
|
+
|
15
|
+
context 'regarding result' do
|
16
|
+
|
17
|
+
it "should render a ul-tag around the items" do
|
18
|
+
HTML::Selector.new('ul').select(render).should have(1).entries
|
19
|
+
end
|
20
|
+
it "the rendered ul-tag should have the specified dom_id" do
|
21
|
+
HTML::Selector.new('ul#nav_dom_id').select(render).should have(1).entries
|
22
|
+
end
|
23
|
+
it "the rendered ul-tag should have the specified class" do
|
24
|
+
HTML::Selector.new('ul.nav_dom_class').select(render).should have(1).entries
|
25
|
+
end
|
26
|
+
it "should render a li tag for each item" do
|
27
|
+
HTML::Selector.new('li').select(render).should have(4).entries
|
28
|
+
end
|
29
|
+
it "should render an a-tag inside each li-tag (for items with links)" do
|
30
|
+
HTML::Selector.new('li a').select(render).should have(3).entries
|
31
|
+
end
|
32
|
+
it "should render a span-tag inside each li-tag (for items without links)" do
|
33
|
+
HTML::Selector.new('li span').select(render).should have(1).entries
|
34
|
+
end
|
35
|
+
|
36
|
+
context 'concerning item names' do
|
37
|
+
context 'with a custom name generator defined' do
|
38
|
+
before(:each) do
|
39
|
+
SimpleNavigation.config.stub!(:name_generator => Proc.new {|name| "<span>name</span>"})
|
40
|
+
end
|
41
|
+
it "should apply the name generator" do
|
42
|
+
HTML::Selector.new('li a span').select(render).should have(3).entries
|
43
|
+
end
|
44
|
+
end
|
45
|
+
context 'no customer generator defined' do
|
46
|
+
before(:each) do
|
47
|
+
SimpleNavigation.config.stub!(:name_generator => Proc.new {|name| "name"})
|
48
|
+
end
|
49
|
+
it "should apply the name generator" do
|
50
|
+
HTML::Selector.new('li a span').select(render).should have(0).entries
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context 'concerning html attributes' do
|
56
|
+
context 'default case (no options defined for link tag)' do
|
57
|
+
it "should pass the specified html_options to the li element" do
|
58
|
+
HTML::Selector.new('li[style=float:right]').select(render).should have(1).entries
|
59
|
+
end
|
60
|
+
it "should give the li the id specified in the html_options" do
|
61
|
+
HTML::Selector.new('li#my_id').select(render).should have(1).entries
|
62
|
+
end
|
63
|
+
it "should give the li the default id (stringified key) if no id is specified in the html_options" do
|
64
|
+
HTML::Selector.new('ul li#invoices').select(render).should have(1).entries
|
65
|
+
end
|
66
|
+
it "should not apply the the default id where there is an id specified in the html_options" do
|
67
|
+
HTML::Selector.new('ul li#users').select(render).should be_empty
|
68
|
+
end
|
69
|
+
end
|
70
|
+
context 'with attributes defined for the link tag as well' do
|
71
|
+
it "should add the link attributes to the link" do
|
72
|
+
HTML::Selector.new('a[style=float:left]').select(render).should have(1).entries
|
73
|
+
end
|
74
|
+
it "should add the li attributes to the li element" do
|
75
|
+
HTML::Selector.new('li[style=float:right]').select(render).should have(1).entries
|
76
|
+
end
|
77
|
+
it "should give the li the default id (stringified key) if no id is specified in the html_options for the li-element" do
|
78
|
+
HTML::Selector.new('ul li#invoices').select(render).should have(1).entries
|
79
|
+
end
|
80
|
+
it "should not apply the the default id where there is an id specified in the html_options for th li-element" do
|
81
|
+
HTML::Selector.new('ul li#users').select(render).should be_empty
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
context 'with current_navigation set' do
|
87
|
+
it "should mark the matching li-item as selected (with the css_class specified in configuration)" do
|
88
|
+
HTML::Selector.new('li.selected').select(render(:invoices)).should have(1).entries
|
89
|
+
end
|
90
|
+
it "should also mark the links inside the selected li's as selected" do
|
91
|
+
HTML::Selector.new('li.selected a.selected').select(render(:invoices)).should have(1).entries
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
context 'without current_navigation set' do
|
96
|
+
it "should not mark any of the items as selected" do
|
97
|
+
HTML::Selector.new('li.selected').select(render).should be_empty
|
98
|
+
end
|
99
|
+
it "should not mark any links as selected" do
|
100
|
+
HTML::Selector.new('a.selected').select(render).should be_empty
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
context 'nested sub_navigation' do
|
105
|
+
it "should nest the current_primary's subnavigation inside the selected li-element" do
|
106
|
+
HTML::Selector.new('li.selected ul li').select(render(:invoices)).should have(2).entries
|
107
|
+
end
|
108
|
+
it "should be possible to identify sub items using an html selector (using ids)" do
|
109
|
+
HTML::Selector.new('#invoices #subnav1').select(render(:invoices)).should have(1).entries
|
110
|
+
end
|
111
|
+
context 'expand_all => false' do
|
112
|
+
it "should not render the invoices submenu if the user-primary is active" do
|
113
|
+
HTML::Selector.new('#invoices #subnav1').select(render(:users, :level => :all, :expand_all => false)).should be_empty
|
114
|
+
HTML::Selector.new('#invoices #subnav2').select(render(:users, :level => :all, :expand_all => false)).should be_empty
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
context 'expand_all => true' do
|
119
|
+
it "should render the invoices submenu even if the user-primary is active" do
|
120
|
+
HTML::Selector.new('#invoices #subnav1').select(render(:users, :level => :all, :expand_all => true)).should have(1).entry
|
121
|
+
HTML::Selector.new('#invoices #subnav2').select(render(:users, :level => :all, :expand_all => true)).should have(1).entry
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
end
|
126
|
+
|
127
|
+
context 'skip_if_empty' do
|
128
|
+
|
129
|
+
def render_container(options={})
|
130
|
+
setup_renderer_for SimpleNavigation::Renderer::List, :rails, options
|
131
|
+
HTML::Document.new(@renderer.render(@container)).root
|
132
|
+
end
|
133
|
+
|
134
|
+
context 'container is empty' do
|
135
|
+
before(:each) do
|
136
|
+
@container = SimpleNavigation::ItemContainer.new(0)
|
137
|
+
end
|
138
|
+
context 'skip_if_empty is true' do
|
139
|
+
it "should not render a ul tag for the empty container" do
|
140
|
+
HTML::Selector.new('ul').select(render_container(:skip_if_empty => true)).should be_empty
|
141
|
+
end
|
142
|
+
end
|
143
|
+
context 'skip_if_empty is false' do
|
144
|
+
it "should render a ul tag for the empty container" do
|
145
|
+
HTML::Selector.new('ul').select(render_container(:skip_if_empty => false)).should have(1).entry
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
context 'container is not empty' do
|
151
|
+
before(:each) do
|
152
|
+
@container = primary_container
|
153
|
+
end
|
154
|
+
context 'skip_if_empty is true' do
|
155
|
+
it "should render a ul tag for the container" do
|
156
|
+
HTML::Selector.new('ul').select(render_container(:skip_if_empty => true)).should have(1).entry
|
157
|
+
end
|
158
|
+
end
|
159
|
+
context 'skip_if_empty is false' do
|
160
|
+
it "should render a ul tag for the container" do
|
161
|
+
HTML::Selector.new('ul').select(render_container(:skip_if_empty => false)).should have(1).entry
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
describe 'link_options_for' do
|
169
|
+
before(:each) do
|
170
|
+
setup_renderer_for SimpleNavigation::Renderer::List, :rails, {}
|
171
|
+
end
|
172
|
+
context 'no link options specified' do
|
173
|
+
context 'method specified' do
|
174
|
+
context 'item selected' do
|
175
|
+
before(:each) do
|
176
|
+
@item = stub(:item, :method => :delete, :selected_class => 'selected', :html_options => {})
|
177
|
+
end
|
178
|
+
it {@renderer.send(:link_options_for, @item).should == {:method => :delete, :class => 'selected'}}
|
179
|
+
end
|
180
|
+
context 'item not selected' do
|
181
|
+
before(:each) do
|
182
|
+
@item = stub(:item, :method => :delete, :selected_class => nil, :html_options => {})
|
183
|
+
end
|
184
|
+
it {@renderer.send(:link_options_for, @item).should == {:method => :delete}}
|
185
|
+
end
|
186
|
+
end
|
187
|
+
context 'method not specified' do
|
188
|
+
context 'item selected' do
|
189
|
+
before(:each) do
|
190
|
+
@item = stub(:item, :method => nil, :selected_class => 'selected', :html_options => {})
|
191
|
+
end
|
192
|
+
it {@renderer.send(:link_options_for, @item).should == {:class => 'selected'}}
|
193
|
+
end
|
194
|
+
context 'item not selected' do
|
195
|
+
before(:each) do
|
196
|
+
@item = stub(:item, :method => nil, :selected_class => nil, :html_options => {})
|
197
|
+
end
|
198
|
+
it {@renderer.send(:link_options_for, @item).should == {}}
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|
202
|
+
context 'link options specified' do
|
203
|
+
before(:each) do
|
204
|
+
@item = stub(:item, :method => :delete, :selected_class => 'selected', :html_options => {:link => {:class => 'link_class', :style => 'float:left'}})
|
205
|
+
end
|
206
|
+
it {@renderer.send(:link_options_for, @item).should == {:method => :delete, :class => 'link_class selected', :style => 'float:left'}}
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
end
|
211
|
+
end
|