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 a bogus ID should fail
267 get message_reply_path(:message_id => 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 unread_message = create(:message, :unread, :sender => user, :recipient => recipient_user)
280 # Check that the show message page requires us to login
281 get message_path(:id => unread_message)
282 assert_redirected_to login_path(:referer => message_path(:id => unread_message.id))
284 # Login as the wrong user
285 session_for(other_user)
287 # Check that we can't read the message
288 get message_path(:id => unread_message)
289 assert_redirected_to login_path(:referer => message_path(:id => unread_message.id))
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(:id => unread_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(unread_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(:id => unread_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(unread_message.id).message_read
312 # Asking to read a message with a bogus ID should fail
313 get message_path(:id => 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
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")
404 assert_response :see_other
405 assert Message.find(unread_message.id).message_read
407 # Check that the marking a message unread via XHR works
408 post message_mark_path(:message_id => unread_message, :mark => "unread")
409 assert_response :see_other
410 assert_not Message.find(unread_message.id).message_read
412 # Asking to mark a message with a bogus ID should fail
413 post message_mark_path(:message_id => 99999)
414 assert_response :not_found
415 assert_template "no_such_message"
419 # test the destroy action
422 second_user = create(:user)
423 other_user = create(:user)
424 read_message = create(:message, :read, :recipient => user, :sender => second_user)
425 sent_message = create(:message, :unread, :recipient => second_user, :sender => user)
427 # Check that destroying a message requires us to login
428 delete message_path(:id => read_message)
429 assert_response :forbidden
431 # Login as a user with no messages
432 session_for(other_user)
434 # Check that destroying a message we didn't send or receive fails
435 delete message_path(:id => read_message)
436 assert_response :not_found
437 assert_template "no_such_message"
439 # Login as the message recipient_user
442 # Check that the destroy a received message works
443 delete message_path(:id => read_message)
444 assert_redirected_to inbox_messages_path
445 assert_equal "Message deleted", flash[:notice]
446 m = Message.find(read_message.id)
447 assert m.from_user_visible
448 assert_not m.to_user_visible
450 # Check that the destroying a sent message works
451 delete message_path(:id => sent_message, :referer => outbox_messages_path)
452 assert_redirected_to outbox_messages_path
453 assert_equal "Message deleted", flash[:notice]
454 m = Message.find(sent_message.id)
455 assert_not m.from_user_visible
456 assert m.to_user_visible
458 # Asking to destroy a message with a bogus ID should fail
459 delete message_path(:id => 99999)
460 assert_response :not_found
461 assert_template "no_such_message"