##// END OF EJS Templates
Upgraded to Rails 2.3.4 (#3597)...
Upgraded to Rails 2.3.4 (#3597) * Ran the Rails upgrade * Upgraded to Rails Engines 2.3.2 * Added a plugin to let Engines override application views. * Converted tests to use the new classes: ** ActionController::TestCase for functional ** ActiveSupport::TestCase for units * Converted ActiveRecord::Error message to a string. * ActiveRecord grouping returns an ordered hash which doesn't have #sort! * Updated the I18n storage_units format. * Added some default initializers from a fresh rails app * Changed the order of check_box_tags and hidden_field_tags. The hidden tag needs to appear first in Rails 2.3, otherwise it will override any value in the check_box_tag. * Removed the custom handler for when the cookie store is tampered with. Rails 2.3 removed the TamperedWithCookie exception and instead Rails will not load the data from it when it's been tampered with (e.g. no user login). * Fixed mail layouts, 2.3 has problems with implicit multipart emails that use layouts. Also removed some custom Redmine mailer code. * Fixed a bug that occurred in tests where the "required" span tag would be added to the :field_status translation. This resulted in an email string of: <li>Status<span class="required"> *</span><span class="required"> *</span> Instead of: <li>Status: New</li> git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2887 e93f8b46-1217-0410-a6f0-8f06a7374b81

File last commit:

r2773:7b0cb6aba871
r2773:7b0cb6aba871
Show More
projects_controller_test.rb
567 lines | 18.0 KiB | text/x-ruby | RubyLexer
/ test / functional / projects_controller_test.rb
Jean-Philippe Lang
Adds support for free ticket filtering and custom queries on Calendar....
r1796 # Redmine - project management software
# Copyright (C) 2006-2008 Jean-Philippe Lang
Jean-Philippe Lang
v0.2.0...
r5 #
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Jean-Philippe Lang
Initial commit...
r2 require File.dirname(__FILE__) + '/../test_helper'
require 'projects_controller'
# Re-raise errors caught by the controller.
class ProjectsController; def rescue_action(e) raise e end; end
Eric Davis
Upgraded to Rails 2.3.4 (#3597)...
r2773 class ProjectsControllerTest < ActionController::TestCase
Jean-Philippe Lang
Allows multiple roles on the same project (#706). Prerequisite for user groups feature....
r2627 fixtures :projects, :versions, :users, :roles, :members, :member_roles, :issues, :journals, :journal_details,
Jean-Philippe Lang
Files module: makes version field non required (#1053)....
r2115 :trackers, :projects_trackers, :issue_statuses, :enabled_modules, :enumerations, :boards, :messages,
:attachments
Jean-Philippe Lang
Initial commit...
r2
def setup
@controller = ProjectsController.new
@request = ActionController::TestRequest.new
@response = ActionController::TestResponse.new
Jean-Philippe Lang
Fixed: Calendar and Gantt show private subprojects even if current user is not a member of them (#1217)....
r1416 @request.session[:user_id] = nil
Jean-Philippe Lang
Slight tests fixes....
r2053 Setting.default_language = 'en'
Jean-Philippe Lang
Initial commit...
r2 end
Eric Davis
Converted routing and urls to follow the Rails REST convention....
r2315
def test_index_routing
assert_routing(
{:method => :get, :path => '/projects'},
:controller => 'projects', :action => 'index'
)
end
Jean-Philippe Lang
Initial commit...
r2 def test_index
get :index
assert_response :success
Jean-Philippe Lang
Moved ProjectsController#list to ProjectsController#index....
r1450 assert_template 'index'
Jean-Philippe Lang
Merged nested projects branch. Removes limit on subproject nesting (#594)....
r2302 assert_not_nil assigns(:projects)
assert_tag :ul, :child => {:tag => 'li',
:descendant => {:tag => 'a', :content => 'eCookbook'},
:child => { :tag => 'ul',
:descendant => { :tag => 'a',
:content => 'Child of private child'
}
}
}
assert_no_tag :a, :content => /Private child of eCookbook/
Eric Davis
Converted routing and urls to follow the Rails REST convention....
r2315 end
def test_index_atom_routing
assert_routing(
{:method => :get, :path => '/projects.atom'},
:controller => 'projects', :action => 'index', :format => 'atom'
)
end
Jean-Philippe Lang
Fixed: no :author method error on projects atom feed (#1623)....
r1639
def test_index_atom
get :index, :format => 'atom'
assert_response :success
assert_template 'common/feed.atom.rxml'
assert_select 'feed>title', :text => 'Redmine: Latest projects'
assert_select 'feed>entry', :count => Project.count(:conditions => Project.visible_by(User.current))
end
Eric Davis
Converted routing and urls to follow the Rails REST convention....
r2315
def test_add_routing
assert_routing(
{:method => :get, :path => '/projects/new'},
:controller => 'projects', :action => 'add'
)
assert_recognizes(
{:controller => 'projects', :action => 'add'},
{:method => :post, :path => '/projects/new'}
)
assert_recognizes(
{:controller => 'projects', :action => 'add'},
{:method => :post, :path => '/projects'}
)
end
Jean-Philippe Lang
Ability to allow non-admin users to create projects (#1007)....
r2651 def test_get_add
@request.session[:user_id] = 1
get :add
assert_response :success
assert_template 'add'
end
def test_get_add_by_non_admin
@request.session[:user_id] = 2
get :add
assert_response :success
assert_template 'add'
end
def test_post_add
@request.session[:user_id] = 1
post :add, :project => { :name => "blog",
:description => "weblog",
:identifier => "blog",
:is_public => 1,
:custom_field_values => { '3' => 'Beta' }
}
assert_redirected_to '/projects/blog/settings'
project = Project.find_by_name('blog')
assert_kind_of Project, project
assert_equal 'weblog', project.description
assert_equal true, project.is_public?
end
def test_post_add_by_non_admin
@request.session[:user_id] = 2
post :add, :project => { :name => "blog",
:description => "weblog",
:identifier => "blog",
:is_public => 1,
:custom_field_values => { '3' => 'Beta' }
}
assert_redirected_to '/projects/blog/settings'
project = Project.find_by_name('blog')
assert_kind_of Project, project
assert_equal 'weblog', project.description
assert_equal true, project.is_public?
# User should be added as a project member
assert User.find(2).member_of?(project)
assert_equal 1, project.members.size
end
Eric Davis
Converted routing and urls to follow the Rails REST convention....
r2315 def test_show_routing
assert_routing(
{:method => :get, :path => '/projects/test'},
:controller => 'projects', :action => 'show', :id => 'test'
)
end
def test_show_by_id
get :show, :id => 1
Jean-Philippe Lang
0.3 unstable...
r10 assert_response :success
Eric Davis
Converted routing and urls to follow the Rails REST convention....
r2315 assert_template 'show'
assert_not_nil assigns(:project)
Jean-Philippe Lang
Added some tests for projects controller and helper....
r976 end
Jean-Philippe Lang
Project identifier is now used in URLs (instead of project id)....
r994
def test_show_by_identifier
get :show, :id => 'ecookbook'
assert_response :success
assert_template 'show'
assert_not_nil assigns(:project)
assert_equal Project.find_by_identifier('ecookbook'), assigns(:project)
end
Jean-Philippe Lang
Added some tests for projects controller and helper....
r976
Jean-Philippe Lang
Fixed: private subprojects names are revealed on the project overview (#1152)....
r1384 def test_private_subprojects_hidden
get :show, :id => 'ecookbook'
assert_response :success
assert_template 'show'
assert_no_tag :tag => 'a', :content => /Private child/
end
def test_private_subprojects_visible
@request.session[:user_id] = 2 # manager who is a member of the private subproject
get :show, :id => 'ecookbook'
assert_response :success
assert_template 'show'
assert_tag :tag => 'a', :content => /Private child/
end
Eric Davis
Converted routing and urls to follow the Rails REST convention....
r2315 def test_settings_routing
assert_routing(
{:method => :get, :path => '/projects/4223/settings'},
:controller => 'projects', :action => 'settings', :id => '4223'
)
assert_routing(
{:method => :get, :path => '/projects/4223/settings/members'},
:controller => 'projects', :action => 'settings', :id => '4223', :tab => 'members'
)
end
Jean-Philippe Lang
Added some tests for projects controller and helper....
r976 def test_settings
@request.session[:user_id] = 2 # manager
get :settings, :id => 1
assert_response :success
assert_template 'settings'
end
def test_edit
@request.session[:user_id] = 2 # manager
Jean-Philippe Lang
Fixed: custom field selection is not saved when unchecking them all on project settings...
r1069 post :edit, :id => 1, :project => {:name => 'Test changed name',
Jean-Philippe Lang
Custom fields refactoring: most of code moved from controllers to models (using new module ActsAsCustomizable)....
r1578 :issue_custom_field_ids => ['']}
Jean-Philippe Lang
Merged Rails 2.2 branch. Redmine now requires Rails 2.2.2....
r2430 assert_redirected_to 'projects/ecookbook/settings'
Jean-Philippe Lang
Added some tests for projects controller and helper....
r976 project = Project.find(1)
assert_equal 'Test changed name', project.name
end
Eric Davis
Converted routing and urls to follow the Rails REST convention....
r2315 def test_add_version_routing
assert_routing(
{:method => :get, :path => 'projects/64/versions/new'},
:controller => 'projects', :action => 'add_version', :id => '64'
)
assert_routing(
#TODO: use PUT
{:method => :post, :path => 'projects/64/versions/new'},
:controller => 'projects', :action => 'add_version', :id => '64'
)
end
def test_add_issue_category_routing
assert_routing(
{:method => :get, :path => 'projects/test/categories/new'},
:controller => 'projects', :action => 'add_issue_category', :id => 'test'
)
assert_routing(
#TODO: use PUT and update form
{:method => :post, :path => 'projects/64/categories/new'},
:controller => 'projects', :action => 'add_issue_category', :id => '64'
)
end
def test_destroy_routing
assert_routing(
{:method => :get, :path => '/projects/567/destroy'},
:controller => 'projects', :action => 'destroy', :id => '567'
)
assert_routing(
#TODO: use DELETE and update form
{:method => :post, :path => 'projects/64/destroy'},
:controller => 'projects', :action => 'destroy', :id => '64'
)
end
Jean-Philippe Lang
Added some tests for projects controller and helper....
r976 def test_get_destroy
@request.session[:user_id] = 1 # admin
get :destroy, :id => 1
assert_response :success
assert_template 'destroy'
assert_not_nil Project.find_by_id(1)
Eric Davis
Converted routing and urls to follow the Rails REST convention....
r2315 end
Jean-Philippe Lang
Added some tests for projects controller and helper....
r976
def test_post_destroy
@request.session[:user_id] = 1 # admin
post :destroy, :id => 1, :confirm => 1
assert_redirected_to 'admin/projects'
assert_nil Project.find_by_id(1)
end
Jean-Philippe Lang
Files module: makes version field non required (#1053)....
r2115
def test_add_file
set_tmp_attachments_directory
@request.session[:user_id] = 2
Jean-Philippe Lang
Fixes functional test failures....
r2185 Setting.notified_events = ['file_added']
Jean-Philippe Lang
Files module: makes version field non required (#1053)....
r2115 ActionMailer::Base.deliveries.clear
assert_difference 'Attachment.count' do
post :add_file, :id => 1, :version_id => '',
:attachments => {'1' => {'file' => test_uploaded_file('testfile.txt', 'text/plain')}}
end
Jean-Philippe Lang
Merged Rails 2.2 branch. Redmine now requires Rails 2.2.2....
r2430 assert_redirected_to 'projects/ecookbook/files'
Jean-Philippe Lang
Files module: makes version field non required (#1053)....
r2115 a = Attachment.find(:first, :order => 'created_on DESC')
assert_equal 'testfile.txt', a.filename
assert_equal Project.find(1), a.container
mail = ActionMailer::Base.deliveries.last
assert_kind_of TMail::Mail, mail
assert_equal "[eCookbook] New file", mail.subject
assert mail.body.include?('testfile.txt')
end
Eric Davis
Converted routing and urls to follow the Rails REST convention....
r2315 def test_add_file_routing
assert_routing(
{:method => :get, :path => '/projects/33/files/new'},
:controller => 'projects', :action => 'add_file', :id => '33'
)
assert_routing(
{:method => :post, :path => '/projects/33/files/new'},
:controller => 'projects', :action => 'add_file', :id => '33'
)
end
Jean-Philippe Lang
Files module: makes version field non required (#1053)....
r2115 def test_add_version_file
set_tmp_attachments_directory
@request.session[:user_id] = 2
Jean-Philippe Lang
Fixes functional test failures....
r2185 Setting.notified_events = ['file_added']
Jean-Philippe Lang
Files module: makes version field non required (#1053)....
r2115
assert_difference 'Attachment.count' do
post :add_file, :id => 1, :version_id => '2',
:attachments => {'1' => {'file' => test_uploaded_file('testfile.txt', 'text/plain')}}
end
Jean-Philippe Lang
Merged Rails 2.2 branch. Redmine now requires Rails 2.2.2....
r2430 assert_redirected_to 'projects/ecookbook/files'
Jean-Philippe Lang
Files module: makes version field non required (#1053)....
r2115 a = Attachment.find(:first, :order => 'created_on DESC')
assert_equal 'testfile.txt', a.filename
assert_equal Version.find(2), a.container
end
Eric Davis
Converted routing and urls to follow the Rails REST convention....
r2315
def test_list_files
get :list_files, :id => 1
assert_response :success
assert_template 'list_files'
Jean-Philippe Lang
Files module: makes version field non required (#1053)....
r2115 assert_not_nil assigns(:containers)
# file attached to the project
assert_tag :a, :content => 'project_file.zip',
:attributes => { :href => '/attachments/download/8/project_file.zip' }
Eric Davis
Converted routing and urls to follow the Rails REST convention....
r2315
Jean-Philippe Lang
Files module: makes version field non required (#1053)....
r2115 # file attached to a project's version
assert_tag :a, :content => 'version_file.zip',
:attributes => { :href => '/attachments/download/9/version_file.zip' }
Eric Davis
Converted routing and urls to follow the Rails REST convention....
r2315 end
def test_list_files_routing
assert_routing(
{:method => :get, :path => '/projects/33/files'},
:controller => 'projects', :action => 'list_files', :id => '33'
)
end
def test_changelog_routing
assert_routing(
{:method => :get, :path => '/projects/44/changelog'},
:controller => 'projects', :action => 'changelog', :id => '44'
)
end
def test_changelog
get :changelog, :id => 1
assert_response :success
assert_template 'changelog'
assert_not_nil assigns(:versions)
end
def test_roadmap_routing
assert_routing(
{:method => :get, :path => 'projects/33/roadmap'},
:controller => 'projects', :action => 'roadmap', :id => '33'
)
Jean-Philippe Lang
Initial commit...
r2 end
Jean-Philippe Lang
search engine improvements and simple test...
r282
Jean-Philippe Lang
added roadmap and activity calls in projects functional tests...
r368 def test_roadmap
get :roadmap, :id => 1
assert_response :success
assert_template 'roadmap'
assert_not_nil assigns(:versions)
Jean-Philippe Lang
Added some functional tests (projects and repositories)....
r968 # Version with no date set appears
assert assigns(:versions).include?(Version.find(3))
# Completed version doesn't appear
assert !assigns(:versions).include?(Version.find(1))
end
def test_roadmap_with_completed_versions
get :roadmap, :id => 1, :completed => 1
assert_response :success
assert_template 'roadmap'
assert_not_nil assigns(:versions)
# Version with no date set appears
assert assigns(:versions).include?(Version.find(3))
# Completed version appears
assert assigns(:versions).include?(Version.find(1))
Jean-Philippe Lang
added roadmap and activity calls in projects functional tests...
r368 end
Eric Davis
Converted routing and urls to follow the Rails REST convention....
r2315
def test_project_activity_routing
assert_routing(
{:method => :get, :path => '/projects/1/activity'},
:controller => 'projects', :action => 'activity', :id => '1'
)
end
def test_project_activity_atom_routing
assert_routing(
{:method => :get, :path => '/projects/1/activity.atom'},
:controller => 'projects', :action => 'activity', :id => '1', :format => 'atom'
)
end
Jean-Philippe Lang
Activity enhancements:...
r1213 def test_project_activity
get :activity, :id => 1, :with_subprojects => 0
Jean-Philippe Lang
added roadmap and activity calls in projects functional tests...
r368 assert_response :success
assert_template 'activity'
assert_not_nil assigns(:events_by_day)
Jean-Philippe Lang
Added issues status changes on the activity view (initial patch by Cyril Mougel)....
r879
assert_tag :tag => "h3",
:content => /#{2.days.ago.to_date.day}/,
Jean-Philippe Lang
Activity test fix (r1120)....
r1109 :sibling => { :tag => "dl",
:child => { :tag => "dt",
Jean-Philippe Lang
Fixes test broken by r1578....
r1567 :attributes => { :class => /issue-edit/ },
Jean-Philippe Lang
Activity test fix (r1120)....
r1109 :child => { :tag => "a",
Jean-Philippe Lang
Added issues status changes on the activity view (initial patch by Cyril Mougel)....
r879 :content => /(#{IssueStatus.find(2).name})/,
}
}
}
Jean-Philippe Lang
Activity refactoring....
r1692 end
def test_previous_project_activity
Jean-Philippe Lang
Display the last 30 days on the activity view rather than the current month....
r1182 get :activity, :id => 1, :from => 3.days.ago.to_date
Jean-Philippe Lang
Project name format limitation removed (name can now contain any character)....
r936 assert_response :success
assert_template 'activity'
assert_not_nil assigns(:events_by_day)
Jean-Philippe Lang
Added issues status changes on the activity view (initial patch by Cyril Mougel)....
r879 assert_tag :tag => "h3",
:content => /#{3.day.ago.to_date.day}/,
Jean-Philippe Lang
Activity test fix (r1120)....
r1109 :sibling => { :tag => "dl",
:child => { :tag => "dt",
Jean-Philippe Lang
Fixes test broken by r1578....
r1567 :attributes => { :class => /issue/ },
Jean-Philippe Lang
Activity test fix (r1120)....
r1109 :child => { :tag => "a",
Jean-Philippe Lang
Added issues status changes on the activity view (initial patch by Cyril Mougel)....
r879 :content => /#{Issue.find(1).subject}/,
}
}
}
Jean-Philippe Lang
added roadmap and activity calls in projects functional tests...
r368 end
Jean-Philippe Lang
Added the ability to archive projects:...
r546
Eric Davis
Converted routing and urls to follow the Rails REST convention....
r2315 def test_global_activity_routing
Jean-Philippe Lang
Fixes tests broken by r2532 (#2853)....
r2470 assert_routing({:method => :get, :path => '/activity'}, :controller => 'projects', :action => 'activity', :id => nil)
Eric Davis
Converted routing and urls to follow the Rails REST convention....
r2315 end
Jean-Philippe Lang
Activity refactoring....
r1692 def test_global_activity
Jean-Philippe Lang
Activity enhancements:...
r1213 get :activity
assert_response :success
assert_template 'activity'
Jean-Philippe Lang
Activity refactoring....
r1692 assert_not_nil assigns(:events_by_day)
Jean-Philippe Lang
Activity enhancements:...
r1213
Jean-Philippe Lang
Activity refactoring....
r1692 assert_tag :tag => "h3",
:content => /#{5.day.ago.to_date.day}/,
:sibling => { :tag => "dl",
:child => { :tag => "dt",
:attributes => { :class => /issue/ },
:child => { :tag => "a",
:content => /#{Issue.find(5).subject}/,
Jean-Philippe Lang
Makes activity view accept a user_id param to show user's activity (#1002)....
r2065 }
}
}
end
def test_user_activity
get :activity, :user_id => 2
assert_response :success
assert_template 'activity'
assert_not_nil assigns(:events_by_day)
assert_tag :tag => "h3",
:content => /#{3.day.ago.to_date.day}/,
:sibling => { :tag => "dl",
:child => { :tag => "dt",
:attributes => { :class => /issue/ },
:child => { :tag => "a",
:content => /#{Issue.find(1).subject}/,
Jean-Philippe Lang
Activity refactoring....
r1692 }
}
}
Jean-Philippe Lang
Activity enhancements:...
r1213 end
Eric Davis
Converted routing and urls to follow the Rails REST convention....
r2315 def test_global_activity_atom_routing
Jean-Philippe Lang
Fixes tests broken by r2532 (#2853)....
r2470 assert_routing({:method => :get, :path => '/activity.atom'}, :controller => 'projects', :action => 'activity', :id => nil, :format => 'atom')
Eric Davis
Converted routing and urls to follow the Rails REST convention....
r2315 end
Jean-Philippe Lang
Fixed: activity atom feed broken by r1701 (#1703)....
r1710 def test_activity_atom_feed
get :activity, :format => 'atom'
assert_response :success
assert_template 'common/feed.atom.rxml'
end
Eric Davis
Converted routing and urls to follow the Rails REST convention....
r2315 def test_archive_routing
assert_routing(
#TODO: use PUT to project path and modify form
{:method => :post, :path => 'projects/64/archive'},
:controller => 'projects', :action => 'archive', :id => '64'
)
end
def test_archive
Jean-Philippe Lang
Added the ability to archive projects:...
r546 @request.session[:user_id] = 1 # admin
post :archive, :id => 1
assert_redirected_to 'admin/projects'
assert !Project.find(1).active?
end
Eric Davis
Converted routing and urls to follow the Rails REST convention....
r2315 def test_unarchive_routing
assert_routing(
#TODO: use PUT to project path and modify form
{:method => :post, :path => '/projects/567/unarchive'},
:controller => 'projects', :action => 'unarchive', :id => '567'
)
end
Jean-Philippe Lang
Added the ability to archive projects:...
r546 def test_unarchive
@request.session[:user_id] = 1 # admin
Project.find(1).archive
post :unarchive, :id => 1
assert_redirected_to 'admin/projects'
assert Project.find(1).active?
end
Jean-Philippe Lang
Menu mapper: add support for :before, :after and :last options to #push method and add #delete method....
r1646
Jean-Philippe Lang
Adds (a maximum of 3) links to project ancestors in the page title (#2788)....
r2423 def test_project_breadcrumbs_should_be_limited_to_3_ancestors
CustomField.delete_all
parent = nil
6.times do |i|
p = Project.create!(:name => "Breadcrumbs #{i}", :identifier => "breadcrumbs-#{i}")
p.set_parent!(parent)
get :show, :id => p
assert_tag :h1, :parent => { :attributes => {:id => 'header'}},
:children => { :count => [i, 3].min,
:only => { :tag => 'a' } }
parent = p
end
end
Eric Davis
Added the ability to copy a project in the Project Administration panel....
r2608
def test_copy_with_project
@request.session[:user_id] = 1 # admin
get :copy, :id => 1
assert_response :success
assert_template 'copy'
assert assigns(:project)
assert_equal Project.find(1).description, assigns(:project).description
assert_nil assigns(:project).id
end
def test_copy_without_project
@request.session[:user_id] = 1 # admin
get :copy
assert_response :redirect
assert_redirected_to :controller => 'admin', :action => 'projects'
end
Jean-Philippe Lang
Jump to the current tab when using the project quick-jump combo (#2364)....
r2208 def test_jump_should_redirect_to_active_tab
get :show, :id => 1, :jump => 'issues'
assert_redirected_to 'projects/ecookbook/issues'
end
def test_jump_should_not_redirect_to_inactive_tab
get :show, :id => 3, :jump => 'documents'
assert_response :success
assert_template 'show'
end
def test_jump_should_not_redirect_to_unknown_tab
get :show, :id => 3, :jump => 'foobar'
assert_response :success
assert_template 'show'
end
Jean-Philippe Lang
Merged hooks branch @ r1785 into trunk....
r1785 # A hook that is manually registered later
class ProjectBasedTemplate < Redmine::Hook::ViewListener
def view_layouts_base_html_head(context)
# Adds a project stylesheet
stylesheet_link_tag(context[:project].identifier) if context[:project]
end
end
# Don't use this hook now
Redmine::Hook.clear_listeners
def test_hook_response
Redmine::Hook.add_listener(ProjectBasedTemplate)
get :show, :id => 1
assert_tag :tag => 'link', :attributes => {:href => '/stylesheets/ecookbook.css'},
:parent => {:tag => 'head'}
Redmine::Hook.clear_listeners
end
Jean-Philippe Lang
Initial commit...
r2 end