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,128 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe SimpleNavigation::Configuration do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@config = SimpleNavigation::Configuration.instance
|
7
|
+
end
|
8
|
+
|
9
|
+
describe 'self.run' do
|
10
|
+
it "should yield the singleton Configuration object" do
|
11
|
+
SimpleNavigation::Configuration.run do |c|
|
12
|
+
c.should == @config
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe 'self.eval_config' do
|
18
|
+
before(:each) do
|
19
|
+
@context = mock(:context)
|
20
|
+
@context.stub!(:instance_eval)
|
21
|
+
SimpleNavigation.stub!(:context_for_eval => @context)
|
22
|
+
@config_files = {:default => 'default', :my_context => 'my_context'}
|
23
|
+
SimpleNavigation.stub!(:config_files).and_return(@config_files)
|
24
|
+
end
|
25
|
+
context "with default navigation context" do
|
26
|
+
it "should instance_eval the default config_file-string inside the context" do
|
27
|
+
@context.should_receive(:instance_eval).with('default')
|
28
|
+
SimpleNavigation::Configuration.eval_config
|
29
|
+
end
|
30
|
+
end
|
31
|
+
context 'with non default navigation context' do
|
32
|
+
it "should instance_eval the specified config_file-string inside the context" do
|
33
|
+
@context.should_receive(:instance_eval).with('my_context')
|
34
|
+
SimpleNavigation::Configuration.eval_config(:my_context)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe 'initialize' do
|
40
|
+
it "should set the List-Renderer as default upon initialize" do
|
41
|
+
@config.renderer.should == SimpleNavigation::Renderer::List
|
42
|
+
end
|
43
|
+
it "should set the selected_class to 'selected' as default" do
|
44
|
+
@config.selected_class.should == 'selected'
|
45
|
+
end
|
46
|
+
it "should set the active_leaf_class to 'simple-navigation-active-leaf' as default" do
|
47
|
+
@config.active_leaf_class.should == 'simple-navigation-active-leaf'
|
48
|
+
end
|
49
|
+
it "should set autogenerate_item_ids to true as default" do
|
50
|
+
@config.autogenerate_item_ids.should be_true
|
51
|
+
end
|
52
|
+
it "should set auto_highlight to true as default" do
|
53
|
+
@config.auto_highlight.should be_true
|
54
|
+
end
|
55
|
+
it "should set the id_generator" do
|
56
|
+
@config.id_generator.should_not be_nil
|
57
|
+
end
|
58
|
+
it "should set the name_generator" do
|
59
|
+
@config.name_generator.should_not be_nil
|
60
|
+
end
|
61
|
+
end
|
62
|
+
describe 'items' do
|
63
|
+
before(:each) do
|
64
|
+
@container = stub(:items_container)
|
65
|
+
SimpleNavigation::ItemContainer.stub!(:new).and_return(@container)
|
66
|
+
end
|
67
|
+
context 'block given' do
|
68
|
+
context 'items_provider specified' do
|
69
|
+
it {lambda {@config.items(stub(:provider)) {}}.should raise_error}
|
70
|
+
end
|
71
|
+
context 'no items_provider specified' do
|
72
|
+
it "should should yield an new ItemContainer" do
|
73
|
+
@config.items do |container|
|
74
|
+
container.should == @container
|
75
|
+
end
|
76
|
+
end
|
77
|
+
it "should assign the ItemContainer to an instance-var" do
|
78
|
+
@config.items {}
|
79
|
+
@config.primary_navigation.should == @container
|
80
|
+
end
|
81
|
+
it "should not set the items on the container" do
|
82
|
+
@container.should_not_receive(:items=)
|
83
|
+
@config.items {}
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
context 'no block given' do
|
88
|
+
context 'items_provider specified' do
|
89
|
+
before(:each) do
|
90
|
+
@external_provider = stub(:external_provider)
|
91
|
+
@items = stub(:items)
|
92
|
+
@items_provider = stub(:items_provider, :items => @items)
|
93
|
+
SimpleNavigation::ItemsProvider.stub!(:new => @items_provider)
|
94
|
+
@container.stub!(:items=)
|
95
|
+
end
|
96
|
+
it "should create an new Provider object for the specified provider" do
|
97
|
+
SimpleNavigation::ItemsProvider.should_receive(:new).with(@external_provider)
|
98
|
+
@config.items(@external_provider)
|
99
|
+
end
|
100
|
+
it "should call items on the provider object" do
|
101
|
+
@items_provider.should_receive(:items)
|
102
|
+
@config.items(@external_provider)
|
103
|
+
end
|
104
|
+
it "should set the items on the container" do
|
105
|
+
@container.should_receive(:items=).with(@items)
|
106
|
+
@config.items(@external_provider)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
context 'items_provider not specified' do
|
110
|
+
it {lambda {@config.items}.should raise_error}
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
describe 'loaded?' do
|
116
|
+
it "should return true if primary_nav is set" do
|
117
|
+
@config.instance_variable_set(:@primary_navigation, :bla)
|
118
|
+
@config.should be_loaded
|
119
|
+
end
|
120
|
+
it "should return false if no primary_nav is set" do
|
121
|
+
@config.instance_variable_set(:@primary_navigation, nil)
|
122
|
+
@config.should_not be_loaded
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
end
|
127
|
+
|
128
|
+
|
@@ -0,0 +1,212 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe SimpleNavigation::ItemAdapter, 'when item is an object' do
|
4
|
+
|
5
|
+
before(:each) do
|
6
|
+
@item = stub(:item)
|
7
|
+
@item_adapter = SimpleNavigation::ItemAdapter.new(@item)
|
8
|
+
end
|
9
|
+
|
10
|
+
describe 'key' do
|
11
|
+
it "should delegate key to item" do
|
12
|
+
@item.should_receive(:key)
|
13
|
+
@item_adapter.key
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe 'url' do
|
18
|
+
it "should delegate url to item" do
|
19
|
+
@item.should_receive(:url)
|
20
|
+
@item_adapter.url
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe 'name' do
|
25
|
+
it "should delegate name to item" do
|
26
|
+
@item.should_receive(:name)
|
27
|
+
@item_adapter.name
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe 'initialize' do
|
32
|
+
it "should set the item" do
|
33
|
+
@item_adapter.item.should == @item
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe 'options' do
|
38
|
+
context 'item does respond to options' do
|
39
|
+
before(:each) do
|
40
|
+
@options = stub(:options)
|
41
|
+
@item.stub!(:options => @options)
|
42
|
+
end
|
43
|
+
it "should return the item's options'" do
|
44
|
+
@item_adapter.options.should == @options
|
45
|
+
end
|
46
|
+
end
|
47
|
+
context 'item does not respond to options' do
|
48
|
+
it "should return an empty hash" do
|
49
|
+
@item_adapter.options.should == {}
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe 'items' do
|
55
|
+
context 'item does respond to items' do
|
56
|
+
context 'items is nil' do
|
57
|
+
before(:each) do
|
58
|
+
@item.stub!(:items => nil)
|
59
|
+
end
|
60
|
+
it "should return nil" do
|
61
|
+
@item_adapter.items.should be_nil
|
62
|
+
end
|
63
|
+
end
|
64
|
+
context 'items is not nil' do
|
65
|
+
context 'items is empty' do
|
66
|
+
before(:each) do
|
67
|
+
@item.stub!(:items => [])
|
68
|
+
end
|
69
|
+
it "should return nil" do
|
70
|
+
@item_adapter.items.should be_nil
|
71
|
+
end
|
72
|
+
end
|
73
|
+
context 'items is not empty' do
|
74
|
+
before(:each) do
|
75
|
+
@items = stub(:items, :empty? => false)
|
76
|
+
@item.stub!(:items => @items)
|
77
|
+
end
|
78
|
+
it "should return the items" do
|
79
|
+
@item_adapter.items.should == @items
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
context 'item does not respond to items' do
|
85
|
+
it "should return nil" do
|
86
|
+
@item_adapter.items.should be_nil
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
describe 'to_simple_navigation_item' do
|
92
|
+
before(:each) do
|
93
|
+
@container = stub(:container)
|
94
|
+
@item.stub!(:url => 'url', :name => 'name', :key => 'key', :options => {}, :items => [])
|
95
|
+
end
|
96
|
+
it "should create a SimpleNavigation::Item" do
|
97
|
+
SimpleNavigation::Item.should_receive(:new).with(@container, 'key', 'name', 'url', {}, nil)
|
98
|
+
@item_adapter.to_simple_navigation_item(@container)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
103
|
+
|
104
|
+
describe SimpleNavigation::ItemAdapter, 'when item is a kind of hash' do
|
105
|
+
|
106
|
+
class ModifiedHash < Hash
|
107
|
+
end
|
108
|
+
|
109
|
+
before(:each) do
|
110
|
+
@item = ModifiedHash[:key => 'key', :url => 'url', :name => 'name']
|
111
|
+
@item_adapter = SimpleNavigation::ItemAdapter.new(@item)
|
112
|
+
end
|
113
|
+
|
114
|
+
describe 'key' do
|
115
|
+
it "should delegate key to item" do
|
116
|
+
@item_adapter.item.should_receive(:key)
|
117
|
+
@item_adapter.key
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
describe 'url' do
|
122
|
+
it "should delegate url to item" do
|
123
|
+
@item_adapter.item.should_receive(:url)
|
124
|
+
@item_adapter.url
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
describe 'name' do
|
129
|
+
it "should delegate name to item" do
|
130
|
+
@item_adapter.item.should_receive(:name)
|
131
|
+
@item_adapter.name
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
describe 'initialize' do
|
136
|
+
it "should set the item" do
|
137
|
+
@item_adapter.item.should_not be_nil
|
138
|
+
end
|
139
|
+
it "should have converted the item into an object" do
|
140
|
+
@item_adapter.item.should respond_to(:url)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
describe 'options' do
|
145
|
+
context 'item does respond to options' do
|
146
|
+
before(:each) do
|
147
|
+
@item = {:key => 'key', :url => 'url', :name => 'name', :options => {:my => :options}}
|
148
|
+
@item_adapter = SimpleNavigation::ItemAdapter.new(@item)
|
149
|
+
end
|
150
|
+
it "should return the item's options'" do
|
151
|
+
@item_adapter.options.should == {:my => :options}
|
152
|
+
end
|
153
|
+
end
|
154
|
+
context 'item does not respond to options' do
|
155
|
+
it "should return an empty hash" do
|
156
|
+
@item_adapter.options.should == {}
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
describe 'items' do
|
162
|
+
context 'item does respond to items' do
|
163
|
+
context 'items is nil' do
|
164
|
+
before(:each) do
|
165
|
+
@item = {:key => 'key', :url => 'url', :name => 'name', :items => nil}
|
166
|
+
@item_adapter = SimpleNavigation::ItemAdapter.new(@item)
|
167
|
+
end
|
168
|
+
it "should return nil" do
|
169
|
+
@item_adapter.items.should be_nil
|
170
|
+
end
|
171
|
+
end
|
172
|
+
context 'items is not nil' do
|
173
|
+
context 'items is empty' do
|
174
|
+
before(:each) do
|
175
|
+
@item = {:key => 'key', :url => 'url', :name => 'name', :items => []}
|
176
|
+
@item_adapter = SimpleNavigation::ItemAdapter.new(@item)
|
177
|
+
end
|
178
|
+
it "should return nil" do
|
179
|
+
@item_adapter.items.should be_nil
|
180
|
+
end
|
181
|
+
end
|
182
|
+
context 'items is not empty' do
|
183
|
+
before(:each) do
|
184
|
+
@item = {:key => 'key', :url => 'url', :name => 'name', :items => ['not', 'empty']}
|
185
|
+
@item_adapter = SimpleNavigation::ItemAdapter.new(@item)
|
186
|
+
end
|
187
|
+
it "should return the items" do
|
188
|
+
@item_adapter.items.should == ['not', 'empty']
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end
|
192
|
+
end
|
193
|
+
context 'item does not respond to items' do
|
194
|
+
it "should return nil" do
|
195
|
+
@item_adapter.items.should be_nil
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
describe 'to_simple_navigation_item' do
|
201
|
+
before(:each) do
|
202
|
+
@container = stub(:container)
|
203
|
+
@item = {:key => 'key', :url => 'url', :name => 'name', :items => [], :options => {}}
|
204
|
+
@item_adapter = SimpleNavigation::ItemAdapter.new(@item)
|
205
|
+
end
|
206
|
+
it "should create a SimpleNavigation::Item" do
|
207
|
+
SimpleNavigation::Item.should_receive(:new).with(@container, 'key', 'name', 'url', {}, nil)
|
208
|
+
@item_adapter.to_simple_navigation_item(@container)
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
end
|
@@ -0,0 +1,451 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe SimpleNavigation::ItemContainer do
|
4
|
+
before(:each) do
|
5
|
+
@item_container = SimpleNavigation::ItemContainer.new
|
6
|
+
end
|
7
|
+
describe 'initialize' do
|
8
|
+
it "should set the renderer to the globally-configured renderer per default" do
|
9
|
+
SimpleNavigation::Configuration.instance.should_receive(:renderer)
|
10
|
+
@item_container = SimpleNavigation::ItemContainer.new
|
11
|
+
end
|
12
|
+
it "should have an empty items-array" do
|
13
|
+
@item_container = SimpleNavigation::ItemContainer.new
|
14
|
+
@item_container.items.should be_empty
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe 'items=' do
|
19
|
+
before(:each) do
|
20
|
+
@item = stub(:item)
|
21
|
+
@items = [@item]
|
22
|
+
@item_adapter = stub(:item_adapter).as_null_object
|
23
|
+
SimpleNavigation::ItemAdapter.stub(:new => @item_adapter)
|
24
|
+
@item_container.stub!(:should_add_item? => true)
|
25
|
+
end
|
26
|
+
it "should wrap each item in an ItemAdapter" do
|
27
|
+
SimpleNavigation::ItemAdapter.should_receive(:new)
|
28
|
+
@item_container.items = @items
|
29
|
+
end
|
30
|
+
context 'item should be added' do
|
31
|
+
before(:each) do
|
32
|
+
@item_container.stub!(:should_add_item? => true)
|
33
|
+
@simple_navigation_item = stub(:simple_navigation_item)
|
34
|
+
@item_adapter.stub!(:to_simple_navigation_item => @simple_navigation_item)
|
35
|
+
end
|
36
|
+
it "should convert the item to a SimpleNavigation::Item" do
|
37
|
+
@item_adapter.should_receive(:to_simple_navigation_item).with(@item_container)
|
38
|
+
@item_container.items = @items
|
39
|
+
end
|
40
|
+
it "should add the item to the items-collection" do
|
41
|
+
@item_container.items.should_receive(:<<).with(@simple_navigation_item)
|
42
|
+
@item_container.items = @items
|
43
|
+
end
|
44
|
+
end
|
45
|
+
context 'item should not be added' do
|
46
|
+
before(:each) do
|
47
|
+
@item_container.stub!(:should_add_item? => false)
|
48
|
+
end
|
49
|
+
it "should not convert the item to a SimpleNavigation::Item" do
|
50
|
+
@item_adapter.should_not_receive(:to_simple_navigation_item)
|
51
|
+
@item_container.items = @items
|
52
|
+
end
|
53
|
+
it "should not add the item to the items-collection" do
|
54
|
+
@item_container.items.should_not_receive(:<<)
|
55
|
+
@item_container.items = @items
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe 'selected?' do
|
61
|
+
before(:each) do
|
62
|
+
@item_1 = stub(:item, :selected? => false)
|
63
|
+
@item_2 = stub(:item, :selected? => false)
|
64
|
+
@item_container.instance_variable_set(:@items, [@item_1, @item_2])
|
65
|
+
end
|
66
|
+
it "should return nil if no item is selected" do
|
67
|
+
@item_container.should_not be_selected
|
68
|
+
end
|
69
|
+
it "should return true if one item is selected" do
|
70
|
+
@item_1.stub!(:selected? => true)
|
71
|
+
@item_container.should be_selected
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
describe 'selected_item' do
|
76
|
+
before(:each) do
|
77
|
+
SimpleNavigation.stub!(:current_navigation_for => :nav)
|
78
|
+
@item_container.stub!(:[] => nil)
|
79
|
+
@item_1 = stub(:item, :selected? => false)
|
80
|
+
@item_2 = stub(:item, :selected? => false)
|
81
|
+
@item_container.instance_variable_set(:@items, [@item_1, @item_2])
|
82
|
+
end
|
83
|
+
context 'navigation not explicitely set' do
|
84
|
+
context 'no item selected' do
|
85
|
+
it "should return nil" do
|
86
|
+
@item_container.selected_item.should be_nil
|
87
|
+
end
|
88
|
+
end
|
89
|
+
context 'one item selected' do
|
90
|
+
before(:each) do
|
91
|
+
@item_1.stub!(:selected? => true)
|
92
|
+
end
|
93
|
+
it "should return the selected item" do
|
94
|
+
@item_container.selected_item.should == @item_1
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
describe 'selected_sub_navigation?' do
|
101
|
+
context 'with an item selected' do
|
102
|
+
before(:each) do
|
103
|
+
@selected_item = stub(:selected_item)
|
104
|
+
@item_container.stub!(:selected_item => @selected_item)
|
105
|
+
end
|
106
|
+
context 'selected item has sub_navigation' do
|
107
|
+
before(:each) do
|
108
|
+
@sub_navigation = stub(:sub_navigation)
|
109
|
+
@selected_item.stub!(:sub_navigation => @sub_navigation)
|
110
|
+
end
|
111
|
+
it {@item_container.send(:selected_sub_navigation?).should be_true}
|
112
|
+
end
|
113
|
+
context 'selected item does not have sub_navigation' do
|
114
|
+
before(:each) do
|
115
|
+
@selected_item.stub!(:sub_navigation => nil)
|
116
|
+
end
|
117
|
+
it {@item_container.send(:selected_sub_navigation?).should be_false}
|
118
|
+
end
|
119
|
+
end
|
120
|
+
context 'without an item selected' do
|
121
|
+
before(:each) do
|
122
|
+
@item_container.stub!(:selected_item => nil)
|
123
|
+
end
|
124
|
+
it {@item_container.send(:selected_sub_navigation?).should be_false}
|
125
|
+
end
|
126
|
+
|
127
|
+
end
|
128
|
+
|
129
|
+
describe 'active_item_container_for' do
|
130
|
+
context "the desired level is the same as the container's" do
|
131
|
+
it {@item_container.active_item_container_for(1).should == @item_container}
|
132
|
+
end
|
133
|
+
context "the desired level is different than the container's" do
|
134
|
+
context 'with no selected subnavigation' do
|
135
|
+
before(:each) do
|
136
|
+
@item_container.stub!(:selected_sub_navigation? => false)
|
137
|
+
end
|
138
|
+
it {@item_container.active_item_container_for(2).should be_nil}
|
139
|
+
end
|
140
|
+
context 'with selected subnavigation' do
|
141
|
+
before(:each) do
|
142
|
+
@item_container.stub!(:selected_sub_navigation? => true)
|
143
|
+
@sub_nav = stub(:sub_nav)
|
144
|
+
@selected_item = stub(:selected_item)
|
145
|
+
@item_container.stub!(:selected_item => @selected_item)
|
146
|
+
@selected_item.stub!(:sub_navigation => @sub_nav)
|
147
|
+
end
|
148
|
+
it "should call recursively on the sub_navigation" do
|
149
|
+
@sub_nav.should_receive(:active_item_container_for).with(2)
|
150
|
+
@item_container.active_item_container_for(2)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
describe 'active_leaf_container' do
|
157
|
+
context 'the current container has a selected subnavigation' do
|
158
|
+
before(:each) do
|
159
|
+
@item_container.stub!(:selected_sub_navigation? => true)
|
160
|
+
@sub_nav = stub(:sub_nav)
|
161
|
+
@selected_item = stub(:selected_item)
|
162
|
+
@item_container.stub!(:selected_item => @selected_item)
|
163
|
+
@selected_item.stub!(:sub_navigation => @sub_nav)
|
164
|
+
end
|
165
|
+
it "should call recursively on the sub_navigation" do
|
166
|
+
@sub_nav.should_receive(:active_leaf_container)
|
167
|
+
@item_container.active_leaf_container
|
168
|
+
end
|
169
|
+
end
|
170
|
+
context 'the current container is the leaf already' do
|
171
|
+
before(:each) do
|
172
|
+
@item_container.stub!(:selected_sub_navigation? => false)
|
173
|
+
end
|
174
|
+
it "should return itsself" do
|
175
|
+
@item_container.active_leaf_container.should == @item_container
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
describe 'item' do
|
181
|
+
|
182
|
+
context 'unconditional item' do
|
183
|
+
|
184
|
+
before(:each) do
|
185
|
+
@item_container.stub!(:should_add_item?).and_return(true)
|
186
|
+
@options = {}
|
187
|
+
end
|
188
|
+
|
189
|
+
context 'block given' do
|
190
|
+
before(:each) do
|
191
|
+
@sub_container = stub(:sub_container)
|
192
|
+
SimpleNavigation::ItemContainer.stub!(:new).and_return(@sub_container)
|
193
|
+
end
|
194
|
+
|
195
|
+
it "should should yield an new ItemContainer" do
|
196
|
+
@item_container.item('key', 'name', 'url', @options) do |container|
|
197
|
+
container.should == @sub_container
|
198
|
+
end
|
199
|
+
end
|
200
|
+
it "should create a new Navigation-Item with the given params and the specified block" do
|
201
|
+
SimpleNavigation::Item.should_receive(:new).with(@item_container, 'key', 'name', 'url', @options, nil, &@proc)
|
202
|
+
@item_container.item('key', 'name', 'url', @options, &@proc)
|
203
|
+
end
|
204
|
+
it "should add the created item to the list of items" do
|
205
|
+
@item_container.items.should_receive(:<<)
|
206
|
+
@item_container.item('key', 'name', 'url', @options) {}
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
context 'no block given' do
|
211
|
+
it "should create a new Navigation_item with the given params and nil as sub_navi" do
|
212
|
+
SimpleNavigation::Item.should_receive(:new).with(@item_container, 'key', 'name', 'url', @options, nil)
|
213
|
+
@item_container.item('key', 'name', 'url', @options)
|
214
|
+
end
|
215
|
+
it "should add the created item to the list of items" do
|
216
|
+
@item_container.items.should_receive(:<<)
|
217
|
+
@item_container.item('key', 'name', 'url', @options)
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
end
|
222
|
+
|
223
|
+
context 'optional url and optional options' do
|
224
|
+
context 'item specifed without url or options' do
|
225
|
+
it 'should add the create item to the list of items' do
|
226
|
+
@item_container.items.should_receive(:<<)
|
227
|
+
@item_container.item('key', 'name')
|
228
|
+
end
|
229
|
+
end
|
230
|
+
context 'item specified with only a url' do
|
231
|
+
it 'should add the item to the list' do
|
232
|
+
@item_container.items.should_receive(:<<)
|
233
|
+
@item_container.item('key', 'name', 'url')
|
234
|
+
end
|
235
|
+
end
|
236
|
+
context 'item specified with only options' do
|
237
|
+
context 'containing no conditions' do
|
238
|
+
it 'should add the created item to the list of items' do
|
239
|
+
@item_container.items.should_receive(:<<)
|
240
|
+
@item_container.item('key', 'name', {:option => true})
|
241
|
+
end
|
242
|
+
end
|
243
|
+
context 'containing negative condition' do
|
244
|
+
it 'should not add the created item to the list of items' do
|
245
|
+
@item_container.items.should_not_receive(:<<)
|
246
|
+
@item_container.item('key', 'name', {:if => lambda{false}, :option => true})
|
247
|
+
end
|
248
|
+
end
|
249
|
+
context 'containing positive condition' do
|
250
|
+
it 'should add the created item to the list of items' do
|
251
|
+
@item_container.items.should_receive(:<<)
|
252
|
+
@item_container.item('key', 'name', {:if => lambda{true}, :option => true})
|
253
|
+
end
|
254
|
+
end
|
255
|
+
end
|
256
|
+
context 'item specified with a url and options' do
|
257
|
+
context 'containing no conditions' do
|
258
|
+
it 'should add the created item to the list of items' do
|
259
|
+
@item_container.items.should_receive(:<<)
|
260
|
+
@item_container.item('key', 'name', 'url', {:option => true})
|
261
|
+
end
|
262
|
+
end
|
263
|
+
context 'containing negative condition' do
|
264
|
+
it 'should not add the created item to the list of items' do
|
265
|
+
@item_container.items.should_not_receive(:<<)
|
266
|
+
@item_container.item('key', 'name', 'url', {:if => lambda{false}, :option => true})
|
267
|
+
end
|
268
|
+
end
|
269
|
+
context 'containing positive condition' do
|
270
|
+
it 'should add the created item to the list of items' do
|
271
|
+
@item_container.items.should_receive(:<<)
|
272
|
+
@item_container.item('key', 'name', 'url', {:if => lambda{true}, :option => true})
|
273
|
+
end
|
274
|
+
end
|
275
|
+
end
|
276
|
+
end
|
277
|
+
|
278
|
+
context 'conditions given for item' do
|
279
|
+
|
280
|
+
context '"if" given' do
|
281
|
+
|
282
|
+
before(:each) do
|
283
|
+
@options = {:if => Proc.new {@condition}}
|
284
|
+
end
|
285
|
+
|
286
|
+
it "should remove if from options" do
|
287
|
+
@item_container.item('key', 'name', 'url', @options)
|
288
|
+
@options[:if].should be_nil
|
289
|
+
end
|
290
|
+
|
291
|
+
context 'if evals to true' do
|
292
|
+
before(:each) do
|
293
|
+
@condition = true
|
294
|
+
end
|
295
|
+
it "should create a new Navigation-Item" do
|
296
|
+
SimpleNavigation::Item.should_receive(:new)
|
297
|
+
@item_container.item('key', 'name', 'url', @options)
|
298
|
+
end
|
299
|
+
end
|
300
|
+
|
301
|
+
context 'if evals to false' do
|
302
|
+
before(:each) do
|
303
|
+
@condition = false
|
304
|
+
end
|
305
|
+
it "should not create a new Navigation-Item" do
|
306
|
+
SimpleNavigation::Item.should_not_receive(:new)
|
307
|
+
@item_container.item('key', 'name', 'url', @options)
|
308
|
+
end
|
309
|
+
end
|
310
|
+
|
311
|
+
context 'if is not a proc or method' do
|
312
|
+
it "should raise an error" do
|
313
|
+
lambda {@item_container.item('key', 'name', 'url', {:if => 'text'})}.should raise_error
|
314
|
+
end
|
315
|
+
end
|
316
|
+
|
317
|
+
context '"unless" given' do
|
318
|
+
|
319
|
+
before(:each) do
|
320
|
+
@options = {:unless => Proc.new {@condition}}
|
321
|
+
end
|
322
|
+
|
323
|
+
|
324
|
+
it "should remove unless from options" do
|
325
|
+
@item_container.item('key', 'name', 'url', @options)
|
326
|
+
@options[:unless].should be_nil
|
327
|
+
end
|
328
|
+
|
329
|
+
context 'unless evals to false' do
|
330
|
+
before(:each) do
|
331
|
+
@condition = false
|
332
|
+
end
|
333
|
+
it "should create a new Navigation-Item" do
|
334
|
+
SimpleNavigation::Item.should_receive(:new)
|
335
|
+
@item_container.item('key', 'name', 'url', @options)
|
336
|
+
end
|
337
|
+
end
|
338
|
+
|
339
|
+
context 'unless evals to true' do
|
340
|
+
before(:each) do
|
341
|
+
@condition = true
|
342
|
+
end
|
343
|
+
it "should not create a new Navigation-Item" do
|
344
|
+
SimpleNavigation::Item.should_not_receive(:new)
|
345
|
+
@item_container.item('key', 'name', 'url', @options)
|
346
|
+
end
|
347
|
+
end
|
348
|
+
|
349
|
+
end
|
350
|
+
end
|
351
|
+
end
|
352
|
+
end
|
353
|
+
|
354
|
+
describe '[]' do
|
355
|
+
|
356
|
+
before(:each) do
|
357
|
+
@item_container.item(:first, 'first', 'bla')
|
358
|
+
@item_container.item(:second, 'second', 'bla')
|
359
|
+
@item_container.item(:third, 'third', 'bla')
|
360
|
+
end
|
361
|
+
|
362
|
+
it "should return the item with the specified navi_key" do
|
363
|
+
@item_container[:second].name.should == 'second'
|
364
|
+
end
|
365
|
+
it "should return nil if no item exists for the specified navi_key" do
|
366
|
+
@item_container[:invalid].should be_nil
|
367
|
+
end
|
368
|
+
end
|
369
|
+
|
370
|
+
describe 'render' do
|
371
|
+
before(:each) do
|
372
|
+
@renderer_instance = stub(:renderer).as_null_object
|
373
|
+
@renderer_class = stub(:renderer_class, :new => @renderer_instance)
|
374
|
+
end
|
375
|
+
context 'renderer specified as option' do
|
376
|
+
context 'renderer-class specified' do
|
377
|
+
it "should instantiate the passed renderer_class with the options" do
|
378
|
+
@renderer_class.should_receive(:new).with(:renderer => @renderer_class)
|
379
|
+
end
|
380
|
+
it "should call render on the renderer and pass self" do
|
381
|
+
@renderer_instance.should_receive(:render).with(@item_container)
|
382
|
+
end
|
383
|
+
after(:each) do
|
384
|
+
@item_container.render(:renderer => @renderer_class)
|
385
|
+
end
|
386
|
+
end
|
387
|
+
context 'renderer-symbol specified' do
|
388
|
+
before(:each) do
|
389
|
+
SimpleNavigation.registered_renderers = {:my_renderer => @renderer_class}
|
390
|
+
end
|
391
|
+
it "should instantiate the passed renderer_class with the options" do
|
392
|
+
@renderer_class.should_receive(:new).with(:renderer => :my_renderer)
|
393
|
+
end
|
394
|
+
it "should call render on the renderer and pass self" do
|
395
|
+
@renderer_instance.should_receive(:render).with(@item_container)
|
396
|
+
end
|
397
|
+
after(:each) do
|
398
|
+
@item_container.render(:renderer => :my_renderer)
|
399
|
+
end
|
400
|
+
end
|
401
|
+
end
|
402
|
+
context 'no renderer specified' do
|
403
|
+
before(:each) do
|
404
|
+
@item_container.stub!(:renderer => @renderer_class)
|
405
|
+
@options = {}
|
406
|
+
end
|
407
|
+
it "should instantiate the container's renderer with the options" do
|
408
|
+
@renderer_class.should_receive(:new).with(@options)
|
409
|
+
end
|
410
|
+
it "should call render on the renderer and pass self" do
|
411
|
+
@renderer_instance.should_receive(:render).with(@item_container)
|
412
|
+
end
|
413
|
+
after(:each) do
|
414
|
+
@item_container.render(@options)
|
415
|
+
end
|
416
|
+
end
|
417
|
+
end
|
418
|
+
|
419
|
+
describe 'level_for_item' do
|
420
|
+
before(:each) do
|
421
|
+
@item_container.item(:p1, 'p1', 'p1')
|
422
|
+
@item_container.item(:p2, 'p2', 'p2') do |p2|
|
423
|
+
p2.item(:s1, 's1', 's1')
|
424
|
+
p2.item(:s2, 's2', 's2') do |s2|
|
425
|
+
s2.item(:ss1, 'ss1', 'ss1')
|
426
|
+
s2.item(:ss2, 'ss2', 'ss2')
|
427
|
+
end
|
428
|
+
p2.item(:s3, 's3', 's3')
|
429
|
+
end
|
430
|
+
@item_container.item(:p3, 'p3', 'p3')
|
431
|
+
end
|
432
|
+
it {@item_container.level_for_item(:p1).should == 1}
|
433
|
+
it {@item_container.level_for_item(:p3).should == 1}
|
434
|
+
it {@item_container.level_for_item(:s1).should == 2}
|
435
|
+
it {@item_container.level_for_item(:ss1).should == 3}
|
436
|
+
it {@item_container.level_for_item(:x).should be_nil}
|
437
|
+
|
438
|
+
end
|
439
|
+
|
440
|
+
describe 'empty?' do
|
441
|
+
it "should be empty if there are no items" do
|
442
|
+
@item_container.instance_variable_set(:@items, [])
|
443
|
+
@item_container.should be_empty
|
444
|
+
end
|
445
|
+
it "should not be empty if there are some items" do
|
446
|
+
@item_container.instance_variable_set(:@items, [stub(:item)])
|
447
|
+
@item_container.should_not be_empty
|
448
|
+
end
|
449
|
+
end
|
450
|
+
|
451
|
+
end
|