3 class DiaryEntriesControllerTest < ActionDispatch::IntegrationTest
 
   4   include ActionView::Helpers::NumberHelper
 
   8     # Create the default language for diary entries
 
   9     create(:language, :code => "en")
 
  10     # Stub nominatim response for diary entry locations
 
  11     stub_request(:get, %r{^https://nominatim\.openstreetmap\.org/reverse\?})
 
  12       .to_return(:status => 404)
 
  16   # test all routes which lead to this controller
 
  19       { :path => "/diary", :method => :get },
 
  20       { :controller => "diary_entries", :action => "index" }
 
  23       { :path => "/diary/language", :method => :get },
 
  24       { :controller => "diary_entries", :action => "index", :language => "language" }
 
  27       { :path => "/user/username/diary", :method => :get },
 
  28       { :controller => "diary_entries", :action => "index", :display_name => "username" }
 
  31       { :path => "/diary/friends", :method => :get },
 
  32       { :controller => "diary_entries", :action => "index", :friends => true }
 
  35       { :path => "/diary/nearby", :method => :get },
 
  36       { :controller => "diary_entries", :action => "index", :nearby => true }
 
  40       { :path => "/diary/rss", :method => :get },
 
  41       { :controller => "diary_entries", :action => "rss", :format => :rss }
 
  44       { :path => "/diary/language/rss", :method => :get },
 
  45       { :controller => "diary_entries", :action => "rss", :language => "language", :format => :rss }
 
  48       { :path => "/user/username/diary/rss", :method => :get },
 
  49       { :controller => "diary_entries", :action => "rss", :display_name => "username", :format => :rss }
 
  53       { :path => "/diary/new", :method => :get },
 
  54       { :controller => "diary_entries", :action => "new" }
 
  57       { :path => "/diary", :method => :post },
 
  58       { :controller => "diary_entries", :action => "create" }
 
  61       { :path => "/user/username/diary/1", :method => :get },
 
  62       { :controller => "diary_entries", :action => "show", :display_name => "username", :id => "1" }
 
  65       { :path => "/user/username/diary/1/edit", :method => :get },
 
  66       { :controller => "diary_entries", :action => "edit", :display_name => "username", :id => "1" }
 
  69       { :path => "/user/username/diary/1", :method => :put },
 
  70       { :controller => "diary_entries", :action => "update", :display_name => "username", :id => "1" }
 
  73       { :path => "/user/username/diary/1/hide", :method => :post },
 
  74       { :controller => "diary_entries", :action => "hide", :display_name => "username", :id => "1" }
 
  77       { :path => "/user/username/diary/1/unhide", :method => :post },
 
  78       { :controller => "diary_entries", :action => "unhide", :display_name => "username", :id => "1" }
 
  81       { :path => "/user/username/diary/1/subscribe", :method => :get },
 
  82       { :controller => "diary_entries", :action => "subscribe", :display_name => "username", :id => "1" }
 
  85       { :path => "/user/username/diary/1/subscribe", :method => :post },
 
  86       { :controller => "diary_entries", :action => "subscribe", :display_name => "username", :id => "1" }
 
  89       { :path => "/user/username/diary/1/unsubscribe", :method => :get },
 
  90       { :controller => "diary_entries", :action => "unsubscribe", :display_name => "username", :id => "1" }
 
  93       { :path => "/user/username/diary/1/unsubscribe", :method => :post },
 
  94       { :controller => "diary_entries", :action => "unsubscribe", :display_name => "username", :id => "1" }
 
  99     # Make sure that you are redirected to the login page when you
 
 101     get new_diary_entry_path
 
 102     assert_redirected_to login_path(:referer => "/diary/new")
 
 106     # Now try again when logged in
 
 107     session_for(create(:user, :languages => ["en"]))
 
 109     get new_diary_entry_path
 
 111     assert_response :success
 
 112     assert_dom "title", :text => /New Diary Entry/, :count => 1
 
 113     assert_dom "div.content-heading", :count => 1 do
 
 114       assert_dom "h1", :text => /New Diary Entry/, :count => 1
 
 116     assert_dom "div#content", :count => 1 do
 
 117       assert_dom "form[action='/diary'][method=post]", :count => 1 do
 
 118         assert_dom "input#diary_entry_title[name='diary_entry[title]']", :count => 1
 
 119         assert_dom "textarea#diary_entry_body[name='diary_entry[body]']", :text => "", :count => 1
 
 120         assert_dom "select#diary_entry_language_code", :count => 1 do
 
 121           assert_dom "option[selected]", :count => 1 do
 
 122             assert_dom "> @value", "en"
 
 125         assert_dom "input#latitude[name='diary_entry[latitude]']", :count => 1
 
 126         assert_dom "input#longitude[name='diary_entry[longitude]']", :count => 1
 
 127         assert_dom "input[name=commit][type=submit][value=Publish]", :count => 1
 
 128         assert_dom "button[type=button]", :text => "Edit", :count => 1
 
 129         assert_dom "button[type=button]", :text => "Preview", :count => 1
 
 130         assert_dom "input", :count => 4
 
 135   def test_new_get_with_params
 
 136     create(:language, :code => "fr")
 
 137     # Now try creating a diary entry using get
 
 138     session_for(create(:user, :languages => ["en"]))
 
 140     assert_difference "DiaryEntry.count", 0 do
 
 141       get new_diary_entry_path(:diary_entry => { :title => "New Title", :body => "This is a new body for the diary entry", :latitude => "1.1",
 
 142                                                  :longitude => "2.2", :language_code => "fr" })
 
 145     assert_response :success
 
 147     assert_dom "div#content", :count => 1 do
 
 148       assert_dom "form[action='/diary'][method=post]", :count => 1 do
 
 149         assert_dom "input#diary_entry_title[name='diary_entry[title]']", :count => 1 do
 
 150           assert_dom "> @value", "New Title"
 
 152         assert_dom "textarea#diary_entry_body[name='diary_entry[body]']", :count => 1, :text => "This is a new body for the diary entry"
 
 153         assert_dom "select#diary_entry_language_code", :count => 1 do
 
 154           assert_dom "option[selected]", :count => 1 do
 
 155             assert_dom "> @value", "fr"
 
 158         assert_dom "input#latitude[name='diary_entry[latitude]']", :count => 1 do
 
 159           assert_dom "> @value", "1.1"
 
 161         assert_dom "input#longitude[name='diary_entry[longitude]']", :count => 1 do
 
 162           assert_dom "> @value", "2.2"
 
 168   def test_create_no_body
 
 169     # Now try creating a invalid diary entry with an empty body
 
 172     assert_no_difference "DiaryEntry.count" do
 
 173       post diary_entries_path(:diary_entry => { :title => "New Title", :body => "", :latitude => "1.1",
 
 174                                                 :longitude => "2.2", :language_code => "en" })
 
 176     assert_response :success
 
 179     assert_nil UserPreference.find_by(:user => user, :k => "diary.default_language")
 
 183     # Now try creating a diary entry
 
 186     assert_difference "DiaryEntry.count", 1 do
 
 187       post diary_entries_path(:diary_entry => { :title => "New Title", :body => "This is a new body for the diary entry", :latitude => "1.1",
 
 188                                                 :longitude => "2.2", :language_code => "en" })
 
 190     entry = DiaryEntry.last
 
 191     assert_redirected_to diary_entry_path(user, entry)
 
 192     assert_equal user.id, entry.user_id
 
 193     assert_equal "New Title", entry.title
 
 194     assert_equal "This is a new body for the diary entry", entry.body
 
 195     assert_equal "1.1".to_f, entry.latitude
 
 196     assert_equal "2.2".to_f, entry.longitude
 
 197     assert_equal "en", entry.language_code
 
 199     # checks if user was subscribed
 
 200     assert_equal 1, entry.subscribers.length
 
 202     assert_equal "en", UserPreference.find_by(:user => user, :k => "diary.default_language").v
 
 205   def test_create_german
 
 206     create(:language, :code => "de")
 
 210     # Now try creating a diary entry in a different language
 
 211     assert_difference "DiaryEntry.count", 1 do
 
 212       post diary_entries_path(:diary_entry => { :title => "New Title", :body => "This is a new body for the diary entry", :latitude => "1.1",
 
 213                                                 :longitude => "2.2", :language_code => "de" })
 
 215     entry = DiaryEntry.last
 
 216     assert_redirected_to diary_entry_path(user, entry)
 
 217     assert_equal user.id, entry.user_id
 
 218     assert_equal "New Title", entry.title
 
 219     assert_equal "This is a new body for the diary entry", entry.body
 
 220     assert_equal "1.1".to_f, entry.latitude
 
 221     assert_equal "2.2".to_f, entry.longitude
 
 222     assert_equal "de", entry.language_code
 
 224     # checks if user was subscribed
 
 225     assert_equal 1, entry.subscribers.length
 
 227     assert_equal "de", UserPreference.find_by(:user => user, :k => "diary.default_language").v
 
 234     # Generate some spammy content
 
 235     spammy_title = "Spam Spam Spam Spam Spam"
 
 236     spammy_body = 1.upto(50).map { |n| "http://example.com/spam#{n}" }.join(" ")
 
 238     # Try creating a spammy diary entry
 
 239     assert_difference "DiaryEntry.count", 1 do
 
 240       post diary_entries_path(:diary_entry => { :title => spammy_title, :body => spammy_body, :language_code => "en" })
 
 242     entry = DiaryEntry.last
 
 243     assert_redirected_to diary_entry_path(user, entry)
 
 244     assert_equal user.id, entry.user_id
 
 245     assert_equal spammy_title, entry.title
 
 246     assert_equal spammy_body, entry.body
 
 247     assert_equal "en", entry.language_code
 
 248     assert_equal "suspended", User.find(user.id).status
 
 250     # Follow the redirect
 
 251     get diary_entries_path(:display_name => user.display_name)
 
 252     assert_redirected_to :controller => :users, :action => :suspended
 
 257     other_user = create(:user)
 
 259     entry = create(:diary_entry, :user => user)
 
 261     # Make sure that you are redirected to the login page when you are
 
 262     # not logged in, without and with the id of the entry you want to edit
 
 263     get edit_diary_entry_path(entry.user, entry)
 
 264     assert_redirected_to login_path(:referer => "/user/#{ERB::Util.u(entry.user.display_name)}/diary/#{entry.id}/edit")
 
 266     session_for(other_user)
 
 268     # Verify that you get redirected to show if you are not the user
 
 269     # that created the entry
 
 270     get edit_diary_entry_path(entry.user, entry)
 
 271     assert_redirected_to :action => :show, :display_name => entry.user.display_name, :id => entry.id
 
 273     session_for(entry.user)
 
 275     # Verify that you get a not found error, when you pass a bogus id
 
 276     get edit_diary_entry_path(entry.user, :id => 9999)
 
 277     assert_response :not_found
 
 278     assert_select "div.content-heading", :count => 1 do
 
 279       assert_select "h1", :text => "No entry with the id: 9999", :count => 1
 
 282     # Now pass the id, and check that you can edit it, when using the same
 
 283     # user as the person who created the entry
 
 284     get edit_diary_entry_path(entry.user, entry)
 
 285     assert_response :success
 
 286     assert_select "title", :text => /Edit Diary Entry/, :count => 1
 
 287     assert_select "div.content-heading", :count => 1 do
 
 288       assert_select "h1", :text => /Edit Diary Entry/, :count => 1
 
 290     assert_select "div#content", :count => 1 do
 
 291       assert_select "form[action='/user/#{ERB::Util.u(entry.user.display_name)}/diary/#{entry.id}'][method=post]", :count => 1 do
 
 292         assert_select "input#diary_entry_title[name='diary_entry[title]'][value='#{entry.title}']", :count => 1
 
 293         assert_select "textarea#diary_entry_body[name='diary_entry[body]']", :text => entry.body, :count => 1
 
 294         assert_select "select#diary_entry_language_code", :count => 1
 
 295         assert_select "input#latitude[name='diary_entry[latitude]']", :count => 1
 
 296         assert_select "input#longitude[name='diary_entry[longitude]']", :count => 1
 
 297         assert_select "input[name=commit][type=submit][value=Update]", :count => 1
 
 298         assert_select "button[type=button]", :text => "Edit", :count => 1
 
 299         assert_select "button[type=button]", :text => "Preview", :count => 1
 
 300         assert_select "input", :count => 5
 
 304     # Now lets see if you can edit the diary entry
 
 305     new_title = "New Title"
 
 306     new_body = "This is a new body for the diary entry"
 
 308     new_longitude = "2.2"
 
 309     new_language_code = "en"
 
 310     put diary_entry_path(entry.user, entry, :diary_entry => { :title => new_title, :body => new_body, :latitude => new_latitude,
 
 311                                                               :longitude => new_longitude, :language_code => new_language_code })
 
 312     assert_redirected_to :action => :show, :display_name => entry.user.display_name, :id => entry.id
 
 314     # Now check that the new data is rendered, when logged in
 
 315     get diary_entry_path(entry.user, entry)
 
 316     assert_response :success
 
 317     assert_template "show"
 
 318     assert_select "head title", :text => /Users' Diaries | /, :count => 1
 
 319     assert_select "div.content-heading", :count => 1 do
 
 320       assert_select "h1", :text => /#{entry.user.display_name}'s Diary/, :count => 1
 
 322     assert_select "div#content", :count => 1 do
 
 323       assert_select "h2", :text => /#{new_title}/, :count => 1
 
 324       # This next line won't work if the text has been run through the htmlize function
 
 325       # due to formatting that could be introduced
 
 326       assert_select "p", :text => /#{new_body}/, :count => 1
 
 327       assert_select "abbr[class='geo'][title='#{number_with_precision(new_latitude, :precision => 4)}; #{number_with_precision(new_longitude, :precision => 4)}']", :count => 1
 
 328       # As we're not logged in, check that you cannot edit
 
 329       assert_select "a[href='/user/#{ERB::Util.u(entry.user.display_name)}/diary/#{entry.id}/edit']", :text => "Edit this entry", :count => 1
 
 332     # and when not logged in as the user who wrote the entry
 
 333     session_for(create(:user))
 
 334     get diary_entry_path(entry.user, entry)
 
 335     assert_response :success
 
 336     assert_template "show"
 
 337     assert_select "head title", :text => /Users' Diaries | /, :count => 1
 
 338     assert_select "div.content-heading", :count => 1 do
 
 339       assert_select "h1", :text => /#{entry.user.display_name}'s Diary/, :count => 1
 
 341     assert_select "div#content", :count => 1 do
 
 342       assert_select "h2", :text => /#{new_title}/, :count => 1
 
 343       # This next line won't work if the text has been run through the htmlize function
 
 344       # due to formatting that could be introduced
 
 345       assert_select "p", :text => /#{new_body}/, :count => 1
 
 346       assert_select "abbr[class=geo][title='#{number_with_precision(new_latitude, :precision => 4)}; #{number_with_precision(new_longitude, :precision => 4)}']", :count => 1
 
 347       # As we're not logged in, check that you cannot edit
 
 348       assert_select "a[href='/user/#{ERB::Util.u(entry.user.display_name)}/diary/#{entry.id}/edit']", false
 
 354     diary_entry = create(:diary_entry, :language_code => "en", :user => user)
 
 356     get edit_diary_entry_path(user, diary_entry)
 
 357     assert_response :success
 
 358     assert_select "span[class=translation_missing]", false, "Missing translation in edit diary entry"
 
 363     other_user = create(:user)
 
 364     diary_entry = create(:diary_entry, :language_code => "en", :user => user, :title => "Original Title")
 
 366     put diary_entry_path(user, diary_entry, :diary_entry => { :title => "Updated Title" })
 
 367     assert_response :forbidden
 
 369     assert_equal "Original Title", diary_entry.title
 
 371     session_for(other_user)
 
 372     put diary_entry_path(user, diary_entry, :diary_entry => { :title => "Updated Title" })
 
 373     assert_redirected_to diary_entry_path(user, diary_entry)
 
 375     assert_equal "Original Title", diary_entry.title
 
 378     put diary_entry_path(user, diary_entry, :diary_entry => { :title => "Updated Title" })
 
 379     assert_redirected_to diary_entry_path(user, diary_entry)
 
 381     assert_equal "Updated Title", diary_entry.title
 
 385     diary_entry = create(:diary_entry)
 
 386     geo_entry = create(:diary_entry, :latitude => 51.50763, :longitude => -0.10781)
 
 387     public_entry = create(:diary_entry, :user => create(:user))
 
 389     # Try a list of all diary entries
 
 390     get diary_entries_path
 
 391     check_diary_index diary_entry, geo_entry, public_entry
 
 396     other_user = create(:user)
 
 398     diary_entry = create(:diary_entry, :user => user)
 
 399     geo_entry = create(:diary_entry, :user => user, :latitude => 51.50763, :longitude => -0.10781)
 
 400     _other_entry = create(:diary_entry, :user => other_user)
 
 402     # Try a list of diary entries for a valid user
 
 403     get diary_entries_path(:display_name => user.display_name)
 
 404     check_diary_index diary_entry, geo_entry
 
 406     # Try a list of diary entries for an invalid user
 
 407     get diary_entries_path(:display_name => "No Such User")
 
 408     assert_response :not_found
 
 409     assert_template "users/no_such_user"
 
 412   def test_index_friends
 
 414     other_user = create(:user)
 
 415     follow = create(:follow, :follower => user)
 
 416     diary_entry = create(:diary_entry, :user => follow.following)
 
 417     _other_entry = create(:diary_entry, :user => other_user)
 
 419     # Try a list of diary entries for your friends when not logged in
 
 420     get friends_diary_entries_path
 
 421     assert_redirected_to login_path(:referer => "/diary/friends")
 
 423     # Try a list of diary entries for your friends when logged in
 
 425     get friends_diary_entries_path
 
 426     check_diary_index diary_entry
 
 427     session_for(other_user)
 
 428     get friends_diary_entries_path
 
 432   def test_index_nearby
 
 433     user = create(:user, :home_lat => 12, :home_lon => 12)
 
 434     nearby_user = create(:user, :home_lat => 11.9, :home_lon => 12.1)
 
 436     diary_entry = create(:diary_entry, :user => user)
 
 438     # Try a list of diary entries for nearby users when not logged in
 
 439     get nearby_diary_entries_path
 
 440     assert_redirected_to login_path(:referer => "/diary/nearby")
 
 442     # Try a list of diary entries for nearby users when logged in
 
 443     session_for(nearby_user)
 
 444     get nearby_diary_entries_path
 
 445     check_diary_index diary_entry
 
 447     get nearby_diary_entries_path
 
 451   def test_index_language
 
 452     create(:language, :code => "de")
 
 453     create(:language, :code => "sl")
 
 454     diary_entry_en = create(:diary_entry, :language_code => "en")
 
 455     diary_entry_en2 = create(:diary_entry, :language_code => "en")
 
 456     diary_entry_de = create(:diary_entry, :language_code => "de")
 
 458     # Try a list of diary entries in english
 
 459     get diary_entries_path(:language => "en")
 
 460     check_diary_index diary_entry_en, diary_entry_en2
 
 462     # Try a list of diary entries in german
 
 463     get diary_entries_path(:language => "de")
 
 464     check_diary_index diary_entry_de
 
 466     # Try a list of diary entries in slovenian
 
 467     get diary_entries_path(:language => "sl")
 
 472     # Create several pages worth of diary entries
 
 473     create_list(:diary_entry, 50)
 
 474     next_path = diary_entries_path
 
 476     # Try and get the index
 
 478     assert_response :success
 
 479     assert_select "article.diary_post", :count => 20
 
 480     check_no_page_link "Newer Entries"
 
 481     next_path = check_page_link "Older Entries"
 
 483     # Try and get the second page
 
 485     assert_response :success
 
 486     assert_select "article.diary_post", :count => 20
 
 487     check_page_link "Newer Entries"
 
 488     next_path = check_page_link "Older Entries"
 
 490     # Try and get the third page
 
 492     assert_response :success
 
 493     assert_select "article.diary_post", :count => 10
 
 494     next_path = check_page_link "Newer Entries"
 
 495     check_no_page_link "Older Entries"
 
 497     # Go back to the second page
 
 499     assert_response :success
 
 500     assert_select "article.diary_post", :count => 20
 
 501     next_path = check_page_link "Newer Entries"
 
 502     check_page_link "Older Entries"
 
 504     # Go back to the first page
 
 506     assert_response :success
 
 507     assert_select "article.diary_post", :count => 20
 
 508     check_no_page_link "Newer Entries"
 
 509     check_page_link "Older Entries"
 
 512   def test_index_invalid_paged
 
 513     # Try some invalid paged accesses
 
 514     %w[-1 fred].each do |id|
 
 515       get diary_entries_path(:before => id)
 
 516       assert_redirected_to :controller => :errors, :action => :bad_request
 
 518       get diary_entries_path(:after => id)
 
 519       assert_redirected_to :controller => :errors, :action => :bad_request
 
 524     create(:language, :code => "de")
 
 525     create(:diary_entry, :language_code => "en")
 
 526     create(:diary_entry, :language_code => "en")
 
 527     create(:diary_entry, :language_code => "de")
 
 530     assert_response :success, "Should be able to get a diary RSS"
 
 531     assert_select "rss", :count => 1 do
 
 532       assert_select "channel", :count => 1 do
 
 533         assert_select "channel>title", :count => 1
 
 534         assert_select "image", :count => 1
 
 535         assert_select "channel>item", :count => 3
 
 540   def test_rss_language
 
 541     create(:language, :code => "de")
 
 542     create(:diary_entry, :language_code => "en")
 
 543     create(:diary_entry, :language_code => "en")
 
 544     create(:diary_entry, :language_code => "de")
 
 546     get diary_rss_path(:language => "en")
 
 547     assert_response :success, "Should be able to get a specific language diary RSS"
 
 548     assert_select "rss>channel>item", :count => 2 # , "Diary entries should be filtered by language"
 
 551   #  def test_rss_nonexisting_language
 
 552   #    get :rss, :params => { :language => 'xx', :format => :rss }
 
 553   #    assert_response :not_found, "Should not be able to get a nonexisting language diary RSS"
 
 556   def test_rss_language_with_no_entries
 
 557     create(:language, :code => "sl")
 
 558     create(:diary_entry, :language_code => "en")
 
 560     get diary_rss_path(:language => "sl")
 
 561     assert_response :success, "Should be able to get a specific language diary RSS"
 
 562     assert_select "rss>channel>item", :count => 0 # , "Diary entries should be filtered by language"
 
 567     other_user = create(:user)
 
 568     create(:diary_entry, :user => user)
 
 569     create(:diary_entry, :user => user)
 
 570     create(:diary_entry, :user => other_user)
 
 572     get diary_rss_path(:display_name => user.display_name)
 
 573     assert_response :success, "Should be able to get a specific users diary RSS"
 
 574     assert_select "rss>channel>item", :count => 2 # , "Diary entries should be filtered by user"
 
 577   def test_rss_nonexisting_user
 
 578     # Try a user that has never existed
 
 579     get diary_rss_path(:display_name => "fakeUsername76543")
 
 580     assert_response :not_found, "Should not be able to get a nonexisting users diary RSS"
 
 582     # Try a suspended user
 
 583     get diary_rss_path(:display_name => create(:user, :suspended).display_name)
 
 584     assert_response :not_found, "Should not be able to get a suspended users diary RSS"
 
 587     get diary_rss_path(:display_name => create(:user, :deleted).display_name)
 
 588     assert_response :not_found, "Should not be able to get a deleted users diary RSS"
 
 591   def test_rss_character_escaping
 
 592     create(:diary_entry, :title => "<script>")
 
 595     assert_match "<title><script></title>", response.body
 
 599     create(:diary_entry, :created_at => 7.hours.ago)
 
 600     create(:diary_entry, :created_at => 5.hours.ago)
 
 602     assert_select "rss>channel>item", :count => 2
 
 604     with_settings(:diary_feed_delay => 6) do
 
 606       assert_select "rss>channel>item", :count => 1
 
 612     suspended_user = create(:user, :suspended)
 
 613     deleted_user = create(:user, :deleted)
 
 615     # Try a normal entry that should work
 
 616     diary_entry = create(:diary_entry, :user => user)
 
 617     get diary_entry_path(user, diary_entry)
 
 618     assert_response :success
 
 619     assert_template :show
 
 621     # Try a non-integer ID
 
 622     get "/user/#{CGI.escape(user.display_name)}/diary/#{diary_entry.id})"
 
 623     assert_response :not_found
 
 624     assert_template "rescues/routing_error"
 
 626     # Try a deleted entry
 
 627     diary_entry_deleted = create(:diary_entry, :user => user, :visible => false)
 
 628     get diary_entry_path(user, diary_entry_deleted)
 
 629     assert_response :not_found
 
 631     # Try an entry by a suspended user
 
 632     diary_entry_suspended_user = create(:diary_entry, :user => suspended_user)
 
 633     get diary_entry_path(suspended_user, diary_entry_suspended_user)
 
 634     assert_response :not_found
 
 636     # Try an entry by a deleted user
 
 637     diary_entry_deleted_user = create(:diary_entry, :user => deleted_user)
 
 638     get diary_entry_path(deleted_user, diary_entry_deleted_user)
 
 639     assert_response :not_found
 
 641     # Now try as a moderator
 
 642     session_for(create(:moderator_user))
 
 643     get diary_entry_path(user, diary_entry_deleted)
 
 644     assert_response :success
 
 645     assert_template :show
 
 647     # Finally try as an administrator
 
 648     session_for(create(:administrator_user))
 
 649     get diary_entry_path(user, diary_entry_deleted)
 
 650     assert_response :success
 
 651     assert_template :show
 
 654   def test_show_hidden_comments
 
 655     # Get a diary entry that has hidden comments
 
 657     diary_entry = create(:diary_entry, :user => user)
 
 658     visible_comment = create(:diary_comment, :diary_entry => diary_entry)
 
 659     suspended_user_comment = create(:diary_comment, :diary_entry => diary_entry, :user => create(:user, :suspended))
 
 660     deleted_user_comment = create(:diary_comment, :diary_entry => diary_entry, :user => create(:user, :deleted))
 
 661     hidden_comment = create(:diary_comment, :diary_entry => diary_entry, :visible => false)
 
 663     get diary_entry_path(user, diary_entry)
 
 664     assert_response :success
 
 665     assert_template :show
 
 666     assert_select "div.comments" do
 
 667       assert_select "p#comment#{visible_comment.id}", :count => 1
 
 668       assert_select "p#comment#{suspended_user_comment.id}", :count => 0
 
 669       assert_select "p#comment#{deleted_user_comment.id}", :count => 0
 
 670       assert_select "p#comment#{hidden_comment.id}", :count => 0
 
 674   def test_show_og_title
 
 676     diary_entry = create(:diary_entry, :user => user, :title => "The Important Blog Post")
 
 678     get diary_entry_path(user, diary_entry)
 
 679     assert_response :success
 
 680     assert_dom "head meta[property='og:title']" do
 
 681       assert_dom "> @content", "The Important Blog Post"
 
 685   def test_show_og_image_with_no_image
 
 687     diary_entry = create(:diary_entry, :user => user, :body => "nothing")
 
 689     get diary_entry_path(user, diary_entry)
 
 690     assert_response :success
 
 691     assert_dom "head meta[property='og:image']" do
 
 692       assert_dom "> @content", ActionController::Base.helpers.image_url("osm_logo_256.png", :host => root_url)
 
 694     assert_dom "head meta[property='og:image:alt']" do
 
 695       assert_dom "> @content", "OpenStreetMap logo"
 
 699   def test_show_og_image
 
 701     diary_entry = create(:diary_entry, :user => user, :body => "")
 
 703     get diary_entry_path(user, diary_entry)
 
 704     assert_response :success
 
 705     assert_dom "head meta[property='og:image']" do
 
 706       assert_dom "> @content", "https://example.com/picture.jpg"
 
 708     assert_dom "head meta[property='og:image:alt']" do
 
 709       assert_dom "> @content", "some picture"
 
 713   def test_show_og_image_with_relative_uri
 
 715     diary_entry = create(:diary_entry, :user => user, :body => "")
 
 717     get diary_entry_path(user, diary_entry)
 
 718     assert_response :success
 
 719     assert_dom "head meta[property='og:image']" do
 
 720       assert_dom "> @content", "#{root_url}picture.jpg"
 
 722     assert_dom "head meta[property='og:image:alt']" do
 
 723       assert_dom "> @content", "some local picture"
 
 727   def test_show_og_image_with_spaces
 
 729     diary_entry = create(:diary_entry, :user => user, :body => "")
 
 731     get diary_entry_path(user, diary_entry)
 
 732     assert_response :success
 
 733     assert_dom "head meta[property='og:image']" do
 
 734       assert_dom "> @content", "https://example.com/the%20picture.jpg"
 
 736     assert_dom "head meta[property='og:image:alt']" do
 
 737       assert_dom "> @content", "some picture"
 
 741   def test_show_og_image_with_relative_uri_and_spaces
 
 743     diary_entry = create(:diary_entry, :user => user, :body => "")
 
 745     get diary_entry_path(user, diary_entry)
 
 746     assert_response :success
 
 747     assert_dom "head meta[property='og:image']" do
 
 748       assert_dom "> @content", "#{root_url}the%20picture.jpg"
 
 750     assert_dom "head meta[property='og:image:alt']" do
 
 751       assert_dom "> @content", "some local picture"
 
 755   def test_show_og_image_with_invalid_uri
 
 757     diary_entry = create(:diary_entry, :user => user, :body => "")
 
 759     get diary_entry_path(user, diary_entry)
 
 760     assert_response :success
 
 761     assert_dom "head meta[property='og:image']" do
 
 762       assert_dom "> @content", ActionController::Base.helpers.image_url("osm_logo_256.png", :host => root_url)
 
 764     assert_dom "head meta[property='og:image:alt']" do
 
 765       assert_dom "> @content", "OpenStreetMap logo"
 
 769   def test_show_og_image_without_alt
 
 771     diary_entry = create(:diary_entry, :user => user, :body => "<img src='https://example.com/no_alt.gif'>")
 
 773     get diary_entry_path(user, diary_entry)
 
 774     assert_response :success
 
 775     assert_dom "head meta[property='og:image']" do
 
 776       assert_dom "> @content", "https://example.com/no_alt.gif"
 
 778     assert_dom "head meta[property='og:image:alt']", :count => 0
 
 781   def test_show_no_og_description
 
 783     diary_entry = create(:diary_entry, :user => user, :body => "")
 
 785     get diary_entry_path(user, diary_entry)
 
 786     assert_response :success
 
 787     assert_dom "head meta[property='og:description']" do
 
 788       assert_dom "> @content", I18n.t("layouts.intro_text")
 
 792   def test_show_og_description
 
 794     diary_entry = create(:diary_entry, :user => user, :body => "# Hello\n\n\n\nFirst paragraph.\n\nSecond paragraph.")
 
 796     get diary_entry_path(user, diary_entry)
 
 797     assert_response :success
 
 798     assert_dom "head meta[property='og:description']" do
 
 799       assert_dom "> @content", "First paragraph."
 
 803   def test_show_article_published_time
 
 805     diary_entry = create(:diary_entry, :user => user, :created_at => "2020-03-04")
 
 807     get diary_entry_path(user, diary_entry)
 
 808     assert_response :success
 
 809     assert_dom "head meta[property='article:published_time']" do
 
 810       assert_dom "> @content", "2020-03-04T00:00:00Z"
 
 816     diary_entry = create(:diary_entry, :user => user)
 
 818     # Try without logging in
 
 819     post hide_diary_entry_path(user, diary_entry)
 
 820     assert_response :forbidden
 
 821     assert DiaryEntry.find(diary_entry.id).visible
 
 823     # Now try as a normal user
 
 825     post hide_diary_entry_path(user, diary_entry)
 
 826     assert_redirected_to :controller => :errors, :action => :forbidden
 
 827     assert DiaryEntry.find(diary_entry.id).visible
 
 829     # Now try as a moderator
 
 830     session_for(create(:moderator_user))
 
 831     post hide_diary_entry_path(user, diary_entry)
 
 832     assert_redirected_to :action => :index, :display_name => user.display_name
 
 833     assert_not DiaryEntry.find(diary_entry.id).visible
 
 836     diary_entry.reload.update(:visible => true)
 
 838     # Finally try as an administrator
 
 839     session_for(create(:administrator_user))
 
 840     post hide_diary_entry_path(user, diary_entry)
 
 841     assert_redirected_to :action => :index, :display_name => user.display_name
 
 842     assert_not DiaryEntry.find(diary_entry.id).visible
 
 848     # Try without logging in
 
 849     diary_entry = create(:diary_entry, :user => user, :visible => false)
 
 850     post unhide_diary_entry_path(user, diary_entry)
 
 851     assert_response :forbidden
 
 852     assert_not DiaryEntry.find(diary_entry.id).visible
 
 854     # Now try as a normal user
 
 856     post unhide_diary_entry_path(user, diary_entry)
 
 857     assert_redirected_to :controller => :errors, :action => :forbidden
 
 858     assert_not DiaryEntry.find(diary_entry.id).visible
 
 860     # Now try as a moderator
 
 861     session_for(create(:moderator_user))
 
 862     post unhide_diary_entry_path(user, diary_entry)
 
 863     assert_redirected_to :action => :index, :display_name => user.display_name
 
 864     assert DiaryEntry.find(diary_entry.id).visible
 
 867     diary_entry.reload.update(:visible => true)
 
 869     # Finally try as an administrator
 
 870     session_for(create(:administrator_user))
 
 871     post unhide_diary_entry_path(user, diary_entry)
 
 872     assert_redirected_to :action => :index, :display_name => user.display_name
 
 873     assert DiaryEntry.find(diary_entry.id).visible
 
 876   def test_subscribe_page
 
 878     other_user = create(:user)
 
 879     diary_entry = create(:diary_entry, :user => user)
 
 880     path = diary_entry_subscribe_path(user, diary_entry)
 
 883     assert_redirected_to login_path(:referer => path)
 
 885     session_for(other_user)
 
 887     assert_response :success
 
 888     assert_dom ".content-body" do
 
 889       assert_dom "a[href='#{diary_entry_path(user, diary_entry)}']", :text => diary_entry.title
 
 890       assert_dom "a[href='#{user_path(user)}']", :text => user.display_name
 
 894   def test_subscribe_success
 
 896     other_user = create(:user)
 
 897     diary_entry = create(:diary_entry, :user => user)
 
 899     session_for(other_user)
 
 900     assert_difference "diary_entry.subscribers.count", 1 do
 
 901       post diary_entry_subscribe_path(user, diary_entry)
 
 903     assert_response :redirect
 
 906   def test_subscribe_fail
 
 908     other_user = create(:user)
 
 910     diary_entry = create(:diary_entry, :user => user)
 
 913     assert_no_difference "diary_entry.subscribers.count" do
 
 914       post diary_entry_subscribe_path(user, diary_entry)
 
 916     assert_response :forbidden
 
 918     session_for(other_user)
 
 921     post diary_entry_subscribe_path("username", 999111)
 
 922     assert_response :not_found
 
 924     # trying to subscribe when already subscribed
 
 925     post diary_entry_subscribe_path(user, diary_entry)
 
 926     assert_no_difference "diary_entry.subscribers.count" do
 
 927       post diary_entry_subscribe_path(user, diary_entry)
 
 931   def test_unsubscribe_page
 
 933     other_user = create(:user)
 
 934     diary_entry = create(:diary_entry, :user => user)
 
 935     path = diary_entry_unsubscribe_path(user, diary_entry)
 
 938     assert_redirected_to login_path(:referer => path)
 
 940     session_for(other_user)
 
 942     assert_response :success
 
 943     assert_dom ".content-body" do
 
 944       assert_dom "a[href='#{diary_entry_path(user, diary_entry)}']", :text => diary_entry.title
 
 945       assert_dom "a[href='#{user_path(user)}']", :text => user.display_name
 
 949   def test_unsubscribe_success
 
 951     other_user = create(:user)
 
 953     diary_entry = create(:diary_entry, :user => user)
 
 954     create(:diary_entry_subscription, :diary_entry => diary_entry, :user => other_user)
 
 956     session_for(other_user)
 
 957     assert_difference "diary_entry.subscribers.count", -1 do
 
 958       post diary_entry_unsubscribe_path(user, diary_entry)
 
 960     assert_response :redirect
 
 963   def test_unsubscribe_fail
 
 965     other_user = create(:user)
 
 967     diary_entry = create(:diary_entry, :user => user)
 
 970     assert_no_difference "diary_entry.subscribers.count" do
 
 971       post diary_entry_unsubscribe_path(user, diary_entry)
 
 973     assert_response :forbidden
 
 975     session_for(other_user)
 
 978     post diary_entry_unsubscribe_path("username", 999111)
 
 979     assert_response :not_found
 
 981     # trying to unsubscribe when not subscribed
 
 982     assert_no_difference "diary_entry.subscribers.count" do
 
 983       post diary_entry_unsubscribe_path(user, diary_entry)
 
 989   def check_diary_index(*entries)
 
 990     assert_response :success
 
 991     assert_template "index"
 
 992     assert_no_missing_translations
 
 993     assert_select "article.diary_post", entries.count
 
 995     entries.each do |entry|
 
 996       assert_select "a[href=?]", "/user/#{ERB::Util.u(entry.user.display_name)}/diary/#{entry.id}"
 
1000   def check_no_page_link(name)
 
1001     assert_select "a.page-link", { :text => /#{Regexp.quote(name)}/, :count => 0 }, "unexpected #{name} page link"
 
1004   def check_page_link(name)
 
1005     assert_select "a.page-link", { :text => /#{Regexp.quote(name)}/ }, "missing #{name} page link" do |buttons|
 
1006       return buttons.first.attributes["href"].value