Chris@0: # Redmine - project management software Chris@1115: # Copyright (C) 2006-2012 Jean-Philippe Lang Chris@0: # Chris@0: # This program is free software; you can redistribute it and/or Chris@0: # modify it under the terms of the GNU General Public License Chris@0: # as published by the Free Software Foundation; either version 2 Chris@0: # of the License, or (at your option) any later version. Chris@909: # Chris@0: # This program is distributed in the hope that it will be useful, Chris@0: # but WITHOUT ANY WARRANTY; without even the implied warranty of Chris@0: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Chris@0: # GNU General Public License for more details. Chris@909: # Chris@0: # You should have received a copy of the GNU General Public License Chris@0: # along with this program; if not, write to the Free Software Chris@0: # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Chris@0: Chris@119: require File.expand_path('../../../../../test_helper', __FILE__) Chris@0: Chris@1115: class Redmine::MenuManager::MenuHelperTest < ActionView::TestCase Chris@1115: Chris@0: include Redmine::MenuManager::MenuHelper Chris@1115: include ERB::Util Chris@1115: fixtures :users, :members, :projects, :enabled_modules, :roles, :member_roles Chris@909: Chris@0: def setup Chris@1115: setup_with_controller Chris@0: # Stub the current menu item in the controller Chris@909: def current_menu_item Chris@0: :index Chris@0: end Chris@0: end Chris@909: Chris@0: context "MenuManager#current_menu_item" do Chris@0: should "be tested" Chris@0: end Chris@0: Chris@0: context "MenuManager#render_main_menu" do Chris@0: should "be tested" Chris@0: end Chris@0: Chris@0: context "MenuManager#render_menu" do Chris@0: should "be tested" Chris@0: end Chris@0: Chris@0: context "MenuManager#menu_item_and_children" do Chris@0: should "be tested" Chris@0: end Chris@0: Chris@0: context "MenuManager#extract_node_details" do Chris@0: should "be tested" Chris@0: end Chris@0: Chris@0: def test_render_single_menu_node Chris@0: node = Redmine::MenuManager::MenuItem.new(:testing, '/test', { }) Chris@1115: @output_buffer = render_single_menu_node(node, 'This is a test', node.url, false) Chris@0: Chris@0: assert_select("a.testing", "This is a test") Chris@0: end Chris@0: Chris@0: def test_render_menu_node Chris@0: single_node = Redmine::MenuManager::MenuItem.new(:single_node, '/test', { }) Chris@1115: @output_buffer = render_menu_node(single_node, nil) Chris@0: Chris@0: assert_select("li") do Chris@0: assert_select("a.single-node", "Single node") Chris@0: end Chris@0: end Chris@909: Chris@0: def test_render_menu_node_with_nested_items Chris@0: parent_node = Redmine::MenuManager::MenuItem.new(:parent_node, '/test', { }) Chris@0: parent_node << Redmine::MenuManager::MenuItem.new(:child_one_node, '/test', { }) Chris@0: parent_node << Redmine::MenuManager::MenuItem.new(:child_two_node, '/test', { }) Chris@0: parent_node << Chris@0: Redmine::MenuManager::MenuItem.new(:child_three_node, '/test', { }) << Chris@0: Redmine::MenuManager::MenuItem.new(:child_three_inner_node, '/test', { }) Chris@0: Chris@1115: @output_buffer = render_menu_node(parent_node, nil) Chris@0: Chris@0: assert_select("li") do Chris@0: assert_select("a.parent-node", "Parent node") Chris@0: assert_select("ul") do Chris@0: assert_select("li a.child-one-node", "Child one node") Chris@0: assert_select("li a.child-two-node", "Child two node") Chris@0: assert_select("li") do Chris@0: assert_select("a.child-three-node", "Child three node") Chris@0: assert_select("ul") do Chris@0: assert_select("li a.child-three-inner-node", "Child three inner node") Chris@0: end Chris@0: end Chris@0: end Chris@0: end Chris@909: Chris@0: end Chris@0: Chris@0: def test_render_menu_node_with_children Chris@0: User.current = User.find(2) Chris@909: Chris@0: parent_node = Redmine::MenuManager::MenuItem.new(:parent_node, Chris@0: '/test', Chris@0: { Chris@0: :children => Proc.new {|p| Chris@0: children = [] Chris@0: 3.times do |time| Chris@0: children << Redmine::MenuManager::MenuItem.new("test_child_#{time}", Chris@0: {:controller => 'issues', :action => 'index'}, Chris@0: {}) Chris@0: end Chris@0: children Chris@0: } Chris@0: }) Chris@1115: @output_buffer = render_menu_node(parent_node, Project.find(1)) Chris@0: Chris@0: assert_select("li") do Chris@0: assert_select("a.parent-node", "Parent node") Chris@0: assert_select("ul") do Chris@0: assert_select("li a.test-child-0", "Test child 0") Chris@0: assert_select("li a.test-child-1", "Test child 1") Chris@0: assert_select("li a.test-child-2", "Test child 2") Chris@0: end Chris@0: end Chris@0: end Chris@0: Chris@0: def test_render_menu_node_with_nested_items_and_children Chris@0: User.current = User.find(2) Chris@0: Chris@0: parent_node = Redmine::MenuManager::MenuItem.new(:parent_node, Chris@0: '/test', Chris@0: { Chris@0: :children => Proc.new {|p| Chris@0: children = [] Chris@0: 3.times do |time| Chris@0: children << Redmine::MenuManager::MenuItem.new("test_child_#{time}", {:controller => 'issues', :action => 'index'}, {}) Chris@0: end Chris@0: children Chris@0: } Chris@0: }) Chris@0: Chris@0: parent_node << Redmine::MenuManager::MenuItem.new(:child_node, Chris@0: '/test', Chris@0: { Chris@0: :children => Proc.new {|p| Chris@0: children = [] Chris@0: 6.times do |time| Chris@0: children << Redmine::MenuManager::MenuItem.new("test_dynamic_child_#{time}", {:controller => 'issues', :action => 'index'}, {}) Chris@0: end Chris@0: children Chris@0: } Chris@0: }) Chris@0: Chris@1115: @output_buffer = render_menu_node(parent_node, Project.find(1)) Chris@0: Chris@0: assert_select("li") do Chris@0: assert_select("a.parent-node", "Parent node") Chris@0: assert_select("ul") do Chris@0: assert_select("li a.child-node", "Child node") Chris@0: assert_select("ul") do Chris@0: assert_select("li a.test-dynamic-child-0", "Test dynamic child 0") Chris@0: assert_select("li a.test-dynamic-child-1", "Test dynamic child 1") Chris@0: assert_select("li a.test-dynamic-child-2", "Test dynamic child 2") Chris@0: assert_select("li a.test-dynamic-child-3", "Test dynamic child 3") Chris@0: assert_select("li a.test-dynamic-child-4", "Test dynamic child 4") Chris@0: assert_select("li a.test-dynamic-child-5", "Test dynamic child 5") Chris@0: end Chris@0: assert_select("li a.test-child-0", "Test child 0") Chris@0: assert_select("li a.test-child-1", "Test child 1") Chris@0: assert_select("li a.test-child-2", "Test child 2") Chris@0: end Chris@0: end Chris@0: end Chris@0: Chris@0: def test_render_menu_node_with_children_without_an_array Chris@0: parent_node = Redmine::MenuManager::MenuItem.new(:parent_node, Chris@0: '/test', Chris@0: { Chris@0: :children => Proc.new {|p| Redmine::MenuManager::MenuItem.new("test_child", "/testing", {})} Chris@0: }) Chris@0: Chris@0: assert_raises Redmine::MenuManager::MenuError, ":children must be an array of MenuItems" do Chris@1115: @output_buffer = render_menu_node(parent_node, Project.find(1)) Chris@0: end Chris@0: end Chris@909: Chris@0: def test_render_menu_node_with_incorrect_children Chris@0: parent_node = Redmine::MenuManager::MenuItem.new(:parent_node, Chris@0: '/test', Chris@0: { Chris@0: :children => Proc.new {|p| ["a string"] } Chris@0: }) Chris@0: Chris@0: assert_raises Redmine::MenuManager::MenuError, ":children must be an array of MenuItems" do Chris@1115: @output_buffer = render_menu_node(parent_node, Project.find(1)) Chris@0: end Chris@0: Chris@0: end Chris@0: Chris@0: def test_menu_items_for_should_yield_all_items_if_passed_a_block Chris@0: menu_name = :test_menu_items_for_should_yield_all_items_if_passed_a_block Chris@0: Redmine::MenuManager.map menu_name do |menu| Chris@0: menu.push(:a_menu, '/', { }) Chris@0: menu.push(:a_menu_2, '/', { }) Chris@0: menu.push(:a_menu_3, '/', { }) Chris@0: end Chris@0: Chris@0: items_yielded = [] Chris@0: menu_items_for(menu_name) do |item| Chris@0: items_yielded << item Chris@0: end Chris@909: Chris@0: assert_equal 3, items_yielded.size Chris@0: end Chris@0: Chris@0: def test_menu_items_for_should_return_all_items Chris@0: menu_name = :test_menu_items_for_should_return_all_items Chris@0: Redmine::MenuManager.map menu_name do |menu| Chris@0: menu.push(:a_menu, '/', { }) Chris@0: menu.push(:a_menu_2, '/', { }) Chris@0: menu.push(:a_menu_3, '/', { }) Chris@0: end Chris@0: Chris@0: items = menu_items_for(menu_name) Chris@0: assert_equal 3, items.size Chris@0: end Chris@0: Chris@0: def test_menu_items_for_should_skip_unallowed_items_on_a_project Chris@0: menu_name = :test_menu_items_for_should_skip_unallowed_items_on_a_project Chris@0: Redmine::MenuManager.map menu_name do |menu| Chris@0: menu.push(:a_menu, {:controller => 'issues', :action => 'index' }, { }) Chris@0: menu.push(:a_menu_2, {:controller => 'issues', :action => 'index' }, { }) Chris@0: menu.push(:unallowed, {:controller => 'issues', :action => 'unallowed' }, { }) Chris@0: end Chris@0: Chris@0: User.current = User.find(2) Chris@909: Chris@0: items = menu_items_for(menu_name, Project.find(1)) Chris@0: assert_equal 2, items.size Chris@0: end Chris@909: Chris@0: def test_menu_items_for_should_skip_items_that_fail_the_conditions Chris@0: menu_name = :test_menu_items_for_should_skip_items_that_fail_the_conditions Chris@0: Redmine::MenuManager.map menu_name do |menu| Chris@0: menu.push(:a_menu, {:controller => 'issues', :action => 'index' }, { }) Chris@0: menu.push(:unallowed, Chris@0: {:controller => 'issues', :action => 'index' }, Chris@0: { :if => Proc.new { false }}) Chris@0: end Chris@0: Chris@0: User.current = User.find(2) Chris@909: Chris@0: items = menu_items_for(menu_name, Project.find(1)) Chris@0: assert_equal 1, items.size Chris@0: end Chris@0: end