##// END OF EJS Templates
Converted routing and urls to follow the Rails REST convention....
Converted routing and urls to follow the Rails REST convention. Patch supplied by commits from Gerrit Kaiser on Github. Existing routes will still work (backwards compatible) but any new urls will be generated using the new routing rules. Changes listed below: * made the URLs for some project tabs and project settings follow the new rails RESTful conventions of /collection/:id/subcollection/:sub_id * prettier URL for project roadmap * more nice project URLs * use GET for filtering form * prettified URLs used on issues tab * custom route for activity atom feeds * prettier repository urls * fixed broken route definition * fixed failing tests for issuecontroller that were hardcoding the url string * more RESTful routes for boards and messages * RESTful routes for wiki pages * RESTful routes for documents * moved old routes that are retained for compatibility to the bottom and grouped them together * added RESTful URIs for issues * RESTfulness for the news section * fixed route order * changed hardcoded URLs in tests * fixed badly written tests * fixed forgotten parameter in routes * changed hardcoded URLS to new scheme * changed project add url to the standard POST to collection * create new issue by POSTing to collection * changed hardcoded URLs in integrations tests * made project add form work again * restful routes for project deletion * prettier routes for project (un)archival * made routes table more readable * fixed note quoting * user routing * fixed bug * always sort by GET * Fixed: cross-project issue list should not show issues of projects for which the issue tracking module was disabled. * prettified URLs used on issues tab * urls for time log * fixed reply routing * eliminate revision query paremeter for diff and entry actions * fixed test failures with hard-coded urls * ensure ajax links always use get * refactored ajax link generation into separate method #1901 git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2317 e93f8b46-1217-0410-a6f0-8f06a7374b81

File last commit:

r2315:765f7abc6033
r2315:765f7abc6033
Show More
projects_controller_test.rb
517 lines | 17.1 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
class ProjectsControllerTest < Test::Unit::TestCase
Jean-Philippe Lang
Activity enhancements:...
r1213 fixtures :projects, :versions, :users, :roles, :members, :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
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
Project identifier is now used in URLs (instead of project id)....
r994 assert_redirected_to 'projects/settings/ecookbook'
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
assert_redirected_to 'projects/list_files/ecookbook'
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
assert_redirected_to 'projects/list_files/ecookbook'
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
assert_routing({:method => :get, :path => '/activity'}, :controller => 'projects', :action => 'activity')
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
assert_routing({:method => :get, :path => '/activity.atom'}, :controller => 'projects', :action => 'activity', :format => 'atom')
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
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
Menu mapper: add support for :before, :after and :last options to #push method and add #delete method....
r1646 def test_project_menu
assert_no_difference 'Redmine::MenuManager.items(:project_menu).size' do
Redmine::MenuManager.map :project_menu do |menu|
menu.push :foo, { :controller => 'projects', :action => 'show' }, :cation => 'Foo'
menu.push :bar, { :controller => 'projects', :action => 'show' }, :before => :activity
menu.push :hello, { :controller => 'projects', :action => 'show' }, :caption => Proc.new {|p| p.name.upcase }, :after => :bar
end
get :show, :id => 1
assert_tag :div, :attributes => { :id => 'main-menu' },
Jean-Philippe Lang
Adds a css class on menu items in order to apply item specific styles (eg. icons)....
r2057 :descendant => { :tag => 'li', :child => { :tag => 'a', :content => 'Foo',
:attributes => { :class => 'foo' } } }
Jean-Philippe Lang
Menu mapper: add support for :before, :after and :last options to #push method and add #delete method....
r1646
assert_tag :div, :attributes => { :id => 'main-menu' },
Jean-Philippe Lang
Adds a css class on menu items in order to apply item specific styles (eg. icons)....
r2057 :descendant => { :tag => 'li', :child => { :tag => 'a', :content => 'Bar',
:attributes => { :class => 'bar' } },
Jean-Philippe Lang
Menu mapper: add support for :before, :after and :last options to #push method and add #delete method....
r1646 :before => { :tag => 'li', :child => { :tag => 'a', :content => 'ECOOKBOOK' } } }
assert_tag :div, :attributes => { :id => 'main-menu' },
Jean-Philippe Lang
Adds a css class on menu items in order to apply item specific styles (eg. icons)....
r2057 :descendant => { :tag => 'li', :child => { :tag => 'a', :content => 'ECOOKBOOK',
:attributes => { :class => 'hello' } },
Jean-Philippe Lang
Menu mapper: add support for :before, :after and :last options to #push method and add #delete method....
r1646 :before => { :tag => 'li', :child => { :tag => 'a', :content => 'Activity' } } }
# Remove the menu items
Redmine::MenuManager.map :project_menu do |menu|
menu.delete :foo
menu.delete :bar
menu.delete :hello
end
end
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