Merge remote-tracking branch 'upstream/pull/2226'
authorTom Hughes <tom@compton.nu>
Tue, 18 Jun 2019 20:10:07 +0000 (21:10 +0100)
committerTom Hughes <tom@compton.nu>
Tue, 18 Jun 2019 20:10:07 +0000 (21:10 +0100)
1  2 
app/abilities/ability.rb
app/views/diary_entries/_diary_comment.html.erb
app/views/diary_entries/_diary_entry.html.erb
test/controllers/diary_entries_controller_test.rb

diff --combined app/abilities/ability.rb
index 28380392df1aaaba9500b1724e047e8c71f70826,897c3410c2e01858d763eb7b3e593f5e40d6229b..c34f357a97a41b2febfbdb7fa1b0a505ded8e3aa
@@@ -36,7 -36,7 +36,7 @@@ class Abilit
  
        if Settings.status != "database_offline"
          can [:index, :new, :create, :show, :edit, :update, :destroy], ClientApplication
 -        can [:create, :edit, :comment, :subscribe, :unsubscribe], DiaryEntry
 +        can [:new, :create, :edit, :update, :comment, :subscribe, :unsubscribe], DiaryEntry
          can [:new, :create, :reply, :show, :inbox, :outbox, :mark, :destroy], Message
          can [:close, :reopen], Note
          can [:new, :create], Report
@@@ -44,6 -44,7 +44,7 @@@
          can [:account, :go_public, :make_friend, :remove_friend], User
  
          if user.moderator?
+           can [:hide, :hidecomment], DiaryEntry
            can [:index, :show, :resolve, :ignore, :reopen], Issue
            can :create, IssueComment
            can [:new, :create, :edit, :update, :destroy], Redaction
@@@ -51,7 -52,7 +52,7 @@@
          end
  
          if user.administrator?
-           can [:hide, :unhide, :hidecomment, :unhidecomment], [DiaryEntry, DiaryComment]
 -          can [:hide, :hidecomment], DiaryEntry
++          can [:hide, :unhide, :hidecomment, :unhidecomment], DiaryEntry
            can [:index, :show, :resolve, :ignore, :reopen], Issue
            can :create, IssueComment
            can [:set_status, :delete, :index], User
index 301739eef9cf3ffe19d4b5fd0d0868198772c840,8679f5a08c44fe60fa21bb8e5911241c59ac76b0..639ac9a191f170e055db979142739c8f179dbb07
@@@ -1,4 -1,4 +1,4 @@@
 -<div class="clearfix diary-comment">
 +<div class="clearfix diary-comment<%= " deemphasize" unless diary_comment.visible? %>">
    <%= user_thumbnail diary_comment.user %>
    <p class="deemphasize comment-heading" id="comment<%= diary_comment.id %>"><%= raw(t(".comment_from", :link_user => (link_to h(diary_comment.user.display_name), user_path(diary_comment.user)), :comment_created_at => link_to(l(diary_comment.created_at, :format => :friendly), :anchor => "comment#{diary_comment.id}"))) %>
      <% if current_user and diary_comment.user.id != current_user.id %>
@@@ -7,13 -7,9 +7,13 @@@
    </p>
  
    <div class="richtext"><%= diary_comment.body.to_html %></div>
-   <% if current_user && current_user.administrator? %>
+   <% if can? :hidecomment, DiaryEntry %>
      <span>
 -      <%= link_to t(".hide_link"), hide_diary_comment_path(:display_name => diary_comment.diary_entry.user.display_name, :id => diary_comment.diary_entry.id, :comment => diary_comment.id), :method => :post, :data => { :confirm => t(".confirm") } %>
 +      <% if diary_comment.visible? %>
 +        <%= link_to t(".hide_link"), hide_diary_comment_path(:display_name => diary_comment.diary_entry.user.display_name, :id => diary_comment.diary_entry.id, :comment => diary_comment.id), :method => :post, :data => { :confirm => t(".confirm") } %>
 +      <% else %>
 +        <%= link_to t(".unhide_link"), unhide_diary_comment_path(:display_name => diary_comment.diary_entry.user.display_name, :id => diary_comment.diary_entry.id, :comment => diary_comment.id), :method => :post, :data => { :confirm => t(".confirm") } %>
 +      <% end %>
      </span>
    <% end %>
  </div>
index 5674a37b7c4d70f9b0041de822baf5b6ea92fce9,0aff1b113ef3c8c2c4b959eae74d00ff2d953356..c7dbec38616f8a623382905127af877b0cb67250
@@@ -1,4 -1,4 +1,4 @@@
 -<div class='diary_post'>
 +<div class='diary_post<%= " deemphasize" unless diary_entry.visible %>'>
    <div class='post_heading clearfix'>
      <% if !@user %>
        <%= user_thumbnail diary_entry.user %>
        </li>
      <% end %>
  
