3 class MessagesControllerTest < ActionDispatch::IntegrationTest
5 # test all routes which lead to this controller
8 { :path => "/messages/inbox", :method => :get },
9 { :controller => "messages", :action => "inbox" }
12 { :path => "/messages/outbox", :method => :get },
13 { :controller => "messages", :action => "outbox" }
16 { :path => "/message/new/username", :method => :get },
17 { :controller => "messages", :action => "new", :display_name => "username" }
20 { :path => "/messages", :method => :post },
21 { :controller => "messages", :action => "create" }
24 { :path => "/messages/1", :method => :get },
25 { :controller => "messages", :action => "show", :id => "1" }
28 { :path => "/messages/1/mark", :method => :post },
29 { :controller => "messages", :action => "mark", :message_id => "1" }
32 { :path => "/messages/1/reply", :method => :get },
33 { :controller => "messages", :action => "reply", :message_id => "1" }
36 { :path => "/messages/1/reply", :method => :post },
37 { :controller => "messages", :action => "reply", :message_id => "1" }
40 { :path => "/messages/1", :method => :delete },
41 { :controller => "messages", :action => "destroy", :id => "1" }
46 # test fetching new message page when not logged in
48 # Check that the new message page requires us to login
50 get new_message_path(:display_name => user.display_name)
51 assert_redirected_to login_path(:referer => new_message_path(:display_name => user.display_name))
55 # test fetching new message page when logged in
57 # Login as a normal user
59 recipient_user = create(:user)
62 # Check that the new message page loads
63 get new_message_path(:display_name => recipient_user.display_name)
64 assert_response :success
66 assert_select "title", "Send message | OpenStreetMap"
67 assert_select "form[action='/messages']", :count => 1 do
68 assert_select "input[type='hidden'][name='display_name'][value='#{recipient_user.display_name}']"
69 assert_select "input#message_title", :count => 1
70 assert_select "textarea#message_body", :count => 1
71 assert_select "input[type='submit'][value='Send']", :count => 1
76 # test fetching new message page with body and title
77 def test_new_get_with_params
78 # Login as a normal user
80 recipient_user = create(:user)
83 # Check that we can't send a message from a GET request
84 assert_difference "ActionMailer::Base.deliveries.size", 0 do
85 assert_difference "Message.count", 0 do
86 perform_enqueued_jobs do
87 get new_message_path(:display_name => recipient_user.display_name,
88 :message => { :title => "Test Message", :body => "Test message body" })
92 assert_response :success
94 assert_select "title", "Send message | OpenStreetMap"
95 assert_select "form[action='/messages']", :count => 1 do
96 assert_select "input[type='hidden'][name='display_name'][value='#{recipient_user.display_name}']"
97 assert_select "input#message_title", :count => 1 do
98 assert_select "[value='Test Message']"
100 assert_select "textarea#message_body", :text => "Test message body", :count => 1
101 assert_select "input[type='submit'][value='Send']", :count => 1
106 # test posting new message page with no body
107 def test_new_post_no_body
108 # Login as a normal user
110 recipient_user = create(:user)
113 # Check that the subject is preserved over errors
114 assert_difference "ActionMailer::Base.deliveries.size", 0 do
115 assert_difference "Message.count", 0 do
116 perform_enqueued_jobs do
117 post messages_path(:display_name => recipient_user.display_name,
118 :message => { :title => "Test Message", :body => "" })
122 assert_response :success
123 assert_template "new"
124 assert_select "title", "Send message | OpenStreetMap"
125 assert_select "form[action='/messages']", :count => 1 do
126 assert_select "input[type='hidden'][name='display_name'][value='#{recipient_user.display_name}']"
127 assert_select "input#message_title", :count => 1 do
128 assert_select "[value='Test Message']"
130 assert_select "textarea#message_body", :text => "", :count => 1
131 assert_select "input[type='submit'][value='Send']", :count => 1
136 # test posting new message page with no title
137 def test_new_post_no_title
138 # Login as a normal user
140 recipient_user = create(:user)
143 # Check that the body text is preserved over errors
144 assert_difference "ActionMailer::Base.deliveries.size", 0 do
145 assert_difference "Message.count", 0 do
146 perform_enqueued_jobs do
147 post messages_path(:display_name => recipient_user.display_name,
148 :message => { :title => "", :body => "Test message body" })
152 assert_response :success
153 assert_template "new"
154 assert_select "title", "Send message | OpenStreetMap"
155 assert_select "form[action='/messages']", :count => 1 do
156 assert_select "input[type='hidden'][name='display_name'][value='#{recipient_user.display_name}']"
157 assert_select "input#message_title", :count => 1 do
158 assert_select "[value='']"
160 assert_select "textarea#message_body", :text => "Test message body", :count => 1
161 assert_select "input[type='submit'][value='Send']", :count => 1
166 # test posting new message page sends message
167 def test_new_post_send
168 # Login as a normal user
170 recipient_user = create(:user)
173 # Check that sending a message works
174 assert_difference "ActionMailer::Base.deliveries.size", 1 do
175 assert_difference "Message.count", 1 do
176 perform_enqueued_jobs do
177 post messages_path(:display_name => recipient_user.display_name,
178 :message => { :title => "Test Message", :body => "Test message body" })
182 assert_redirected_to inbox_messages_path
183 assert_equal "Message sent", flash[:notice]
184 e = ActionMailer::Base.deliveries.first
185 assert_equal [recipient_user.email], e.to
186 assert_equal "[OpenStreetMap] Test Message", e.subject
187 assert_match(/Test message body/, e.text_part.decoded)
188 assert_match(/Test message body/, e.html_part.decoded)
189 assert_match %r{#{Settings.server_url}/messages/[0-9]+}, e.text_part.decoded
190 ActionMailer::Base.deliveries.clear
192 assert_equal user.id, m.from_user_id
193 assert_equal recipient_user.id, m.to_user_id
194 assert_in_delta Time.now.utc, m.sent_on, 2
195 assert_equal "Test Message", m.title
196 assert_equal "Test message body", m.body
197 assert_equal "markdown", m.body_format
199 # Asking to send a message with a bogus user name should fail
200 get new_message_path(:display_name => "non_existent_user")
201 assert_response :not_found
202 assert_template "users/no_such_user"
203 assert_select "h1", "The user non_existent_user does not exist"
207 # test the new action message limit
209 # Login as a normal user
211 recipient_user = create(:user)
214 # Check that sending a message fails when the message limit is hit
215 assert_no_difference "ActionMailer::Base.deliveries.size" do
216 assert_no_difference "Message.count" do
217 with_settings(:max_messages_per_hour => 0) do
218 perform_enqueued_jobs do
219 post messages_path(:display_name => recipient_user.display_name,
220 :message => { :title => "Test Message", :body => "Test message body" })
221 assert_response :success
222 assert_template "new"
223 assert_select ".alert.alert-danger", /wait a while/
231 # test the reply action
234 recipient_user = create(:user)
235 other_user = create(:user)
236 unread_message = create(:message, :unread, :sender => user, :recipient => recipient_user)
238 # Check that the message reply page requires us to login
239 get message_reply_path(:message_id => unread_message)
240 assert_redirected_to login_path(:referer => message_reply_path(:message_id => unread_message.id))
242 # Login as the wrong user
243 session_for(other_user)
245 # Check that we can't reply to somebody else's message
246 get message_reply_path(:message_id => unread_message)
247 assert_redirected_to login_path(:referer => message_reply_path(:message_id => unread_message.id))
248 assert_equal "You are logged in as `#{other_user.display_name}' but the message you have asked to reply to was not sent to that user. Please login as the correct user in order to reply.", flash[:notice]
250 # Login as the right user
251 session_for(recipient_user)
253 # Check that the message reply page loads
254 get message_reply_path(:message_id => unread_message)
255 assert_response :success
256 assert_template "new"
257 assert_select "title", "Re: #{unread_message.title} | OpenStreetMap"
258 assert_select "form[action='/messages']", :count => 1 do
259 assert_select "input[type='hidden'][name='display_name'][value='#{user.display_name}']"
260 assert_select "input#message_title[value='Re: #{unread_message.title}']", :count => 1
261 assert_select "textarea#message_body", :count => 1
262 assert_select "input[type='submit'][value='Send']", :count => 1
264 assert Message.find(unread_message.id).message_read
266 # Asking to reply to a message with no ID should fail
267 get message_reply_path
268 assert_response :success
270 # Asking to reply to a message with a bogus ID should fail
271 get message_reply_path(:message_id => 99999)
272 assert_response :not_found
273 assert_template "no_such_message"
277 # test the show action
280 recipient_user = create(:user)
281 other_user = create(:user)
282 unread_message = create(:message, :unread, :sender => user, :recipient => recipient_user)
284 # Check that the show message page requires us to login
285 get message_path(:id => unread_message)
286 assert_redirected_to login_path(:referer => message_path(:id => unread_message.id))
288 # Login as the wrong user
289 session_for(other_user)
291 # Check that we can't read the message
292 get message_path(:id => unread_message)
293 assert_redirected_to login_path(:referer => message_path(:id => unread_message.id))
294 assert_equal "You are logged in as `#{other_user.display_name}' but the message you have asked to read was not sent by or to that user. Please login as the correct user in order to read it.", flash[:notice]
296 # Login as the message sender
299 # Check that the message sender can read the message
300 get message_path(:id => unread_message)
301 assert_response :success
302 assert_template "show"
303 assert_not Message.find(unread_message.id).message_read
305 # Login as the message recipient
306 session_for(recipient_user)
308 # Check that the message recipient can read the message
309 get message_path(:id => unread_message)
310 assert_response :success
311 assert_template "show"
312 assert Message.find(unread_message.id).message_read
314 # Asking to read a message with no ID should fail
316 assert_response :success
318 # Asking to read a message with a bogus ID should fail
319 get message_path(:id => 99999)
320 assert_response :not_found
321 assert_template "no_such_message"
325 # test the inbox action
328 read_message = create(:message, :read, :recipient => user)
329 # Check that the inbox page requires us to login
330 get inbox_messages_path
331 assert_redirected_to login_path(:referer => inbox_messages_path)
336 # Check that we can view our inbox when logged in
337 get inbox_messages_path
338 assert_response :success
339 assert_template "inbox"
340 assert_select ".content-inner > table", :count => 1 do
341 assert_select "tr", :count => 2
342 assert_select "tr#inbox-#{read_message.id}.inbox-row", :count => 1
347 # test the outbox action
350 create(:message, :sender => user)
352 # Check that the outbox page requires us to login
353 get outbox_messages_path
354 assert_redirected_to login_path(:referer => outbox_messages_path)
359 # Check that we can view our outbox when logged in
360 get outbox_messages_path
361 assert_response :success
362 assert_template "outbox"
363 assert_select ".content-inner > table", :count => 1 do
364 assert_select "tr", :count => 2
365 assert_select "tr.inbox-row", :count => 1
370 # test the mark action
373 recipient_user = create(:user)
374 other_user = create(:user)
375 unread_message = create(:message, :unread, :sender => user, :recipient => recipient_user)
377 # Check that the marking a message requires us to login
378 post message_mark_path(:message_id => unread_message)
379 assert_response :forbidden
381 # Login as a user with no messages
382 session_for(other_user)
384 # Check that marking a message we didn't send or receive fails
385 post message_mark_path(:message_id => unread_message)
386 assert_response :not_found
387 assert_template "no_such_message"
389 # Login as the message recipient_user
390 session_for(recipient_user)
392 # Check that the marking a message read works
393 post message_mark_path(:message_id => unread_message, :mark => "read")
394 assert_redirected_to inbox_messages_path
395 assert Message.find(unread_message.id).message_read
397 # Check that the marking a message unread works
398 post message_mark_path(:message_id => unread_message, :mark => "unread")
399 assert_redirected_to inbox_messages_path
400 assert_not Message.find(unread_message.id).message_read
402 # Check that the marking a message read via XHR works
403 post message_mark_path(:message_id => unread_message, :mark => "read"), :xhr => true
404 assert_response :success
405 assert_template "mark"
406 assert Message.find(unread_message.id).message_read
408 # Check that the marking a message unread via XHR works
409 post message_mark_path(:message_id => unread_message, :mark => "unread"), :xhr => true
410 assert_response :success
411 assert_template "mark"
412 assert_not Message.find(unread_message.id).message_read
414 # Asking to mark a message with no ID should fail
415 post message_mark_path
416 assert_response :redirect
417 assert_redirected_to inbox_messages_path
419 # Asking to mark a message with a bogus ID should fail
420 post message_mark_path(:message_id => 99999)
421 assert_response :not_found
422 assert_template "no_such_message"
426 # test the destroy action
429 second_user = create(:user)
430 other_user = create(:user)
431 read_message = create(:message, :read, :recipient => user, :sender => second_user)
432 sent_message = create(:message, :unread, :recipient => second_user, :sender => user)
434 # Check that destroying a message requires us to login
435 delete message_path(:id => read_message)
436 assert_response :forbidden
438 # Login as a user with no messages
439 session_for(other_user)
441 # Check that destroying a message we didn't send or receive fails
442 delete message_path(:id => read_message)
443 assert_response :not_found
444 assert_template "no_such_message"
446 # Login as the message recipient_user
449 # Check that the destroy a received message works
450 delete message_path(:id => read_message)
451 assert_redirected_to inbox_messages_path
452 assert_equal "Message deleted", flash[:notice]
453 m = Message.find(read_message.id)
454 assert m.from_user_visible
455 assert_not m.to_user_visible
457 # Check that the destroying a sent message works
458 delete message_path(:id => sent_message, :referer => outbox_messages_path)
459 assert_redirected_to outbox_messages_path
460 assert_equal "Message deleted", flash[:notice]
461 m = Message.find(sent_message.id)
462 assert_not m.from_user_visible
463 assert m.to_user_visible
465 # Asking to destroy a message with no ID should fail
467 assert_response :redirect
468 assert_redirected_to inbox_messages_path
470 # Asking to destroy a message with a bogus ID should fail
471 delete message_path(:id => 99999)
472 assert_response :not_found
473 assert_template "no_such_message"