From 00b51bbc238b9631a624e5330b91228183a5bd90 Mon Sep 17 00:00:00 2001 From: kikito Date: Fri, 21 Aug 2015 22:01:47 +0200 Subject: [PATCH] Adds first version of comment moderation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Missing: * Ensure removing a flag updates the flagged_at attribute correctly * Showing the debate when the comment is not a “root” * Filter (pending / reviewed / all) * Order * Same for debates --- .../moderation/comments_controller.rb | 27 +++- app/views/moderation/comments/index.html.erb | 36 +++++ spec/features/moderation/comments_spec.rb | 131 ++++++++++++------ 3 files changed, 153 insertions(+), 41 deletions(-) create mode 100644 app/views/moderation/comments/index.html.erb diff --git a/app/controllers/moderation/comments_controller.rb b/app/controllers/moderation/comments_controller.rb index c250fc460..781f6b1e7 100644 --- a/app/controllers/moderation/comments_controller.rb +++ b/app/controllers/moderation/comments_controller.rb @@ -1,8 +1,31 @@ class Moderation::CommentsController < Moderation::BaseController + before_filter :load_comments, only: :index + + load_and_authorize_resource + + def index + @comments = @comments.page(params[:page]) + end + def hide - @comment = Comment.find(params[:id]) @comment.hide end -end \ No newline at end of file + def hide_in_moderation_screen + @comment.hide + redirect_to action: :index + end + + def mark_as_reviewed + @comment.mark_as_reviewed + redirect_to action: :index + end + + private + + def load_comments + @comments = Comment.accessible_by(current_ability, :hide).where('inappropiate_flags_count > 0').includes(:commentable) + end + +end diff --git a/app/views/moderation/comments/index.html.erb b/app/views/moderation/comments/index.html.erb new file mode 100644 index 000000000..f89e58cc1 --- /dev/null +++ b/app/views/moderation/comments/index.html.erb @@ -0,0 +1,36 @@ +

<%= t('moderation.comments.index.title') %>

+ +

<%= page_entries_info @comments %>

+ + + + + + + + + <% @comments.each do |comment| %> + + + + + + + <% if can? :mark_as_reviewed, comment %> + + <% end %> + <% if comment.reviewed? %> + + <% end %> + + <% end %> +
<%= t('moderation.comments.index.flags') %><%= t('moderation.comments.index.debate') %><%= t('moderation.comments.index.comment') %><%= t('moderation.comments.index.updated_at') %>
<%= comment.inappropiate_flags_count %><%= link_to(comment.debate.title, comment.debate) %><%= comment.body %><%= l comment.updated_at.to_date %> + <%= link_to t('moderation.comments.index.hide'), hide_in_moderation_screen_moderation_comment_path(comment), method: :put %> + + <%= link_to t('moderation.comments.index.mark_as_reviewed'), mark_as_reviewed_moderation_comment_path(comment), method: :put %> + + <%= t('moderation.comments.index.reviewed') %> +
+ +<%= paginate @comments %> + diff --git a/spec/features/moderation/comments_spec.rb b/spec/features/moderation/comments_spec.rb index 099946d82..ef3970b20 100644 --- a/spec/features/moderation/comments_spec.rb +++ b/spec/features/moderation/comments_spec.rb @@ -2,61 +2,64 @@ require 'rails_helper' feature 'Moderate Comments' do - scenario 'Hide', :js do - citizen = create(:user) - moderator = create(:moderator) + feature 'Hiding Comments' do - debate = create(:debate) - comment = create(:comment, commentable: debate, body: 'SPAM') + scenario 'Hide', :js do + citizen = create(:user) + moderator = create(:moderator) - login_as(moderator.user) - visit debate_path(debate) + debate = create(:debate) + comment = create(:comment, commentable: debate, body: 'SPAM') - within("#comment_#{comment.id}") do - click_link 'Hide' - expect(page).to have_css('.comment .faded') + login_as(moderator.user) + visit debate_path(debate) + + within("#comment_#{comment.id}") do + click_link 'Hide' + expect(page).to have_css('.comment .faded') + end + + login_as(citizen) + visit debate_path(debate) + + expect(page).to have_css('.comment', count: 1) + expect(page).to have_content('This comment has been deleted') + expect(page).to_not have_content('SPAM') end - login_as(citizen) - visit debate_path(debate) + scenario 'Children visible', :js do + citizen = create(:user) + moderator = create(:moderator) - expect(page).to have_css('.comment', count: 1) - expect(page).to have_content('This comment has been deleted') - expect(page).to_not have_content('SPAM') - end + debate = create(:debate) + comment = create(:comment, commentable: debate, body: 'SPAM') + create(:comment, commentable: debate, body: 'Acceptable reply', parent_id: comment.id) - scenario 'Children visible', :js do - citizen = create(:user) - moderator = create(:moderator) + login_as(moderator.user) + visit debate_path(debate) - debate = create(:debate) - comment = create(:comment, commentable: debate, body: 'SPAM') - reply = create(:comment, commentable: debate, body: 'Acceptable reply', parent_id: comment.id) + within("#comment_#{comment.id}") do + first(:link, "Hide").click + expect(page).to have_css('.comment .faded') + end - login_as(moderator.user) - visit debate_path(debate) + login_as(citizen) + visit debate_path(debate) - within("#comment_#{comment.id}") do - first(:link, "Hide").click - expect(page).to have_css('.comment .faded') + expect(page).to have_css('.comment', count: 2) + expect(page).to have_content('This comment has been deleted') + expect(page).to_not have_content('SPAM') + + expect(page).to have_content('Acceptable reply') end - - login_as(citizen) - visit debate_path(debate) - - expect(page).to have_css('.comment', count: 2) - expect(page).to have_content('This comment has been deleted') - expect(page).to_not have_content('SPAM') - - expect(page).to have_content('Acceptable reply') end - scenario 'Moderator actions' do + scenario 'Moderator actions in the comment' do citizen = create(:user) moderator = create(:moderator) debate = create(:debate) - comment = create(:comment, commentable: debate) + create(:comment, commentable: debate) login_as(moderator.user) visit debate_path(debate) @@ -69,4 +72,54 @@ feature 'Moderate Comments' do expect(page).to_not have_css("#moderator-comment-actions") end -end \ No newline at end of file + feature '/moderation/ menu' do + + background do + moderator = create(:moderator) + login_as(moderator.user) + + user = create(:user) + debate = create(:debate, title: 'Democracy') + @comment = create(:comment, commentable: debate, body: 'spammy spam') + InappropiateFlag.flag!(user, @comment) + + visit moderation_comments_path + end + + scenario 'Flagged comment shows the right params' do + within("#comment_#{@comment.id}") do + expect(page).to have_link('Democracy') + expect(page).to have_content('spammy spam') + expect(page).to have_content('1') + expect(page).to have_link('Hide') + expect(page).to have_content('Mark as reviewed') + end + end + + scenario 'Hiding a comment' do + within("#comment_#{@comment.id}") do + click_link('Hide') + end + + expect(current_path).to eq(moderation_comments_path) + expect(page).to_not have_selector("#comment_#{@comment.id}") + + expect(@comment.reload).to be_hidden + end + + scenario 'Marking a comment as reviewed' do + within("#comment_#{@comment.id}") do + click_link('Mark as reviewed') + end + + expect(current_path).to eq(moderation_comments_path) + + within("#comment_#{@comment.id}") do + expect(page).to have_content('Reviewed') + end + + expect(@comment.reload).to be_reviewed + end + end + +end