Files
danbooru/test/unit/post_pruner_test.rb
evazion 0a0a85ee70 Fix #4568: Send appealed posts back to the mod queue
* Include appealed posts in the modqueue.

* Add `status` field to appeals. Appeals start out as `pending`, then
  become `rejected` if the post isn't approved within three days. If the
  post is approved, the appeal's status becomes `succeeded`.

* Add `status` field to flags. Flags start out as `pending` then become
  `rejected` if the post is approved within three days. If the post
  isn't approved, the flag's status becomes `succeeded`.

* Leave behind a "Unapproved in three days" dummy flag when an appeal
  goes unapproved, just like when a pending post is unapproved.

* Only allow deleted posts to be appealed. Don't allow flagged posts to be appealed.

* Add `status:appealed` metatag. `status:appealed` is separate from `status:pending`.

* Include appealed posts in `status:modqueue`. Search `status:modqueue order:modqueue`
  to view the modqueue as a normal search.

* Retroactively set old flags and appeals as succeeded or rejected. This
  may not be correct for posts that were appealed or flagged multiple
  times. This is difficult to set correctly because we don't have
  approval records for old posts, so we can't tell the actual outcome of
  old flags and appeals.

* Deprecate the `is_resolved` field on post flags. A resolved flag is a
  flag that isn't pending.

* Known bug: appealed posts have a black border instead of a blue
  border. Checking whether a post has been appealed would require either
  an extra query on the posts/index page, or an is_appealed flag on
  posts, neither of which are very desirable.

* Known bug: you can't use `status:appealed` in blacklists, for the same
  reason as above.
2020-08-06 20:55:45 -05:00

109 lines
4.1 KiB
Ruby

require 'test_helper'
class PostPrunerTest < ActiveSupport::TestCase
context "PostPruner" do
context "for a pending post" do
should "prune expired posts" do
@post = create(:post, created_at: 5.days.ago, is_pending: true)
PostPruner.prune!
assert_equal(true, @post.reload.is_deleted?)
assert_equal(false, @post.is_pending?)
assert_equal(1, @post.flags.size)
assert_equal("Unapproved in three days", @post.flags.last.reason)
end
end
context "for a flagged post" do
should "prune expired flags" do
@post = create(:post, created_at: 4.weeks.ago, is_flagged: true)
@flag = create(:post_flag, post: @post, created_at: 5.days.ago)
PostPruner.prune!
assert_equal(true, @post.reload.is_deleted?)
assert_equal(false, @post.is_pending?)
assert_equal(false, @post.is_flagged?)
assert_equal(true, @flag.reload.succeeded?)
assert_equal(2, @post.flags.size)
assert_equal("Unapproved in three days after returning to moderation queue", @post.flags.last.reason)
end
should "not prune unexpired flags" do
@post = create(:post, created_at: 4.weeks.ago, is_flagged: true)
@flag = create(:post_flag, post: @post, created_at: 1.day.ago)
PostPruner.prune!
assert_equal(false, @post.reload.is_deleted?)
assert_equal(false, @post.is_pending?)
assert_equal(true, @post.is_flagged?)
assert_equal(true, @flag.reload.pending?)
assert_equal(1, @post.flags.size)
end
should "leave the status of old flags unchanged" do
@post = create(:post, created_at: 4.weeks.ago, is_flagged: true)
@flag1 = create(:post_flag, post: @post, created_at: 3.weeks.ago, status: :succeeded)
@flag2 = create(:post_flag, post: @post, created_at: 2.weeks.ago, status: :rejected)
@flag3 = create(:post_flag, post: @post, created_at: 1.weeks.ago, status: :pending)
PostPruner.prune!
assert_equal(true, @post.reload.is_deleted?)
assert_equal(false, @post.is_pending?)
assert_equal(false, @post.is_flagged?)
assert_equal(true, @flag1.reload.succeeded?)
assert_equal(true, @flag2.reload.rejected?)
assert_equal(true, @flag3.reload.succeeded?)
end
end
context "for an appealed post" do
should "prune expired appeals" do
@post = create(:post, created_at: 4.weeks.ago, is_deleted: true)
@appeal = create(:post_appeal, post: @post, created_at: 5.days.ago)
PostPruner.prune!
assert_equal(false, @post.reload.is_pending?)
assert_equal(false, @post.is_flagged?)
assert_equal(true, @post.is_deleted?)
assert_equal(true, @appeal.reload.rejected?)
assert_equal(1, @post.flags.size)
assert_equal("Unapproved in three days after returning to moderation queue", @post.flags.last.reason)
end
should "not prune unexpired appeals" do
@post = create(:post, created_at: 4.weeks.ago, is_deleted: true)
@appeal = create(:post_appeal, post: @post, created_at: 1.day.ago)
PostPruner.prune!
assert_equal(false, @post.reload.is_pending?)
assert_equal(false, @post.is_flagged?)
assert_equal(true, @post.is_deleted?)
assert_equal(true, @appeal.reload.pending?)
assert_equal(0, @post.flags.size)
end
should "leave the status of old appeals unchanged" do
@post = create(:post, created_at: 4.weeks.ago, is_deleted: true)
@appeal1 = create(:post_appeal, post: @post, created_at: 3.weeks.ago, status: :succeeded)
@appeal2 = create(:post_appeal, post: @post, created_at: 2.weeks.ago, status: :rejected)
@appeal3 = create(:post_appeal, post: @post, created_at: 1.weeks.ago, status: :pending)
PostPruner.prune!
assert_equal(true, @post.reload.is_deleted?)
assert_equal(false, @post.is_pending?)
assert_equal(false, @post.is_flagged?)
assert_equal(true, @appeal1.reload.succeeded?)
assert_equal(true, @appeal2.reload.rejected?)
assert_equal(false, @appeal3.reload.pending?)
end
end
end
end