3 class DiaryEntryControllerTest < ActionController::TestCase
4 fixtures :users, :user_roles, :diary_entries, :diary_comments, :languages, :friends
6 include ActionView::Helpers::NumberHelper
9 # test all routes which lead to this controller
12 { :path => "/diary", :method => :get },
13 { :controller => "diary_entry", :action => "list" }
16 { :path => "/diary/language", :method => :get },
17 { :controller => "diary_entry", :action => "list", :language => "language" }
20 { :path => "/user/username/diary", :method => :get },
21 { :controller => "diary_entry", :action => "list", :display_name => "username" }
24 { :path => "/diary/friends", :method => :get },
25 { :controller => "diary_entry", :action => "list", :friends => true }
28 { :path => "/diary/nearby", :method => :get },
29 { :controller => "diary_entry", :action => "list", :nearby => true }
33 { :path => "/diary/rss", :method => :get },
34 { :controller => "diary_entry", :action => "rss", :format => :rss }
37 { :path => "/diary/language/rss", :method => :get },
38 { :controller => "diary_entry", :action => "rss", :language => "language", :format => :rss }
41 { :path => "/user/username/diary/rss", :method => :get },
42 { :controller => "diary_entry", :action => "rss", :display_name => "username", :format => :rss }
46 { :path => "/user/username/diary/comments", :method => :get },
47 { :controller => "diary_entry", :action => "comments", :display_name => "username" }
50 { :path => "/user/username/diary/comments/1", :method => :get },
51 { :controller => "diary_entry", :action => "comments", :display_name => "username", :page => "1" }
55 { :path => "/diary/new", :method => :get },
56 { :controller => "diary_entry", :action => "new" }
59 { :path => "/diary/new", :method => :post },
60 { :controller => "diary_entry", :action => "new" }
63 { :path => "/user/username/diary/1", :method => :get },
64 { :controller => "diary_entry", :action => "view", :display_name => "username", :id => "1" }
67 { :path => "/user/username/diary/1/edit", :method => :get },
68 { :controller => "diary_entry", :action => "edit", :display_name => "username", :id => "1" }
71 { :path => "/user/username/diary/1/edit", :method => :post },
72 { :controller => "diary_entry", :action => "edit", :display_name => "username", :id => "1" }
75 { :path => "/user/username/diary/1/newcomment", :method => :post },
76 { :controller => "diary_entry", :action => "comment", :display_name => "username", :id => "1" }
79 { :path => "/user/username/diary/1/hide", :method => :post },
80 { :controller => "diary_entry", :action => "hide", :display_name => "username", :id => "1" }
83 { :path => "/user/username/diary/1/hidecomment/2", :method => :post },
84 { :controller => "diary_entry", :action => "hidecomment", :display_name => "username", :id => "1", :comment => "2" }
89 # Make sure that you are redirected to the login page when you
92 assert_response :redirect
93 assert_redirected_to :controller => :user, :action => :login, :referer => "/diary/new"
95 # Now try again when logged in
96 get :new, {}, { :user => users(:normal_user).id }
97 assert_response :success
98 assert_select "title", :text => /New Diary Entry/, :count => 1
99 assert_select "div.content-heading", :count => 1 do
100 assert_select "h1", :text => /New Diary Entry/, :count => 1
102 assert_select "div#content", :count => 1 do
103 assert_select "form[action='/diary/new'][method=post]", :count => 1 do
104 assert_select "input#diary_entry_title[name='diary_entry[title]']", :count => 1
105 assert_select "textarea#diary_entry_body[name='diary_entry[body]']", :text => "", :count => 1
106 assert_select "select#diary_entry_language_code", :count => 1
107 assert_select "input#latitude[name='diary_entry[latitude]']", :count => 1
108 assert_select "input#longitude[name='diary_entry[longitude]']", :count => 1
109 assert_select "input[name=commit][type=submit][value=Save]", :count => 1
110 assert_select "input[name=commit][type=submit][value=Edit]", :count => 1
111 assert_select "input[name=commit][type=submit][value=Preview]", :count => 1
112 assert_select "input", :count => 7
116 new_title = "New Title"
117 new_body = "This is a new body for the diary entry"
119 new_longitude = "2.2"
120 new_language_code = "en"
122 # Now try creating a invalid diary entry with an empty body
123 assert_no_difference "DiaryEntry.count" do
124 post :new, { :commit => "save",
125 :diary_entry => { :title => new_title, :body => "", :latitude => new_latitude,
126 :longitude => new_longitude, :language_code => new_language_code } },
127 { :user => users(:normal_user).id }
129 assert_response :success
130 assert_template :edit
132 # Now try creating a diary entry
133 assert_difference "DiaryEntry.count", 1 do
134 post :new, { :commit => "save",
135 :diary_entry => { :title => new_title, :body => new_body, :latitude => new_latitude,
136 :longitude => new_longitude, :language_code => new_language_code } },
137 { :user => users(:normal_user).id }
139 assert_response :redirect
140 assert_redirected_to :action => :list, :display_name => users(:normal_user).display_name
141 entry = DiaryEntry.order(:id).last
142 assert_equal users(:normal_user).id, entry.user_id
143 assert_equal new_title, entry.title
144 assert_equal new_body, entry.body
145 assert_equal new_latitude.to_f, entry.latitude
146 assert_equal new_longitude.to_f, entry.longitude
147 assert_equal new_language_code, entry.language_code
151 entry = diary_entries(:normal_user_entry_1)
153 # Make sure that you are redirected to the login page when you are
154 # not logged in, without and with the id of the entry you want to edit
155 get :edit, :display_name => entry.user.display_name, :id => entry.id
156 assert_response :redirect
157 assert_redirected_to :controller => :user, :action => :login, :referer => "/user/#{entry.user.display_name}/diary/#{entry.id}/edit"
159 # Verify that you get a not found error, when you pass a bogus id
160 get :edit, { :display_name => entry.user.display_name, :id => 9999 }, { :user => entry.user.id }
161 assert_response :not_found
162 assert_select "div.content-heading", :count => 1 do
163 assert_select "h2", :text => "No entry with the id: 9999", :count => 1
166 # Verify that you get redirected to view if you are not the user
167 # that created the entry
168 get :edit, { :display_name => entry.user.display_name, :id => entry.id }, { :user => users(:public_user).id }
169 assert_response :redirect
170 assert_redirected_to :action => :view, :display_name => entry.user.display_name, :id => entry.id
172 # Now pass the id, and check that you can edit it, when using the same
173 # user as the person who created the entry
174 get :edit, { :display_name => entry.user.display_name, :id => entry.id }, { :user => entry.user.id }
175 assert_response :success
176 assert_select "title", :text => /Edit diary entry/, :count => 1
177 assert_select "div.content-heading", :count => 1 do
178 assert_select "h1", :text => /Edit diary entry/, :count => 1
180 assert_select "div#content", :count => 1 do
181 assert_select "form[action='/user/#{entry.user.display_name}/diary/#{entry.id}/edit'][method=post]", :count => 1 do
182 assert_select "input#diary_entry_title[name='diary_entry[title]'][value='#{entry.title}']", :count => 1
183 assert_select "textarea#diary_entry_body[name='diary_entry[body]']", :text => entry.body, :count => 1
184 assert_select "select#diary_entry_language_code", :count => 1
185 assert_select "input#latitude[name='diary_entry[latitude]']", :count => 1
186 assert_select "input#longitude[name='diary_entry[longitude]']", :count => 1
187 assert_select "input[name=commit][type=submit][value=Save]", :count => 1
188 assert_select "input[name=commit][type=submit][value=Edit]", :count => 1
189 assert_select "input[name=commit][type=submit][value=Preview]", :count => 1
190 assert_select "input", :count => 7
194 # Now lets see if you can edit the diary entry
195 new_title = "New Title"
196 new_body = "This is a new body for the diary entry"
198 new_longitude = "2.2"
199 new_language_code = "en"
200 post :edit, { :display_name => entry.user.display_name, :id => entry.id, :commit => "save",
201 :diary_entry => { :title => new_title, :body => new_body, :latitude => new_latitude,
202 :longitude => new_longitude, :language_code => new_language_code } },
203 { :user => entry.user.id }
204 assert_response :redirect
205 assert_redirected_to :action => :view, :display_name => entry.user.display_name, :id => entry.id
207 # Now check that the new data is rendered, when logged in
208 get :view, { :display_name => entry.user.display_name, :id => entry.id }, { :user => entry.user.id }
209 assert_response :success
210 assert_template "diary_entry/view"
211 assert_select "title", :text => /Users' diaries | /, :count => 1
212 assert_select "div.content-heading", :count => 1 do
213 assert_select "h2", :text => /#{entry.user.display_name}'s diary/, :count => 1
215 assert_select "div#content", :count => 1 do
216 assert_select "div.post_heading", :text => /#{new_title}/, :count => 1
217 # This next line won't work if the text has been run through the htmlize function
218 # due to formatting that could be introduced
219 assert_select "p", :text => /#{new_body}/, :count => 1
220 assert_select "abbr[class='geo'][title='#{number_with_precision(new_latitude, :precision => 4)}; #{number_with_precision(new_longitude, :precision => 4)}']", :count => 1
221 # As we're not logged in, check that you cannot edit
222 # print @response.body
223 assert_select "a[href='/user/#{entry.user.display_name}/diary/#{entry.id}/edit']", :text => "Edit this entry", :count => 1
226 # and when not logged in as the user who wrote the entry
227 get :view, { :display_name => entry.user.display_name, :id => entry.id }, { :user => entry.user.id }
228 assert_response :success
229 assert_template "diary_entry/view"
230 assert_select "title", :text => /Users' diaries | /, :count => 1
231 assert_select "div.content-heading", :count => 1 do
232 assert_select "h2", :text => /#{users(:normal_user).display_name}'s diary/, :count => 1
234 assert_select "div#content", :count => 1 do
235 assert_select "div.post_heading", :text => /#{new_title}/, :count => 1
236 # This next line won't work if the text has been run through the htmlize function
237 # due to formatting that could be introduced
238 assert_select "p", :text => /#{new_body}/, :count => 1
239 assert_select "abbr[class=geo][title='#{number_with_precision(new_latitude, :precision => 4)}; #{number_with_precision(new_longitude, :precision => 4)}']", :count => 1
240 # As we're not logged in, check that you cannot edit
241 assert_select "li[class='hidden show_if_user_#{entry.user.id}']", :count => 1 do
242 assert_select "a[href='/user/#{entry.user.display_name}/diary/#{entry.id}/edit']", :text => "Edit this entry", :count => 1
248 get :edit, { :display_name => users(:normal_user).display_name, :id => diary_entries(:normal_user_entry_1).id }, { :user => users(:normal_user).id }
249 assert_response :success
250 assert_select "span[class=translation_missing]", false, "Missing translation in edit diary entry"
254 entry = diary_entries(:normal_user_entry_1)
256 # Make sure that you are denied when you are not logged in
257 post :comment, :display_name => entry.user.display_name, :id => entry.id
258 assert_response :forbidden
260 # Verify that you get a not found error, when you pass a bogus id
261 post :comment, { :display_name => entry.user.display_name, :id => 9999 }, { :user => users(:public_user).id }
262 assert_response :not_found
263 assert_select "div.content-heading", :count => 1 do
264 assert_select "h2", :text => "No entry with the id: 9999", :count => 1
267 # Now try an invalid comment with an empty body
268 assert_no_difference "ActionMailer::Base.deliveries.size" do
269 assert_no_difference "DiaryComment.count" do
270 post :comment, { :display_name => entry.user.display_name, :id => entry.id, :diary_comment => { :body => "" } }, { :user => users(:public_user).id }
273 assert_response :success
274 assert_template :view
276 # Now try again with the right id
277 assert_difference "ActionMailer::Base.deliveries.size", 1 do
278 assert_difference "DiaryComment.count", 1 do
279 post :comment, { :display_name => entry.user.display_name, :id => entry.id, :diary_comment => { :body => "New comment" } }, { :user => users(:public_user).id }
282 assert_response :redirect
283 assert_redirected_to :action => :view, :display_name => entry.user.display_name, :id => entry.id
284 email = ActionMailer::Base.deliveries.first
285 assert_equal [users(:normal_user).email], email.to
286 assert_equal "[OpenStreetMap] #{users(:public_user).display_name} commented on your diary entry", email.subject
287 assert_match /New comment/, email.text_part.decoded
288 assert_match /New comment/, email.html_part.decoded
289 ActionMailer::Base.deliveries.clear
290 comment = DiaryComment.find(5)
291 assert_equal entry.id, comment.diary_entry_id
292 assert_equal users(:public_user).id, comment.user_id
293 assert_equal "New comment", comment.body
295 # Now view the diary entry, and check the new comment is present
296 get :view, :display_name => entry.user.display_name, :id => entry.id
297 assert_response :success
298 assert_select ".diary-comment", :count => 1 do
299 assert_select "#comment5", :count => 1 do
300 assert_select "a[href='/user/#{users(:public_user).display_name}']", :text => users(:public_user).display_name, :count => 1
302 assert_select ".richtext", :text => /New comment/, :count => 1
307 # Try a list of all diary entries
309 check_diary_list :normal_user_entry_1, :normal_user_geo_entry, :public_user_entry_1
313 # Try a list of diary entries for a valid user
314 get :list, :display_name => users(:normal_user).display_name
315 check_diary_list :normal_user_entry_1, :normal_user_geo_entry
317 # Try a list of diary entries for an invalid user
318 get :list, :display_name => "No Such User"
319 assert_response :not_found
320 assert_template "user/no_such_user"
323 def test_list_friends
324 # Try a list of diary entries for your friends when not logged in
325 get :list, :friends => true
326 assert_response :redirect
327 assert_redirected_to :controller => :user, :action => :login, :referer => "/diary/friends"
329 # Try a list of diary entries for your friends when logged in
330 get :list, { :friends => true }, { :user => users(:normal_user).id }
331 check_diary_list :public_user_entry_1
332 get :list, { :friends => true }, { :user => users(:public_user).id }
337 # Try a list of diary entries for nearby users when not logged in
338 get :list, :nearby => true
339 assert_response :redirect
340 assert_redirected_to :controller => :user, :action => :login, :referer => "/diary/nearby"
342 # Try a list of diary entries for nearby users when logged in
343 get :list, { :nearby => true }, { :user => users(:german_user).id }
344 check_diary_list :public_user_entry_1
345 get :list, { :nearby => true }, { :user => users(:public_user).id }
349 def test_list_language
350 # Try a list of diary entries in english
351 get :list, :language => "en"
352 check_diary_list :normal_user_entry_1, :public_user_entry_1
354 # Try a list of diary entries in german
355 get :list, :language => "de"
356 check_diary_list :normal_user_geo_entry
358 # Try a list of diary entries in slovenian
359 get :list, :language => "sl"
364 get :rss, :format => :rss
365 assert_response :success, "Should be able to get a diary RSS"
366 assert_select "rss", :count => 1 do
367 assert_select "channel", :count => 1 do
368 assert_select "channel>title", :count => 1
369 assert_select "image", :count => 1
370 assert_select "channel>item", :count => 3
375 def test_rss_language
376 get :rss, :language => diary_entries(:normal_user_entry_1).language_code, :format => :rss
377 assert_response :success, "Should be able to get a specific language diary RSS"
378 assert_select "rss>channel>item", :count => 2 # , "Diary entries should be filtered by language"
381 # def test_rss_nonexisting_language
382 # get :rss, {:language => 'xx', :format => :rss}
383 # assert_response :not_found, "Should not be able to get a nonexisting language diary RSS"
386 def test_rss_language_with_no_entries
387 get :rss, :language => "sl", :format => :rss
388 assert_response :success, "Should be able to get a specific language diary RSS"
389 assert_select "rss>channel>item", :count => 0 # , "Diary entries should be filtered by language"
393 get :rss, :display_name => users(:normal_user).display_name, :format => :rss
394 assert_response :success, "Should be able to get a specific users diary RSS"
395 assert_select "rss>channel>item", :count => 2 # , "Diary entries should be filtered by user"
398 def test_rss_nonexisting_user
399 # Try a user that has never existed
400 get :rss, :display_name => "fakeUsername76543", :format => :rss
401 assert_response :not_found, "Should not be able to get a nonexisting users diary RSS"
403 # Try a suspended user
404 get :rss, :display_name => users(:suspended_user).display_name, :format => :rss
405 assert_response :not_found, "Should not be able to get a suspended users diary RSS"
408 get :rss, :display_name => users(:deleted_user).display_name, :format => :rss
409 assert_response :not_found, "Should not be able to get a deleted users diary RSS"
413 # Try a normal entry that should work
414 get :view, :display_name => users(:normal_user).display_name, :id => diary_entries(:normal_user_entry_1).id
415 assert_response :success
416 assert_template :view
418 # Try a deleted entry
419 get :view, :display_name => users(:normal_user).display_name, :id => diary_entries(:deleted_entry).id
420 assert_response :not_found
422 # Try an entry by a suspended user
423 get :view, :display_name => users(:suspended_user).display_name, :id => diary_entries(:entry_by_suspended_user).id
424 assert_response :not_found
426 # Try an entry by a deleted user
427 get :view, :display_name => users(:deleted_user).display_name, :id => diary_entries(:entry_by_deleted_user).id
428 assert_response :not_found
431 def test_view_hidden_comments
432 # Get a diary entry that has hidden comments
433 get :view, :display_name => users(:normal_user).display_name, :id => diary_entries(:normal_user_geo_entry).id
434 assert_response :success
435 assert_template :view
436 assert_select "div.comments" do
437 assert_select "p#comment1", :count => 1 # visible comment
438 assert_select "p#comment2", :count => 0 # comment by suspended user
439 assert_select "p#comment3", :count => 0 # comment by deleted user
440 assert_select "p#comment4", :count => 0 # hidden comment
445 # Try without logging in
446 post :hide, :display_name => users(:normal_user).display_name, :id => diary_entries(:normal_user_entry_1).id
447 assert_response :forbidden
448 assert_equal true, DiaryEntry.find(diary_entries(:normal_user_entry_1).id).visible
450 # Now try as a normal user
451 post :hide, { :display_name => users(:normal_user).display_name, :id => diary_entries(:normal_user_entry_1).id }, { :user => users(:normal_user).id }
452 assert_response :redirect
453 assert_redirected_to :action => :view, :display_name => users(:normal_user).display_name, :id => diary_entries(:normal_user_entry_1).id
454 assert_equal true, DiaryEntry.find(diary_entries(:normal_user_entry_1).id).visible
456 # Finally try as an administrator
457 post :hide, { :display_name => users(:normal_user).display_name, :id => diary_entries(:normal_user_entry_1).id }, { :user => users(:administrator_user).id }
458 assert_response :redirect
459 assert_redirected_to :action => :list, :display_name => users(:normal_user).display_name
460 assert_equal false, DiaryEntry.find(diary_entries(:normal_user_entry_1).id).visible
464 # Try without logging in
465 post :hidecomment, :display_name => users(:normal_user).display_name, :id => diary_entries(:normal_user_geo_entry).id, :comment => diary_comments(:comment_for_geo_post).id
466 assert_response :forbidden
467 assert_equal true, DiaryComment.find(diary_comments(:comment_for_geo_post).id).visible
469 # Now try as a normal user
470 post :hidecomment, { :display_name => users(:normal_user).display_name, :id => diary_entries(:normal_user_geo_entry).id, :comment => diary_comments(:comment_for_geo_post).id }, { :user => users(:normal_user).id }
471 assert_response :redirect
472 assert_redirected_to :action => :view, :display_name => users(:normal_user).display_name, :id => diary_entries(:normal_user_geo_entry).id
473 assert_equal true, DiaryComment.find(diary_comments(:comment_for_geo_post).id).visible
475 # Finally try as an administrator
476 post :hidecomment, { :display_name => users(:normal_user).display_name, :id => diary_entries(:normal_user_geo_entry).id, :comment => diary_comments(:comment_for_geo_post).id }, { :user => users(:administrator_user).id }
477 assert_response :redirect
478 assert_redirected_to :action => :view, :display_name => users(:normal_user).display_name, :id => diary_entries(:normal_user_geo_entry).id
479 assert_equal false, DiaryComment.find(diary_comments(:comment_for_geo_post).id).visible
483 # Test a user with no comments
484 get :comments, :display_name => users(:normal_user).display_name
485 assert_response :success
486 assert_template :comments
487 assert_select "table.messages" do
488 assert_select "tr", :count => 1 # header, no comments
491 # Test a user with a comment
492 get :comments, :display_name => users(:public_user).display_name
493 assert_response :success
494 assert_template :comments
495 assert_select "table.messages" do
496 assert_select "tr", :count => 2 # header and one comment
499 # Test a suspended user
500 get :comments, :display_name => users(:suspended_user).display_name
501 assert_response :not_found
503 # Test a deleted user
504 get :comments, :display_name => users(:deleted_user).display_name
505 assert_response :not_found
510 def check_diary_list(*entries)
511 assert_response :success
512 assert_template "list"
513 assert_no_missing_translations
514 assert_select "div.diary_post", entries.count
516 entries.each do |entry|
517 entry = diary_entries(entry)
518 assert_select "a[href=?]", "/user/#{entry.user.display_name}/diary/#{entry.id}"