-     <% if current_user && current_user.administrator? %>
+     <% if can? :hide, DiaryEntry %>
        <li>
 -        <%= link_to t(".hide_link"), hide_diary_entry_path(:display_name => diary_entry.user.display_name, :id => diary_entry.id), :method => :post, :data => { :confirm => t(".confirm") } %>
 +        <% if diary_entry.visible %>
 +          <%= link_to t(".hide_link"), hide_diary_entry_path(:display_name => diary_entry.user.display_name, :id => diary_entry.id), :method => :post, :data => { :confirm => t(".confirm") } %>
 +        <% else %>
 +          <%= link_to t(".unhide_link"), unhide_diary_entry_path(:display_name => diary_entry.user.display_name, :id => diary_entry.id), :method => :post, :data => { :confirm => t(".confirm") } %>
 +        <% end %>
        </li>
      <% end %>
    </ul>
index 2b4230db7a41cfbfdf92cb4a6bcd73fcc611900c,b17d974d1f65deb85c9056304c2e672d43115c3f..fd03758233c5699421b8025f8812fb493583a1f0
@@@ -62,8 -62,8 +62,8 @@@ class DiaryEntriesControllerTest < Acti
        { :controller => "diary_entries", :action => "new" }
      )
      assert_routing(
 -      { :path => "/diary/new", :method => :post },
 -      { :controller => "diary_entries", :action => "new" }
 +      { :path => "/diary", :method => :post },
 +      { :controller => "diary_entries", :action => "create" }
      )
      assert_routing(
        { :path => "/user/username/diary/1", :method => :get },
@@@ -74,8 -74,8 +74,8 @@@
        { :controller => "diary_entries", :action => "edit", :display_name => "username", :id => "1" }
      )
      assert_routing(
 -      { :path => "/user/username/diary/1/edit", :method => :post },
 -      { :controller => "diary_entries", :action => "edit", :display_name => "username", :id => "1" }
 +      { :path => "/user/username/diary/1", :method => :put },
 +      { :controller => "diary_entries", :action => "update", :display_name => "username", :id => "1" }
      )
      assert_routing(
        { :path => "/user/username/diary/1/newcomment", :method => :post },
        { :path => "/user/username/diary/1/hide", :method => :post },
        { :controller => "diary_entries", :action => "hide", :display_name => "username", :id => "1" }
      )
 +    assert_routing(
 +      { :path => "/user/username/diary/1/unhide", :method => :post },
 +      { :controller => "diary_entries", :action => "unhide", :display_name => "username", :id => "1" }
 +    )
      assert_routing(
        { :path => "/user/username/diary/1/hidecomment/2", :method => :post },
        { :controller => "diary_entries", :action => "hidecomment", :display_name => "username", :id => "1", :comment => "2" }
      )
 +    assert_routing(
 +      { :path => "/user/username/diary/1/unhidecomment/2", :method => :post },
 +      { :controller => "diary_entries", :action => "unhidecomment", :display_name => "username", :id => "1", :comment => "2" }
 +    )
      assert_routing(
        { :path => "/user/username/diary/1/subscribe", :method => :post },
        { :controller => "diary_entries", :action => "subscribe", :display_name => "username", :id => "1" }
        assert_select "h1", :text => /New Diary Entry/, :count => 1
      end
      assert_select "div#content", :count => 1 do
 -      assert_select "form[action='/diary/new'][method=post]", :count => 1 do
 +      assert_select "form[action='/diary'][method=post]", :count => 1 do
          assert_select "input#diary_entry_title[name='diary_entry[title]']", :count => 1
          assert_select "textarea#diary_entry_body[name='diary_entry[body]']", :text => "", :count => 1
          assert_select "select#diary_entry_language_code", :count => 1
            :session => { :user => create(:user).id }
      end
      assert_response :success
 -    assert_template :edit
 +    assert_template :new
    end
  
 -  def test_new_no_body
 +  def test_create_no_body
      # Now try creating a invalid diary entry with an empty body
      user = create(:user)
      assert_no_difference "DiaryEntry.count" do
 -      post :new,
 +      post :create,
             :params => { :commit => "save",
                          :diary_entry => { :title => "New Title", :body => "", :latitude => "1.1",
                                            :longitude => "2.2", :language_code => "en" } },
             :session => { :user => user.id }
      end
      assert_response :success
 -    assert_template :edit
 +    assert_template :new
  
      assert_nil UserPreference.where(:user_id => user.id, :k => "diary.default_language").first
    end
  
 -  def test_new_post
 +  def test_create
      # Now try creating a diary entry
      user = create(:user)
      assert_difference "DiaryEntry.count", 1 do
 -      post :new,
 +      post :create,
             :params => { :commit => "save",
                          :diary_entry => { :title => "New Title", :body => "This is a new body for the diary entry", :latitude => "1.1",
                                            :longitude => "2.2", :language_code => "en" } },
      assert_equal "en", UserPreference.where(:user_id => user.id, :k => "diary.default_language").first.v
    end
  
 -  def test_new_german
 +  def test_create_german
      create(:language, :code => "de")
      user = create(:user)
  
      # Now try creating a diary entry in a different language
      assert_difference "DiaryEntry.count", 1 do
 -      post :new,
 +      post :create,
             :params => { :commit => "save",
                          :diary_entry => { :title => "New Title", :body => "This is a new body for the diary entry", :latitude => "1.1",
                                            :longitude => "2.2", :language_code => "de" } },
  
      # Try creating a spammy diary entry
      assert_difference "DiaryEntry.count", 1 do
 -      post :new,
 +      post :create,
             :params => { :commit => "save",
                          :diary_entry => { :title => spammy_title, :body => spammy_body, :language_code => "en" } },
             :session => { :user => user.id }
          :params => { :display_name => entry.user.display_name, :id => entry.id },
          :session => { :user => entry.user }
      assert_response :success
 -    assert_select "title", :text => /Edit diary entry/, :count => 1
 +    assert_select "title", :text => /Edit Diary Entry/, :count => 1
      assert_select "div.content-heading", :count => 1 do
 -      assert_select "h1", :text => /Edit diary entry/, :count => 1
 +      assert_select "h1", :text => /Edit Diary Entry/, :count => 1
      end
      assert_select "div#content", :count => 1 do
 -      assert_select "form[action='/user/#{ERB::Util.u(entry.user.display_name)}/diary/#{entry.id}/edit'][method=post]", :count => 1 do
 +      assert_select "form[action='/user/#{ERB::Util.u(entry.user.display_name)}/diary/#{entry.id}'][method=post]", :count => 1 do
          assert_select "input#diary_entry_title[name='diary_entry[title]'][value='#{entry.title}']", :count => 1
          assert_select "textarea#diary_entry_body[name='diary_entry[body]']", :text => entry.body, :count => 1
          assert_select "select#diary_entry_language_code", :count => 1
          assert_select "input#latitude[name='diary_entry[latitude]']", :count => 1
          assert_select "input#longitude[name='diary_entry[longitude]']", :count => 1
 -        assert_select "input[name=commit][type=submit][value=Save]", :count => 1
 +        assert_select "input[name=commit][type=submit][value=Update]", :count => 1
          assert_select "input[name=commit][type=submit][value=Edit]", :count => 1
          assert_select "input[name=commit][type=submit][value=Preview]", :count => 1
 -        assert_select "input", :count => 7
 +        assert_select "input", :count => 8
        end
      end
  
      new_latitude = "1.1"
      new_longitude = "2.2"
      new_language_code = "en"
 -    post :edit,
 -         :params => { :display_name => entry.user.display_name, :id => entry.id, :commit => "save",
 -                      :diary_entry => { :title => new_title, :body => new_body, :latitude => new_latitude,
 -                                        :longitude => new_longitude, :language_code => new_language_code } },
 -         :session => { :user => entry.user.id }
 +    put :update,
 +        :params => { :display_name => entry.user.display_name, :id => entry.id, :commit => "save",
 +                     :diary_entry => { :title => new_title, :body => new_body, :latitude => new_latitude,
 +                                       :longitude => new_longitude, :language_code => new_language_code } },
 +        :session => { :user => entry.user.id }
      assert_response :redirect
      assert_redirected_to :action => :show, :display_name => entry.user.display_name, :id => entry.id
  
      assert_match "<title>&lt;script&gt;</title>", response.body
    end
  
 +  def test_feed_delay
 +    create(:diary_entry, :created_at => 7.hours.ago)
 +    create(:diary_entry, :created_at => 5.hours.ago)
 +    get :rss, :params => { :format => :rss }
 +    assert_select "rss>channel>item", :count => 2
 +
 +    with_diary_feed_delay(6) do
 +      get :rss, :params => { :format => :rss }
 +      assert_select "rss>channel>item", :count => 1
 +    end
 +  end
 +
    def test_show
      user = create(:user)
      suspended_user = create(:user, :suspended)
  
    def test_hide
      user = create(:user)
+     diary_entry = create(:diary_entry, :user => user)
  
      # Try without logging in
-     diary_entry = create(:diary_entry, :user => user)
      post :hide,
           :params => { :display_name => user.display_name, :id => diary_entry.id }
      assert_response :forbidden
      assert_redirected_to :controller => :errors, :action => :forbidden
      assert_equal true, DiaryEntry.find(diary_entry.id).visible
  
+     # Now try as a moderator
+     post :hide,
+          :params => { :display_name => user.display_name, :id => diary_entry.id },
+          :session => { :user => create(:moderator_user) }
+     assert_response :redirect
+     assert_redirected_to :action => :index, :display_name => user.display_name
+     assert_equal false, DiaryEntry.find(diary_entry.id).visible
+     # Reset
+     diary_entry.reload.update(:visible => true)
      # Finally try as an administrator
      post :hide,
           :params => { :display_name => user.display_name, :id => diary_entry.id },
      assert_equal false, DiaryEntry.find(diary_entry.id).visible
    end
  
 +  def test_unhide
 +    user = create(:user)
 +
 +    # Try without logging in
 +    diary_entry = create(:diary_entry, :user => user, :visible => false)
 +    post :unhide,
 +         :params => { :display_name => user.display_name, :id => diary_entry.id }
 +    assert_response :forbidden
 +    assert_equal false, DiaryEntry.find(diary_entry.id).visible
 +
 +    # Now try as a normal user
 +    post :unhide,
 +         :params => { :display_name => user.display_name, :id => diary_entry.id },
 +         :session => { :user => user }
 +    assert_response :redirect
 +    assert_redirected_to :controller => :errors, :action => :forbidden
 +    assert_equal false, DiaryEntry.find(diary_entry.id).visible
 +
 +    # Finally try as an administrator
 +    post :unhide,
 +         :params => { :display_name => user.display_name, :id => diary_entry.id },
 +         :session => { :user => create(:administrator_user) }
 +    assert_response :redirect
 +    assert_redirected_to :action => :index, :display_name => user.display_name
 +    assert_equal true, DiaryEntry.find(diary_entry.id).visible
 +  end
 +
    def test_hidecomment
      user = create(:user)
-     administrator_user = create(:administrator_user)
      diary_entry = create(:diary_entry, :user => user)
      diary_comment = create(:diary_comment, :diary_entry => diary_entry)
      # Try without logging in
      post :hidecomment,
           :params => { :display_name => user.display_name, :id => diary_entry.id, :comment => diary_comment.id }
      assert_redirected_to :controller => :errors, :action => :forbidden
      assert_equal true, DiaryComment.find(diary_comment.id).visible
  
+     # Try as a moderator
+     post :hidecomment,
+          :params => { :display_name => user.display_name, :id => diary_entry.id, :comment => diary_comment.id },
+          :session => { :user => create(:moderator_user) }
+     assert_response :redirect
+     assert_redirected_to :action => :show, :display_name => user.display_name, :id => diary_entry.id
+     assert_equal false, DiaryComment.find(diary_comment.id).visible
+     # Reset
+     diary_comment.reload.update(:visible => true)
      # Finally try as an administrator
      post :hidecomment,
           :params => { :display_name => user.display_name, :id => diary_entry.id, :comment => diary_comment.id },
-          :session => { :user => administrator_user }
+          :session => { :user => create(:administrator_user) }
      assert_response :redirect
      assert_redirected_to :action => :show, :display_name => user.display_name, :id => diary_entry.id
      assert_equal false, DiaryComment.find(diary_comment.id).visible
    end
  
 +  def test_unhidecomment
 +    user = create(:user)
 +    administrator_user = create(:administrator_user)
 +    diary_entry = create(:diary_entry, :user => user)
 +    diary_comment = create(:diary_comment, :diary_entry => diary_entry, :visible => false)
 +    # Try without logging in
 +    post :unhidecomment,
 +         :params => { :display_name => user.display_name, :id => diary_entry.id, :comment => diary_comment.id }
 +    assert_response :forbidden
 +    assert_equal false, DiaryComment.find(diary_comment.id).visible
 +
 +    # Now try as a normal user
 +    post :unhidecomment,
 +         :params => { :display_name => user.display_name, :id => diary_entry.id, :comment => diary_comment.id },
 +         :session => { :user => user }
 +    assert_response :redirect
 +    assert_redirected_to :controller => :errors, :action => :forbidden
 +    assert_equal false, DiaryComment.find(diary_comment.id).visible
 +
 +    # Finally try as an administrator
 +    post :unhidecomment,
 +         :params => { :display_name => user.display_name, :id => diary_entry.id, :comment => diary_comment.id },
 +         :session => { :user => administrator_user }
 +    assert_response :redirect
 +    assert_redirected_to :action => :show, :display_name => user.display_name, :id => diary_entry.id
 +    assert_equal true, DiaryComment.find(diary_comment.id).visible
 +  end
 +
    def test_comments
      user = create(:user)
      other_user = create(:user)
        assert_select "a[href=?]", "/user/#{ERB::Util.u(entry.user.display_name)}/diary/#{entry.id}"
      end
    end
 +
 +  def with_diary_feed_delay(value)
 +    diary_feed_delay = Settings.diary_feed_delay
 +    Settings.diary_feed_delay = value
 +
 +    yield
 +
 +    Settings.diary_feed_delay = diary_feed_delay
 +  end
  end