From 567da0216dbe76d11251216c5f40570578f298b0 Mon Sep 17 00:00:00 2001 From: ArtOfCode- <hello@artofcode.co.uk> Date: Wed, 16 Dec 2020 15:16:28 +0000 Subject: [PATCH] Delete/restore answers with question; close #342 --- app/controllers/posts_controller.rb | 18 ++++++++++++ test/controllers/posts_controller_test.rb | 28 +++++++++++++++++++ test/fixtures/posts.yml | 34 +++++++++++++++++++++++ 3 files changed, 80 insertions(+) diff --git a/app/controllers/posts_controller.rb b/app/controllers/posts_controller.rb index d4e9f3f0b..d2aea372e 100644 --- a/app/controllers/posts_controller.rb +++ b/app/controllers/posts_controller.rb @@ -262,6 +262,15 @@ class PostsController < ApplicationController if @post.update(deleted: true, deleted_at: DateTime.now, deleted_by: current_user, last_activity: DateTime.now, last_activity_by: current_user) PostHistory.post_deleted(@post, current_user) + if @post.children.any? + @post.children.update_all(deleted: true, deleted_at: DateTime.now, deleted_by_id: current_user.id, + last_activity: DateTime.now, last_activity_by_id: current_user.id) + histories = @post.children.map do |c| + { post_history_type: PostHistoryType.find_by(name: 'post_deleted'), user: current_user, post: c, + community: RequestContext.community } + end + PostHistory.create(histories) + end else flash[:danger] = "Can't delete this post right now. Try again later." end @@ -288,9 +297,18 @@ class PostsController < ApplicationController return end + deleted_at = @post.deleted_at if @post.update(deleted: false, deleted_at: nil, deleted_by: nil, last_activity: DateTime.now, last_activity_by: current_user) PostHistory.post_undeleted(@post, current_user) + restore_children = @post.children.where('deleted_at >= ?', deleted_at) + restore_children.update_all(deleted: true, deleted_at: DateTime.now, deleted_by_id: current_user.id, + last_activity: DateTime.now, last_activity_by_id: current_user.id) + histories = restore_children.map do |c| + { post_history_type: PostHistoryType.find_by(name: 'post_undeleted'), user: current_user, post: c, + community: RequestContext.community } + end + PostHistory.create(histories) else flash[:danger] = "Can't restore this post right now. Try again later." end diff --git a/test/controllers/posts_controller_test.rb b/test/controllers/posts_controller_test.rb index e0a7c821d..f59de979b 100644 --- a/test/controllers/posts_controller_test.rb +++ b/test/controllers/posts_controller_test.rb @@ -591,6 +591,19 @@ class PostsControllerTest < ActionController::TestCase assert_equal before_history, after_history, 'PostHistory event incorrectly created on deletion' end + test 'delete ensures all children are deleted' do + sign_in users(:deleter) + before_history = PostHistory.where(post_id: posts(:bad_answers).children.map(&:id)).count + post :delete, params: { id: posts(:bad_answers).id } + after_history = PostHistory.where(post_id: posts(:bad_answers).children.map(&:id)).count + assert_response 302 + assert_redirected_to post_path(assigns(:post)) + assert_nil flash[:danger] + assert assigns(:post).children.all?(&:deleted), 'Answers not deleted with question' + assert_equal before_history + posts(:bad_answers).children.count, after_history, + 'Answer PostHistory events not created on question deletion' + end + # Restore test 'can restore post' do @@ -652,6 +665,21 @@ class PostsControllerTest < ActionController::TestCase assert_equal before_history, after_history, 'PostHistory event incorrectly created on deletion' end + test 'restore brings back all answers deleted after question' do + sign_in users(:deleter) + deleted_at = posts(:deleted).deleted_at + children = posts(:deleted).children.where('deleted_at >= ?', deleted_at) + children_count = children.count + before_history = PostHistory.where(post_id: children.where('deleted_at >= ?', deleted_at)).count + post :restore, params: { id: posts(:deleted).id } + after_history = PostHistory.where(post_id: children.where('deleted_at >= ?', deleted_at)).count + assert_response 302 + assert_redirected_to post_path(assigns(:post)) + assert_nil flash[:danger] + assert_equal before_history + children_count, after_history, + 'Answer PostHistory events not created on question restore' + end + # Toggle comments test 'can toggle comments' do diff --git a/test/fixtures/posts.yml b/test/fixtures/posts.yml index bdea67b9f..54e50a21a 100644 --- a/test/fixtures/posts.yml +++ b/test/fixtures/posts.yml @@ -40,6 +40,27 @@ question_two: upvote_count: 0 downvote_count: 0 +bad_answers: + post_type: question + title: Q1 ABCDEF GHIJKL MNOPQR STUVWX YZ + body: ABCDEF GHIJKL MNOPQR STUVWX YZ ABCDEF GHIJKL MNOPQR STUVWX YZ + body_markdown: ABCDEF GHIJKL MNOPQR STUVWX YZ ABCDEF GHIJKL MNOPQR STUVWX YZ + tags_cache: + - discussion + - support + - bug + tags: + - discussion + - support + - bug + score: 0.5 + user: standard_user + community: sample + category: main + license: cc_by_sa + upvote_count: 0 + downvote_count: 0 + deleted: post_type: question title: Q3D ZY XWVUTS RQPONM LKJIHG FEDCBA @@ -188,6 +209,19 @@ answer_two: upvote_count: 0 downvote_count: 0 +bad_answer: + post_type: answer + body: A2 ABCDEF GHIJKL MNOPQR STUVWX YZ ABCDEF GHIJKL MNOPQR STUVWX YZ + body_markdown: ZY XWVUTS RQPONM LKJIHG FEDCBA ZY XWVUTS RQPONM LKJIHG FEDCBA + score: 0.4 + parent: question_one + user: editor + community: sample + category: main + license: cc_by_sa + upvote_count: 0 + downvote_count: 1 + really_old_answer: post_type: answer body: A3RO ABCDEF GHIJKL MNOPQR STUVWX YZ ABCDEF GHIJKL MNOPQR STUVWX YZ -- GitLab