##// END OF EJS Templates
Adds support for requesting information about current user using /users/current (#7141)....
Jean-Philippe Lang -
r4430:599bc450730b
parent child
Show More
@@ -1,221 +1,225
1 # Redmine - project management software
1 # Redmine - project management software
2 # Copyright (C) 2006-2010 Jean-Philippe Lang
2 # Copyright (C) 2006-2010 Jean-Philippe Lang
3 #
3 #
4 # This program is free software; you can redistribute it and/or
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
7 # of the License, or (at your option) any later version.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU General Public License
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 class UsersController < ApplicationController
18 class UsersController < ApplicationController
19 layout 'admin'
19 layout 'admin'
20
20
21 before_filter :require_admin, :except => :show
21 before_filter :require_admin, :except => :show
22 before_filter :find_user, :only => [:show, :edit, :update, :edit_membership, :destroy_membership]
22 accept_key_auth :index, :show, :create, :update
23 accept_key_auth :index, :show, :create, :update
23
24
24 helper :sort
25 helper :sort
25 include SortHelper
26 include SortHelper
26 helper :custom_fields
27 helper :custom_fields
27 include CustomFieldsHelper
28 include CustomFieldsHelper
28
29
29 def index
30 def index
30 sort_init 'login', 'asc'
31 sort_init 'login', 'asc'
31 sort_update %w(login firstname lastname mail admin created_on last_login_on)
32 sort_update %w(login firstname lastname mail admin created_on last_login_on)
32
33
33 case params[:format]
34 case params[:format]
34 when 'xml', 'json'
35 when 'xml', 'json'
35 @offset, @limit = api_offset_and_limit
36 @offset, @limit = api_offset_and_limit
36 else
37 else
37 @limit = per_page_option
38 @limit = per_page_option
38 end
39 end
39
40
40 @status = params[:status] ? params[:status].to_i : 1
41 @status = params[:status] ? params[:status].to_i : 1
41 c = ARCondition.new(@status == 0 ? "status <> 0" : ["status = ?", @status])
42 c = ARCondition.new(@status == 0 ? "status <> 0" : ["status = ?", @status])
42
43
43 unless params[:name].blank?
44 unless params[:name].blank?
44 name = "%#{params[:name].strip.downcase}%"
45 name = "%#{params[:name].strip.downcase}%"
45 c << ["LOWER(login) LIKE ? OR LOWER(firstname) LIKE ? OR LOWER(lastname) LIKE ? OR LOWER(mail) LIKE ?", name, name, name, name]
46 c << ["LOWER(login) LIKE ? OR LOWER(firstname) LIKE ? OR LOWER(lastname) LIKE ? OR LOWER(mail) LIKE ?", name, name, name, name]
46 end
47 end
47
48
48 @user_count = User.count(:conditions => c.conditions)
49 @user_count = User.count(:conditions => c.conditions)
49 @user_pages = Paginator.new self, @user_count, @limit, params['page']
50 @user_pages = Paginator.new self, @user_count, @limit, params['page']
50 @offset ||= @user_pages.current.offset
51 @offset ||= @user_pages.current.offset
51 @users = User.find :all,
52 @users = User.find :all,
52 :order => sort_clause,
53 :order => sort_clause,
53 :conditions => c.conditions,
54 :conditions => c.conditions,
54 :limit => @limit,
55 :limit => @limit,
55 :offset => @offset
56 :offset => @offset
56
57
57 respond_to do |format|
58 respond_to do |format|
58 format.html { render :layout => !request.xhr? }
59 format.html { render :layout => !request.xhr? }
59 format.api
60 format.api
60 end
61 end
61 end
62 end
62
63
63 def show
64 def show
64 @user = User.find(params[:id])
65
66 # show projects based on current user visibility
65 # show projects based on current user visibility
67 @memberships = @user.memberships.all(:conditions => Project.visible_by(User.current))
66 @memberships = @user.memberships.all(:conditions => Project.visible_by(User.current))
68
67
69 events = Redmine::Activity::Fetcher.new(User.current, :author => @user).events(nil, nil, :limit => 10)
68 events = Redmine::Activity::Fetcher.new(User.current, :author => @user).events(nil, nil, :limit => 10)
70 @events_by_day = events.group_by(&:event_date)
69 @events_by_day = events.group_by(&:event_date)
71
70
72 unless User.current.admin?
71 unless User.current.admin?
73 if !@user.active? || (@user != User.current && @memberships.empty? && events.empty?)
72 if !@user.active? || (@user != User.current && @memberships.empty? && events.empty?)
74 render_404
73 render_404
75 return
74 return
76 end
75 end
77 end
76 end
78
77
79 respond_to do |format|
78 respond_to do |format|
80 format.html { render :layout => 'base' }
79 format.html { render :layout => 'base' }
81 format.api
80 format.api
82 end
81 end
83 rescue ActiveRecord::RecordNotFound
84 render_404
85 end
82 end
86
83
87 def new
84 def new
88 @user = User.new(:language => Setting.default_language, :mail_notification => Setting.default_notification_option)
85 @user = User.new(:language => Setting.default_language, :mail_notification => Setting.default_notification_option)
89 @auth_sources = AuthSource.find(:all)
86 @auth_sources = AuthSource.find(:all)
90 end
87 end
91
88
92 verify :method => :post, :only => :create, :render => {:nothing => true, :status => :method_not_allowed }
89 verify :method => :post, :only => :create, :render => {:nothing => true, :status => :method_not_allowed }
93 def create
90 def create
94 @user = User.new(:language => Setting.default_language, :mail_notification => Setting.default_notification_option)
91 @user = User.new(:language => Setting.default_language, :mail_notification => Setting.default_notification_option)
95 @user.safe_attributes = params[:user]
92 @user.safe_attributes = params[:user]
96 @user.admin = params[:user][:admin] || false
93 @user.admin = params[:user][:admin] || false
97 @user.login = params[:user][:login]
94 @user.login = params[:user][:login]
98 @user.password, @user.password_confirmation = params[:user][:password], params[:user][:password_confirmation] unless @user.auth_source_id
95 @user.password, @user.password_confirmation = params[:user][:password], params[:user][:password_confirmation] unless @user.auth_source_id
99
96
100 # TODO: Similar to My#account
97 # TODO: Similar to My#account
101 @user.pref.attributes = params[:pref]
98 @user.pref.attributes = params[:pref]
102 @user.pref[:no_self_notified] = (params[:no_self_notified] == '1')
99 @user.pref[:no_self_notified] = (params[:no_self_notified] == '1')
103
100
104 if @user.save
101 if @user.save
105 @user.pref.save
102 @user.pref.save
106 @user.notified_project_ids = (@user.mail_notification == 'selected' ? params[:notified_project_ids] : [])
103 @user.notified_project_ids = (@user.mail_notification == 'selected' ? params[:notified_project_ids] : [])
107
104
108 Mailer.deliver_account_information(@user, params[:user][:password]) if params[:send_information]
105 Mailer.deliver_account_information(@user, params[:user][:password]) if params[:send_information]
109
106
110 respond_to do |format|
107 respond_to do |format|
111 format.html {
108 format.html {
112 flash[:notice] = l(:notice_successful_create)
109 flash[:notice] = l(:notice_successful_create)
113 redirect_to(params[:continue] ?
110 redirect_to(params[:continue] ?
114 {:controller => 'users', :action => 'new'} :
111 {:controller => 'users', :action => 'new'} :
115 {:controller => 'users', :action => 'edit', :id => @user}
112 {:controller => 'users', :action => 'edit', :id => @user}
116 )
113 )
117 }
114 }
118 format.api { render :action => 'show', :status => :created, :location => user_url(@user) }
115 format.api { render :action => 'show', :status => :created, :location => user_url(@user) }
119 end
116 end
120 else
117 else
121 @auth_sources = AuthSource.find(:all)
118 @auth_sources = AuthSource.find(:all)
122 # Clear password input
119 # Clear password input
123 @user.password = @user.password_confirmation = nil
120 @user.password = @user.password_confirmation = nil
124
121
125 respond_to do |format|
122 respond_to do |format|
126 format.html { render :action => 'new' }
123 format.html { render :action => 'new' }
127 format.api { render_validation_errors(@user) }
124 format.api { render_validation_errors(@user) }
128 end
125 end
129 end
126 end
130 end
127 end
131
128
132 def edit
129 def edit
133 @user = User.find(params[:id])
134
135 @auth_sources = AuthSource.find(:all)
130 @auth_sources = AuthSource.find(:all)
136 @membership ||= Member.new
131 @membership ||= Member.new
137 end
132 end
138
133
139 verify :method => :put, :only => :update, :render => {:nothing => true, :status => :method_not_allowed }
134 verify :method => :put, :only => :update, :render => {:nothing => true, :status => :method_not_allowed }
140 def update
135 def update
141 @user = User.find(params[:id])
142
143 @user.admin = params[:user][:admin] if params[:user][:admin]
136 @user.admin = params[:user][:admin] if params[:user][:admin]
144 @user.login = params[:user][:login] if params[:user][:login]
137 @user.login = params[:user][:login] if params[:user][:login]
145 if params[:user][:password].present? && (@user.auth_source_id.nil? || params[:user][:auth_source_id].blank?)
138 if params[:user][:password].present? && (@user.auth_source_id.nil? || params[:user][:auth_source_id].blank?)
146 @user.password, @user.password_confirmation = params[:user][:password], params[:user][:password_confirmation]
139 @user.password, @user.password_confirmation = params[:user][:password], params[:user][:password_confirmation]
147 end
140 end
148 @user.safe_attributes = params[:user]
141 @user.safe_attributes = params[:user]
149 # Was the account actived ? (do it before User#save clears the change)
142 # Was the account actived ? (do it before User#save clears the change)
150 was_activated = (@user.status_change == [User::STATUS_REGISTERED, User::STATUS_ACTIVE])
143 was_activated = (@user.status_change == [User::STATUS_REGISTERED, User::STATUS_ACTIVE])
151 # TODO: Similar to My#account
144 # TODO: Similar to My#account
152 @user.pref.attributes = params[:pref]
145 @user.pref.attributes = params[:pref]
153 @user.pref[:no_self_notified] = (params[:no_self_notified] == '1')
146 @user.pref[:no_self_notified] = (params[:no_self_notified] == '1')
154
147
155 if @user.save
148 if @user.save
156 @user.pref.save
149 @user.pref.save
157 @user.notified_project_ids = (@user.mail_notification == 'selected' ? params[:notified_project_ids] : [])
150 @user.notified_project_ids = (@user.mail_notification == 'selected' ? params[:notified_project_ids] : [])
158
151
159 if was_activated
152 if was_activated
160 Mailer.deliver_account_activated(@user)
153 Mailer.deliver_account_activated(@user)
161 elsif @user.active? && params[:send_information] && !params[:user][:password].blank? && @user.auth_source_id.nil?
154 elsif @user.active? && params[:send_information] && !params[:user][:password].blank? && @user.auth_source_id.nil?
162 Mailer.deliver_account_information(@user, params[:user][:password])
155 Mailer.deliver_account_information(@user, params[:user][:password])
163 end
156 end
164
157
165 respond_to do |format|
158 respond_to do |format|
166 format.html {
159 format.html {
167 flash[:notice] = l(:notice_successful_update)
160 flash[:notice] = l(:notice_successful_update)
168 redirect_to :back
161 redirect_to :back
169 }
162 }
170 format.api { head :ok }
163 format.api { head :ok }
171 end
164 end
172 else
165 else
173 @auth_sources = AuthSource.find(:all)
166 @auth_sources = AuthSource.find(:all)
174 @membership ||= Member.new
167 @membership ||= Member.new
175 # Clear password input
168 # Clear password input
176 @user.password = @user.password_confirmation = nil
169 @user.password = @user.password_confirmation = nil
177
170
178 respond_to do |format|
171 respond_to do |format|
179 format.html { render :action => :edit }
172 format.html { render :action => :edit }
180 format.api { render_validation_errors(@user) }
173 format.api { render_validation_errors(@user) }
181 end
174 end
182 end
175 end
183 rescue ::ActionController::RedirectBackError
176 rescue ::ActionController::RedirectBackError
184 redirect_to :controller => 'users', :action => 'edit', :id => @user
177 redirect_to :controller => 'users', :action => 'edit', :id => @user
185 end
178 end
186
179
187 def edit_membership
180 def edit_membership
188 @user = User.find(params[:id])
189 @membership = Member.edit_membership(params[:membership_id], params[:membership], @user)
181 @membership = Member.edit_membership(params[:membership_id], params[:membership], @user)
190 @membership.save if request.post?
182 @membership.save if request.post?
191 respond_to do |format|
183 respond_to do |format|
192 if @membership.valid?
184 if @membership.valid?
193 format.html { redirect_to :controller => 'users', :action => 'edit', :id => @user, :tab => 'memberships' }
185 format.html { redirect_to :controller => 'users', :action => 'edit', :id => @user, :tab => 'memberships' }
194 format.js {
186 format.js {
195 render(:update) {|page|
187 render(:update) {|page|
196 page.replace_html "tab-content-memberships", :partial => 'users/memberships'
188 page.replace_html "tab-content-memberships", :partial => 'users/memberships'
197 page.visual_effect(:highlight, "member-#{@membership.id}")
189 page.visual_effect(:highlight, "member-#{@membership.id}")
198 }
190 }
199 }
191 }
200 else
192 else
201 format.js {
193 format.js {
202 render(:update) {|page|
194 render(:update) {|page|
203 page.alert(l(:notice_failed_to_save_members, :errors => @membership.errors.full_messages.join(', ')))
195 page.alert(l(:notice_failed_to_save_members, :errors => @membership.errors.full_messages.join(', ')))
204 }
196 }
205 }
197 }
206 end
198 end
207 end
199 end
208 end
200 end
209
201
210 def destroy_membership
202 def destroy_membership
211 @user = User.find(params[:id])
212 @membership = Member.find(params[:membership_id])
203 @membership = Member.find(params[:membership_id])
213 if request.post? && @membership.deletable?
204 if request.post? && @membership.deletable?
214 @membership.destroy
205 @membership.destroy
215 end
206 end
216 respond_to do |format|
207 respond_to do |format|
217 format.html { redirect_to :controller => 'users', :action => 'edit', :id => @user, :tab => 'memberships' }
208 format.html { redirect_to :controller => 'users', :action => 'edit', :id => @user, :tab => 'memberships' }
218 format.js { render(:update) {|page| page.replace_html "tab-content-memberships", :partial => 'users/memberships'} }
209 format.js { render(:update) {|page| page.replace_html "tab-content-memberships", :partial => 'users/memberships'} }
219 end
210 end
220 end
211 end
212
213 private
214
215 def find_user
216 if params[:id] == 'current'
217 require_login || return
218 @user = User.current
219 else
220 @user = User.find(params[:id])
221 end
222 rescue ActiveRecord::RecordNotFound
223 render_404
224 end
221 end
225 end
@@ -1,265 +1,279
1 # redMine - project management software
1 # redMine - project management software
2 # Copyright (C) 2006-2007 Jean-Philippe Lang
2 # Copyright (C) 2006-2007 Jean-Philippe Lang
3 #
3 #
4 # This program is free software; you can redistribute it and/or
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
7 # of the License, or (at your option) any later version.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU General Public License
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 require File.expand_path('../../test_helper', __FILE__)
18 require File.expand_path('../../test_helper', __FILE__)
19 require 'users_controller'
19 require 'users_controller'
20
20
21 # Re-raise errors caught by the controller.
21 # Re-raise errors caught by the controller.
22 class UsersController; def rescue_action(e) raise e end; end
22 class UsersController; def rescue_action(e) raise e end; end
23
23
24 class UsersControllerTest < ActionController::TestCase
24 class UsersControllerTest < ActionController::TestCase
25 include Redmine::I18n
25 include Redmine::I18n
26
26
27 fixtures :users, :projects, :members, :member_roles, :roles, :auth_sources, :custom_fields, :custom_values
27 fixtures :users, :projects, :members, :member_roles, :roles, :auth_sources, :custom_fields, :custom_values
28
28
29 def setup
29 def setup
30 @controller = UsersController.new
30 @controller = UsersController.new
31 @request = ActionController::TestRequest.new
31 @request = ActionController::TestRequest.new
32 @response = ActionController::TestResponse.new
32 @response = ActionController::TestResponse.new
33 User.current = nil
33 User.current = nil
34 @request.session[:user_id] = 1 # admin
34 @request.session[:user_id] = 1 # admin
35 end
35 end
36
36
37 def test_index
37 def test_index
38 get :index
38 get :index
39 assert_response :success
39 assert_response :success
40 assert_template 'index'
40 assert_template 'index'
41 end
41 end
42
42
43 def test_index
43 def test_index
44 get :index
44 get :index
45 assert_response :success
45 assert_response :success
46 assert_template 'index'
46 assert_template 'index'
47 assert_not_nil assigns(:users)
47 assert_not_nil assigns(:users)
48 # active users only
48 # active users only
49 assert_nil assigns(:users).detect {|u| !u.active?}
49 assert_nil assigns(:users).detect {|u| !u.active?}
50 end
50 end
51
51
52 def test_index_with_name_filter
52 def test_index_with_name_filter
53 get :index, :name => 'john'
53 get :index, :name => 'john'
54 assert_response :success
54 assert_response :success
55 assert_template 'index'
55 assert_template 'index'
56 users = assigns(:users)
56 users = assigns(:users)
57 assert_not_nil users
57 assert_not_nil users
58 assert_equal 1, users.size
58 assert_equal 1, users.size
59 assert_equal 'John', users.first.firstname
59 assert_equal 'John', users.first.firstname
60 end
60 end
61
61
62 def test_show
62 def test_show
63 @request.session[:user_id] = nil
63 @request.session[:user_id] = nil
64 get :show, :id => 2
64 get :show, :id => 2
65 assert_response :success
65 assert_response :success
66 assert_template 'show'
66 assert_template 'show'
67 assert_not_nil assigns(:user)
67 assert_not_nil assigns(:user)
68
68
69 assert_tag 'li', :content => /Phone number/
69 assert_tag 'li', :content => /Phone number/
70 end
70 end
71
71
72 def test_show_should_not_display_hidden_custom_fields
72 def test_show_should_not_display_hidden_custom_fields
73 @request.session[:user_id] = nil
73 @request.session[:user_id] = nil
74 UserCustomField.find_by_name('Phone number').update_attribute :visible, false
74 UserCustomField.find_by_name('Phone number').update_attribute :visible, false
75 get :show, :id => 2
75 get :show, :id => 2
76 assert_response :success
76 assert_response :success
77 assert_template 'show'
77 assert_template 'show'
78 assert_not_nil assigns(:user)
78 assert_not_nil assigns(:user)
79
79
80 assert_no_tag 'li', :content => /Phone number/
80 assert_no_tag 'li', :content => /Phone number/
81 end
81 end
82
82
83 def test_show_should_not_fail_when_custom_values_are_nil
83 def test_show_should_not_fail_when_custom_values_are_nil
84 user = User.find(2)
84 user = User.find(2)
85
85
86 # Create a custom field to illustrate the issue
86 # Create a custom field to illustrate the issue
87 custom_field = CustomField.create!(:name => 'Testing', :field_format => 'text')
87 custom_field = CustomField.create!(:name => 'Testing', :field_format => 'text')
88 custom_value = user.custom_values.build(:custom_field => custom_field).save!
88 custom_value = user.custom_values.build(:custom_field => custom_field).save!
89
89
90 get :show, :id => 2
90 get :show, :id => 2
91 assert_response :success
91 assert_response :success
92 end
92 end
93
93
94 def test_show_inactive
94 def test_show_inactive
95 @request.session[:user_id] = nil
95 @request.session[:user_id] = nil
96 get :show, :id => 5
96 get :show, :id => 5
97 assert_response 404
97 assert_response 404
98 end
98 end
99
99
100 def test_show_should_not_reveal_users_with_no_visible_activity_or_project
100 def test_show_should_not_reveal_users_with_no_visible_activity_or_project
101 @request.session[:user_id] = nil
101 @request.session[:user_id] = nil
102 get :show, :id => 9
102 get :show, :id => 9
103 assert_response 404
103 assert_response 404
104 end
104 end
105
105
106 def test_show_inactive_by_admin
106 def test_show_inactive_by_admin
107 @request.session[:user_id] = 1
107 @request.session[:user_id] = 1
108 get :show, :id => 5
108 get :show, :id => 5
109 assert_response 200
109 assert_response 200
110 assert_not_nil assigns(:user)
110 assert_not_nil assigns(:user)
111 end
111 end
112
112
113 def test_show_displays_memberships_based_on_project_visibility
113 def test_show_displays_memberships_based_on_project_visibility
114 @request.session[:user_id] = 1
114 @request.session[:user_id] = 1
115 get :show, :id => 2
115 get :show, :id => 2
116 assert_response :success
116 assert_response :success
117 memberships = assigns(:memberships)
117 memberships = assigns(:memberships)
118 assert_not_nil memberships
118 assert_not_nil memberships
119 project_ids = memberships.map(&:project_id)
119 project_ids = memberships.map(&:project_id)
120 assert project_ids.include?(2) #private project admin can see
120 assert project_ids.include?(2) #private project admin can see
121 end
121 end
122
122
123 def test_show_current_should_require_authentication
124 @request.session[:user_id] = nil
125 get :show, :id => 'current'
126 assert_response 302
127 end
128
129 def test_show_current
130 @request.session[:user_id] = 2
131 get :show, :id => 'current'
132 assert_response :success
133 assert_template 'show'
134 assert_equal User.find(2), assigns(:user)
135 end
136
123 def test_new
137 def test_new
124 get :new
138 get :new
125
139
126 assert_response :success
140 assert_response :success
127 assert_template :new
141 assert_template :new
128 assert assigns(:user)
142 assert assigns(:user)
129 end
143 end
130
144
131 def test_create
145 def test_create
132 Setting.bcc_recipients = '1'
146 Setting.bcc_recipients = '1'
133
147
134 assert_difference 'User.count' do
148 assert_difference 'User.count' do
135 assert_difference 'ActionMailer::Base.deliveries.size' do
149 assert_difference 'ActionMailer::Base.deliveries.size' do
136 post :create,
150 post :create,
137 :user => {
151 :user => {
138 :firstname => 'John',
152 :firstname => 'John',
139 :lastname => 'Doe',
153 :lastname => 'Doe',
140 :login => 'jdoe',
154 :login => 'jdoe',
141 :password => 'secret',
155 :password => 'secret',
142 :password_confirmation => 'secret',
156 :password_confirmation => 'secret',
143 :mail => 'jdoe@gmail.com',
157 :mail => 'jdoe@gmail.com',
144 :mail_notification => 'none'
158 :mail_notification => 'none'
145 },
159 },
146 :send_information => '1'
160 :send_information => '1'
147 end
161 end
148 end
162 end
149
163
150 user = User.first(:order => 'id DESC')
164 user = User.first(:order => 'id DESC')
151 assert_redirected_to :controller => 'users', :action => 'edit', :id => user.id
165 assert_redirected_to :controller => 'users', :action => 'edit', :id => user.id
152
166
153 assert_equal 'John', user.firstname
167 assert_equal 'John', user.firstname
154 assert_equal 'Doe', user.lastname
168 assert_equal 'Doe', user.lastname
155 assert_equal 'jdoe', user.login
169 assert_equal 'jdoe', user.login
156 assert_equal 'jdoe@gmail.com', user.mail
170 assert_equal 'jdoe@gmail.com', user.mail
157 assert_equal 'none', user.mail_notification
171 assert_equal 'none', user.mail_notification
158 assert user.check_password?('secret')
172 assert user.check_password?('secret')
159
173
160 mail = ActionMailer::Base.deliveries.last
174 mail = ActionMailer::Base.deliveries.last
161 assert_not_nil mail
175 assert_not_nil mail
162 assert_equal [user.mail], mail.bcc
176 assert_equal [user.mail], mail.bcc
163 assert mail.body.include?('secret')
177 assert mail.body.include?('secret')
164 end
178 end
165
179
166 def test_create_with_failure
180 def test_create_with_failure
167 assert_no_difference 'User.count' do
181 assert_no_difference 'User.count' do
168 post :create, :user => {}
182 post :create, :user => {}
169 end
183 end
170
184
171 assert_response :success
185 assert_response :success
172 assert_template 'new'
186 assert_template 'new'
173 end
187 end
174
188
175 def test_edit
189 def test_edit
176 get :edit, :id => 2
190 get :edit, :id => 2
177
191
178 assert_response :success
192 assert_response :success
179 assert_template 'edit'
193 assert_template 'edit'
180 assert_equal User.find(2), assigns(:user)
194 assert_equal User.find(2), assigns(:user)
181 end
195 end
182
196
183 def test_update
197 def test_update
184 ActionMailer::Base.deliveries.clear
198 ActionMailer::Base.deliveries.clear
185 put :update, :id => 2, :user => {:firstname => 'Changed', :mail_notification => 'only_assigned'}, :pref => {:hide_mail => '1', :comments_sorting => 'desc'}
199 put :update, :id => 2, :user => {:firstname => 'Changed', :mail_notification => 'only_assigned'}, :pref => {:hide_mail => '1', :comments_sorting => 'desc'}
186
200
187 user = User.find(2)
201 user = User.find(2)
188 assert_equal 'Changed', user.firstname
202 assert_equal 'Changed', user.firstname
189 assert_equal 'only_assigned', user.mail_notification
203 assert_equal 'only_assigned', user.mail_notification
190 assert_equal true, user.pref[:hide_mail]
204 assert_equal true, user.pref[:hide_mail]
191 assert_equal 'desc', user.pref[:comments_sorting]
205 assert_equal 'desc', user.pref[:comments_sorting]
192 assert ActionMailer::Base.deliveries.empty?
206 assert ActionMailer::Base.deliveries.empty?
193 end
207 end
194
208
195 def test_update_with_failure
209 def test_update_with_failure
196 assert_no_difference 'User.count' do
210 assert_no_difference 'User.count' do
197 put :update, :id => 2, :user => {:firstname => ''}
211 put :update, :id => 2, :user => {:firstname => ''}
198 end
212 end
199
213
200 assert_response :success
214 assert_response :success
201 assert_template 'edit'
215 assert_template 'edit'
202 end
216 end
203
217
204 def test_update_with_group_ids_should_assign_groups
218 def test_update_with_group_ids_should_assign_groups
205 put :update, :id => 2, :user => {:group_ids => ['10']}
219 put :update, :id => 2, :user => {:group_ids => ['10']}
206
220
207 user = User.find(2)
221 user = User.find(2)
208 assert_equal [10], user.group_ids
222 assert_equal [10], user.group_ids
209 end
223 end
210
224
211 def test_update_with_activation_should_send_a_notification
225 def test_update_with_activation_should_send_a_notification
212 u = User.new(:firstname => 'Foo', :lastname => 'Bar', :mail => 'foo.bar@somenet.foo', :language => 'fr')
226 u = User.new(:firstname => 'Foo', :lastname => 'Bar', :mail => 'foo.bar@somenet.foo', :language => 'fr')
213 u.login = 'foo'
227 u.login = 'foo'
214 u.status = User::STATUS_REGISTERED
228 u.status = User::STATUS_REGISTERED
215 u.save!
229 u.save!
216 ActionMailer::Base.deliveries.clear
230 ActionMailer::Base.deliveries.clear
217 Setting.bcc_recipients = '1'
231 Setting.bcc_recipients = '1'
218
232
219 put :update, :id => u.id, :user => {:status => User::STATUS_ACTIVE}
233 put :update, :id => u.id, :user => {:status => User::STATUS_ACTIVE}
220 assert u.reload.active?
234 assert u.reload.active?
221 mail = ActionMailer::Base.deliveries.last
235 mail = ActionMailer::Base.deliveries.last
222 assert_not_nil mail
236 assert_not_nil mail
223 assert_equal ['foo.bar@somenet.foo'], mail.bcc
237 assert_equal ['foo.bar@somenet.foo'], mail.bcc
224 assert mail.body.include?(ll('fr', :notice_account_activated))
238 assert mail.body.include?(ll('fr', :notice_account_activated))
225 end
239 end
226
240
227 def test_update_with_password_change_should_send_a_notification
241 def test_update_with_password_change_should_send_a_notification
228 ActionMailer::Base.deliveries.clear
242 ActionMailer::Base.deliveries.clear
229 Setting.bcc_recipients = '1'
243 Setting.bcc_recipients = '1'
230
244
231 put :update, :id => 2, :user => {:password => 'newpass', :password_confirmation => 'newpass'}, :send_information => '1'
245 put :update, :id => 2, :user => {:password => 'newpass', :password_confirmation => 'newpass'}, :send_information => '1'
232 u = User.find(2)
246 u = User.find(2)
233 assert u.check_password?('newpass')
247 assert u.check_password?('newpass')
234
248
235 mail = ActionMailer::Base.deliveries.last
249 mail = ActionMailer::Base.deliveries.last
236 assert_not_nil mail
250 assert_not_nil mail
237 assert_equal [u.mail], mail.bcc
251 assert_equal [u.mail], mail.bcc
238 assert mail.body.include?('newpass')
252 assert mail.body.include?('newpass')
239 end
253 end
240
254
241 test "put :update with a password change to an AuthSource user switching to Internal authentication" do
255 test "put :update with a password change to an AuthSource user switching to Internal authentication" do
242 # Configure as auth source
256 # Configure as auth source
243 u = User.find(2)
257 u = User.find(2)
244 u.auth_source = AuthSource.find(1)
258 u.auth_source = AuthSource.find(1)
245 u.save!
259 u.save!
246
260
247 put :update, :id => u.id, :user => {:auth_source_id => '', :password => 'newpass'}, :password_confirmation => 'newpass'
261 put :update, :id => u.id, :user => {:auth_source_id => '', :password => 'newpass'}, :password_confirmation => 'newpass'
248
262
249 assert_equal nil, u.reload.auth_source
263 assert_equal nil, u.reload.auth_source
250 assert u.check_password?('newpass')
264 assert u.check_password?('newpass')
251 end
265 end
252
266
253 def test_edit_membership
267 def test_edit_membership
254 post :edit_membership, :id => 2, :membership_id => 1,
268 post :edit_membership, :id => 2, :membership_id => 1,
255 :membership => { :role_ids => [2]}
269 :membership => { :role_ids => [2]}
256 assert_redirected_to :action => 'edit', :id => '2', :tab => 'memberships'
270 assert_redirected_to :action => 'edit', :id => '2', :tab => 'memberships'
257 assert_equal [2], Member.find(1).role_ids
271 assert_equal [2], Member.find(1).role_ids
258 end
272 end
259
273
260 def test_destroy_membership
274 def test_destroy_membership
261 post :destroy_membership, :id => 2, :membership_id => 1
275 post :destroy_membership, :id => 2, :membership_id => 1
262 assert_redirected_to :action => 'edit', :id => '2', :tab => 'memberships'
276 assert_redirected_to :action => 'edit', :id => '2', :tab => 'memberships'
263 assert_nil Member.find_by_id(1)
277 assert_nil Member.find_by_id(1)
264 end
278 end
265 end
279 end
@@ -1,258 +1,275
1 # Redmine - project management software
1 # Redmine - project management software
2 # Copyright (C) 2006-2010 Jean-Philippe Lang
2 # Copyright (C) 2006-2010 Jean-Philippe Lang
3 #
3 #
4 # This program is free software; you can redistribute it and/or
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
7 # of the License, or (at your option) any later version.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU General Public License
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 require File.expand_path('../../../test_helper', __FILE__)
18 require File.expand_path('../../../test_helper', __FILE__)
19 require 'pp'
19 require 'pp'
20 class ApiTest::UsersTest < ActionController::IntegrationTest
20 class ApiTest::UsersTest < ActionController::IntegrationTest
21 fixtures :users
21 fixtures :users
22
22
23 def setup
23 def setup
24 Setting.rest_api_enabled = '1'
24 Setting.rest_api_enabled = '1'
25 end
25 end
26
26
27 context "GET /users" do
27 context "GET /users" do
28 should_allow_api_authentication(:get, "/users.xml")
28 should_allow_api_authentication(:get, "/users.xml")
29 should_allow_api_authentication(:get, "/users.json")
29 should_allow_api_authentication(:get, "/users.json")
30 end
30 end
31
31
32 context "GET /users/2" do
32 context "GET /users/2" do
33 context ".xml" do
33 context ".xml" do
34 should "return requested user" do
34 should "return requested user" do
35 get '/users/2.xml'
35 get '/users/2.xml'
36
36
37 assert_tag :tag => 'user',
37 assert_tag :tag => 'user',
38 :child => {:tag => 'id', :content => '2'}
38 :child => {:tag => 'id', :content => '2'}
39 end
39 end
40 end
40 end
41
41
42 context ".json" do
42 context ".json" do
43 should "return requested user" do
43 should "return requested user" do
44 get '/users/2.json'
44 get '/users/2.json'
45
45
46 json = ActiveSupport::JSON.decode(response.body)
46 json = ActiveSupport::JSON.decode(response.body)
47 assert_kind_of Hash, json
47 assert_kind_of Hash, json
48 assert_kind_of Hash, json['user']
48 assert_kind_of Hash, json['user']
49 assert_equal 2, json['user']['id']
49 assert_equal 2, json['user']['id']
50 end
50 end
51 end
51 end
52 end
52 end
53
54 context "GET /users/current" do
55 context ".xml" do
56 should "require authentication" do
57 get '/users/current.xml'
58
59 assert_response 401
60 end
61
62 should "return current user" do
63 get '/users/current.xml', {}, :authorization => credentials('jsmith')
64
65 assert_tag :tag => 'user',
66 :child => {:tag => 'id', :content => '2'}
67 end
68 end
69 end
53
70
54 context "POST /users" do
71 context "POST /users" do
55 context "with valid parameters" do
72 context "with valid parameters" do
56 setup do
73 setup do
57 @parameters = {:user => {:login => 'foo', :firstname => 'Firstname', :lastname => 'Lastname', :mail => 'foo@example.net', :password => 'secret', :mail_notification => 'only_assigned'}}
74 @parameters = {:user => {:login => 'foo', :firstname => 'Firstname', :lastname => 'Lastname', :mail => 'foo@example.net', :password => 'secret', :mail_notification => 'only_assigned'}}
58 end
75 end
59
76
60 context ".xml" do
77 context ".xml" do
61 should_allow_api_authentication(:post,
78 should_allow_api_authentication(:post,
62 '/users.xml',
79 '/users.xml',
63 {:user => {:login => 'foo', :firstname => 'Firstname', :lastname => 'Lastname', :mail => 'foo@example.net', :password => 'secret'}},
80 {:user => {:login => 'foo', :firstname => 'Firstname', :lastname => 'Lastname', :mail => 'foo@example.net', :password => 'secret'}},
64 {:success_code => :created})
81 {:success_code => :created})
65
82
66 should "create a user with the attributes" do
83 should "create a user with the attributes" do
67 assert_difference('User.count') do
84 assert_difference('User.count') do
68 post '/users.xml', @parameters, :authorization => credentials('admin')
85 post '/users.xml', @parameters, :authorization => credentials('admin')
69 end
86 end
70
87
71 user = User.first(:order => 'id DESC')
88 user = User.first(:order => 'id DESC')
72 assert_equal 'foo', user.login
89 assert_equal 'foo', user.login
73 assert_equal 'Firstname', user.firstname
90 assert_equal 'Firstname', user.firstname
74 assert_equal 'Lastname', user.lastname
91 assert_equal 'Lastname', user.lastname
75 assert_equal 'foo@example.net', user.mail
92 assert_equal 'foo@example.net', user.mail
76 assert_equal 'only_assigned', user.mail_notification
93 assert_equal 'only_assigned', user.mail_notification
77 assert !user.admin?
94 assert !user.admin?
78 assert user.check_password?('secret')
95 assert user.check_password?('secret')
79
96
80 assert_response :created
97 assert_response :created
81 assert_equal 'application/xml', @response.content_type
98 assert_equal 'application/xml', @response.content_type
82 assert_tag 'user', :child => {:tag => 'id', :content => user.id.to_s}
99 assert_tag 'user', :child => {:tag => 'id', :content => user.id.to_s}
83 end
100 end
84 end
101 end
85
102
86 context ".json" do
103 context ".json" do
87 should_allow_api_authentication(:post,
104 should_allow_api_authentication(:post,
88 '/users.json',
105 '/users.json',
89 {:user => {:login => 'foo', :firstname => 'Firstname', :lastname => 'Lastname', :mail => 'foo@example.net'}},
106 {:user => {:login => 'foo', :firstname => 'Firstname', :lastname => 'Lastname', :mail => 'foo@example.net'}},
90 {:success_code => :created})
107 {:success_code => :created})
91
108
92 should "create a user with the attributes" do
109 should "create a user with the attributes" do
93 assert_difference('User.count') do
110 assert_difference('User.count') do
94 post '/users.json', @parameters, :authorization => credentials('admin')
111 post '/users.json', @parameters, :authorization => credentials('admin')
95 end
112 end
96
113
97 user = User.first(:order => 'id DESC')
114 user = User.first(:order => 'id DESC')
98 assert_equal 'foo', user.login
115 assert_equal 'foo', user.login
99 assert_equal 'Firstname', user.firstname
116 assert_equal 'Firstname', user.firstname
100 assert_equal 'Lastname', user.lastname
117 assert_equal 'Lastname', user.lastname
101 assert_equal 'foo@example.net', user.mail
118 assert_equal 'foo@example.net', user.mail
102 assert !user.admin?
119 assert !user.admin?
103
120
104 assert_response :created
121 assert_response :created
105 assert_equal 'application/json', @response.content_type
122 assert_equal 'application/json', @response.content_type
106 json = ActiveSupport::JSON.decode(response.body)
123 json = ActiveSupport::JSON.decode(response.body)
107 assert_kind_of Hash, json
124 assert_kind_of Hash, json
108 assert_kind_of Hash, json['user']
125 assert_kind_of Hash, json['user']
109 assert_equal user.id, json['user']['id']
126 assert_equal user.id, json['user']['id']
110 end
127 end
111 end
128 end
112 end
129 end
113
130
114 context "with invalid parameters" do
131 context "with invalid parameters" do
115 setup do
132 setup do
116 @parameters = {:user => {:login => 'foo', :lastname => 'Lastname', :mail => 'foo'}}
133 @parameters = {:user => {:login => 'foo', :lastname => 'Lastname', :mail => 'foo'}}
117 end
134 end
118
135
119 context ".xml" do
136 context ".xml" do
120 should "return errors" do
137 should "return errors" do
121 assert_no_difference('User.count') do
138 assert_no_difference('User.count') do
122 post '/users.xml', @parameters, :authorization => credentials('admin')
139 post '/users.xml', @parameters, :authorization => credentials('admin')
123 end
140 end
124
141
125 assert_response :unprocessable_entity
142 assert_response :unprocessable_entity
126 assert_equal 'application/xml', @response.content_type
143 assert_equal 'application/xml', @response.content_type
127 assert_tag 'errors', :child => {:tag => 'error', :content => "Firstname can't be blank"}
144 assert_tag 'errors', :child => {:tag => 'error', :content => "Firstname can't be blank"}
128 end
145 end
129 end
146 end
130
147
131 context ".json" do
148 context ".json" do
132 should "return errors" do
149 should "return errors" do
133 assert_no_difference('User.count') do
150 assert_no_difference('User.count') do
134 post '/users.json', @parameters, :authorization => credentials('admin')
151 post '/users.json', @parameters, :authorization => credentials('admin')
135 end
152 end
136
153
137 assert_response :unprocessable_entity
154 assert_response :unprocessable_entity
138 assert_equal 'application/json', @response.content_type
155 assert_equal 'application/json', @response.content_type
139 json = ActiveSupport::JSON.decode(response.body)
156 json = ActiveSupport::JSON.decode(response.body)
140 assert_kind_of Hash, json
157 assert_kind_of Hash, json
141 assert json.has_key?('errors')
158 assert json.has_key?('errors')
142 assert_kind_of Array, json['errors']
159 assert_kind_of Array, json['errors']
143 end
160 end
144 end
161 end
145 end
162 end
146 end
163 end
147
164
148 context "PUT /users/2" do
165 context "PUT /users/2" do
149 context "with valid parameters" do
166 context "with valid parameters" do
150 setup do
167 setup do
151 @parameters = {:user => {:login => 'jsmith', :firstname => 'John', :lastname => 'Renamed', :mail => 'jsmith@somenet.foo'}}
168 @parameters = {:user => {:login => 'jsmith', :firstname => 'John', :lastname => 'Renamed', :mail => 'jsmith@somenet.foo'}}
152 end
169 end
153
170
154 context ".xml" do
171 context ".xml" do
155 should_allow_api_authentication(:put,
172 should_allow_api_authentication(:put,
156 '/users/2.xml',
173 '/users/2.xml',
157 {:user => {:login => 'jsmith', :firstname => 'John', :lastname => 'Renamed', :mail => 'jsmith@somenet.foo'}},
174 {:user => {:login => 'jsmith', :firstname => 'John', :lastname => 'Renamed', :mail => 'jsmith@somenet.foo'}},
158 {:success_code => :ok})
175 {:success_code => :ok})
159
176
160 should "update user with the attributes" do
177 should "update user with the attributes" do
161 assert_no_difference('User.count') do
178 assert_no_difference('User.count') do
162 put '/users/2.xml', @parameters, :authorization => credentials('admin')
179 put '/users/2.xml', @parameters, :authorization => credentials('admin')
163 end
180 end
164
181
165 user = User.find(2)
182 user = User.find(2)
166 assert_equal 'jsmith', user.login
183 assert_equal 'jsmith', user.login
167 assert_equal 'John', user.firstname
184 assert_equal 'John', user.firstname
168 assert_equal 'Renamed', user.lastname
185 assert_equal 'Renamed', user.lastname
169 assert_equal 'jsmith@somenet.foo', user.mail
186 assert_equal 'jsmith@somenet.foo', user.mail
170 assert !user.admin?
187 assert !user.admin?
171
188
172 assert_response :ok
189 assert_response :ok
173 end
190 end
174 end
191 end
175
192
176 context ".json" do
193 context ".json" do
177 should_allow_api_authentication(:put,
194 should_allow_api_authentication(:put,
178 '/users/2.json',
195 '/users/2.json',
179 {:user => {:login => 'jsmith', :firstname => 'John', :lastname => 'Renamed', :mail => 'jsmith@somenet.foo'}},
196 {:user => {:login => 'jsmith', :firstname => 'John', :lastname => 'Renamed', :mail => 'jsmith@somenet.foo'}},
180 {:success_code => :ok})
197 {:success_code => :ok})
181
198
182 should "update user with the attributes" do
199 should "update user with the attributes" do
183 assert_no_difference('User.count') do
200 assert_no_difference('User.count') do
184 put '/users/2.json', @parameters, :authorization => credentials('admin')
201 put '/users/2.json', @parameters, :authorization => credentials('admin')
185 end
202 end
186
203
187 user = User.find(2)
204 user = User.find(2)
188 assert_equal 'jsmith', user.login
205 assert_equal 'jsmith', user.login
189 assert_equal 'John', user.firstname
206 assert_equal 'John', user.firstname
190 assert_equal 'Renamed', user.lastname
207 assert_equal 'Renamed', user.lastname
191 assert_equal 'jsmith@somenet.foo', user.mail
208 assert_equal 'jsmith@somenet.foo', user.mail
192 assert !user.admin?
209 assert !user.admin?
193
210
194 assert_response :ok
211 assert_response :ok
195 end
212 end
196 end
213 end
197 end
214 end
198
215
199 context "with invalid parameters" do
216 context "with invalid parameters" do
200 setup do
217 setup do
201 @parameters = {:user => {:login => 'jsmith', :firstname => '', :lastname => 'Lastname', :mail => 'foo'}}
218 @parameters = {:user => {:login => 'jsmith', :firstname => '', :lastname => 'Lastname', :mail => 'foo'}}
202 end
219 end
203
220
204 context ".xml" do
221 context ".xml" do
205 should "return errors" do
222 should "return errors" do
206 assert_no_difference('User.count') do
223 assert_no_difference('User.count') do
207 put '/users/2.xml', @parameters, :authorization => credentials('admin')
224 put '/users/2.xml', @parameters, :authorization => credentials('admin')
208 end
225 end
209
226
210 assert_response :unprocessable_entity
227 assert_response :unprocessable_entity
211 assert_equal 'application/xml', @response.content_type
228 assert_equal 'application/xml', @response.content_type
212 assert_tag 'errors', :child => {:tag => 'error', :content => "Firstname can't be blank"}
229 assert_tag 'errors', :child => {:tag => 'error', :content => "Firstname can't be blank"}
213 end
230 end
214 end
231 end
215
232
216 context ".json" do
233 context ".json" do
217 should "return errors" do
234 should "return errors" do
218 assert_no_difference('User.count') do
235 assert_no_difference('User.count') do
219 put '/users/2.json', @parameters, :authorization => credentials('admin')
236 put '/users/2.json', @parameters, :authorization => credentials('admin')
220 end
237 end
221
238
222 assert_response :unprocessable_entity
239 assert_response :unprocessable_entity
223 assert_equal 'application/json', @response.content_type
240 assert_equal 'application/json', @response.content_type
224 json = ActiveSupport::JSON.decode(response.body)
241 json = ActiveSupport::JSON.decode(response.body)
225 assert_kind_of Hash, json
242 assert_kind_of Hash, json
226 assert json.has_key?('errors')
243 assert json.has_key?('errors')
227 assert_kind_of Array, json['errors']
244 assert_kind_of Array, json['errors']
228 end
245 end
229 end
246 end
230 end
247 end
231
248
232 context "DELETE /users/2" do
249 context "DELETE /users/2" do
233 context ".xml" do
250 context ".xml" do
234 should "not be allowed" do
251 should "not be allowed" do
235 assert_no_difference('User.count') do
252 assert_no_difference('User.count') do
236 delete '/users/2.xml'
253 delete '/users/2.xml'
237 end
254 end
238
255
239 assert_response :method_not_allowed
256 assert_response :method_not_allowed
240 end
257 end
241 end
258 end
242
259
243 context ".json" do
260 context ".json" do
244 should "not be allowed" do
261 should "not be allowed" do
245 assert_no_difference('User.count') do
262 assert_no_difference('User.count') do
246 delete '/users/2.json'
263 delete '/users/2.json'
247 end
264 end
248
265
249 assert_response :method_not_allowed
266 assert_response :method_not_allowed
250 end
267 end
251 end
268 end
252 end
269 end
253 end
270 end
254
271
255 def credentials(user, password=nil)
272 def credentials(user, password=nil)
256 ActionController::HttpAuthentication::Basic.encode_credentials(user, password || user)
273 ActionController::HttpAuthentication::Basic.encode_credentials(user, password || user)
257 end
274 end
258 end
275 end
@@ -1,347 +1,348
1 # redMine - project management software
1 # redMine - project management software
2 # Copyright (C) 2006-2010 Jean-Philippe Lang
2 # Copyright (C) 2006-2010 Jean-Philippe Lang
3 #
3 #
4 # This program is free software; you can redistribute it and/or
4 # This program is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU General Public License
5 # modify it under the terms of the GNU General Public License
6 # as published by the Free Software Foundation; either version 2
6 # as published by the Free Software Foundation; either version 2
7 # of the License, or (at your option) any later version.
7 # of the License, or (at your option) any later version.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU General Public License
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17
17
18 require File.expand_path('../../test_helper', __FILE__)
18 require File.expand_path('../../test_helper', __FILE__)
19
19
20 class RoutingTest < ActionController::IntegrationTest
20 class RoutingTest < ActionController::IntegrationTest
21 context "activities" do
21 context "activities" do
22 should_route :get, "/activity", :controller => 'activities', :action => 'index', :id => nil
22 should_route :get, "/activity", :controller => 'activities', :action => 'index', :id => nil
23 should_route :get, "/activity.atom", :controller => 'activities', :action => 'index', :id => nil, :format => 'atom'
23 should_route :get, "/activity.atom", :controller => 'activities', :action => 'index', :id => nil, :format => 'atom'
24 end
24 end
25
25
26 context "attachments" do
26 context "attachments" do
27 should_route :get, "/attachments/1", :controller => 'attachments', :action => 'show', :id => '1'
27 should_route :get, "/attachments/1", :controller => 'attachments', :action => 'show', :id => '1'
28 should_route :get, "/attachments/1/filename.ext", :controller => 'attachments', :action => 'show', :id => '1', :filename => 'filename.ext'
28 should_route :get, "/attachments/1/filename.ext", :controller => 'attachments', :action => 'show', :id => '1', :filename => 'filename.ext'
29 should_route :get, "/attachments/download/1", :controller => 'attachments', :action => 'download', :id => '1'
29 should_route :get, "/attachments/download/1", :controller => 'attachments', :action => 'download', :id => '1'
30 should_route :get, "/attachments/download/1/filename.ext", :controller => 'attachments', :action => 'download', :id => '1', :filename => 'filename.ext'
30 should_route :get, "/attachments/download/1/filename.ext", :controller => 'attachments', :action => 'download', :id => '1', :filename => 'filename.ext'
31 end
31 end
32
32
33 context "boards" do
33 context "boards" do
34 should_route :get, "/projects/world_domination/boards", :controller => 'boards', :action => 'index', :project_id => 'world_domination'
34 should_route :get, "/projects/world_domination/boards", :controller => 'boards', :action => 'index', :project_id => 'world_domination'
35 should_route :get, "/projects/world_domination/boards/new", :controller => 'boards', :action => 'new', :project_id => 'world_domination'
35 should_route :get, "/projects/world_domination/boards/new", :controller => 'boards', :action => 'new', :project_id => 'world_domination'
36 should_route :get, "/projects/world_domination/boards/44", :controller => 'boards', :action => 'show', :project_id => 'world_domination', :id => '44'
36 should_route :get, "/projects/world_domination/boards/44", :controller => 'boards', :action => 'show', :project_id => 'world_domination', :id => '44'
37 should_route :get, "/projects/world_domination/boards/44.atom", :controller => 'boards', :action => 'show', :project_id => 'world_domination', :id => '44', :format => 'atom'
37 should_route :get, "/projects/world_domination/boards/44.atom", :controller => 'boards', :action => 'show', :project_id => 'world_domination', :id => '44', :format => 'atom'
38 should_route :get, "/projects/world_domination/boards/44/edit", :controller => 'boards', :action => 'edit', :project_id => 'world_domination', :id => '44'
38 should_route :get, "/projects/world_domination/boards/44/edit", :controller => 'boards', :action => 'edit', :project_id => 'world_domination', :id => '44'
39
39
40 should_route :post, "/projects/world_domination/boards/new", :controller => 'boards', :action => 'new', :project_id => 'world_domination'
40 should_route :post, "/projects/world_domination/boards/new", :controller => 'boards', :action => 'new', :project_id => 'world_domination'
41 should_route :post, "/projects/world_domination/boards/44/edit", :controller => 'boards', :action => 'edit', :project_id => 'world_domination', :id => '44'
41 should_route :post, "/projects/world_domination/boards/44/edit", :controller => 'boards', :action => 'edit', :project_id => 'world_domination', :id => '44'
42 should_route :post, "/projects/world_domination/boards/44/destroy", :controller => 'boards', :action => 'destroy', :project_id => 'world_domination', :id => '44'
42 should_route :post, "/projects/world_domination/boards/44/destroy", :controller => 'boards', :action => 'destroy', :project_id => 'world_domination', :id => '44'
43
43
44 end
44 end
45
45
46 context "documents" do
46 context "documents" do
47 should_route :get, "/projects/567/documents", :controller => 'documents', :action => 'index', :project_id => '567'
47 should_route :get, "/projects/567/documents", :controller => 'documents', :action => 'index', :project_id => '567'
48 should_route :get, "/projects/567/documents/new", :controller => 'documents', :action => 'new', :project_id => '567'
48 should_route :get, "/projects/567/documents/new", :controller => 'documents', :action => 'new', :project_id => '567'
49 should_route :get, "/documents/22", :controller => 'documents', :action => 'show', :id => '22'
49 should_route :get, "/documents/22", :controller => 'documents', :action => 'show', :id => '22'
50 should_route :get, "/documents/22/edit", :controller => 'documents', :action => 'edit', :id => '22'
50 should_route :get, "/documents/22/edit", :controller => 'documents', :action => 'edit', :id => '22'
51
51
52 should_route :post, "/projects/567/documents/new", :controller => 'documents', :action => 'new', :project_id => '567'
52 should_route :post, "/projects/567/documents/new", :controller => 'documents', :action => 'new', :project_id => '567'
53 should_route :post, "/documents/567/edit", :controller => 'documents', :action => 'edit', :id => '567'
53 should_route :post, "/documents/567/edit", :controller => 'documents', :action => 'edit', :id => '567'
54 should_route :post, "/documents/567/destroy", :controller => 'documents', :action => 'destroy', :id => '567'
54 should_route :post, "/documents/567/destroy", :controller => 'documents', :action => 'destroy', :id => '567'
55 end
55 end
56
56
57 context "issues" do
57 context "issues" do
58 # REST actions
58 # REST actions
59 should_route :get, "/issues", :controller => 'issues', :action => 'index'
59 should_route :get, "/issues", :controller => 'issues', :action => 'index'
60 should_route :get, "/issues.pdf", :controller => 'issues', :action => 'index', :format => 'pdf'
60 should_route :get, "/issues.pdf", :controller => 'issues', :action => 'index', :format => 'pdf'
61 should_route :get, "/issues.atom", :controller => 'issues', :action => 'index', :format => 'atom'
61 should_route :get, "/issues.atom", :controller => 'issues', :action => 'index', :format => 'atom'
62 should_route :get, "/issues.xml", :controller => 'issues', :action => 'index', :format => 'xml'
62 should_route :get, "/issues.xml", :controller => 'issues', :action => 'index', :format => 'xml'
63 should_route :get, "/projects/23/issues", :controller => 'issues', :action => 'index', :project_id => '23'
63 should_route :get, "/projects/23/issues", :controller => 'issues', :action => 'index', :project_id => '23'
64 should_route :get, "/projects/23/issues.pdf", :controller => 'issues', :action => 'index', :project_id => '23', :format => 'pdf'
64 should_route :get, "/projects/23/issues.pdf", :controller => 'issues', :action => 'index', :project_id => '23', :format => 'pdf'
65 should_route :get, "/projects/23/issues.atom", :controller => 'issues', :action => 'index', :project_id => '23', :format => 'atom'
65 should_route :get, "/projects/23/issues.atom", :controller => 'issues', :action => 'index', :project_id => '23', :format => 'atom'
66 should_route :get, "/projects/23/issues.xml", :controller => 'issues', :action => 'index', :project_id => '23', :format => 'xml'
66 should_route :get, "/projects/23/issues.xml", :controller => 'issues', :action => 'index', :project_id => '23', :format => 'xml'
67 should_route :get, "/issues/64", :controller => 'issues', :action => 'show', :id => '64'
67 should_route :get, "/issues/64", :controller => 'issues', :action => 'show', :id => '64'
68 should_route :get, "/issues/64.pdf", :controller => 'issues', :action => 'show', :id => '64', :format => 'pdf'
68 should_route :get, "/issues/64.pdf", :controller => 'issues', :action => 'show', :id => '64', :format => 'pdf'
69 should_route :get, "/issues/64.atom", :controller => 'issues', :action => 'show', :id => '64', :format => 'atom'
69 should_route :get, "/issues/64.atom", :controller => 'issues', :action => 'show', :id => '64', :format => 'atom'
70 should_route :get, "/issues/64.xml", :controller => 'issues', :action => 'show', :id => '64', :format => 'xml'
70 should_route :get, "/issues/64.xml", :controller => 'issues', :action => 'show', :id => '64', :format => 'xml'
71
71
72 should_route :get, "/projects/23/issues/new", :controller => 'issues', :action => 'new', :project_id => '23'
72 should_route :get, "/projects/23/issues/new", :controller => 'issues', :action => 'new', :project_id => '23'
73 should_route :post, "/projects/23/issues", :controller => 'issues', :action => 'create', :project_id => '23'
73 should_route :post, "/projects/23/issues", :controller => 'issues', :action => 'create', :project_id => '23'
74 should_route :post, "/issues.xml", :controller => 'issues', :action => 'create', :format => 'xml'
74 should_route :post, "/issues.xml", :controller => 'issues', :action => 'create', :format => 'xml'
75
75
76 should_route :get, "/issues/64/edit", :controller => 'issues', :action => 'edit', :id => '64'
76 should_route :get, "/issues/64/edit", :controller => 'issues', :action => 'edit', :id => '64'
77 # TODO: Should use PUT
77 # TODO: Should use PUT
78 should_route :post, "/issues/64/edit", :controller => 'issues', :action => 'edit', :id => '64'
78 should_route :post, "/issues/64/edit", :controller => 'issues', :action => 'edit', :id => '64'
79 should_route :put, "/issues/1.xml", :controller => 'issues', :action => 'update', :id => '1', :format => 'xml'
79 should_route :put, "/issues/1.xml", :controller => 'issues', :action => 'update', :id => '1', :format => 'xml'
80
80
81 # TODO: Should use DELETE
81 # TODO: Should use DELETE
82 should_route :post, "/issues/64/destroy", :controller => 'issues', :action => 'destroy', :id => '64'
82 should_route :post, "/issues/64/destroy", :controller => 'issues', :action => 'destroy', :id => '64'
83 should_route :delete, "/issues/1.xml", :controller => 'issues', :action => 'destroy', :id => '1', :format => 'xml'
83 should_route :delete, "/issues/1.xml", :controller => 'issues', :action => 'destroy', :id => '1', :format => 'xml'
84
84
85 # Extra actions
85 # Extra actions
86 should_route :get, "/projects/23/issues/64/copy", :controller => 'issues', :action => 'new', :project_id => '23', :copy_from => '64'
86 should_route :get, "/projects/23/issues/64/copy", :controller => 'issues', :action => 'new', :project_id => '23', :copy_from => '64'
87
87
88 should_route :get, "/issues/move/new", :controller => 'issue_moves', :action => 'new'
88 should_route :get, "/issues/move/new", :controller => 'issue_moves', :action => 'new'
89 should_route :post, "/issues/move", :controller => 'issue_moves', :action => 'create'
89 should_route :post, "/issues/move", :controller => 'issue_moves', :action => 'create'
90
90
91 should_route :post, "/issues/1/quoted", :controller => 'journals', :action => 'new', :id => '1'
91 should_route :post, "/issues/1/quoted", :controller => 'journals', :action => 'new', :id => '1'
92
92
93 should_route :get, "/issues/calendar", :controller => 'calendars', :action => 'show'
93 should_route :get, "/issues/calendar", :controller => 'calendars', :action => 'show'
94 should_route :put, "/issues/calendar", :controller => 'calendars', :action => 'update'
94 should_route :put, "/issues/calendar", :controller => 'calendars', :action => 'update'
95 should_route :get, "/projects/project-name/issues/calendar", :controller => 'calendars', :action => 'show', :project_id => 'project-name'
95 should_route :get, "/projects/project-name/issues/calendar", :controller => 'calendars', :action => 'show', :project_id => 'project-name'
96 should_route :put, "/projects/project-name/issues/calendar", :controller => 'calendars', :action => 'update', :project_id => 'project-name'
96 should_route :put, "/projects/project-name/issues/calendar", :controller => 'calendars', :action => 'update', :project_id => 'project-name'
97
97
98 should_route :get, "/issues/gantt", :controller => 'gantts', :action => 'show'
98 should_route :get, "/issues/gantt", :controller => 'gantts', :action => 'show'
99 should_route :put, "/issues/gantt", :controller => 'gantts', :action => 'update'
99 should_route :put, "/issues/gantt", :controller => 'gantts', :action => 'update'
100 should_route :get, "/projects/project-name/issues/gantt", :controller => 'gantts', :action => 'show', :project_id => 'project-name'
100 should_route :get, "/projects/project-name/issues/gantt", :controller => 'gantts', :action => 'show', :project_id => 'project-name'
101 should_route :put, "/projects/project-name/issues/gantt", :controller => 'gantts', :action => 'update', :project_id => 'project-name'
101 should_route :put, "/projects/project-name/issues/gantt", :controller => 'gantts', :action => 'update', :project_id => 'project-name'
102
102
103 should_route :get, "/issues/auto_complete", :controller => 'auto_completes', :action => 'issues'
103 should_route :get, "/issues/auto_complete", :controller => 'auto_completes', :action => 'issues'
104
104
105 should_route :get, "/issues/preview/123", :controller => 'previews', :action => 'issue', :id => '123'
105 should_route :get, "/issues/preview/123", :controller => 'previews', :action => 'issue', :id => '123'
106 should_route :post, "/issues/preview/123", :controller => 'previews', :action => 'issue', :id => '123'
106 should_route :post, "/issues/preview/123", :controller => 'previews', :action => 'issue', :id => '123'
107 should_route :get, "/issues/context_menu", :controller => 'context_menus', :action => 'issues'
107 should_route :get, "/issues/context_menu", :controller => 'context_menus', :action => 'issues'
108 should_route :post, "/issues/context_menu", :controller => 'context_menus', :action => 'issues'
108 should_route :post, "/issues/context_menu", :controller => 'context_menus', :action => 'issues'
109
109
110 should_route :get, "/issues/changes", :controller => 'journals', :action => 'index'
110 should_route :get, "/issues/changes", :controller => 'journals', :action => 'index'
111
111
112 should_route :get, "/issues/bulk_edit", :controller => 'issues', :action => 'bulk_edit'
112 should_route :get, "/issues/bulk_edit", :controller => 'issues', :action => 'bulk_edit'
113 should_route :post, "/issues/bulk_edit", :controller => 'issues', :action => 'bulk_update'
113 should_route :post, "/issues/bulk_edit", :controller => 'issues', :action => 'bulk_update'
114 end
114 end
115
115
116 context "issue categories" do
116 context "issue categories" do
117 should_route :get, "/projects/test/issue_categories/new", :controller => 'issue_categories', :action => 'new', :project_id => 'test'
117 should_route :get, "/projects/test/issue_categories/new", :controller => 'issue_categories', :action => 'new', :project_id => 'test'
118
118
119 should_route :post, "/projects/test/issue_categories/new", :controller => 'issue_categories', :action => 'new', :project_id => 'test'
119 should_route :post, "/projects/test/issue_categories/new", :controller => 'issue_categories', :action => 'new', :project_id => 'test'
120 end
120 end
121
121
122 context "issue relations" do
122 context "issue relations" do
123 should_route :post, "/issues/1/relations", :controller => 'issue_relations', :action => 'new', :issue_id => '1'
123 should_route :post, "/issues/1/relations", :controller => 'issue_relations', :action => 'new', :issue_id => '1'
124 should_route :post, "/issues/1/relations/23/destroy", :controller => 'issue_relations', :action => 'destroy', :issue_id => '1', :id => '23'
124 should_route :post, "/issues/1/relations/23/destroy", :controller => 'issue_relations', :action => 'destroy', :issue_id => '1', :id => '23'
125 end
125 end
126
126
127 context "issue reports" do
127 context "issue reports" do
128 should_route :get, "/projects/567/issues/report", :controller => 'reports', :action => 'issue_report', :id => '567'
128 should_route :get, "/projects/567/issues/report", :controller => 'reports', :action => 'issue_report', :id => '567'
129 should_route :get, "/projects/567/issues/report/assigned_to", :controller => 'reports', :action => 'issue_report_details', :id => '567', :detail => 'assigned_to'
129 should_route :get, "/projects/567/issues/report/assigned_to", :controller => 'reports', :action => 'issue_report_details', :id => '567', :detail => 'assigned_to'
130 end
130 end
131
131
132 context "members" do
132 context "members" do
133 should_route :post, "/projects/5234/members/new", :controller => 'members', :action => 'new', :id => '5234'
133 should_route :post, "/projects/5234/members/new", :controller => 'members', :action => 'new', :id => '5234'
134 end
134 end
135
135
136 context "messages" do
136 context "messages" do
137 should_route :get, "/boards/22/topics/2", :controller => 'messages', :action => 'show', :id => '2', :board_id => '22'
137 should_route :get, "/boards/22/topics/2", :controller => 'messages', :action => 'show', :id => '2', :board_id => '22'
138 should_route :get, "/boards/lala/topics/new", :controller => 'messages', :action => 'new', :board_id => 'lala'
138 should_route :get, "/boards/lala/topics/new", :controller => 'messages', :action => 'new', :board_id => 'lala'
139 should_route :get, "/boards/lala/topics/22/edit", :controller => 'messages', :action => 'edit', :id => '22', :board_id => 'lala'
139 should_route :get, "/boards/lala/topics/22/edit", :controller => 'messages', :action => 'edit', :id => '22', :board_id => 'lala'
140
140
141 should_route :post, "/boards/lala/topics/new", :controller => 'messages', :action => 'new', :board_id => 'lala'
141 should_route :post, "/boards/lala/topics/new", :controller => 'messages', :action => 'new', :board_id => 'lala'
142 should_route :post, "/boards/lala/topics/22/edit", :controller => 'messages', :action => 'edit', :id => '22', :board_id => 'lala'
142 should_route :post, "/boards/lala/topics/22/edit", :controller => 'messages', :action => 'edit', :id => '22', :board_id => 'lala'
143 should_route :post, "/boards/22/topics/555/replies", :controller => 'messages', :action => 'reply', :id => '555', :board_id => '22'
143 should_route :post, "/boards/22/topics/555/replies", :controller => 'messages', :action => 'reply', :id => '555', :board_id => '22'
144 should_route :post, "/boards/22/topics/555/destroy", :controller => 'messages', :action => 'destroy', :id => '555', :board_id => '22'
144 should_route :post, "/boards/22/topics/555/destroy", :controller => 'messages', :action => 'destroy', :id => '555', :board_id => '22'
145 end
145 end
146
146
147 context "news" do
147 context "news" do
148 should_route :get, "/news", :controller => 'news', :action => 'index'
148 should_route :get, "/news", :controller => 'news', :action => 'index'
149 should_route :get, "/news.atom", :controller => 'news', :action => 'index', :format => 'atom'
149 should_route :get, "/news.atom", :controller => 'news', :action => 'index', :format => 'atom'
150 should_route :get, "/news.xml", :controller => 'news', :action => 'index', :format => 'xml'
150 should_route :get, "/news.xml", :controller => 'news', :action => 'index', :format => 'xml'
151 should_route :get, "/news.json", :controller => 'news', :action => 'index', :format => 'json'
151 should_route :get, "/news.json", :controller => 'news', :action => 'index', :format => 'json'
152 should_route :get, "/projects/567/news", :controller => 'news', :action => 'index', :project_id => '567'
152 should_route :get, "/projects/567/news", :controller => 'news', :action => 'index', :project_id => '567'
153 should_route :get, "/projects/567/news.atom", :controller => 'news', :action => 'index', :format => 'atom', :project_id => '567'
153 should_route :get, "/projects/567/news.atom", :controller => 'news', :action => 'index', :format => 'atom', :project_id => '567'
154 should_route :get, "/projects/567/news.xml", :controller => 'news', :action => 'index', :format => 'xml', :project_id => '567'
154 should_route :get, "/projects/567/news.xml", :controller => 'news', :action => 'index', :format => 'xml', :project_id => '567'
155 should_route :get, "/projects/567/news.json", :controller => 'news', :action => 'index', :format => 'json', :project_id => '567'
155 should_route :get, "/projects/567/news.json", :controller => 'news', :action => 'index', :format => 'json', :project_id => '567'
156 should_route :get, "/news/2", :controller => 'news', :action => 'show', :id => '2'
156 should_route :get, "/news/2", :controller => 'news', :action => 'show', :id => '2'
157 should_route :get, "/projects/567/news/new", :controller => 'news', :action => 'new', :project_id => '567'
157 should_route :get, "/projects/567/news/new", :controller => 'news', :action => 'new', :project_id => '567'
158 should_route :get, "/news/234", :controller => 'news', :action => 'show', :id => '234'
158 should_route :get, "/news/234", :controller => 'news', :action => 'show', :id => '234'
159 should_route :get, "/news/567/edit", :controller => 'news', :action => 'edit', :id => '567'
159 should_route :get, "/news/567/edit", :controller => 'news', :action => 'edit', :id => '567'
160 should_route :get, "/news/preview", :controller => 'previews', :action => 'news'
160 should_route :get, "/news/preview", :controller => 'previews', :action => 'news'
161
161
162 should_route :post, "/projects/567/news", :controller => 'news', :action => 'create', :project_id => '567'
162 should_route :post, "/projects/567/news", :controller => 'news', :action => 'create', :project_id => '567'
163 should_route :post, "/news/567/comments", :controller => 'comments', :action => 'create', :id => '567'
163 should_route :post, "/news/567/comments", :controller => 'comments', :action => 'create', :id => '567'
164
164
165 should_route :put, "/news/567", :controller => 'news', :action => 'update', :id => '567'
165 should_route :put, "/news/567", :controller => 'news', :action => 'update', :id => '567'
166
166
167 should_route :delete, "/news/567", :controller => 'news', :action => 'destroy', :id => '567'
167 should_route :delete, "/news/567", :controller => 'news', :action => 'destroy', :id => '567'
168 should_route :delete, "/news/567/comments/15", :controller => 'comments', :action => 'destroy', :id => '567', :comment_id => '15'
168 should_route :delete, "/news/567/comments/15", :controller => 'comments', :action => 'destroy', :id => '567', :comment_id => '15'
169 end
169 end
170
170
171 context "projects" do
171 context "projects" do
172 should_route :get, "/projects", :controller => 'projects', :action => 'index'
172 should_route :get, "/projects", :controller => 'projects', :action => 'index'
173 should_route :get, "/projects.atom", :controller => 'projects', :action => 'index', :format => 'atom'
173 should_route :get, "/projects.atom", :controller => 'projects', :action => 'index', :format => 'atom'
174 should_route :get, "/projects.xml", :controller => 'projects', :action => 'index', :format => 'xml'
174 should_route :get, "/projects.xml", :controller => 'projects', :action => 'index', :format => 'xml'
175 should_route :get, "/projects/new", :controller => 'projects', :action => 'new'
175 should_route :get, "/projects/new", :controller => 'projects', :action => 'new'
176 should_route :get, "/projects/test", :controller => 'projects', :action => 'show', :id => 'test'
176 should_route :get, "/projects/test", :controller => 'projects', :action => 'show', :id => 'test'
177 should_route :get, "/projects/1.xml", :controller => 'projects', :action => 'show', :id => '1', :format => 'xml'
177 should_route :get, "/projects/1.xml", :controller => 'projects', :action => 'show', :id => '1', :format => 'xml'
178 should_route :get, "/projects/4223/settings", :controller => 'projects', :action => 'settings', :id => '4223'
178 should_route :get, "/projects/4223/settings", :controller => 'projects', :action => 'settings', :id => '4223'
179 should_route :get, "/projects/4223/settings/members", :controller => 'projects', :action => 'settings', :id => '4223', :tab => 'members'
179 should_route :get, "/projects/4223/settings/members", :controller => 'projects', :action => 'settings', :id => '4223', :tab => 'members'
180 should_route :get, "/projects/33/files", :controller => 'files', :action => 'index', :project_id => '33'
180 should_route :get, "/projects/33/files", :controller => 'files', :action => 'index', :project_id => '33'
181 should_route :get, "/projects/33/files/new", :controller => 'files', :action => 'new', :project_id => '33'
181 should_route :get, "/projects/33/files/new", :controller => 'files', :action => 'new', :project_id => '33'
182 should_route :get, "/projects/33/roadmap", :controller => 'versions', :action => 'index', :project_id => '33'
182 should_route :get, "/projects/33/roadmap", :controller => 'versions', :action => 'index', :project_id => '33'
183 should_route :get, "/projects/33/activity", :controller => 'activities', :action => 'index', :id => '33'
183 should_route :get, "/projects/33/activity", :controller => 'activities', :action => 'index', :id => '33'
184 should_route :get, "/projects/33/activity.atom", :controller => 'activities', :action => 'index', :id => '33', :format => 'atom'
184 should_route :get, "/projects/33/activity.atom", :controller => 'activities', :action => 'index', :id => '33', :format => 'atom'
185
185
186 should_route :post, "/projects", :controller => 'projects', :action => 'create'
186 should_route :post, "/projects", :controller => 'projects', :action => 'create'
187 should_route :post, "/projects.xml", :controller => 'projects', :action => 'create', :format => 'xml'
187 should_route :post, "/projects.xml", :controller => 'projects', :action => 'create', :format => 'xml'
188 should_route :post, "/projects/33/files", :controller => 'files', :action => 'create', :project_id => '33'
188 should_route :post, "/projects/33/files", :controller => 'files', :action => 'create', :project_id => '33'
189 should_route :post, "/projects/64/archive", :controller => 'projects', :action => 'archive', :id => '64'
189 should_route :post, "/projects/64/archive", :controller => 'projects', :action => 'archive', :id => '64'
190 should_route :post, "/projects/64/unarchive", :controller => 'projects', :action => 'unarchive', :id => '64'
190 should_route :post, "/projects/64/unarchive", :controller => 'projects', :action => 'unarchive', :id => '64'
191
191
192 should_route :put, "/projects/64/enumerations", :controller => 'project_enumerations', :action => 'update', :project_id => '64'
192 should_route :put, "/projects/64/enumerations", :controller => 'project_enumerations', :action => 'update', :project_id => '64'
193 should_route :put, "/projects/4223", :controller => 'projects', :action => 'update', :id => '4223'
193 should_route :put, "/projects/4223", :controller => 'projects', :action => 'update', :id => '4223'
194 should_route :put, "/projects/1.xml", :controller => 'projects', :action => 'update', :id => '1', :format => 'xml'
194 should_route :put, "/projects/1.xml", :controller => 'projects', :action => 'update', :id => '1', :format => 'xml'
195
195
196 should_route :delete, "/projects/64", :controller => 'projects', :action => 'destroy', :id => '64'
196 should_route :delete, "/projects/64", :controller => 'projects', :action => 'destroy', :id => '64'
197 should_route :delete, "/projects/1.xml", :controller => 'projects', :action => 'destroy', :id => '1', :format => 'xml'
197 should_route :delete, "/projects/1.xml", :controller => 'projects', :action => 'destroy', :id => '1', :format => 'xml'
198 should_route :delete, "/projects/64/enumerations", :controller => 'project_enumerations', :action => 'destroy', :project_id => '64'
198 should_route :delete, "/projects/64/enumerations", :controller => 'project_enumerations', :action => 'destroy', :project_id => '64'
199 end
199 end
200
200
201 context "repositories" do
201 context "repositories" do
202 should_route :get, "/projects/redmine/repository", :controller => 'repositories', :action => 'show', :id => 'redmine'
202 should_route :get, "/projects/redmine/repository", :controller => 'repositories', :action => 'show', :id => 'redmine'
203 should_route :get, "/projects/redmine/repository/edit", :controller => 'repositories', :action => 'edit', :id => 'redmine'
203 should_route :get, "/projects/redmine/repository/edit", :controller => 'repositories', :action => 'edit', :id => 'redmine'
204 should_route :get, "/projects/redmine/repository/revisions", :controller => 'repositories', :action => 'revisions', :id => 'redmine'
204 should_route :get, "/projects/redmine/repository/revisions", :controller => 'repositories', :action => 'revisions', :id => 'redmine'
205 should_route :get, "/projects/redmine/repository/revisions.atom", :controller => 'repositories', :action => 'revisions', :id => 'redmine', :format => 'atom'
205 should_route :get, "/projects/redmine/repository/revisions.atom", :controller => 'repositories', :action => 'revisions', :id => 'redmine', :format => 'atom'
206 should_route :get, "/projects/redmine/repository/revisions/2457", :controller => 'repositories', :action => 'revision', :id => 'redmine', :rev => '2457'
206 should_route :get, "/projects/redmine/repository/revisions/2457", :controller => 'repositories', :action => 'revision', :id => 'redmine', :rev => '2457'
207 should_route :get, "/projects/redmine/repository/revisions/2457/diff", :controller => 'repositories', :action => 'diff', :id => 'redmine', :rev => '2457'
207 should_route :get, "/projects/redmine/repository/revisions/2457/diff", :controller => 'repositories', :action => 'diff', :id => 'redmine', :rev => '2457'
208 should_route :get, "/projects/redmine/repository/revisions/2457/diff.diff", :controller => 'repositories', :action => 'diff', :id => 'redmine', :rev => '2457', :format => 'diff'
208 should_route :get, "/projects/redmine/repository/revisions/2457/diff.diff", :controller => 'repositories', :action => 'diff', :id => 'redmine', :rev => '2457', :format => 'diff'
209 should_route :get, "/projects/redmine/repository/diff/path/to/file.c", :controller => 'repositories', :action => 'diff', :id => 'redmine', :path => %w[path to file.c]
209 should_route :get, "/projects/redmine/repository/diff/path/to/file.c", :controller => 'repositories', :action => 'diff', :id => 'redmine', :path => %w[path to file.c]
210 should_route :get, "/projects/redmine/repository/revisions/2/diff/path/to/file.c", :controller => 'repositories', :action => 'diff', :id => 'redmine', :path => %w[path to file.c], :rev => '2'
210 should_route :get, "/projects/redmine/repository/revisions/2/diff/path/to/file.c", :controller => 'repositories', :action => 'diff', :id => 'redmine', :path => %w[path to file.c], :rev => '2'
211 should_route :get, "/projects/redmine/repository/browse/path/to/file.c", :controller => 'repositories', :action => 'browse', :id => 'redmine', :path => %w[path to file.c]
211 should_route :get, "/projects/redmine/repository/browse/path/to/file.c", :controller => 'repositories', :action => 'browse', :id => 'redmine', :path => %w[path to file.c]
212 should_route :get, "/projects/redmine/repository/entry/path/to/file.c", :controller => 'repositories', :action => 'entry', :id => 'redmine', :path => %w[path to file.c]
212 should_route :get, "/projects/redmine/repository/entry/path/to/file.c", :controller => 'repositories', :action => 'entry', :id => 'redmine', :path => %w[path to file.c]
213 should_route :get, "/projects/redmine/repository/revisions/2/entry/path/to/file.c", :controller => 'repositories', :action => 'entry', :id => 'redmine', :path => %w[path to file.c], :rev => '2'
213 should_route :get, "/projects/redmine/repository/revisions/2/entry/path/to/file.c", :controller => 'repositories', :action => 'entry', :id => 'redmine', :path => %w[path to file.c], :rev => '2'
214 should_route :get, "/projects/redmine/repository/raw/path/to/file.c", :controller => 'repositories', :action => 'entry', :id => 'redmine', :path => %w[path to file.c], :format => 'raw'
214 should_route :get, "/projects/redmine/repository/raw/path/to/file.c", :controller => 'repositories', :action => 'entry', :id => 'redmine', :path => %w[path to file.c], :format => 'raw'
215 should_route :get, "/projects/redmine/repository/revisions/2/raw/path/to/file.c", :controller => 'repositories', :action => 'entry', :id => 'redmine', :path => %w[path to file.c], :rev => '2', :format => 'raw'
215 should_route :get, "/projects/redmine/repository/revisions/2/raw/path/to/file.c", :controller => 'repositories', :action => 'entry', :id => 'redmine', :path => %w[path to file.c], :rev => '2', :format => 'raw'
216 should_route :get, "/projects/redmine/repository/annotate/path/to/file.c", :controller => 'repositories', :action => 'annotate', :id => 'redmine', :path => %w[path to file.c]
216 should_route :get, "/projects/redmine/repository/annotate/path/to/file.c", :controller => 'repositories', :action => 'annotate', :id => 'redmine', :path => %w[path to file.c]
217 should_route :get, "/projects/redmine/repository/changes/path/to/file.c", :controller => 'repositories', :action => 'changes', :id => 'redmine', :path => %w[path to file.c]
217 should_route :get, "/projects/redmine/repository/changes/path/to/file.c", :controller => 'repositories', :action => 'changes', :id => 'redmine', :path => %w[path to file.c]
218 should_route :get, "/projects/redmine/repository/statistics", :controller => 'repositories', :action => 'stats', :id => 'redmine'
218 should_route :get, "/projects/redmine/repository/statistics", :controller => 'repositories', :action => 'stats', :id => 'redmine'
219
219
220
220
221 should_route :post, "/projects/redmine/repository/edit", :controller => 'repositories', :action => 'edit', :id => 'redmine'
221 should_route :post, "/projects/redmine/repository/edit", :controller => 'repositories', :action => 'edit', :id => 'redmine'
222 end
222 end
223
223
224 context "timelogs (global)" do
224 context "timelogs (global)" do
225 should_route :get, "/time_entries", :controller => 'timelog', :action => 'index'
225 should_route :get, "/time_entries", :controller => 'timelog', :action => 'index'
226 should_route :get, "/time_entries.csv", :controller => 'timelog', :action => 'index', :format => 'csv'
226 should_route :get, "/time_entries.csv", :controller => 'timelog', :action => 'index', :format => 'csv'
227 should_route :get, "/time_entries.atom", :controller => 'timelog', :action => 'index', :format => 'atom'
227 should_route :get, "/time_entries.atom", :controller => 'timelog', :action => 'index', :format => 'atom'
228 should_route :get, "/time_entries/new", :controller => 'timelog', :action => 'new'
228 should_route :get, "/time_entries/new", :controller => 'timelog', :action => 'new'
229 should_route :get, "/time_entries/22/edit", :controller => 'timelog', :action => 'edit', :id => '22'
229 should_route :get, "/time_entries/22/edit", :controller => 'timelog', :action => 'edit', :id => '22'
230
230
231 should_route :post, "/time_entries", :controller => 'timelog', :action => 'create'
231 should_route :post, "/time_entries", :controller => 'timelog', :action => 'create'
232
232
233 should_route :put, "/time_entries/22", :controller => 'timelog', :action => 'update', :id => '22'
233 should_route :put, "/time_entries/22", :controller => 'timelog', :action => 'update', :id => '22'
234
234
235 should_route :delete, "/time_entries/55", :controller => 'timelog', :action => 'destroy', :id => '55'
235 should_route :delete, "/time_entries/55", :controller => 'timelog', :action => 'destroy', :id => '55'
236 end
236 end
237
237
238 context "timelogs (scoped under project)" do
238 context "timelogs (scoped under project)" do
239 should_route :get, "/projects/567/time_entries", :controller => 'timelog', :action => 'index', :project_id => '567'
239 should_route :get, "/projects/567/time_entries", :controller => 'timelog', :action => 'index', :project_id => '567'
240 should_route :get, "/projects/567/time_entries.csv", :controller => 'timelog', :action => 'index', :project_id => '567', :format => 'csv'
240 should_route :get, "/projects/567/time_entries.csv", :controller => 'timelog', :action => 'index', :project_id => '567', :format => 'csv'
241 should_route :get, "/projects/567/time_entries.atom", :controller => 'timelog', :action => 'index', :project_id => '567', :format => 'atom'
241 should_route :get, "/projects/567/time_entries.atom", :controller => 'timelog', :action => 'index', :project_id => '567', :format => 'atom'
242 should_route :get, "/projects/567/time_entries/new", :controller => 'timelog', :action => 'new', :project_id => '567'
242 should_route :get, "/projects/567/time_entries/new", :controller => 'timelog', :action => 'new', :project_id => '567'
243 should_route :get, "/projects/567/time_entries/22/edit", :controller => 'timelog', :action => 'edit', :id => '22', :project_id => '567'
243 should_route :get, "/projects/567/time_entries/22/edit", :controller => 'timelog', :action => 'edit', :id => '22', :project_id => '567'
244
244
245 should_route :post, "/projects/567/time_entries", :controller => 'timelog', :action => 'create', :project_id => '567'
245 should_route :post, "/projects/567/time_entries", :controller => 'timelog', :action => 'create', :project_id => '567'
246
246
247 should_route :put, "/projects/567/time_entries/22", :controller => 'timelog', :action => 'update', :id => '22', :project_id => '567'
247 should_route :put, "/projects/567/time_entries/22", :controller => 'timelog', :action => 'update', :id => '22', :project_id => '567'
248
248
249 should_route :delete, "/projects/567/time_entries/55", :controller => 'timelog', :action => 'destroy', :id => '55', :project_id => '567'
249 should_route :delete, "/projects/567/time_entries/55", :controller => 'timelog', :action => 'destroy', :id => '55', :project_id => '567'
250 end
250 end
251
251
252 context "timelogs (scoped under issues)" do
252 context "timelogs (scoped under issues)" do
253 should_route :get, "/issues/234/time_entries", :controller => 'timelog', :action => 'index', :issue_id => '234'
253 should_route :get, "/issues/234/time_entries", :controller => 'timelog', :action => 'index', :issue_id => '234'
254 should_route :get, "/issues/234/time_entries.csv", :controller => 'timelog', :action => 'index', :issue_id => '234', :format => 'csv'
254 should_route :get, "/issues/234/time_entries.csv", :controller => 'timelog', :action => 'index', :issue_id => '234', :format => 'csv'
255 should_route :get, "/issues/234/time_entries.atom", :controller => 'timelog', :action => 'index', :issue_id => '234', :format => 'atom'
255 should_route :get, "/issues/234/time_entries.atom", :controller => 'timelog', :action => 'index', :issue_id => '234', :format => 'atom'
256 should_route :get, "/issues/234/time_entries/new", :controller => 'timelog', :action => 'new', :issue_id => '234'
256 should_route :get, "/issues/234/time_entries/new", :controller => 'timelog', :action => 'new', :issue_id => '234'
257 should_route :get, "/issues/234/time_entries/22/edit", :controller => 'timelog', :action => 'edit', :id => '22', :issue_id => '234'
257 should_route :get, "/issues/234/time_entries/22/edit", :controller => 'timelog', :action => 'edit', :id => '22', :issue_id => '234'
258
258
259 should_route :post, "/issues/234/time_entries", :controller => 'timelog', :action => 'create', :issue_id => '234'
259 should_route :post, "/issues/234/time_entries", :controller => 'timelog', :action => 'create', :issue_id => '234'
260
260
261 should_route :put, "/issues/234/time_entries/22", :controller => 'timelog', :action => 'update', :id => '22', :issue_id => '234'
261 should_route :put, "/issues/234/time_entries/22", :controller => 'timelog', :action => 'update', :id => '22', :issue_id => '234'
262
262
263 should_route :delete, "/issues/234/time_entries/55", :controller => 'timelog', :action => 'destroy', :id => '55', :issue_id => '234'
263 should_route :delete, "/issues/234/time_entries/55", :controller => 'timelog', :action => 'destroy', :id => '55', :issue_id => '234'
264 end
264 end
265
265
266 context "timelogs (scoped under project and issues)" do
266 context "timelogs (scoped under project and issues)" do
267 should_route :get, "/projects/ecookbook/issues/234/time_entries", :controller => 'timelog', :action => 'index', :issue_id => '234', :project_id => 'ecookbook'
267 should_route :get, "/projects/ecookbook/issues/234/time_entries", :controller => 'timelog', :action => 'index', :issue_id => '234', :project_id => 'ecookbook'
268 should_route :get, "/projects/ecookbook/issues/234/time_entries.csv", :controller => 'timelog', :action => 'index', :issue_id => '234', :project_id => 'ecookbook', :format => 'csv'
268 should_route :get, "/projects/ecookbook/issues/234/time_entries.csv", :controller => 'timelog', :action => 'index', :issue_id => '234', :project_id => 'ecookbook', :format => 'csv'
269 should_route :get, "/projects/ecookbook/issues/234/time_entries.atom", :controller => 'timelog', :action => 'index', :issue_id => '234', :project_id => 'ecookbook', :format => 'atom'
269 should_route :get, "/projects/ecookbook/issues/234/time_entries.atom", :controller => 'timelog', :action => 'index', :issue_id => '234', :project_id => 'ecookbook', :format => 'atom'
270 should_route :get, "/projects/ecookbook/issues/234/time_entries/new", :controller => 'timelog', :action => 'new', :issue_id => '234', :project_id => 'ecookbook'
270 should_route :get, "/projects/ecookbook/issues/234/time_entries/new", :controller => 'timelog', :action => 'new', :issue_id => '234', :project_id => 'ecookbook'
271 should_route :get, "/projects/ecookbook/issues/234/time_entries/22/edit", :controller => 'timelog', :action => 'edit', :id => '22', :issue_id => '234', :project_id => 'ecookbook'
271 should_route :get, "/projects/ecookbook/issues/234/time_entries/22/edit", :controller => 'timelog', :action => 'edit', :id => '22', :issue_id => '234', :project_id => 'ecookbook'
272
272
273 should_route :post, "/projects/ecookbook/issues/234/time_entries", :controller => 'timelog', :action => 'create', :issue_id => '234', :project_id => 'ecookbook'
273 should_route :post, "/projects/ecookbook/issues/234/time_entries", :controller => 'timelog', :action => 'create', :issue_id => '234', :project_id => 'ecookbook'
274
274
275 should_route :put, "/projects/ecookbook/issues/234/time_entries/22", :controller => 'timelog', :action => 'update', :id => '22', :issue_id => '234', :project_id => 'ecookbook'
275 should_route :put, "/projects/ecookbook/issues/234/time_entries/22", :controller => 'timelog', :action => 'update', :id => '22', :issue_id => '234', :project_id => 'ecookbook'
276
276
277 should_route :delete, "/projects/ecookbook/issues/234/time_entries/55", :controller => 'timelog', :action => 'destroy', :id => '55', :issue_id => '234', :project_id => 'ecookbook'
277 should_route :delete, "/projects/ecookbook/issues/234/time_entries/55", :controller => 'timelog', :action => 'destroy', :id => '55', :issue_id => '234', :project_id => 'ecookbook'
278 end
278 end
279
279
280 context "time_entry_reports" do
280 context "time_entry_reports" do
281 should_route :get, "/time_entries/report", :controller => 'time_entry_reports', :action => 'report'
281 should_route :get, "/time_entries/report", :controller => 'time_entry_reports', :action => 'report'
282 should_route :get, "/projects/567/time_entries/report", :controller => 'time_entry_reports', :action => 'report', :project_id => '567'
282 should_route :get, "/projects/567/time_entries/report", :controller => 'time_entry_reports', :action => 'report', :project_id => '567'
283 should_route :get, "/projects/567/time_entries/report.csv", :controller => 'time_entry_reports', :action => 'report', :project_id => '567', :format => 'csv'
283 should_route :get, "/projects/567/time_entries/report.csv", :controller => 'time_entry_reports', :action => 'report', :project_id => '567', :format => 'csv'
284 end
284 end
285
285
286 context "users" do
286 context "users" do
287 should_route :get, "/users", :controller => 'users', :action => 'index'
287 should_route :get, "/users", :controller => 'users', :action => 'index'
288 should_route :get, "/users/44", :controller => 'users', :action => 'show', :id => '44'
288 should_route :get, "/users/44", :controller => 'users', :action => 'show', :id => '44'
289 should_route :get, "/users/current", :controller => 'users', :action => 'show', :id => 'current'
289 should_route :get, "/users/new", :controller => 'users', :action => 'new'
290 should_route :get, "/users/new", :controller => 'users', :action => 'new'
290 should_route :get, "/users/444/edit", :controller => 'users', :action => 'edit', :id => '444'
291 should_route :get, "/users/444/edit", :controller => 'users', :action => 'edit', :id => '444'
291 should_route :get, "/users/222/edit/membership", :controller => 'users', :action => 'edit', :id => '222', :tab => 'membership'
292 should_route :get, "/users/222/edit/membership", :controller => 'users', :action => 'edit', :id => '222', :tab => 'membership'
292
293
293 should_route :post, "/users", :controller => 'users', :action => 'create'
294 should_route :post, "/users", :controller => 'users', :action => 'create'
294 should_route :post, "/users/123/memberships", :controller => 'users', :action => 'edit_membership', :id => '123'
295 should_route :post, "/users/123/memberships", :controller => 'users', :action => 'edit_membership', :id => '123'
295 should_route :post, "/users/123/memberships/55", :controller => 'users', :action => 'edit_membership', :id => '123', :membership_id => '55'
296 should_route :post, "/users/123/memberships/55", :controller => 'users', :action => 'edit_membership', :id => '123', :membership_id => '55'
296 should_route :post, "/users/567/memberships/12/destroy", :controller => 'users', :action => 'destroy_membership', :id => '567', :membership_id => '12'
297 should_route :post, "/users/567/memberships/12/destroy", :controller => 'users', :action => 'destroy_membership', :id => '567', :membership_id => '12'
297
298
298 should_route :put, "/users/444", :controller => 'users', :action => 'update', :id => '444'
299 should_route :put, "/users/444", :controller => 'users', :action => 'update', :id => '444'
299 end
300 end
300
301
301 # TODO: should they all be scoped under /projects/:project_id ?
302 # TODO: should they all be scoped under /projects/:project_id ?
302 context "versions" do
303 context "versions" do
303 should_route :get, "/projects/foo/versions/new", :controller => 'versions', :action => 'new', :project_id => 'foo'
304 should_route :get, "/projects/foo/versions/new", :controller => 'versions', :action => 'new', :project_id => 'foo'
304 should_route :get, "/versions/show/1", :controller => 'versions', :action => 'show', :id => '1'
305 should_route :get, "/versions/show/1", :controller => 'versions', :action => 'show', :id => '1'
305 should_route :get, "/versions/edit/1", :controller => 'versions', :action => 'edit', :id => '1'
306 should_route :get, "/versions/edit/1", :controller => 'versions', :action => 'edit', :id => '1'
306
307
307 should_route :post, "/projects/foo/versions", :controller => 'versions', :action => 'create', :project_id => 'foo'
308 should_route :post, "/projects/foo/versions", :controller => 'versions', :action => 'create', :project_id => 'foo'
308 should_route :post, "/versions/update/1", :controller => 'versions', :action => 'update', :id => '1'
309 should_route :post, "/versions/update/1", :controller => 'versions', :action => 'update', :id => '1'
309
310
310 should_route :delete, "/versions/destroy/1", :controller => 'versions', :action => 'destroy', :id => '1'
311 should_route :delete, "/versions/destroy/1", :controller => 'versions', :action => 'destroy', :id => '1'
311 end
312 end
312
313
313 context "wiki (singular, project's pages)" do
314 context "wiki (singular, project's pages)" do
314 should_route :get, "/projects/567/wiki", :controller => 'wiki', :action => 'show', :project_id => '567'
315 should_route :get, "/projects/567/wiki", :controller => 'wiki', :action => 'show', :project_id => '567'
315 should_route :get, "/projects/567/wiki/lalala", :controller => 'wiki', :action => 'show', :project_id => '567', :id => 'lalala'
316 should_route :get, "/projects/567/wiki/lalala", :controller => 'wiki', :action => 'show', :project_id => '567', :id => 'lalala'
316 should_route :get, "/projects/567/wiki/my_page/edit", :controller => 'wiki', :action => 'edit', :project_id => '567', :id => 'my_page'
317 should_route :get, "/projects/567/wiki/my_page/edit", :controller => 'wiki', :action => 'edit', :project_id => '567', :id => 'my_page'
317 should_route :get, "/projects/1/wiki/CookBook_documentation/history", :controller => 'wiki', :action => 'history', :project_id => '1', :id => 'CookBook_documentation'
318 should_route :get, "/projects/1/wiki/CookBook_documentation/history", :controller => 'wiki', :action => 'history', :project_id => '1', :id => 'CookBook_documentation'
318 should_route :get, "/projects/1/wiki/CookBook_documentation/diff", :controller => 'wiki', :action => 'diff', :project_id => '1', :id => 'CookBook_documentation'
319 should_route :get, "/projects/1/wiki/CookBook_documentation/diff", :controller => 'wiki', :action => 'diff', :project_id => '1', :id => 'CookBook_documentation'
319 should_route :get, "/projects/1/wiki/CookBook_documentation/diff/2", :controller => 'wiki', :action => 'diff', :project_id => '1', :id => 'CookBook_documentation', :version => '2'
320 should_route :get, "/projects/1/wiki/CookBook_documentation/diff/2", :controller => 'wiki', :action => 'diff', :project_id => '1', :id => 'CookBook_documentation', :version => '2'
320 should_route :get, "/projects/1/wiki/CookBook_documentation/diff/2/vs/1", :controller => 'wiki', :action => 'diff', :project_id => '1', :id => 'CookBook_documentation', :version => '2', :version_from => '1'
321 should_route :get, "/projects/1/wiki/CookBook_documentation/diff/2/vs/1", :controller => 'wiki', :action => 'diff', :project_id => '1', :id => 'CookBook_documentation', :version => '2', :version_from => '1'
321 should_route :get, "/projects/1/wiki/CookBook_documentation/annotate/2", :controller => 'wiki', :action => 'annotate', :project_id => '1', :id => 'CookBook_documentation', :version => '2'
322 should_route :get, "/projects/1/wiki/CookBook_documentation/annotate/2", :controller => 'wiki', :action => 'annotate', :project_id => '1', :id => 'CookBook_documentation', :version => '2'
322 should_route :get, "/projects/22/wiki/ladida/rename", :controller => 'wiki', :action => 'rename', :project_id => '22', :id => 'ladida'
323 should_route :get, "/projects/22/wiki/ladida/rename", :controller => 'wiki', :action => 'rename', :project_id => '22', :id => 'ladida'
323 should_route :get, "/projects/567/wiki/index", :controller => 'wiki', :action => 'index', :project_id => '567'
324 should_route :get, "/projects/567/wiki/index", :controller => 'wiki', :action => 'index', :project_id => '567'
324 should_route :get, "/projects/567/wiki/date_index", :controller => 'wiki', :action => 'date_index', :project_id => '567'
325 should_route :get, "/projects/567/wiki/date_index", :controller => 'wiki', :action => 'date_index', :project_id => '567'
325 should_route :get, "/projects/567/wiki/export", :controller => 'wiki', :action => 'export', :project_id => '567'
326 should_route :get, "/projects/567/wiki/export", :controller => 'wiki', :action => 'export', :project_id => '567'
326
327
327 should_route :post, "/projects/567/wiki/CookBook_documentation/preview", :controller => 'wiki', :action => 'preview', :project_id => '567', :id => 'CookBook_documentation'
328 should_route :post, "/projects/567/wiki/CookBook_documentation/preview", :controller => 'wiki', :action => 'preview', :project_id => '567', :id => 'CookBook_documentation'
328 should_route :post, "/projects/22/wiki/ladida/rename", :controller => 'wiki', :action => 'rename', :project_id => '22', :id => 'ladida'
329 should_route :post, "/projects/22/wiki/ladida/rename", :controller => 'wiki', :action => 'rename', :project_id => '22', :id => 'ladida'
329 should_route :post, "/projects/22/wiki/ladida/protect", :controller => 'wiki', :action => 'protect', :project_id => '22', :id => 'ladida'
330 should_route :post, "/projects/22/wiki/ladida/protect", :controller => 'wiki', :action => 'protect', :project_id => '22', :id => 'ladida'
330 should_route :post, "/projects/22/wiki/ladida/add_attachment", :controller => 'wiki', :action => 'add_attachment', :project_id => '22', :id => 'ladida'
331 should_route :post, "/projects/22/wiki/ladida/add_attachment", :controller => 'wiki', :action => 'add_attachment', :project_id => '22', :id => 'ladida'
331
332
332 should_route :put, "/projects/567/wiki/my_page", :controller => 'wiki', :action => 'update', :project_id => '567', :id => 'my_page'
333 should_route :put, "/projects/567/wiki/my_page", :controller => 'wiki', :action => 'update', :project_id => '567', :id => 'my_page'
333
334
334 should_route :delete, "/projects/22/wiki/ladida", :controller => 'wiki', :action => 'destroy', :project_id => '22', :id => 'ladida'
335 should_route :delete, "/projects/22/wiki/ladida", :controller => 'wiki', :action => 'destroy', :project_id => '22', :id => 'ladida'
335 end
336 end
336
337
337 context "wikis (plural, admin setup)" do
338 context "wikis (plural, admin setup)" do
338 should_route :get, "/projects/ladida/wiki/destroy", :controller => 'wikis', :action => 'destroy', :id => 'ladida'
339 should_route :get, "/projects/ladida/wiki/destroy", :controller => 'wikis', :action => 'destroy', :id => 'ladida'
339
340
340 should_route :post, "/projects/ladida/wiki", :controller => 'wikis', :action => 'edit', :id => 'ladida'
341 should_route :post, "/projects/ladida/wiki", :controller => 'wikis', :action => 'edit', :id => 'ladida'
341 should_route :post, "/projects/ladida/wiki/destroy", :controller => 'wikis', :action => 'destroy', :id => 'ladida'
342 should_route :post, "/projects/ladida/wiki/destroy", :controller => 'wikis', :action => 'destroy', :id => 'ladida'
342 end
343 end
343
344
344 context "administration panel" do
345 context "administration panel" do
345 should_route :get, "/admin/projects", :controller => 'admin', :action => 'projects'
346 should_route :get, "/admin/projects", :controller => 'admin', :action => 'projects'
346 end
347 end
347 end
348 end
General Comments 0
You need to be logged in to leave comments. Login now