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.
Files changed (52) hide show
  1. data/CHANGELOG +265 -0
  2. data/Gemfile +17 -0
  3. data/README +22 -0
  4. data/Rakefile +47 -0
  5. data/VERSION +1 -0
  6. data/generators/navigation_config/USAGE +1 -0
  7. data/generators/navigation_config/navigation_config_generator.rb +8 -0
  8. data/generators/navigation_config/templates/config/navigation.rb +76 -0
  9. data/lib/generators/navigation_config/navigation_config_generator.rb +12 -0
  10. data/lib/simple-navigation.rb +1 -0
  11. data/lib/simple_navigation.rb +167 -0
  12. data/lib/simple_navigation/adapters.rb +10 -0
  13. data/lib/simple_navigation/adapters/base.rb +37 -0
  14. data/lib/simple_navigation/adapters/nanoc.rb +45 -0
  15. data/lib/simple_navigation/adapters/padrino.rb +20 -0
  16. data/lib/simple_navigation/adapters/rails.rb +93 -0
  17. data/lib/simple_navigation/adapters/sinatra.rb +69 -0
  18. data/lib/simple_navigation/core.rb +5 -0
  19. data/lib/simple_navigation/core/configuration.rb +72 -0
  20. data/lib/simple_navigation/core/item.rb +144 -0
  21. data/lib/simple_navigation/core/item_adapter.rb +63 -0
  22. data/lib/simple_navigation/core/item_container.rb +147 -0
  23. data/lib/simple_navigation/core/items_provider.rb +35 -0
  24. data/lib/simple_navigation/rails_controller_methods.rb +144 -0
  25. data/lib/simple_navigation/rendering.rb +12 -0
  26. data/lib/simple_navigation/rendering/helpers.rb +123 -0
  27. data/lib/simple_navigation/rendering/renderer/base.rb +107 -0
  28. data/lib/simple_navigation/rendering/renderer/breadcrumbs.rb +59 -0
  29. data/lib/simple_navigation/rendering/renderer/json.rb +29 -0
  30. data/lib/simple_navigation/rendering/renderer/links.rb +32 -0
  31. data/lib/simple_navigation/rendering/renderer/list.rb +29 -0
  32. data/lib/simple_navigation/rendering/renderer/text.rb +26 -0
  33. data/rails/init.rb +1 -0
  34. data/spec/lib/simple_navigation/adapters/padrino_spec.rb +31 -0
  35. data/spec/lib/simple_navigation/adapters/rails_spec.rb +287 -0
  36. data/spec/lib/simple_navigation/adapters/sinatra_spec.rb +80 -0
  37. data/spec/lib/simple_navigation/core/configuration_spec.rb +128 -0
  38. data/spec/lib/simple_navigation/core/item_adapter_spec.rb +212 -0
  39. data/spec/lib/simple_navigation/core/item_container_spec.rb +451 -0
  40. data/spec/lib/simple_navigation/core/item_spec.rb +566 -0
  41. data/spec/lib/simple_navigation/core/items_provider_spec.rb +60 -0
  42. data/spec/lib/simple_navigation/rails_controller_methods_spec.rb +249 -0
  43. data/spec/lib/simple_navigation/rendering/helpers_spec.rb +276 -0
  44. data/spec/lib/simple_navigation/rendering/renderer/base_spec.rb +199 -0
  45. data/spec/lib/simple_navigation/rendering/renderer/breadcrumbs_spec.rb +101 -0
  46. data/spec/lib/simple_navigation/rendering/renderer/json_spec.rb +48 -0
  47. data/spec/lib/simple_navigation/rendering/renderer/links_spec.rb +64 -0
  48. data/spec/lib/simple_navigation/rendering/renderer/list_spec.rb +211 -0
  49. data/spec/lib/simple_navigation/rendering/renderer/text_spec.rb +41 -0
  50. data/spec/lib/simple_navigation_spec.rb +307 -0
  51. data/spec/spec_helper.rb +108 -0
  52. 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