menu_helper 0.0.5 → 0.1.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.rdoc +40 -0
- data/{MIT-LICENSE → LICENSE} +0 -0
- data/{README → README.rdoc} +26 -30
- data/Rakefile +44 -36
- data/lib/menu_helper.rb +70 -33
- data/lib/menu_helper/menu.rb +86 -44
- data/lib/menu_helper/menu_bar.rb +113 -50
- data/test/app_root/config/routes.rb +0 -12
- data/test/helpers/menu_helper_test.rb +30 -0
- data/test/test_helper.rb +7 -2
- data/test/unit/html_element_test.rb +1 -1
- data/test/unit/menu_bar_test.rb +268 -25
- data/test/unit/menu_test.rb +377 -101
- metadata +11 -11
- data/CHANGELOG +0 -35
- data/test/unit/menu_helper_test.rb +0 -30
data/lib/menu_helper/menu_bar.rb
CHANGED
@@ -1,47 +1,107 @@
|
|
1
1
|
module PluginAWeek #:nodoc:
|
2
2
|
module MenuHelper
|
3
|
-
# Represents a group of menus. A menu bar can either be the main menu
|
4
|
-
#
|
3
|
+
# Represents a group of menus. A menu bar can either be the main menu bar
|
4
|
+
# or a menu bar nested within a menu.
|
5
5
|
class MenuBar < HtmlElement
|
6
|
+
# The css class to apply for all menu bars
|
7
|
+
cattr_accessor :menu_bar_class
|
8
|
+
@@menu_bar_class = 'menubar'
|
9
|
+
|
10
|
+
# The css class to apply when a sub-menu bar is selected
|
11
|
+
cattr_accessor :selected_class
|
12
|
+
@@selected_class = 'menubar-selected'
|
13
|
+
|
14
|
+
# The request context in which this menu bar is being rendered
|
15
|
+
attr_reader :request_controller
|
16
|
+
|
6
17
|
# The menus within this menu bar
|
7
18
|
attr_reader :menus
|
8
19
|
|
9
|
-
|
20
|
+
# The configuration options for this menu bar
|
21
|
+
attr_reader :options
|
22
|
+
|
23
|
+
def initialize(request_controller, options = {}, html_options = {}) #:nodoc:
|
10
24
|
super(html_options)
|
11
25
|
|
12
|
-
options
|
13
|
-
options.
|
26
|
+
# Set up default options
|
27
|
+
options.assert_valid_keys(:parent_menu, :auto_set_ids, :attach_active_submenus, :content_for)
|
28
|
+
options.reverse_merge!(:auto_set_ids => true, :attach_active_submenus => true, :content_for => 'menu_bar')
|
14
29
|
@options = options
|
30
|
+
|
31
|
+
# Set context of the menu bar (the request and any parent)
|
15
32
|
@request_controller = request_controller
|
16
|
-
@parent_menu = parent_menu
|
17
33
|
|
34
|
+
# No menus initially associated
|
18
35
|
@menus = []
|
19
36
|
|
20
|
-
|
21
|
-
|
22
|
-
else
|
23
|
-
self[:id] ||= 'menubar'
|
24
|
-
end
|
37
|
+
# Set up default html options
|
38
|
+
self[:class] = "#{self[:class]} #{menu_bar_class} #{menu_bar_class}-#{level}".strip
|
25
39
|
|
26
40
|
yield self if block_given?
|
27
41
|
end
|
28
42
|
|
43
|
+
# Gets the nesting level of this menu bar. The top-level menu bar will
|
44
|
+
# always have a nesting level of 1.
|
45
|
+
def level
|
46
|
+
@level ||= begin
|
47
|
+
level = 1
|
48
|
+
|
49
|
+
# Keep walking up the tree, until first-level menus are encountered
|
50
|
+
menu = parent_menu
|
51
|
+
while menu
|
52
|
+
level += 1
|
53
|
+
menu = menu.parent_menu
|
54
|
+
end
|
55
|
+
|
56
|
+
level
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
# The menu in which this menu bar is being displayed. This will be nil if
|
61
|
+
# this is the main menu bar.
|
62
|
+
def parent_menu
|
63
|
+
@options[:parent_menu]
|
64
|
+
end
|
65
|
+
|
66
|
+
# Shoulds elements have default ids automatically applied to them?
|
67
|
+
def auto_set_ids?
|
68
|
+
@options[:auto_set_ids]
|
69
|
+
end
|
70
|
+
|
71
|
+
# Should menu bars in sub-menus be attached to this menu bar?
|
72
|
+
def attach_active_submenus?
|
73
|
+
@options[:attach_active_submenus]
|
74
|
+
end
|
75
|
+
|
76
|
+
# The instance variable to use when rendering the current active sub-menu
|
77
|
+
# bar
|
78
|
+
def content_for_variable
|
79
|
+
"@content_for_#{@options[:content_for]}_level_#{level}"
|
80
|
+
end
|
81
|
+
|
82
|
+
# Is this menu bar selected? A menu bar is considered selected if it has
|
83
|
+
# a parent menu and that parent menu is selected.
|
84
|
+
def selected?
|
85
|
+
parent_menu && menus.any? {|menu| menu.selected?}
|
86
|
+
end
|
87
|
+
|
29
88
|
# Creates a new menu in this bar with the given id. The content
|
30
89
|
# within the menu is, by default, set to a humanized version of the id.
|
31
90
|
#
|
32
91
|
# == URLs with routes
|
33
92
|
#
|
34
|
-
# If you have named routes
|
93
|
+
# If you have named routes set up in the application, the menu attempts
|
35
94
|
# to automatically figure out what URL you're trying to link to. It
|
36
95
|
# does this by looking at the id of the menu and the id of its parent.
|
37
96
|
#
|
38
|
-
# For example, a
|
97
|
+
# For example, a menu bar with the id 'home' and a menu with the id
|
39
98
|
# 'contact_us' will attempt to look for the following named routes as
|
40
99
|
# the URL to link to (in order of priority):
|
41
|
-
# 1.
|
42
|
-
# 2.
|
100
|
+
# 1. home_contact_us_url
|
101
|
+
# 2. contact_us_url
|
43
102
|
#
|
44
103
|
# Example routes.rb:
|
104
|
+
#
|
45
105
|
# ActionController::Routing::Routes.draw do |map|
|
46
106
|
# map.with_options(:controller => 'home') do |home|
|
47
107
|
# home.home '', :action => 'index'
|
@@ -53,12 +113,11 @@ module PluginAWeek #:nodoc:
|
|
53
113
|
# end
|
54
114
|
# end
|
55
115
|
#
|
56
|
-
# Example
|
57
|
-
#
|
58
|
-
#
|
59
|
-
#
|
60
|
-
# menu :search
|
61
|
-
# #=> Links to home_search_url
|
116
|
+
# Example menu bar:
|
117
|
+
#
|
118
|
+
# menu_bar :home do |home|
|
119
|
+
# home.menu :about_us # => Links to about_us_url
|
120
|
+
# home.menu :search # => Links to home_search_url
|
62
121
|
# end
|
63
122
|
#
|
64
123
|
# == URLs with url_for
|
@@ -73,27 +132,27 @@ module PluginAWeek #:nodoc:
|
|
73
132
|
#
|
74
133
|
# To override the default controller being linked to, you can explicitly
|
75
134
|
# define it like so:
|
76
|
-
# menu :contact, 'Contact Us',
|
135
|
+
# menu :contact, 'Contact Us', :controller => 'about_us'
|
77
136
|
#
|
78
137
|
# Examples:
|
138
|
+
#
|
79
139
|
# menu :home do |home|
|
80
|
-
# menu :about, 'About Us', :action => 'about_us'
|
81
|
-
#
|
82
|
-
# menu :
|
83
|
-
#
|
84
|
-
# menu :contact_us, 'Contact Us', :controller => 'contact', :action => 'index'
|
85
|
-
# #=> Links to {:controller => 'contact', :action => 'index'}
|
86
|
-
# menu :search
|
87
|
-
# #=> Links to {:controller => 'search'}
|
140
|
+
# home.menu :about, 'About Us', :action => 'about_us' # => Links to {:controller => 'home', :action => 'about_us'}
|
141
|
+
# home.menu :who_we_are # => Links to {:controller => 'home', :action => 'who_we_are'}
|
142
|
+
# home.menu :contact_us, :controller => 'contact', :action => 'index' # => Links to {:controller => 'contact', :action => 'index'}
|
143
|
+
# home.menu :search # => Links to {:controller => 'search'}
|
88
144
|
# end
|
89
145
|
#
|
90
146
|
# You can also link to an explicit URL like so:
|
91
|
-
#
|
147
|
+
#
|
148
|
+
# home.menu :search, 'http://www.google.com'
|
92
149
|
#
|
93
150
|
# == Turning off links
|
94
151
|
#
|
95
|
-
# If you don't want a menu to link to a URL, you can turn off linking like
|
96
|
-
#
|
152
|
+
# If you don't want a menu to link to a URL, you can turn off linking like
|
153
|
+
# so:
|
154
|
+
#
|
155
|
+
# home.menu :contact_us, {}, :link => false
|
97
156
|
#
|
98
157
|
# == Defining content and html attributes
|
99
158
|
#
|
@@ -101,41 +160,45 @@ module PluginAWeek #:nodoc:
|
|
101
160
|
# version of the menu's id. Examples of menus which customize the
|
102
161
|
# content and/or html attributes are below:
|
103
162
|
#
|
104
|
-
# menu :contact
|
105
|
-
#
|
106
|
-
# menu :contact, 'Contact
|
107
|
-
#
|
108
|
-
# menu :contact, :class => 'pretty'
|
109
|
-
# #=> <li id="contact" class="pretty"><a href="/contact">Contact</a></li>
|
110
|
-
# menu :contact, 'Contact Us', :class => 'pretty'
|
111
|
-
# #=> <li id="contact" class="pretty"><a href="/contact">Contact Us</a></li>
|
163
|
+
# home.menu :contact # => <li id="contact"><a href="/contact">Contact</a></li>
|
164
|
+
# home.menu :contact, 'Contact Us' # => <li id="contact"><a href="/contact">Contact Us</a></li>
|
165
|
+
# home.menu :contact, {}, :class => 'pretty' # => <li id="contact" class="pretty"><a href="/contact">Contact</a></li>
|
166
|
+
# home.menu :contact, 'Get in touch!', {}, :class => 'pretty' # => <li id="contact" class="pretty"><a href="/contact">Contact Us</a></li>
|
112
167
|
#
|
113
|
-
# ==
|
168
|
+
# == Sub-menus
|
114
169
|
#
|
115
|
-
# Menus can also have their own
|
116
|
-
# create
|
170
|
+
# Menus can also have their own sub-menus by passing in a block. You can
|
171
|
+
# create sub-menus in the same manner that the main menus are created.
|
117
172
|
# For example,
|
118
173
|
#
|
119
|
-
# menu :about do |about|
|
174
|
+
# home.menu :about do |about|
|
120
175
|
# about.menu :who_we_are
|
121
176
|
# about.menu :contact_us
|
122
177
|
# end
|
123
|
-
def menu(id,
|
124
|
-
menu = Menu.new(id,
|
178
|
+
def menu(id, content = nil, url_options = {}, html_options = {}, &block)
|
179
|
+
menu = Menu.new(self, id, content, url_options, html_options, &block)
|
125
180
|
@menus << menu
|
126
181
|
|
127
182
|
menu
|
128
183
|
end
|
129
184
|
|
185
|
+
# Builds the actual html of the menu bar
|
186
|
+
def html
|
187
|
+
html_options = @html_options.dup
|
188
|
+
html_options[:class] = "#{html_options[:class]} #{selected_class}".strip if selected?
|
189
|
+
|
190
|
+
content_tag(tag_name, content, html_options)
|
191
|
+
end
|
192
|
+
|
130
193
|
private
|
194
|
+
# Unordered list
|
131
195
|
def tag_name
|
132
196
|
'ul'
|
133
197
|
end
|
134
198
|
|
199
|
+
# Generate the html for the menu bar
|
135
200
|
def content
|
136
|
-
@menus.inject('')
|
137
|
-
html << menu.html(@menus.last == menu)
|
138
|
-
end
|
201
|
+
@menus.inject('') {|html, menu| html << menu.html(@menus.last == menu)}
|
139
202
|
end
|
140
203
|
end
|
141
204
|
end
|
@@ -1,15 +1,3 @@
|
|
1
1
|
ActionController::Routing::Routes.draw do |map|
|
2
|
-
# Home
|
3
|
-
map.with_options(:controller => 'home') do |home|
|
4
|
-
home.home '', :action => 'index'
|
5
|
-
home.home_search 'search_stuff', :action => 'search'
|
6
|
-
end
|
7
|
-
|
8
|
-
# Contact
|
9
|
-
map.with_options(:controller => 'contact') do |contact|
|
10
|
-
contact.contact 'contact', :action => 'index'
|
11
|
-
end
|
12
|
-
|
13
|
-
map.connect ':controller/:action/:id.:format'
|
14
2
|
map.connect ':controller/:action/:id'
|
15
3
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
|
2
|
+
|
3
|
+
class MenuHelperTest < ActionView::TestCase
|
4
|
+
tests PluginAWeek::MenuHelper
|
5
|
+
|
6
|
+
def test_should_build_menu_bar
|
7
|
+
menu_bar_html = menu_bar({}, :class => 'pretty') do |main|
|
8
|
+
main.menu :home do |home|
|
9
|
+
home.menu :browse
|
10
|
+
home.menu :search
|
11
|
+
end
|
12
|
+
main.menu :contact, 'Contact Us'
|
13
|
+
main.menu :about_us
|
14
|
+
end
|
15
|
+
|
16
|
+
expected = <<-eos
|
17
|
+
<ul class="pretty menubar menubar-1">
|
18
|
+
<li><a href="http://test.host/home"><span>Home</span></a>
|
19
|
+
<ul class="menubar menubar-2">
|
20
|
+
<li><a href="http://test.host/home/browse"><span>Browse</span></a></li>
|
21
|
+
<li class="menubar-last"><a href="http://test.host/home/search"><span>Search</span></a></li>
|
22
|
+
</ul>
|
23
|
+
</li>
|
24
|
+
<li class="menubar-selected"><a href="http://test.host/contact"><span>Contact Us</span></a></li>
|
25
|
+
<li class="menubar-last"><a href="http://test.host/about_us"><span>About Us</span></a></li>
|
26
|
+
</ul>
|
27
|
+
eos
|
28
|
+
assert_equal expected.gsub(/\n\s*/, ''), menu_bar_html
|
29
|
+
end
|
30
|
+
end
|
data/test/test_helper.rb
CHANGED
@@ -3,14 +3,19 @@ $:.unshift("#{File.dirname(__FILE__)}/../../plugin_test_helper/lib")
|
|
3
3
|
require 'rubygems'
|
4
4
|
require 'plugin_test_helper'
|
5
5
|
|
6
|
-
|
6
|
+
Test::Unit::TestCase.class_eval do
|
7
7
|
def setup
|
8
8
|
request = ActionController::TestRequest.new
|
9
9
|
request.request_uri = '/contact'
|
10
10
|
request.path_parameters = {:action => 'index', :controller => 'contact'}
|
11
|
-
|
11
|
+
|
12
|
+
@controller = ContactController.new
|
12
13
|
@controller.request = request
|
13
14
|
@controller.instance_eval {@_params = request.path_parameters}
|
14
15
|
@controller.send(:initialize_current_url)
|
15
16
|
end
|
17
|
+
|
18
|
+
def teardown
|
19
|
+
ActionController::Routing::Routes.load!
|
20
|
+
end
|
16
21
|
end
|
data/test/unit/menu_bar_test.rb
CHANGED
@@ -1,72 +1,315 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/../test_helper'
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
|
2
2
|
|
3
3
|
class MenuBarByDefaultTest < Test::Unit::TestCase
|
4
4
|
def setup
|
5
5
|
super
|
6
|
+
|
6
7
|
@menu_bar = PluginAWeek::MenuHelper::MenuBar.new(@controller)
|
7
8
|
end
|
8
9
|
|
9
|
-
def
|
10
|
+
def test_should_have_no_menus
|
10
11
|
assert_equal [], @menu_bar.menus
|
11
12
|
end
|
12
13
|
|
13
|
-
def
|
14
|
-
assert_equal
|
14
|
+
def test_should_have_a_request_controller
|
15
|
+
assert_equal @controller, @menu_bar.request_controller
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_should_have_options
|
19
|
+
expected = {
|
20
|
+
:auto_set_ids => true,
|
21
|
+
:attach_active_submenus => true,
|
22
|
+
:content_for => 'menu_bar'
|
23
|
+
}
|
24
|
+
assert_equal expected, @menu_bar.options
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_should_have_a_level
|
28
|
+
assert_equal 1, @menu_bar.level
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_should_not_have_a_parent_menu
|
32
|
+
assert_nil @menu_bar.parent_menu
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_should_auto_set_ids
|
36
|
+
assert @menu_bar.auto_set_ids?
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_should_attach_active_submenus
|
40
|
+
assert @menu_bar.attach_active_submenus?
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_should_have_a_content_for_variable
|
44
|
+
assert_equal '@content_for_menu_bar_level_1', @menu_bar.content_for_variable
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_should_not_be_selected
|
48
|
+
assert !@menu_bar.selected?
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_should_set_css_classes
|
52
|
+
assert_equal 'menubar menubar-1', @menu_bar[:class]
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_should_allow_css_classes_to_be_customized
|
56
|
+
@original_menu_bar_class = PluginAWeek::MenuHelper::MenuBar.menu_bar_class
|
57
|
+
PluginAWeek::MenuHelper::MenuBar.menu_bar_class = 'menus'
|
58
|
+
|
59
|
+
menu_bar = PluginAWeek::MenuHelper::MenuBar.new(@controller)
|
60
|
+
assert_equal 'menus menus-1', menu_bar[:class]
|
61
|
+
ensure
|
62
|
+
PluginAWeek::MenuHelper::MenuBar.menu_bar_class = @original_menu_bar_class
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_should_not_set_id
|
66
|
+
assert_nil @menu_bar[:id]
|
15
67
|
end
|
16
68
|
end
|
17
69
|
|
18
70
|
class MenuBarTest < Test::Unit::TestCase
|
71
|
+
def setup
|
72
|
+
super
|
73
|
+
|
74
|
+
@menu_bar = PluginAWeek::MenuHelper::MenuBar.new(@controller)
|
75
|
+
end
|
76
|
+
|
19
77
|
def test_should_raise_exception_if_invalid_option_specified
|
20
|
-
assert_raise(ArgumentError) {
|
78
|
+
assert_raise(ArgumentError) {PluginAWeek::MenuHelper::MenuBar.new(@controller, :invalid => true)}
|
21
79
|
end
|
22
80
|
|
23
81
|
def test_should_accept_block
|
24
82
|
in_block = false
|
25
|
-
menu_bar =
|
83
|
+
menu_bar = PluginAWeek::MenuHelper::MenuBar.new(@controller) do |menu_bar|
|
26
84
|
in_block = true
|
27
85
|
end
|
28
86
|
|
29
87
|
assert in_block
|
30
88
|
end
|
31
89
|
|
32
|
-
def
|
33
|
-
menu_bar
|
90
|
+
def test_should_not_modify_html_options_after_building_hml
|
91
|
+
@menu_bar.html
|
92
|
+
assert_equal 'menubar menubar-1', @menu_bar[:class]
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_should_allow_menus_to_be_created
|
96
|
+
@menu = @menu_bar.menu(:home) do |menu_bar|
|
97
|
+
@sub_menu_bar = menu_bar
|
98
|
+
end
|
99
|
+
|
100
|
+
assert_equal @menu, @sub_menu_bar.parent_menu
|
101
|
+
assert_equal [@menu], @menu_bar.menus
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
class MenuBarWithoutMenusTest < Test::Unit::TestCase
|
106
|
+
def setup
|
107
|
+
super
|
108
|
+
|
109
|
+
@menu_bar = PluginAWeek::MenuHelper::MenuBar.new(@controller)
|
110
|
+
end
|
111
|
+
|
112
|
+
def test_should_not_have_any_menus
|
113
|
+
assert @menu_bar.menus.empty?
|
114
|
+
end
|
115
|
+
|
116
|
+
def test_should_not_be_selected
|
117
|
+
assert !@menu_bar.selected?
|
118
|
+
end
|
119
|
+
|
120
|
+
def test_should_not_render_menus
|
121
|
+
assert_equal '<ul class="menubar menubar-1"></ul>', @menu_bar.html
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
class MenuBarWithCustomHtmlOptionsTest < Test::Unit::TestCase
|
126
|
+
def setup
|
127
|
+
super
|
128
|
+
|
129
|
+
@menu_bar = PluginAWeek::MenuHelper::MenuBar.new(@controller, {}, :id => 'menus', :class => 'pretty')
|
130
|
+
end
|
131
|
+
|
132
|
+
def test_should_render_with_custom_options
|
133
|
+
assert_equal '<ul class="pretty menubar menubar-1" id="menus"></ul>', @menu_bar.html
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
class MenuBarWithCustomContentForTest < Test::Unit::TestCase
|
138
|
+
def setup
|
139
|
+
super
|
140
|
+
|
141
|
+
@menu_bar = PluginAWeek::MenuHelper::MenuBar.new(@controller, :content_for => 'menus')
|
142
|
+
end
|
143
|
+
|
144
|
+
def test_should_have_a_content_for_variable_based_on_options
|
145
|
+
assert_equal '@content_for_menus_level_1', @menu_bar.content_for_variable
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
class MenuBarWithMenusTest < Test::Unit::TestCase
|
150
|
+
def setup
|
151
|
+
super
|
152
|
+
|
153
|
+
@menu_bar = PluginAWeek::MenuHelper::MenuBar.new(@controller, {}, :id => 'menus') do |main|
|
34
154
|
main.menu :home
|
35
|
-
main.menu :
|
155
|
+
main.menu :about_us, 'About'
|
36
156
|
end
|
157
|
+
end
|
158
|
+
|
159
|
+
def test_should_render_menus
|
160
|
+
expected = <<-eos
|
161
|
+
<ul class="menubar menubar-1" id="menus">
|
162
|
+
<li id="menus-home"><a href="http://test.host/home"><span>Home</span></a></li>
|
163
|
+
<li class="menubar-last" id="menus-about_us"><a href="http://test.host/about_us"><span>About</span></a></li>
|
164
|
+
</ul>
|
165
|
+
eos
|
166
|
+
assert_equal expected.gsub(/\n\s*/, ''), @menu_bar.html
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
class MenuBarWithSelectedMenuTest < Test::Unit::TestCase
|
171
|
+
def setup
|
172
|
+
super
|
37
173
|
|
38
|
-
|
174
|
+
@menu_bar = PluginAWeek::MenuHelper::MenuBar.new(@controller) do |main|
|
175
|
+
main.menu :contact
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
def test_should_not_be_selected
|
180
|
+
assert !@menu_bar.selected?
|
39
181
|
end
|
40
182
|
|
41
|
-
def
|
42
|
-
|
183
|
+
def test_should_not_include_selected_css_class_in_html
|
184
|
+
expected = <<-eos
|
185
|
+
<ul class="menubar menubar-1">
|
186
|
+
<li class="menubar-selected menubar-last"><a href="http://test.host/contact"><span>Contact</span></a></li>
|
187
|
+
</ul>
|
188
|
+
eos
|
189
|
+
assert_equal expected.gsub(/\n\s*/, ''), @menu_bar.html
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
class MenuBarWithoutAutoIdSettingTest < Test::Unit::TestCase
|
194
|
+
def setup
|
195
|
+
super
|
196
|
+
|
197
|
+
@menu_bar = PluginAWeek::MenuHelper::MenuBar.new(@controller, {:auto_set_ids => false}, :id => 'menus') do |main|
|
43
198
|
main.menu :home
|
44
|
-
main.menu :contact, 'Contact Us'
|
45
199
|
end
|
200
|
+
end
|
201
|
+
|
202
|
+
def test_should_not_set_default_id_for_menus
|
203
|
+
expected = <<-eos
|
204
|
+
<ul class="menubar menubar-1" id="menus">
|
205
|
+
<li class="menubar-last"><a href="http://test.host/home"><span>Home</span></a></li>
|
206
|
+
</ul>
|
207
|
+
eos
|
208
|
+
assert_equal expected.gsub(/\n\s*/, ''), @menu_bar.html
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
class MenuBarUnselectedWithDetachedActiveSubmenus < Test::Unit::TestCase
|
213
|
+
def setup
|
214
|
+
super
|
46
215
|
|
216
|
+
@menu_bar = PluginAWeek::MenuHelper::MenuBar.new(@controller, :attach_active_submenus => false) do |main|
|
217
|
+
main.menu :home do |home|
|
218
|
+
home.menu :about_us
|
219
|
+
end
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
def test_should_render_sub_menu_bars
|
47
224
|
expected = <<-eos
|
48
|
-
<ul
|
49
|
-
<li
|
50
|
-
|
225
|
+
<ul class="menubar menubar-1">
|
226
|
+
<li class="menubar-last"><a href="http://test.host/home"><span>Home</span></a>
|
227
|
+
<ul class="menubar menubar-2">
|
228
|
+
<li class="menubar-last"><a href="http://test.host/about_us"><span>About Us</span></a></li>
|
229
|
+
</ul>
|
230
|
+
</li>
|
51
231
|
</ul>
|
52
232
|
eos
|
53
|
-
assert_equal expected.gsub(/\n\s*/, ''), menu_bar.html
|
233
|
+
assert_equal expected.gsub(/\n\s*/, ''), @menu_bar.html
|
54
234
|
end
|
55
235
|
|
56
|
-
|
57
|
-
|
58
|
-
|
236
|
+
def test_should_not_store_a_menu_bar_in_content_variable
|
237
|
+
assert !@controller.instance_variable_defined?('@content_for_menu_bar_level_2')
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
241
|
+
class MenuBarSelectedWithDetachedActiveSubmenus < Test::Unit::TestCase
|
242
|
+
def setup
|
243
|
+
super
|
244
|
+
|
245
|
+
@menu_bar = PluginAWeek::MenuHelper::MenuBar.new(@controller, :attach_active_submenus => false) do |main|
|
246
|
+
main.menu :contact do |contact|
|
247
|
+
contact.menu :investors
|
248
|
+
end
|
59
249
|
end
|
250
|
+
end
|
251
|
+
|
252
|
+
def test_should_not_render_sub_menu_bars
|
253
|
+
expected = <<-eos
|
254
|
+
<ul class="menubar menubar-1">
|
255
|
+
<li class="menubar-selected menubar-last"><a href="http://test.host/contact"><span>Contact</span></a></li>
|
256
|
+
</ul>
|
257
|
+
eos
|
258
|
+
assert_equal expected.gsub(/\n\s*/, ''), @menu_bar.html
|
259
|
+
end
|
260
|
+
|
261
|
+
def test_should_store_a_menu_bar_in_content_variable
|
262
|
+
# Generate the html to store it in the variable
|
263
|
+
@menu_bar.html
|
264
|
+
|
265
|
+
expected = <<-eos
|
266
|
+
<ul class="menubar menubar-2">
|
267
|
+
<li class="menubar-last"><a href="http://test.host/contact/investors"><span>Investors</span></a></li>
|
268
|
+
</ul>
|
269
|
+
eos
|
270
|
+
assert_equal expected.gsub(/\n\s*/, ''), @controller.instance_variable_get('@content_for_menu_bar_level_2')
|
271
|
+
end
|
60
272
|
end
|
61
273
|
|
62
|
-
class
|
274
|
+
class MenuBarWithParentMenuTest < Test::Unit::TestCase
|
63
275
|
def setup
|
64
276
|
super
|
65
|
-
|
66
|
-
@
|
277
|
+
|
278
|
+
@parent_menu_bar = PluginAWeek::MenuHelper::MenuBar.new(@controller)
|
279
|
+
@parent_menu = PluginAWeek::MenuHelper::Menu.new(@parent_menu_bar, :home)
|
280
|
+
@menu_bar = PluginAWeek::MenuHelper::MenuBar.new(@controller, :parent_menu => @parent_menu)
|
281
|
+
end
|
282
|
+
|
283
|
+
def test_should_have_a_parent_menu
|
284
|
+
assert_equal @parent_menu, @menu_bar.parent_menu
|
67
285
|
end
|
68
286
|
|
69
|
-
def
|
70
|
-
assert_equal
|
287
|
+
def test_should_have_level
|
288
|
+
assert_equal 2, @menu_bar.level
|
289
|
+
end
|
290
|
+
end
|
291
|
+
|
292
|
+
class MenuBarWithParentMenuAndSelectedMenuTest < Test::Unit::TestCase
|
293
|
+
def setup
|
294
|
+
super
|
295
|
+
|
296
|
+
@parent_menu_bar = PluginAWeek::MenuHelper::MenuBar.new(@controller)
|
297
|
+
@parent_menu = PluginAWeek::MenuHelper::Menu.new(@parent_menu_bar, :about_us)
|
298
|
+
@menu_bar = PluginAWeek::MenuHelper::MenuBar.new(@controller, :parent_menu => @parent_menu) do |about_us|
|
299
|
+
about_us.menu :contact
|
300
|
+
end
|
301
|
+
end
|
302
|
+
|
303
|
+
def test_should_be_selected
|
304
|
+
assert @menu_bar.selected?
|
305
|
+
end
|
306
|
+
|
307
|
+
def test_should_include_selected_css_class_in_html
|
308
|
+
expected = <<-eos
|
309
|
+
<ul class="menubar menubar-2 menubar-selected">
|
310
|
+
<li class="menubar-selected menubar-last"><a href="http://test.host/contact"><span>Contact</span></a></li>
|
311
|
+
</ul>
|
312
|
+
eos
|
313
|
+
assert_equal expected.gsub(/\n\s*/, ''), @menu_bar.html
|
71
314
|
end
|
72
315
|
end
|