##// END OF EJS Templates
Leading slash required with Rails 4.2....
Jean-Philippe Lang -
r13401:7296b569a3de
parent child
Show More
@@ -1,291 +1,291
1 1 # Redmine - project management software
2 2 # Copyright (C) 2006-2014 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 require File.expand_path('../../test_helper', __FILE__)
19 19
20 20 class AccountTest < Redmine::IntegrationTest
21 21 fixtures :users, :roles
22 22
23 23 def test_login
24 get "my/page"
24 get "/my/page"
25 25 assert_redirected_to "/login?back_url=http%3A%2F%2Fwww.example.com%2Fmy%2Fpage"
26 26 log_user('jsmith', 'jsmith')
27 27
28 get "my/account"
28 get "/my/account"
29 29 assert_response :success
30 30 assert_template "my/account"
31 31 end
32 32
33 33 def test_autologin
34 34 user = User.find(1)
35 35 Setting.autologin = "7"
36 36 Token.delete_all
37 37
38 38 # User logs in with 'autologin' checked
39 39 post '/login', :username => user.login, :password => 'admin', :autologin => 1
40 40 assert_redirected_to '/my/page'
41 41 token = Token.first
42 42 assert_not_nil token
43 43 assert_equal user, token.user
44 44 assert_equal 'autologin', token.action
45 45 assert_equal user.id, session[:user_id]
46 46 assert_equal token.value, cookies['autologin']
47 47
48 48 # Session is cleared
49 49 reset!
50 50 User.current = nil
51 51 # Clears user's last login timestamp
52 52 user.update_attribute :last_login_on, nil
53 53 assert_nil user.reload.last_login_on
54 54
55 55 # User comes back with user's autologin cookie
56 56 cookies[:autologin] = token.value
57 57 get '/my/page'
58 58 assert_response :success
59 59 assert_template 'my/page'
60 60 assert_equal user.id, session[:user_id]
61 61 assert_not_nil user.reload.last_login_on
62 62 end
63 63
64 64 def test_autologin_should_use_autologin_cookie_name
65 65 Token.delete_all
66 66 Redmine::Configuration.stubs(:[]).with('autologin_cookie_name').returns('custom_autologin')
67 67 Redmine::Configuration.stubs(:[]).with('autologin_cookie_path').returns('/')
68 68 Redmine::Configuration.stubs(:[]).with('autologin_cookie_secure').returns(false)
69 69
70 70 with_settings :autologin => '7' do
71 71 assert_difference 'Token.count' do
72 72 post '/login', :username => 'admin', :password => 'admin', :autologin => 1
73 73 end
74 74 assert_response 302
75 75 assert cookies['custom_autologin'].present?
76 76 token = cookies['custom_autologin']
77 77
78 78 # Session is cleared
79 79 reset!
80 80 cookies['custom_autologin'] = token
81 81 get '/my/page'
82 82 assert_response :success
83 83
84 84 assert_difference 'Token.count', -1 do
85 85 post '/logout'
86 86 end
87 87 assert cookies['custom_autologin'].blank?
88 88 end
89 89 end
90 90
91 91 def test_lost_password
92 92 Token.delete_all
93 93
94 get "account/lost_password"
94 get "/account/lost_password"
95 95 assert_response :success
96 96 assert_template "account/lost_password"
97 97 assert_select 'input[name=mail]'
98 98
99 post "account/lost_password", :mail => 'jSmith@somenet.foo'
99 post "/account/lost_password", :mail => 'jSmith@somenet.foo'
100 100 assert_redirected_to "/login"
101 101
102 102 token = Token.first
103 103 assert_equal 'recovery', token.action
104 104 assert_equal 'jsmith@somenet.foo', token.user.mail
105 105 assert !token.expired?
106 106
107 get "account/lost_password", :token => token.value
107 get "/account/lost_password", :token => token.value
108 108 assert_response :success
109 109 assert_template "account/password_recovery"
110 110 assert_select 'input[type=hidden][name=token][value=?]', token.value
111 111 assert_select 'input[name=new_password]'
112 112 assert_select 'input[name=new_password_confirmation]'
113 113
114 post "account/lost_password",
114 post "/account/lost_password",
115 115 :token => token.value, :new_password => 'newpass123',
116 116 :new_password_confirmation => 'newpass123'
117 117 assert_redirected_to "/login"
118 118 assert_equal 'Password was successfully updated.', flash[:notice]
119 119
120 120 log_user('jsmith', 'newpass123')
121 121 assert_equal 0, Token.count
122 122 end
123 123
124 124 def test_user_with_must_change_passwd_should_be_forced_to_change_its_password
125 125 User.find_by_login('jsmith').update_attribute :must_change_passwd, true
126 126
127 127 post '/login', :username => 'jsmith', :password => 'jsmith'
128 128 assert_redirected_to '/my/page'
129 129 follow_redirect!
130 130 assert_redirected_to '/my/password'
131 131
132 132 get '/issues'
133 133 assert_redirected_to '/my/password'
134 134 end
135 135
136 136 def test_user_with_must_change_passwd_should_be_able_to_change_its_password
137 137 User.find_by_login('jsmith').update_attribute :must_change_passwd, true
138 138
139 139 post '/login', :username => 'jsmith', :password => 'jsmith'
140 140 assert_redirected_to '/my/page'
141 141 follow_redirect!
142 142 assert_redirected_to '/my/password'
143 143 follow_redirect!
144 144 assert_response :success
145 145 post '/my/password', :password => 'jsmith', :new_password => 'newpassword', :new_password_confirmation => 'newpassword'
146 146 assert_redirected_to '/my/account'
147 147 follow_redirect!
148 148 assert_response :success
149 149
150 150 assert_equal false, User.find_by_login('jsmith').must_change_passwd?
151 151 end
152 152
153 153 def test_register_with_automatic_activation
154 154 Setting.self_registration = '3'
155 155
156 get 'account/register'
156 get '/account/register'
157 157 assert_response :success
158 158 assert_template 'account/register'
159 159
160 post 'account/register',
160 post '/account/register',
161 161 :user => {:login => "newuser", :language => "en",
162 162 :firstname => "New", :lastname => "User", :mail => "newuser@foo.bar",
163 163 :password => "newpass123", :password_confirmation => "newpass123"}
164 164 assert_redirected_to '/my/account'
165 165 follow_redirect!
166 166 assert_response :success
167 167 assert_template 'my/account'
168 168
169 169 user = User.find_by_login('newuser')
170 170 assert_not_nil user
171 171 assert user.active?
172 172 assert_not_nil user.last_login_on
173 173 end
174 174
175 175 def test_register_with_manual_activation
176 176 Setting.self_registration = '2'
177 177
178 post 'account/register',
178 post '/account/register',
179 179 :user => {:login => "newuser", :language => "en",
180 180 :firstname => "New", :lastname => "User", :mail => "newuser@foo.bar",
181 181 :password => "newpass123", :password_confirmation => "newpass123"}
182 182 assert_redirected_to '/login'
183 183 assert !User.find_by_login('newuser').active?
184 184 end
185 185
186 186 def test_register_with_email_activation
187 187 Setting.self_registration = '1'
188 188 Token.delete_all
189 189
190 post 'account/register',
190 post '/account/register',
191 191 :user => {:login => "newuser", :language => "en",
192 192 :firstname => "New", :lastname => "User", :mail => "newuser@foo.bar",
193 193 :password => "newpass123", :password_confirmation => "newpass123"}
194 194 assert_redirected_to '/login'
195 195 assert !User.find_by_login('newuser').active?
196 196
197 197 token = Token.first
198 198 assert_equal 'register', token.action
199 199 assert_equal 'newuser@foo.bar', token.user.mail
200 200 assert !token.expired?
201 201
202 get 'account/activate', :token => token.value
202 get '/account/activate', :token => token.value
203 203 assert_redirected_to '/login'
204 204 log_user('newuser', 'newpass123')
205 205 end
206 206
207 207 def test_onthefly_registration
208 208 # disable registration
209 209 Setting.self_registration = '0'
210 210 AuthSource.expects(:authenticate).returns(
211 211 {:login => 'foo', :firstname => 'Foo', :lastname => 'Smith',
212 212 :mail => 'foo@bar.com', :auth_source_id => 66})
213 213
214 214 post '/login', :username => 'foo', :password => 'bar'
215 215 assert_redirected_to '/my/page'
216 216
217 217 user = User.find_by_login('foo')
218 218 assert user.is_a?(User)
219 219 assert_equal 66, user.auth_source_id
220 220 assert user.hashed_password.blank?
221 221 end
222 222
223 223 def test_onthefly_registration_with_invalid_attributes
224 224 # disable registration
225 225 Setting.self_registration = '0'
226 226 AuthSource.expects(:authenticate).returns(
227 227 {:login => 'foo', :lastname => 'Smith', :auth_source_id => 66})
228 228
229 229 post '/login', :username => 'foo', :password => 'bar'
230 230 assert_response :success
231 231 assert_template 'account/register'
232 232 assert_select 'input[name=?][value=""]', 'user[firstname]'
233 233 assert_select 'input[name=?][value=Smith]', 'user[lastname]'
234 234 assert_select 'input[name=?]', 'user[login]', 0
235 235 assert_select 'input[name=?]', 'user[password]', 0
236 236
237 post 'account/register',
237 post '/account/register',
238 238 :user => {:firstname => 'Foo', :lastname => 'Smith', :mail => 'foo@bar.com'}
239 239 assert_redirected_to '/my/account'
240 240
241 241 user = User.find_by_login('foo')
242 242 assert user.is_a?(User)
243 243 assert_equal 66, user.auth_source_id
244 244 assert user.hashed_password.blank?
245 245 end
246 246
247 247 def test_registered_user_should_be_able_to_get_a_new_activation_email
248 248 Token.delete_all
249 249
250 250 with_settings :self_registration => '1', :default_language => 'en' do
251 251 # register a new account
252 252 assert_difference 'User.count' do
253 253 assert_difference 'Token.count' do
254 post 'account/register',
254 post '/account/register',
255 255 :user => {:login => "newuser", :language => "en",
256 256 :firstname => "New", :lastname => "User", :mail => "newuser@foo.bar",
257 257 :password => "newpass123", :password_confirmation => "newpass123"}
258 258 end
259 259 end
260 260 user = User.order('id desc').first
261 261 assert_equal User::STATUS_REGISTERED, user.status
262 262 reset!
263 263
264 264 # try to use "lost password"
265 265 assert_no_difference 'ActionMailer::Base.deliveries.size' do
266 266 post '/account/lost_password', :mail => 'newuser@foo.bar'
267 267 end
268 268 assert_redirected_to '/account/lost_password'
269 269 follow_redirect!
270 270 assert_response :success
271 271 assert_select 'div.flash', :text => /new activation email/
272 272 assert_select 'div.flash a[href="/account/activation_email"]'
273 273
274 274 # request a new action activation email
275 275 assert_difference 'ActionMailer::Base.deliveries.size' do
276 276 get '/account/activation_email'
277 277 end
278 278 assert_redirected_to '/login'
279 279 token = Token.order('id desc').first
280 280 activation_path = "/account/activate?token=#{token.value}"
281 281 assert_include activation_path, mail_body(ActionMailer::Base.deliveries.last)
282 282
283 283 # activate the account
284 284 get activation_path
285 285 assert_redirected_to '/login'
286 286
287 287 post '/login', :username => 'newuser', :password => 'newpass123'
288 288 assert_redirected_to '/my/page'
289 289 end
290 290 end
291 291 end
@@ -1,61 +1,61
1 1 # Redmine - project management software
2 2 # Copyright (C) 2006-2014 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 require File.expand_path('../../test_helper', __FILE__)
19 19
20 20 class AdminTest < Redmine::IntegrationTest
21 21 fixtures :projects, :trackers, :issue_statuses, :issues,
22 22 :enumerations, :users, :issue_categories,
23 23 :projects_trackers,
24 24 :roles,
25 25 :member_roles,
26 26 :members,
27 27 :enabled_modules
28 28
29 29 def test_add_user
30 30 log_user("admin", "admin")
31 31 get "/users/new"
32 32 assert_response :success
33 33 assert_template "users/new"
34 34 post "/users",
35 35 :user => { :login => "psmith", :firstname => "Paul",
36 36 :lastname => "Smith", :mail => "psmith@somenet.foo",
37 37 :language => "en", :password => "psmith09",
38 38 :password_confirmation => "psmith09" }
39 39
40 40 user = User.find_by_login("psmith")
41 41 assert_kind_of User, user
42 42 assert_redirected_to "/users/#{ user.id }/edit"
43 43
44 44 logged_user = User.try_to_login("psmith", "psmith09")
45 45 assert_kind_of User, logged_user
46 46 assert_equal "Paul", logged_user.firstname
47 47
48 put "users/#{user.id}", :id => user.id, :user => { :status => User::STATUS_LOCKED }
48 put "/users/#{user.id}", :id => user.id, :user => { :status => User::STATUS_LOCKED }
49 49 assert_redirected_to "/users/#{ user.id }/edit"
50 50 locked_user = User.try_to_login("psmith", "psmith09")
51 51 assert_equal nil, locked_user
52 52 end
53 53
54 54 test "Add a user as an anonymous user should fail" do
55 55 post '/users',
56 56 :user => { :login => 'psmith', :firstname => 'Paul'},
57 57 :password => "psmith09", :password_confirmation => "psmith09"
58 58 assert_response :redirect
59 59 assert_redirected_to "/login?back_url=http%3A%2F%2Fwww.example.com%2Fusers"
60 60 end
61 61 end
@@ -1,90 +1,90
1 1 # Redmine - project management software
2 2 # Copyright (C) 2006-2014 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 require File.expand_path('../../test_helper', __FILE__)
19 19
20 20 class ApplicationTest < Redmine::IntegrationTest
21 21 include Redmine::I18n
22 22
23 23 fixtures :projects, :trackers, :issue_statuses, :issues,
24 24 :enumerations, :users, :issue_categories,
25 25 :projects_trackers,
26 26 :roles,
27 27 :member_roles,
28 28 :members,
29 29 :enabled_modules
30 30
31 31 def test_set_localization
32 32 Setting.default_language = 'en'
33 33
34 34 # a french user
35 get 'projects', { }, 'HTTP_ACCEPT_LANGUAGE' => 'fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3'
35 get '/projects', { }, 'HTTP_ACCEPT_LANGUAGE' => 'fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3'
36 36 assert_response :success
37 37 assert_select 'h2', :text => 'Projets'
38 38 assert_equal :fr, current_language
39 39 assert_select "html[lang=?]", "fr"
40 40
41 41 # then an italien user
42 get 'projects', { }, 'HTTP_ACCEPT_LANGUAGE' => 'it;q=0.8,en-us;q=0.5,en;q=0.3'
42 get '/projects', { }, 'HTTP_ACCEPT_LANGUAGE' => 'it;q=0.8,en-us;q=0.5,en;q=0.3'
43 43 assert_response :success
44 44 assert_select 'h2', :text => 'Progetti'
45 45 assert_equal :it, current_language
46 46 assert_select "html[lang=?]", "it"
47 47
48 48 # not a supported language: default language should be used
49 get 'projects', { }, 'HTTP_ACCEPT_LANGUAGE' => 'zz'
49 get '/projects', { }, 'HTTP_ACCEPT_LANGUAGE' => 'zz'
50 50 assert_response :success
51 51 assert_select 'h2', :text => 'Projects'
52 52 assert_select "html[lang=?]", "en"
53 53 end
54 54
55 55 def test_token_based_access_should_not_start_session
56 56 # issue of a private project
57 get 'issues/4.atom'
57 get '/issues/4.atom'
58 58 assert_response 302
59 59
60 60 rss_key = User.find(2).rss_key
61 get "issues/4.atom?key=#{rss_key}"
61 get "/issues/4.atom?key=#{rss_key}"
62 62 assert_response 200
63 63 assert_nil session[:user_id]
64 64 end
65 65
66 66 def test_missing_template_should_respond_with_404
67 67 get '/login.png'
68 68 assert_response 404
69 69 end
70 70
71 71 def test_invalid_token_should_call_custom_handler
72 72 ActionController::Base.allow_forgery_protection = true
73 73 post '/issues'
74 74 assert_response 422
75 75 assert_include "Invalid form authenticity token.", response.body
76 76 ensure
77 77 ActionController::Base.allow_forgery_protection = false
78 78 end
79 79
80 80 def test_localization_should_be_set_correctly_on_invalid_token
81 81 ActionController::Base.allow_forgery_protection = true
82 82 Setting.default_language = 'en'
83 post 'issues', { }, 'HTTP_ACCEPT_LANGUAGE' => 'fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3'
83 post '/issues', { }, 'HTTP_ACCEPT_LANGUAGE' => 'fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3'
84 84 assert_response 422
85 85 assert_equal :fr, current_language
86 86 assert_select "html[lang=?]", "fr"
87 87 ensure
88 88 ActionController::Base.allow_forgery_protection = false
89 89 end
90 90 end
@@ -1,216 +1,216
1 1 # Redmine - project management software
2 2 # Copyright (C) 2006-2014 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 require File.expand_path('../../test_helper', __FILE__)
19 19
20 20 class IssuesTest < Redmine::IntegrationTest
21 21 fixtures :projects,
22 22 :users,
23 23 :roles,
24 24 :members,
25 25 :member_roles,
26 26 :trackers,
27 27 :projects_trackers,
28 28 :enabled_modules,
29 29 :issue_statuses,
30 30 :issues,
31 31 :enumerations,
32 32 :custom_fields,
33 33 :custom_values,
34 34 :custom_fields_trackers
35 35
36 36 # create an issue
37 37 def test_add_issue
38 38 log_user('jsmith', 'jsmith')
39 get 'projects/1/issues/new', :tracker_id => '1'
39 get '/projects/1/issues/new', :tracker_id => '1'
40 40 assert_response :success
41 41 assert_template 'issues/new'
42 42
43 post 'projects/1/issues', :tracker_id => "1",
43 post '/projects/1/issues', :tracker_id => "1",
44 44 :issue => { :start_date => "2006-12-26",
45 45 :priority_id => "4",
46 46 :subject => "new test issue",
47 47 :category_id => "",
48 48 :description => "new issue",
49 49 :done_ratio => "0",
50 50 :due_date => "",
51 51 :assigned_to_id => "" },
52 52 :custom_fields => {'2' => 'Value for field 2'}
53 53 # find created issue
54 54 issue = Issue.find_by_subject("new test issue")
55 55 assert_kind_of Issue, issue
56 56
57 57 # check redirection
58 58 assert_redirected_to :controller => 'issues', :action => 'show', :id => issue
59 59 follow_redirect!
60 60 assert_equal issue, assigns(:issue)
61 61
62 62 # check issue attributes
63 63 assert_equal 'jsmith', issue.author.login
64 64 assert_equal 1, issue.project.id
65 65 assert_equal 1, issue.status.id
66 66 end
67 67
68 68 def test_create_issue_by_anonymous_without_permission_should_fail
69 69 Role.anonymous.remove_permission! :add_issues
70 70
71 71 assert_no_difference 'Issue.count' do
72 post 'projects/1/issues', :tracker_id => "1", :issue => {:subject => "new test issue"}
72 post '/projects/1/issues', :tracker_id => "1", :issue => {:subject => "new test issue"}
73 73 end
74 74 assert_response 302
75 75 end
76 76
77 77 def test_create_issue_by_anonymous_with_custom_permission_should_succeed
78 78 Role.anonymous.remove_permission! :add_issues
79 79 Member.create!(:project_id => 1, :principal => Group.anonymous, :role_ids => [3])
80 80
81 81 assert_difference 'Issue.count' do
82 post 'projects/1/issues', :tracker_id => "1", :issue => {:subject => "new test issue"}
82 post '/projects/1/issues', :tracker_id => "1", :issue => {:subject => "new test issue"}
83 83 end
84 84 assert_response 302
85 85 issue = Issue.order("id DESC").first
86 86 assert_equal User.anonymous, issue.author
87 87 end
88 88
89 89 # add then remove 2 attachments to an issue
90 90 def test_issue_attachments
91 91 log_user('jsmith', 'jsmith')
92 92 set_tmp_attachments_directory
93 93
94 put 'issues/1',
94 put '/issues/1',
95 95 :notes => 'Some notes',
96 96 :attachments => {'1' => {'file' => uploaded_test_file('testfile.txt', 'text/plain'), 'description' => 'This is an attachment'}}
97 97 assert_redirected_to "/issues/1"
98 98
99 99 # make sure attachment was saved
100 100 attachment = Issue.find(1).attachments.find_by_filename("testfile.txt")
101 101 assert_kind_of Attachment, attachment
102 102 assert_equal Issue.find(1), attachment.container
103 103 assert_equal 'This is an attachment', attachment.description
104 104 # verify the size of the attachment stored in db
105 105 #assert_equal file_data_1.length, attachment.filesize
106 106 # verify that the attachment was written to disk
107 107 assert File.exist?(attachment.diskfile)
108 108
109 109 # remove the attachments
110 110 Issue.find(1).attachments.each(&:destroy)
111 111 assert_equal 0, Issue.find(1).attachments.length
112 112 end
113 113
114 114 def test_other_formats_links_on_index
115 115 get '/projects/ecookbook/issues'
116 116
117 117 %w(Atom PDF CSV).each do |format|
118 118 assert_select 'a[rel=nofollow][href=?]', "/projects/ecookbook/issues.#{format.downcase}", :text => format
119 119 end
120 120 end
121 121
122 122 def test_other_formats_links_on_index_without_project_id_in_url
123 123 get '/issues', :project_id => 'ecookbook'
124 124
125 125 %w(Atom PDF CSV).each do |format|
126 126 assert_select 'a[rel=nofollow][href=?]', "/projects/ecookbook/issues.#{format.downcase}", :text => format
127 127 end
128 128 end
129 129
130 130 def test_pagination_links_on_index
131 131 with_settings :per_page_options => '2' do
132 132 get '/projects/ecookbook/issues'
133 133
134 134 assert_select 'a[href=?]', '/projects/ecookbook/issues?page=2', :text => '2'
135 135 end
136 136 end
137 137
138 138 def test_pagination_links_on_index_without_project_id_in_url
139 139 with_settings :per_page_options => '2' do
140 140 get '/issues', :project_id => 'ecookbook'
141 141
142 142 assert_select 'a[href=?]', '/projects/ecookbook/issues?page=2', :text => '2'
143 143 end
144 144 end
145 145
146 146 def test_issue_with_user_custom_field
147 147 @field = IssueCustomField.create!(:name => 'Tester', :field_format => 'user', :is_for_all => true, :trackers => Tracker.all)
148 148 Role.anonymous.add_permission! :add_issues, :edit_issues
149 149 users = Project.find(1).users.uniq.sort
150 150 tester = users.first
151 151
152 152 # Issue form
153 153 get '/projects/ecookbook/issues/new'
154 154 assert_response :success
155 155 assert_select 'select[name=?]', "issue[custom_field_values][#{@field.id}]" do
156 156 assert_select 'option', users.size + 1 # +1 for blank value
157 157 assert_select 'option[value=?]', tester.id.to_s, :text => tester.name
158 158 end
159 159
160 160 # Create issue
161 161 assert_difference 'Issue.count' do
162 162 post '/projects/ecookbook/issues',
163 163 :issue => {
164 164 :tracker_id => '1',
165 165 :priority_id => '4',
166 166 :subject => 'Issue with user custom field',
167 167 :custom_field_values => {@field.id.to_s => users.first.id.to_s}
168 168 }
169 169 end
170 170 issue = Issue.order('id DESC').first
171 171 assert_response 302
172 172
173 173 # Issue view
174 174 follow_redirect!
175 175 assert_select 'th:content(Tester:) + td', :text => tester.name
176 176 assert_select 'select[name=?]', "issue[custom_field_values][#{@field.id}]" do
177 177 assert_select 'option', users.size + 1 # +1 for blank value
178 178 assert_select 'option[value=?][selected=selected]', tester.id.to_s, :text => tester.name
179 179 end
180 180
181 181 new_tester = users[1]
182 182 with_settings :default_language => 'en' do
183 183 # Update issue
184 184 assert_difference 'Journal.count' do
185 185 put "/issues/#{issue.id}",
186 186 :notes => 'Updating custom field',
187 187 :issue => {
188 188 :custom_field_values => {@field.id.to_s => new_tester.id.to_s}
189 189 }
190 190 assert_redirected_to "/issues/#{issue.id}"
191 191 end
192 192 # Issue view
193 193 follow_redirect!
194 194 assert_select 'ul.details li', :text => "Tester changed from #{tester} to #{new_tester}"
195 195 end
196 196 end
197 197
198 198 def test_update_using_invalid_http_verbs
199 199 subject = 'Updated by an invalid http verb'
200 200
201 201 get '/issues/update/1', {:issue => {:subject => subject}}, credentials('jsmith')
202 202 assert_response 404
203 203 assert_not_equal subject, Issue.find(1).subject
204 204
205 205 post '/issues/1', {:issue => {:subject => subject}}, credentials('jsmith')
206 206 assert_response 404
207 207 assert_not_equal subject, Issue.find(1).subject
208 208 end
209 209
210 210 def test_get_watch_should_be_invalid
211 211 assert_no_difference 'Watcher.count' do
212 212 get '/watchers/watch?object_type=issue&object_id=1', {}, credentials('jsmith')
213 213 assert_response 404
214 214 end
215 215 end
216 216 end
@@ -1,66 +1,66
1 1 # Redmine - project management software
2 2 # Copyright (C) 2006-2014 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 require File.expand_path('../../../../test_helper', __FILE__)
19 19
20 20 class MenuManagerTest < Redmine::IntegrationTest
21 21 include Redmine::I18n
22 22
23 23 fixtures :projects, :trackers, :issue_statuses, :issues,
24 24 :enumerations, :users, :issue_categories,
25 25 :projects_trackers,
26 26 :roles,
27 27 :member_roles,
28 28 :members,
29 29 :enabled_modules
30 30
31 31 def test_project_menu_with_specific_locale
32 get 'projects/ecookbook/issues', { }, 'HTTP_ACCEPT_LANGUAGE' => 'fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3'
32 get '/projects/ecookbook/issues', { }, 'HTTP_ACCEPT_LANGUAGE' => 'fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3'
33 33
34 34 assert_select 'div#main-menu' do
35 35 assert_select 'li a.activity[href=?]', '/projects/ecookbook/activity', :text => ll('fr', :label_activity)
36 36 assert_select 'li a.issues.selected[href=?]', '/projects/ecookbook/issues', :text => ll('fr', :label_issue_plural)
37 37 end
38 38 end
39 39
40 40 def test_project_menu_with_additional_menu_items
41 41 Setting.default_language = 'en'
42 42 assert_no_difference 'Redmine::MenuManager.items(:project_menu).size' do
43 43 Redmine::MenuManager.map :project_menu do |menu|
44 44 menu.push :foo, { :controller => 'projects', :action => 'show' }, :caption => 'Foo'
45 45 menu.push :bar, { :controller => 'projects', :action => 'show' }, :before => :activity
46 46 menu.push :hello, { :controller => 'projects', :action => 'show' }, :caption => Proc.new {|p| p.name.upcase }, :after => :bar
47 47 end
48 48
49 get 'projects/ecookbook'
49 get '/projects/ecookbook'
50 50
51 51 assert_select 'div#main-menu ul' do
52 52 assert_select 'li:last-child a.foo[href=?]', '/projects/ecookbook', :text => 'Foo'
53 53 assert_select 'li:nth-child(2) a.bar[href=?]', '/projects/ecookbook', :text => 'Bar'
54 54 assert_select 'li:nth-child(3) a.hello[href=?]', '/projects/ecookbook', :text => 'ECOOKBOOK'
55 55 assert_select 'li:nth-child(4) a', :text => 'Activity'
56 56 end
57 57
58 58 # Remove the menu items
59 59 Redmine::MenuManager.map :project_menu do |menu|
60 60 menu.delete :foo
61 61 menu.delete :bar
62 62 menu.delete :hello
63 63 end
64 64 end
65 65 end
66 66 end
@@ -1,51 +1,51
1 1 # Redmine - project management software
2 2 # Copyright (C) 2006-2014 Jean-Philippe Lang
3 3 #
4 4 # This program is free software; you can redistribute it and/or
5 5 # modify it under the terms of the GNU General Public License
6 6 # as published by the Free Software Foundation; either version 2
7 7 # of the License, or (at your option) any later version.
8 8 #
9 9 # This program is distributed in the hope that it will be useful,
10 10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 12 # GNU General Public License for more details.
13 13 #
14 14 # You should have received a copy of the GNU General Public License
15 15 # along with this program; if not, write to the Free Software
16 16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17 17
18 18 require File.expand_path('../../test_helper', __FILE__)
19 19
20 20 class ProjectsTest < Redmine::IntegrationTest
21 21 fixtures :projects, :users, :members, :enabled_modules
22 22
23 23 def test_archive_project
24 24 subproject = Project.find(1).children.first
25 25 log_user("admin", "admin")
26 get "admin/projects"
26 get "/admin/projects"
27 27 assert_response :success
28 28 assert_template "admin/projects"
29 post "projects/1/archive"
29 post "/projects/1/archive"
30 30 assert_redirected_to "/admin/projects"
31 31 assert !Project.find(1).active?
32 32
33 get 'projects/1'
33 get '/projects/1'
34 34 assert_response 403
35 get "projects/#{subproject.id}"
35 get "/projects/#{subproject.id}"
36 36 assert_response 403
37 37
38 post "projects/1/unarchive"
38 post "/projects/1/unarchive"
39 39 assert_redirected_to "/admin/projects"
40 40 assert Project.find(1).active?
41 get "projects/1"
41 get "/projects/1"
42 42 assert_response :success
43 43 end
44 44
45 45 def test_modules_should_not_allow_get
46 46 assert_no_difference 'EnabledModule.count' do
47 47 get '/projects/1/modules', {:enabled_module_names => ['']}, credentials('jsmith')
48 48 assert_response 404
49 49 end
50 50 end
51 51 end
General Comments 0
You need to be logged in to leave comments. Login now