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(user)
51 assert_redirected_to login_path(:referer => new_message_path(user))
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(recipient_user)
64 assert_response :success
66 assert_select "title", "Send message | OpenStreetMap"
67 assert_select "a[href='#{user_path recipient_user}']", :text => recipient_user.display_name
68 assert_select "form[action='/messages']", :count => 1 do
69 assert_select "input[type='hidden'][name='display_name'][value='#{recipient_user.display_name}']"
70 assert_select "input#message_title", :count => 1
71 assert_select "textarea#message_body", :count => 1
72 assert_select "input[type='submit'][value='Send']", :count => 1
77 # test fetching new message page with body and title
78 def test_new_get_with_params
79 # Login as a normal user
81 recipient_user = create(:user)
84 # Check that we can't send a message from a GET request
85 assert_difference "ActionMailer::Base.deliveries.size", 0 do
86 assert_difference "Message.count", 0 do
87 perform_enqueued_jobs do
88 get new_message_path(recipient_user, :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("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 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)
240 assert_redirected_to login_path(:referer => message_reply_path(message))
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)
247 assert_redirected_to login_path(:referer => message_reply_path(message))
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 log in 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)
255 assert_response :success
256 assert_template "new"
257 assert_select "title", "Re: #{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: #{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(message.id).message_read
266 # Asking to reply to a message with a bogus ID should fail
267 get message_reply_path(99999)
268 assert_response :not_found
269 assert_template "no_such_message"
273 # test the show action
276 recipient_user = create(:user)
277 other_user = create(:user)
278 message = create(:message, :unread, :sender => user, :recipient => recipient_user)
280 # Check that the show message page requires us to login
281 get message_path(message)
282 assert_redirected_to login_path(:referer => message_path(message))
284 # Login as the wrong user
285 session_for(other_user)
287 # Check that we can't read the message
288 get message_path(message)
289 assert_redirected_to login_path(:referer => message_path(message))
290 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 log in as the correct user in order to read it.", flash[:notice]
292 # Login as the message sender
295 # Check that the message sender can read the message
296 get message_path(message)
297 assert_response :success
298 assert_template "show"
299 assert_select "a[href='#{user_path recipient_user}']", :text => recipient_user.display_name
300 assert_not Message.find(message.id).message_read
302 # Login as the message recipient
303 session_for(recipient_user)
305 # Check that the message recipient can read the message
306 get message_path(message)
307 assert_response :success
308 assert_template "show"
309 assert_select "a[href='#{user_path user}']", :text => user.display_name
310 assert Message.find(message.id).message_read
312 # Asking to read a message with a bogus ID should fail
313 get message_path(99999)
314 assert_response :not_found
315 assert_template "no_such_message"
319 # test the inbox action
322 read_message = create(:message, :read, :recipient => user)
323 # Check that the inbox page requires us to login
324 get inbox_messages_path
325 assert_redirected_to login_path(:referer => inbox_messages_path)
330 # Check that we can view our inbox when logged in
331 get inbox_messages_path
332 assert_response :success
333 assert_template "inbox"
334 assert_select ".content-inner > table.messages-table > tbody", :count => 1 do
335 assert_select "tr", :count => 1
336 assert_select "tr#inbox-#{read_message.id}", :count => 1 do
337 assert_select "a[href='#{user_path read_message.sender}']", :text => read_message.sender.display_name
338 assert_select "a[href='#{message_path read_message}']", :text => read_message.title
344 # test the outbox action
347 message = create(:message, :sender => user)
349 # Check that the outbox page requires us to login
350 get outbox_messages_path
351 assert_redirected_to login_path(:referer => outbox_messages_path)
356 # Check that we can view our outbox when logged in
357 get outbox_messages_path
358 assert_response :success
359 assert_template "outbox"
360 assert_select ".content-inner > table.messages-table > tbody", :count => 1 do
361 assert_select "tr", :count => 1
362 assert_select "tr#outbox-#{message.id}", :count => 1 do
363 assert_select "a[href='#{user_path message.recipient}']", :text => message.recipient.display_name
364 assert_select "a[href='#{message_path message}']", :text => message.title
370 # test the mark action
372 sender_user = create(:user)
373 recipient_user = create(:user)
374 other_user = create(:user)
375 message = create(:message, :unread, :sender => sender_user, :recipient => recipient_user)
377 # Check that the marking a message requires us to login
378 post message_mark_path(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)
386 assert_response :not_found
387 assert_template "no_such_message"
389 # Login as the message sender_user
390 session_for(sender_user)
392 # Check that marking a message we sent fails
393 post message_mark_path(message)
394 assert_response :not_found
395 assert_template "no_such_message"
397 # Login as the message recipient_user
398 session_for(recipient_user)
400 # Check that the marking a message read works
401 post message_mark_path(message, :mark => "read")
402 assert_redirected_to inbox_messages_path
403 assert Message.find(message.id).message_read
405 # Check that the marking a message unread works
406 post message_mark_path(message, :mark => "unread")
407 assert_redirected_to inbox_messages_path
408 assert_not Message.find(message.id).message_read
410 # Check that the marking a message read works and redirects to inbox from the message page
411 post message_mark_path(message, :mark => "read"), :headers => { :referer => message_path(message) }
412 assert_redirected_to inbox_messages_path
413 assert Message.find(message.id).message_read
415 # Check that the marking a message unread works and redirects to inbox from the message page
416 post message_mark_path(message, :mark => "unread"), :headers => { :referer => message_path(message) }
417 assert_redirected_to inbox_messages_path
418 assert_not Message.find(message.id).message_read
420 # Asking to mark a message with a bogus ID should fail
421 post message_mark_path(99999)
422 assert_response :not_found
423 assert_template "no_such_message"
427 # test the mark action for messages from muted users
429 sender_user = create(:user)
430 recipient_user = create(:user)
431 create(:user_mute, :owner => recipient_user, :subject => sender_user)
432 message = create(:message, :unread, :sender => sender_user, :recipient => recipient_user)
434 session_for(recipient_user)
436 # Check that the marking a message read works
437 post message_mark_path(message, :mark => "read")
438 assert_redirected_to muted_messages_path
439 assert Message.find(message.id).message_read
441 # Check that the marking a message unread works
442 post message_mark_path(message, :mark => "unread")
443 assert_redirected_to muted_messages_path
444 assert_not Message.find(message.id).message_read
448 # test the destroy action
451 second_user = create(:user)
452 other_user = create(:user)
453 read_message = create(:message, :read, :recipient => user, :sender => second_user)
454 sent_message = create(:message, :unread, :recipient => second_user, :sender => user)
456 # Check that destroying a message requires us to login
457 delete message_path(read_message)
458 assert_response :forbidden
460 # Login as a user with no messages
461 session_for(other_user)
463 # Check that destroying a message we didn't send or receive fails
464 delete message_path(read_message)
465 assert_response :not_found
466 assert_template "no_such_message"
468 # Login as the message recipient_user
471 # Check that the destroy a received message works
472 delete message_path(read_message)
473 assert_redirected_to inbox_messages_path
474 assert_equal "Message deleted", flash[:notice]
475 m = Message.find(read_message.id)
476 assert m.from_user_visible
477 assert_not m.to_user_visible
479 # Check that the destroying a sent message works
480 delete message_path(sent_message, :referer => outbox_messages_path)
481 assert_redirected_to outbox_messages_path
482 assert_equal "Message deleted", flash[:notice]
483 m = Message.find(sent_message.id)
484 assert_not m.from_user_visible
485 assert m.to_user_visible
487 # Asking to destroy a message with a bogus ID should fail
488 delete message_path(99999)
489 assert_response :not_found
490 assert_template "no_such_message"