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 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 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_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 log in 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_select "a[href='#{user_path recipient_user}']", :text => recipient_user.display_name
304 assert_not Message.find(unread_message.id).message_read
306 # Login as the message recipient
307 session_for(recipient_user)
309 # Check that the message recipient can read the message
310 get message_path(:id => unread_message)
311 assert_response :success
312 assert_template "show"
313 assert_select "a[href='#{user_path user}']", :text => user.display_name
314 assert Message.find(unread_message.id).message_read
316 # Asking to read a message with no ID should fail
318 assert_response :success
320 # Asking to read a message with a bogus ID should fail
321 get message_path(:id => 99999)
322 assert_response :not_found
323 assert_template "no_such_message"
327 # test the inbox action
330 read_message = create(:message, :read, :recipient => user)
331 # Check that the inbox page requires us to login
332 get inbox_messages_path
333 assert_redirected_to login_path(:referer => inbox_messages_path)
338 # Check that we can view our inbox when logged in
339 get inbox_messages_path
340 assert_response :success
341 assert_template "inbox"
342 assert_select ".content-inner > table", :count => 1 do
343 assert_select "tr", :count => 2
344 assert_select "tr#inbox-#{read_message.id}.inbox-row", :count => 1 do
345 assert_select "a[href='#{user_path read_message.sender}']", :text => read_message.sender.display_name
346 assert_select "a[href='#{message_path read_message}']", :text => read_message.title
352 # test the outbox action
355 message = create(:message, :sender => user)
357 # Check that the outbox page requires us to login
358 get outbox_messages_path
359 assert_redirected_to login_path(:referer => outbox_messages_path)
364 # Check that we can view our outbox when logged in
365 get outbox_messages_path
366 assert_response :success
367 assert_template "outbox"
368 assert_select ".content-inner > table", :count => 1 do
369 assert_select "tr", :count => 2
370 assert_select "tr.inbox-row", :count => 1 do
371 assert_select "a[href='#{user_path message.recipient}']", :text => message.recipient.display_name
372 assert_select "a[href='#{message_path message}']", :text => message.title
378 # test the mark action
381 recipient_user = create(:user)
382 other_user = create(:user)
383 unread_message = create(:message, :unread, :sender => user, :recipient => recipient_user)
385 # Check that the marking a message requires us to login
386 post message_mark_path(:message_id => unread_message)
387 assert_response :forbidden
389 # Login as a user with no messages
390 session_for(other_user)
392 # Check that marking a message we didn't send or receive fails
393 post message_mark_path(:message_id => unread_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_id => unread_message, :mark => "read")
402 assert_redirected_to inbox_messages_path
403 assert Message.find(unread_message.id).message_read
405 # Check that the marking a message unread works
406 post message_mark_path(:message_id => unread_message, :mark => "unread")
407 assert_redirected_to inbox_messages_path
408 assert_not Message.find(unread_message.id).message_read
410 # Check that the marking a message read via XHR works
411 post message_mark_path(:message_id => unread_message, :mark => "read"), :xhr => true
412 assert_response :success
413 assert_template "mark"
414 assert Message.find(unread_message.id).message_read
416 # Check that the marking a message unread via XHR works
417 post message_mark_path(:message_id => unread_message, :mark => "unread"), :xhr => true
418 assert_response :success
419 assert_template "mark"
420 assert_not Message.find(unread_message.id).message_read
422 # Asking to mark a message with no ID should fail
423 post message_mark_path
424 assert_redirected_to inbox_messages_path
426 # Asking to mark a message with a bogus ID should fail
427 post message_mark_path(:message_id => 99999)
428 assert_response :not_found
429 assert_template "no_such_message"
433 # test the destroy action
436 second_user = create(:user)
437 other_user = create(:user)
438 read_message = create(:message, :read, :recipient => user, :sender => second_user)
439 sent_message = create(:message, :unread, :recipient => second_user, :sender => user)
441 # Check that destroying a message requires us to login
442 delete message_path(:id => read_message)
443 assert_response :forbidden
445 # Login as a user with no messages
446 session_for(other_user)
448 # Check that destroying a message we didn't send or receive fails
449 delete message_path(:id => read_message)
450 assert_response :not_found
451 assert_template "no_such_message"
453 # Login as the message recipient_user
456 # Check that the destroy a received message works
457 delete message_path(:id => read_message)
458 assert_redirected_to inbox_messages_path
459 assert_equal "Message deleted", flash[:notice]
460 m = Message.find(read_message.id)
461 assert m.from_user_visible
462 assert_not m.to_user_visible
464 # Check that the destroying a sent message works
465 delete message_path(:id => sent_message, :referer => outbox_messages_path)
466 assert_redirected_to outbox_messages_path
467 assert_equal "Message deleted", flash[:notice]
468 m = Message.find(sent_message.id)
469 assert_not m.from_user_visible
470 assert m.to_user_visible
472 # Asking to destroy a message with no ID should fail
474 assert_redirected_to inbox_messages_path
476 # Asking to destroy a message with a bogus ID should fail
477 delete message_path(:id => 99999)
478 assert_response :not_found
479 assert_template "no_such_message"