From 34057b25e10a678b9e529ea70eb5898acc4a02c2 Mon Sep 17 00:00:00 2001 From: evazion Date: Sun, 25 Sep 2022 01:05:50 -0500 Subject: [PATCH] mod actions: record the subject of the mod action. Add a polymorphic `subject` field that records the subject of the mod action. The subject is the post, user, comment, artist, etc the mod action is for. * The subject for the user ban and unban actions is the user, not the ban itself. * The subject for the user feedback update and deletion actions is the user, not the feedback itself. * The subject for the post undeletion action is the post, not the approval itself. * The subject for the move favorites action is the source post where the favorites were moved from, not the destination post where the favorites were moved to. * The subject for the post permanent delete action is nil, because the post itself is hard deleted. * When a post is permanently deleted, all mod actions related to the post are deleted as well. --- .../moderator/post/posts_controller.rb | 6 ++--- app/logical/user_deletion.rb | 2 +- app/logical/user_promotion.rb | 12 ++++----- app/models/artist.rb | 15 ++++++----- app/models/ban.rb | 4 +-- app/models/comment.rb | 5 ++-- app/models/comment_vote.rb | 5 ++-- app/models/forum_post.rb | 5 ++-- app/models/forum_topic.rb | 7 ++--- app/models/ip_ban.rb | 15 ++++++----- app/models/mod_action.rb | 11 +++++--- app/models/moderation_report.rb | 5 ++-- app/models/pool.rb | 6 +++-- app/models/post.rb | 27 ++++++++++--------- app/models/post_approval.rb | 2 +- app/models/post_vote.rb | 5 ++-- app/models/tag_relationship.rb | 3 ++- app/models/user.rb | 1 + app/models/user_feedback.rb | 4 +-- .../functional/admin/users_controller_test.rb | 10 +++++++ test/functional/bans_controller_test.rb | 4 +++ .../comment_votes_controller_test.rb | 5 +++- test/functional/comments_controller_test.rb | 16 +++++++++-- .../functional/forum_posts_controller_test.rb | 8 +++++- test/functional/ip_bans_controller_test.rb | 6 +++++ .../moderation_reports_controller_test.rb | 4 +++ .../moderator/post/posts_controller_test.rb | 2 +- .../post_regenerations_controller_test.rb | 4 +++ test/functional/post_votes_controller_test.rb | 2 ++ .../functional/tag_aliases_controller_test.rb | 1 + .../tag_implications_controller_test.rb | 1 + .../user_feedbacks_controller_test.rb | 4 +++ test/unit/comment_test.rb | 9 ++++--- test/unit/favorite_group_test.rb | 2 +- test/unit/post_approval_test.rb | 2 ++ test/unit/post_test.rb | 23 ++++++++++++++++ test/unit/post_vote_test.rb | 4 +++ test/unit/user_deletion_test.rb | 7 ++++- 38 files changed, 183 insertions(+), 71 deletions(-) diff --git a/app/controllers/moderator/post/posts_controller.rb b/app/controllers/moderator/post/posts_controller.rb index f228b7e74..4de5f15df 100644 --- a/app/controllers/moderator/post/posts_controller.rb +++ b/app/controllers/moderator/post/posts_controller.rb @@ -19,12 +19,12 @@ module Moderator def expunge @post = authorize ::Post.find(params[:id]) - @post.expunge! + @post.expunge!(CurrentUser.user) end def ban @post = authorize ::Post.find(params[:id]) - @post.ban! + @post.ban!(CurrentUser.user) flash[:notice] = "Post was banned" respond_with(@post) @@ -32,7 +32,7 @@ module Moderator def unban @post = authorize ::Post.find(params[:id]) - @post.unban! + @post.unban!(CurrentUser.user) flash[:notice] = "Post was unbanned" respond_with(@post) diff --git a/app/logical/user_deletion.rb b/app/logical/user_deletion.rb index b9eb3dc6e..efc882350 100644 --- a/app/logical/user_deletion.rb +++ b/app/logical/user_deletion.rb @@ -42,7 +42,7 @@ class UserDeletion private def create_mod_action - ModAction.log("deleted user ##{user.id}", :user_delete, deleter) + ModAction.log("deleted user ##{user.id}", :user_delete, subject: user, user: deleter) end def create_user_event diff --git a/app/logical/user_promotion.rb b/app/logical/user_promotion.rb index 47adb8f6e..39417c881 100644 --- a/app/logical/user_promotion.rb +++ b/app/logical/user_promotion.rb @@ -42,21 +42,21 @@ class UserPromotion def create_mod_actions if old_can_approve_posts == false && user.can_approve_posts? == true - ModAction.log("granted approval privileges to \"#{user.name}\":#{Routes.user_path(user)}", :user_approval_privilege, promoter) + ModAction.log("granted approval privileges to \"#{user.name}\":#{Routes.user_path(user)}", :user_approval_privilege, subject: user, user: promoter) elsif old_can_approve_posts == true && user.can_approve_posts? == false - ModAction.log("removed approval privileges from \"#{user.name}\":#{Routes.user_path(user)}", :user_approval_privilege, promoter) + ModAction.log("removed approval privileges from \"#{user.name}\":#{Routes.user_path(user)}", :user_approval_privilege, subject: user, user: promoter) end if old_can_upload_free == false && user.can_upload_free? == true - ModAction.log("granted unlimited upload privileges to \"#{user.name}\":#{Routes.user_path(user)}", :user_upload_privilege, promoter) + ModAction.log("granted unlimited upload privileges to \"#{user.name}\":#{Routes.user_path(user)}", :user_upload_privilege, subject: user, user: promoter) elsif old_can_upload_free == false && user.can_upload_free? == true - ModAction.log("removed unlimited upload privileges from \"#{user.name}\":#{Routes.user_path(user)}", :user_upload_privilege, promoter) + ModAction.log("removed unlimited upload privileges from \"#{user.name}\":#{Routes.user_path(user)}", :user_upload_privilege, subject: user, user: promoter) end if user.level_changed? && user.level >= user.level_was - ModAction.log(%{promoted "#{user.name}":#{Routes.user_path(user)} from #{user.level_string_was} to #{user.level_string}}, :user_level_change, promoter) + ModAction.log(%{promoted "#{user.name}":#{Routes.user_path(user)} from #{user.level_string_was} to #{user.level_string}}, :user_level_change, subject: user, user: promoter) elsif user.level_changed? && user.level < user.level_was - ModAction.log(%{demoted "#{user.name}":#{Routes.user_path(user)} from #{user.level_string_was} to #{user.level_string}}, :user_level_change, promoter) + ModAction.log(%{demoted "#{user.name}":#{Routes.user_path(user)} from #{user.level_string_was} to #{user.level_string}}, :user_level_change, subject: user, user: promoter) end end diff --git a/app/models/artist.rb b/app/models/artist.rb index 3175979f7..73f66bee3 100644 --- a/app/models/artist.rb +++ b/app/models/artist.rb @@ -24,6 +24,7 @@ class Artist < ApplicationRecord has_many :members, :class_name => "Artist", :foreign_key => "group_name", :primary_key => "name" has_many :urls, dependent: :destroy, class_name: "ArtistURL", autosave: true has_many :versions, -> {order("artist_versions.id ASC")}, :class_name => "ArtistVersion" + has_many :mod_actions, as: :subject, dependent: :destroy has_one :wiki_page, -> { active }, foreign_key: "title", primary_key: "name" has_one :tag_alias, -> { active }, foreign_key: "antecedent_name", primary_key: "name" belongs_to :tag, foreign_key: "name", primary_key: "name", default: -> { Tag.new(name: name, category: Tag.categories.artist) } @@ -192,25 +193,25 @@ class Artist < ApplicationRecord end module BanMethods - def unban! + def unban!(current_user = CurrentUser.user) Post.transaction do ti = TagImplication.find_by(antecedent_name: name, consequent_name: "banned_artist") ti&.destroy Post.raw_tag_match(name).find_each do |post| - post.unban! + post.unban!(current_user) fixed_tags = post.tag_string.sub(/(?:\A| )banned_artist(?:\Z| )/, " ").strip - post.update(tag_string: fixed_tags) + post.update(tag_string: fixed_tags) # XXX should use current_user end - update!(is_banned: false) - ModAction.log("unbanned artist ##{id}", :artist_unban) + update!(is_banned: false) # XXX should use current_user + ModAction.log("unbanned artist ##{id}", :artist_unban, subject: self, user: current_user) end end def ban!(banner: CurrentUser.user) Post.transaction do - Post.raw_tag_match(name).each(&:ban!) + Post.raw_tag_match(name).each { |post| post.ban!(banner) } # potential race condition but unlikely unless TagImplication.where(:antecedent_name => name, :consequent_name => "banned_artist").exists? @@ -219,7 +220,7 @@ class Artist < ApplicationRecord end update!(is_banned: true) - ModAction.log("banned artist ##{id}", :artist_ban) + ModAction.log("banned artist ##{id}", :artist_ban, subject: self, user: banner) end end end diff --git a/app/models/ban.rb b/app/models/ban.rb index ded13db53..f87a6f0f3 100644 --- a/app/models/ban.rb +++ b/app/models/ban.rb @@ -81,11 +81,11 @@ class Ban < ApplicationRecord end def create_ban_mod_action - ModAction.log(%{banned <@#{user_name}> #{humanized_duration}: #{reason}}, :user_ban, banner) + ModAction.log(%{banned <@#{user_name}> #{humanized_duration}: #{reason}}, :user_ban, subject: user, user: banner) end def create_unban_mod_action - ModAction.log(%{unbanned <@#{user_name}>}, :user_unban) + ModAction.log(%{unbanned <@#{user_name}>}, :user_unban, subject: user, user: CurrentUser.user) end def self.available_includes diff --git a/app/models/comment.rb b/app/models/comment.rb index f2f3e84ea..c1f9da98c 100644 --- a/app/models/comment.rb +++ b/app/models/comment.rb @@ -10,6 +10,7 @@ class Comment < ApplicationRecord has_many :moderation_reports, as: :model, dependent: :destroy has_many :pending_moderation_reports, -> { pending }, as: :model, class_name: "ModerationReport" has_many :votes, class_name: "CommentVote", dependent: :destroy + has_many :mod_actions, as: :subject, dependent: :destroy validates :body, presence: true, length: { maximum: 15_000 }, if: :body_changed? @@ -17,11 +18,11 @@ class Comment < ApplicationRecord before_save :handle_reports_on_deletion after_create :update_last_commented_at_on_create after_update(:if => ->(rec) {(!rec.is_deleted? || !rec.saved_change_to_is_deleted?) && CurrentUser.id != rec.creator_id}) do |comment| - ModAction.log("updated #{comment.dtext_shortlink}", :comment_update, comment.updater) + ModAction.log("updated #{comment.dtext_shortlink}", :comment_update, subject: self, user: comment.updater) end after_save :update_last_commented_at_on_destroy, :if => ->(rec) {rec.is_deleted? && rec.saved_change_to_is_deleted?} after_save(:if => ->(rec) {rec.is_deleted? && rec.saved_change_to_is_deleted? && CurrentUser.id != rec.creator_id}) do |comment| - ModAction.log("deleted #{comment.dtext_shortlink}", :comment_delete, comment.updater) + ModAction.log("deleted #{comment.dtext_shortlink}", :comment_delete, subject: self, user: comment.updater) end deletable diff --git a/app/models/comment_vote.rb b/app/models/comment_vote.rb index de55d453e..61da24874 100644 --- a/app/models/comment_vote.rb +++ b/app/models/comment_vote.rb @@ -5,6 +5,7 @@ class CommentVote < ApplicationRecord belongs_to :comment belongs_to :user + has_many :mod_actions, as: :subject, dependent: :destroy validate :validate_vote_is_unique, if: :is_deleted_changed? validates :score, inclusion: { in: [-1, 1], message: "must be 1 or -1" } @@ -56,13 +57,13 @@ class CommentVote < ApplicationRecord comment.update_columns(score: comment.score - score) if updater != user - ModAction.log("deleted comment vote ##{id} on comment ##{comment_id}", :comment_vote_delete, updater) + ModAction.log("deleted comment vote ##{id} on comment ##{comment_id}", :comment_vote_delete, subject: self, user: updater) end else comment.update_columns(score: comment.score + score) if updater != user - ModAction.log("undeleted comment vote ##{id} on comment ##{comment_id}", :comment_vote_undelete, updater) + ModAction.log("undeleted comment vote ##{id} on comment ##{comment_id}", :comment_vote_undelete, subject: self, user: updater) end end end diff --git a/app/models/forum_post.rb b/app/models/forum_post.rb index 3112b3d33..1f979211f 100644 --- a/app/models/forum_post.rb +++ b/app/models/forum_post.rb @@ -11,6 +11,7 @@ class ForumPost < ApplicationRecord has_many :moderation_reports, as: :model has_many :pending_moderation_reports, -> { pending }, as: :model, class_name: "ModerationReport" has_many :votes, class_name: "ForumPostVote" + has_many :mod_actions, as: :subject, dependent: :destroy has_one :tag_alias has_one :tag_implication has_one :bulk_update_request @@ -25,10 +26,10 @@ class ForumPost < ApplicationRecord after_update :update_topic_updated_at_on_update_for_original_posts after_destroy :update_topic_updated_at_on_destroy after_update(:if => ->(rec) {rec.updater_id != rec.creator_id}) do |forum_post| - ModAction.log("updated #{forum_post.dtext_shortlink}", :forum_post_update, forum_post.updater) + ModAction.log("updated #{forum_post.dtext_shortlink}", :forum_post_update, subject: self, user: forum_post.updater) end after_destroy(:if => ->(rec) {rec.updater_id != rec.creator_id}) do |forum_post| - ModAction.log("deleted #{forum_post.dtext_shortlink}", :forum_post_delete, forum_post.updater) + ModAction.log("deleted #{forum_post.dtext_shortlink}", :forum_post_delete, subject: self, user: forum_post.updater) end after_create_commit :async_send_discord_notification diff --git a/app/models/forum_topic.rb b/app/models/forum_topic.rb index 952dc58b3..4a954f0e0 100644 --- a/app/models/forum_topic.rb +++ b/app/models/forum_topic.rb @@ -22,6 +22,7 @@ class ForumTopic < ApplicationRecord has_many :bulk_update_requests has_many :tag_aliases has_many :tag_implications + has_many :mod_actions, as: :subject, dependent: :destroy validates :title, presence: true, length: { maximum: 200 }, if: :title_changed? validates :category_id, inclusion: { in: CATEGORIES.keys } @@ -32,7 +33,7 @@ class ForumTopic < ApplicationRecord after_update :update_posts_on_deletion_or_undeletion after_update :update_original_post after_save(:if => ->(rec) {rec.is_locked? && rec.saved_change_to_is_locked?}) do |rec| - ModAction.log("locked forum topic ##{id} (title: #{title})", :forum_topic_lock) + ModAction.log("locked forum topic ##{id} (title: #{title})", :forum_topic_lock, subject: self, user: CurrentUser.user) end deletable @@ -164,11 +165,11 @@ class ForumTopic < ApplicationRecord end def create_mod_action_for_delete - ModAction.log("deleted forum topic ##{id} (title: #{title})", :forum_topic_delete) + ModAction.log("deleted forum topic ##{id} (title: #{title})", :forum_topic_delete, subject: self, user: CurrentUser.user) end def create_mod_action_for_undelete - ModAction.log("undeleted forum topic ##{id} (title: #{title})", :forum_topic_undelete) + ModAction.log("undeleted forum topic ##{id} (title: #{title})", :forum_topic_undelete, subject: self, user: CurrentUser.user) end def page_for(post_id) diff --git a/app/models/ip_ban.rb b/app/models/ip_ban.rb index 729a80082..8440ea345 100644 --- a/app/models/ip_ban.rb +++ b/app/models/ip_ban.rb @@ -4,11 +4,12 @@ class IpBan < ApplicationRecord attribute :ip_addr, :ip_address belongs_to :creator, class_name: "User" + has_many :mod_actions, as: :subject, dependent: :destroy validate :validate_ip_addr validates :reason, presence: true - before_save :create_mod_action + after_save :create_mod_action deletable enum category: { @@ -52,12 +53,12 @@ class IpBan < ApplicationRecord end def create_mod_action - if new_record? - ModAction.log("created ip ban for #{ip_addr}", :ip_ban_create, creator) - elsif is_deleted? == true && is_deleted_was == false - ModAction.log("deleted ip ban for #{ip_addr}", :ip_ban_delete) - elsif is_deleted? == false && is_deleted_was == true - ModAction.log("undeleted ip ban for #{ip_addr}", :ip_ban_undelete) + if previously_new_record? + ModAction.log("created ip ban for #{ip_addr}", :ip_ban_create, subject: self, user: creator) + elsif is_deleted? == true && is_deleted_before_last_save == false + ModAction.log("deleted ip ban for #{ip_addr}", :ip_ban_delete, subject: self, user: CurrentUser.user) + elsif is_deleted? == false && is_deleted_before_last_save == true + ModAction.log("undeleted ip ban for #{ip_addr}", :ip_ban_undelete, subject: self, user: CurrentUser.user) end end diff --git a/app/models/mod_action.rb b/app/models/mod_action.rb index aa43c6b76..4d1c7acca 100644 --- a/app/models/mod_action.rb +++ b/app/models/mod_action.rb @@ -2,6 +2,7 @@ class ModAction < ApplicationRecord belongs_to :creator, :class_name => "User" + belongs_to :subject, polymorphic: true, optional: true # ####DIVISIONS##### # Groups: 0-999 @@ -70,6 +71,10 @@ class ModAction < ApplicationRecord other: 2000, } + def self.model_types + %w[Artist Comment CommentVote ForumPost ForumTopic IpBan ModerationReport Pool Post PostVote Tag TagAlias TagImplication User UserFeedback] + end + def self.visible(user) if user.is_moderator? all @@ -79,7 +84,7 @@ class ModAction < ApplicationRecord end def self.search(params, current_user) - q = search_attributes(params, [:id, :created_at, :updated_at, :category, :description, :creator], current_user: current_user) + q = search_attributes(params, [:id, :created_at, :updated_at, :category, :description, :creator, :subject], current_user: current_user) case params[:order] when "created_at_asc" @@ -95,8 +100,8 @@ class ModAction < ApplicationRecord self.class.categories[category] end - def self.log(desc, cat = :other, user = CurrentUser.user) - create(creator: user, description: desc, category: categories[cat]) + def self.log(description, category, subject:, user:) + create!(description: description, category: category, subject: subject, creator: user) end def self.available_includes diff --git a/app/models/moderation_report.rb b/app/models/moderation_report.rb index bf559dcf2..119e5fed9 100644 --- a/app/models/moderation_report.rb +++ b/app/models/moderation_report.rb @@ -7,6 +7,7 @@ class ModerationReport < ApplicationRecord belongs_to :model, polymorphic: true belongs_to :creator, class_name: "User" + has_many :mod_actions, as: :subject, dependent: :destroy before_validation(on: :create) { model.lock! } validates :reason, presence: true @@ -61,9 +62,9 @@ class ModerationReport < ApplicationRecord return unless saved_change_to_status? && status != :pending if handled? - ModAction.log("handled modreport ##{id}", :moderation_report_handled, updater) + ModAction.log("handled modreport ##{id}", :moderation_report_handled, subject: self, user: updater) elsif rejected? - ModAction.log("rejected modreport ##{id}", :moderation_report_rejected, updater) + ModAction.log("rejected modreport ##{id}", :moderation_report_rejected, subject: self, user: updater) end end diff --git a/app/models/pool.rb b/app/models/pool.rb index 2e40a5cd3..0a66afd2d 100644 --- a/app/models/pool.rb +++ b/app/models/pool.rb @@ -14,6 +14,8 @@ class Pool < ApplicationRecord before_validation :normalize_name after_save :create_version + has_many :mod_actions, as: :subject, dependent: :destroy + deletable has_dtext_links :description @@ -157,11 +159,11 @@ class Pool < ApplicationRecord end def create_mod_action_for_delete - ModAction.log("deleted pool ##{id} (name: #{name})", :pool_delete) + ModAction.log("deleted pool ##{id} (name: #{name})", :pool_delete, subject: self, user: CurrentUser.user) end def create_mod_action_for_undelete - ModAction.log("undeleted pool ##{id} (name: #{name})", :pool_undelete) + ModAction.log("undeleted pool ##{id} (name: #{name})", :pool_undelete, subject: self, user: CurrentUser.user) end def add!(post) diff --git a/app/models/post.rb b/app/models/post.rb index 39967db1c..ac46f1531 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -71,6 +71,7 @@ class Post < ApplicationRecord has_many :replacements, class_name: "PostReplacement", :dependent => :destroy has_many :ai_tags, through: :media_asset has_many :events, class_name: "PostEvent" + has_many :mod_actions, as: :subject, dependent: :destroy attr_accessor :old_tag_string, :old_parent_id, :old_source, :old_rating, :has_constraints, :disable_versioning, :post_edit @@ -516,11 +517,11 @@ class Post < ApplicationRecord in "status", "banned" raise User::PrivilegeError unless CurrentUser.is_approver? - ban! + ban!(CurrentUser.user) in "-status", "banned" raise User::PrivilegeError unless CurrentUser.is_approver? - unban! + unban!(CurrentUser.user) in "disapproved", reason raise User::PrivilegeError unless CurrentUser.is_approver? @@ -732,7 +733,7 @@ class Post < ApplicationRecord nil end - def give_favorites_to_parent + def give_favorites_to_parent(current_user = CurrentUser.user) return if parent.nil? transaction do @@ -742,7 +743,7 @@ class Post < ApplicationRecord end end - ModAction.log("moved favorites from post ##{id} to post ##{parent.id}", :post_move_favorites) + ModAction.log("moved favorites from post ##{id} to post ##{parent.id}", :post_move_favorites, subject: self, user: current_user) end def has_visible_children? @@ -758,10 +759,10 @@ class Post < ApplicationRecord end concerning :DeletionMethods do - def expunge! + def expunge!(current_user = CurrentUser.user) transaction do Post.without_timeout do - ModAction.log("permanently deleted post ##{id} (md5=#{md5})", :post_permanent_delete) + ModAction.log("permanently deleted post ##{id} (md5=#{md5})", :post_permanent_delete, subject: nil, user: current_user) update_children_on_destroy decrement_tag_post_counts @@ -776,16 +777,16 @@ class Post < ApplicationRecord remove_iqdb # this is non-transactional end - def ban! + def ban!(current_user) return if is_banned? update_column(:is_banned, true) - ModAction.log("banned post ##{id}", :post_ban) + ModAction.log("banned post ##{id}", :post_ban, subject: self, user: current_user) end - def unban! + def unban!(current_user) return unless is_banned? update_column(:is_banned, false) - ModAction.log("unbanned post ##{id}", :post_unban) + ModAction.log("unbanned post ##{id}", :post_unban, subject: self, user: current_user) end def delete!(reason, move_favorites: false, user: CurrentUser.user) @@ -804,7 +805,7 @@ class Post < ApplicationRecord uploader.upload_limit.update_limit!(is_pending?, false) unless automated - ModAction.log("deleted post ##{id}, reason: #{reason}", :post_delete) + ModAction.log("deleted post ##{id}, reason: #{reason}", :post_delete, subject: self, user: user) end end end @@ -1449,7 +1450,7 @@ class Post < ApplicationRecord if category == "iqdb" update_iqdb - ModAction.log("regenerated IQDB for post ##{id}", :post_regenerate_iqdb, user) + ModAction.log("regenerated IQDB for post ##{id}", :post_regenerate_iqdb, subject: self, user: user) else media_file = media_asset.variant(:original).open_file media_asset.distribute_files!(media_file) @@ -1471,7 +1472,7 @@ class Post < ApplicationRecord purge_cached_urls! update_iqdb - ModAction.log("regenerated image samples for post ##{id}", :post_regenerate, user) + ModAction.log("regenerated image samples for post ##{id}", :post_regenerate, subject: self, user: user) end end diff --git a/app/models/post_approval.rb b/app/models/post_approval.rb index 146cba18b..9d3343a41 100644 --- a/app/models/post_approval.rb +++ b/app/models/post_approval.rb @@ -31,7 +31,7 @@ class PostApproval < ApplicationRecord post.appeals.pending.update!(status: :succeeded) post.update(approver: user, is_flagged: false, is_pending: false, is_deleted: false) - ModAction.log("undeleted post ##{post_id}", :post_undelete, user) if is_undeletion + ModAction.log("undeleted post ##{post_id}", :post_undelete, subject: post, user: user) if is_undeletion post.uploader.upload_limit.update_limit!(is_pending, true) end diff --git a/app/models/post_vote.rb b/app/models/post_vote.rb index 841e6d252..bde39844d 100644 --- a/app/models/post_vote.rb +++ b/app/models/post_vote.rb @@ -5,6 +5,7 @@ class PostVote < ApplicationRecord belongs_to :post belongs_to :user + has_many :mod_actions, as: :subject, dependent: :destroy validates :score, inclusion: { in: [1, -1], message: "must be 1 or -1" } @@ -81,9 +82,9 @@ class PostVote < ApplicationRecord return if new_record? || updater.nil? || updater == user if is_deleted_changed?(from: false, to: true) - ModAction.log("deleted post vote ##{id} on post ##{post_id}", :post_vote_delete, updater) + ModAction.log("deleted post vote ##{id} on post ##{post_id}", :post_vote_delete, subject: self, user: updater) elsif is_deleted_changed?(from: true, to: false) - ModAction.log("undeleted post vote ##{id} on post ##{post_id}", :post_vote_undelete, updater) + ModAction.log("undeleted post vote ##{id} on post ##{post_id}", :post_vote_undelete, subject: self, user: updater) end end diff --git a/app/models/tag_relationship.rb b/app/models/tag_relationship.rb index 947af139d..5eeccad30 100644 --- a/app/models/tag_relationship.rb +++ b/app/models/tag_relationship.rb @@ -13,6 +13,7 @@ class TagRelationship < ApplicationRecord belongs_to :consequent_tag, class_name: "Tag", foreign_key: "consequent_name", primary_key: "name", default: -> { Tag.find_or_create_by_name(consequent_name) } belongs_to :antecedent_wiki, class_name: "WikiPage", foreign_key: "antecedent_name", primary_key: "title", optional: true belongs_to :consequent_wiki, class_name: "WikiPage", foreign_key: "consequent_name", primary_key: "title", optional: true + has_many :mod_actions, as: :subject, dependent: :destroy scope :active, -> {where(status: "active")} scope :deleted, -> {where(status: "deleted")} @@ -61,7 +62,7 @@ class TagRelationship < ApplicationRecord if rejector != User.system category = relationship == "tag alias" ? :tag_alias_delete : :tag_implication_delete - ModAction.log("deleted #{relationship} #{antecedent_name} -> #{consequent_name}", category, rejector) + ModAction.log("deleted #{relationship} #{antecedent_name} -> #{consequent_name}", category, subject: self, user: rejector) end end diff --git a/app/models/user.rb b/app/models/user.rb index 96c8156e2..b2b1fc426 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -139,6 +139,7 @@ class User < ApplicationRecord has_many :tag_implications, foreign_key: :creator_id has_many :uploads, foreign_key: :uploader_id, dependent: :destroy has_many :upload_media_assets, through: :uploads, dependent: :destroy + has_many :mod_actions, as: :subject, dependent: :destroy belongs_to :inviter, class_name: "User", optional: true accepts_nested_attributes_for :email_address, reject_if: :all_blank, allow_destroy: true diff --git a/app/models/user_feedback.rb b/app/models/user_feedback.rb index 2f1731761..e45cd3d91 100644 --- a/app/models/user_feedback.rb +++ b/app/models/user_feedback.rb @@ -11,10 +11,10 @@ class UserFeedback < ApplicationRecord validates :category, presence: true, inclusion: { in: %w[positive negative neutral] } after_create :create_dmail, unless: :disable_dmail_notification after_update(:if => ->(rec) { CurrentUser.id != rec.creator_id}) do |rec| - ModAction.log(%{updated user feedback for "#{rec.user.name}":#{Routes.user_path(rec.user)}}, :user_feedback_update) + ModAction.log(%{updated user feedback for "#{rec.user.name}":#{Routes.user_path(rec.user)}}, :user_feedback_update, subject: user, user: CurrentUser.user) end after_destroy(:if => ->(rec) { CurrentUser.id != rec.creator_id}) do |rec| - ModAction.log(%{deleted user feedback for "#{rec.user.name}":#{Routes.user_path(rec.user)}}, :user_feedback_delete) + ModAction.log(%{deleted user feedback for "#{rec.user.name}":#{Routes.user_path(rec.user)}}, :user_feedback_delete, subject: user, user: CurrentUser.user) end deletable diff --git a/test/functional/admin/users_controller_test.rb b/test/functional/admin/users_controller_test.rb index 78b0d2b78..4810ef53f 100644 --- a/test/functional/admin/users_controller_test.rb +++ b/test/functional/admin/users_controller_test.rb @@ -23,6 +23,8 @@ class Admin::UsersControllerTest < ActionDispatch::IntegrationTest assert_redirected_to(edit_admin_user_path(@user)) assert_equal(30, @user.reload.level) assert_match(/promoted "#{@user.name}":\/users\/#{@user.id} from Member to Gold/, ModAction.last.description) + assert_equal(@user, ModAction.last.subject) + assert_equal(@mod, ModAction.last.creator) end should "promote the user to unrestricted uploads" do @@ -34,6 +36,10 @@ class Admin::UsersControllerTest < ActionDispatch::IntegrationTest assert_equal(false, @user.can_approve_posts?) assert_match(/granted unlimited upload privileges to "#{@user.name}":\/users\/#{@user.id}/, ModAction.first.description) assert_match(/promoted "#{@user.name}":\/users\/#{@user.id} from Member to Builder/, ModAction.last.description) + assert_equal(@user, ModAction.first.subject) + assert_equal(@mod, ModAction.first.creator) + assert_equal(@user, ModAction.last.subject) + assert_equal(@mod, ModAction.last.creator) end should "promote the user to approver" do @@ -45,6 +51,10 @@ class Admin::UsersControllerTest < ActionDispatch::IntegrationTest assert_equal(true, @user.can_approve_posts?) assert_match(/granted approval privileges to "#{@user.name}":\/users\/#{@user.id}/, ModAction.first.description) assert_match(/promoted "#{@user.name}":\/users\/#{@user.id} from Member to Builder/, ModAction.last.description) + assert_equal(@user, ModAction.first.subject) + assert_equal(@mod, ModAction.first.creator) + assert_equal(@user, ModAction.last.subject) + assert_equal(@mod, ModAction.last.creator) end context "promoted to an admin" do diff --git a/test/functional/bans_controller_test.rb b/test/functional/bans_controller_test.rb index 22a23d51b..3587ff27a 100644 --- a/test/functional/bans_controller_test.rb +++ b/test/functional/bans_controller_test.rb @@ -61,6 +61,8 @@ class BansControllerTest < ActionDispatch::IntegrationTest assert_redirected_to bans_path assert_equal(true, @user.reload.is_banned?) assert_match(/banned <@#{@user.name}> 1 day: xxx/, ModAction.last.description) + assert_equal(@user, ModAction.last.subject) + assert_equal(@mod, ModAction.last.creator) end end @@ -135,6 +137,8 @@ class BansControllerTest < ActionDispatch::IntegrationTest assert_redirected_to bans_path assert_match(/unbanned <@#{@ban.user.name}>/, ModAction.last.description) + assert_equal(@ban.user, ModAction.last.subject) + assert_equal(@mod, ModAction.last.creator) end end end diff --git a/test/functional/comment_votes_controller_test.rb b/test/functional/comment_votes_controller_test.rb index 8cda53192..1b7fbb6ce 100644 --- a/test/functional/comment_votes_controller_test.rb +++ b/test/functional/comment_votes_controller_test.rb @@ -214,7 +214,8 @@ class CommentVotesControllerTest < ActionDispatch::IntegrationTest assert_equal(1, @vote.comment.score) assert_difference("CommentVote.count", 0) do - delete_auth comment_vote_path(@vote), create(:admin_user), xhr: true, params: { variant: "listing" } + admin = create(:admin_user) + delete_auth comment_vote_path(@vote), admin, xhr: true, params: { variant: "listing" } assert_response :success assert_equal(true, @vote.reload.is_deleted?) @@ -222,6 +223,8 @@ class CommentVotesControllerTest < ActionDispatch::IntegrationTest assert_equal("comment_vote_delete", ModAction.last.category) assert_match(/deleted comment vote/, ModAction.last.description) + assert_equal(@vote, ModAction.last.subject) + assert_equal(admin, ModAction.last.creator) end end diff --git a/test/functional/comments_controller_test.rb b/test/functional/comments_controller_test.rb index 6d26f2123..24e87cc31 100644 --- a/test/functional/comments_controller_test.rb +++ b/test/functional/comments_controller_test.rb @@ -178,10 +178,12 @@ class CommentsControllerTest < ActionDispatch::IntegrationTest context "when updating another user's comment" do should "succeed if updater is a moderator" do - put_auth comment_path(@comment.id), @user, params: {comment: {body: "abc"}}, xhr: true + put_auth comment_path(@comment.id), @mod, params: {comment: {body: "abc"}}, xhr: true assert_equal("abc", @comment.reload.body) assert_match(/updated comment ##{@comment.id}/, ModAction.last.description) + assert_equal(@comment, ModAction.last.subject) + assert_equal(@mod, ModAction.last.creator) assert_response :success end @@ -199,6 +201,8 @@ class CommentsControllerTest < ActionDispatch::IntegrationTest assert_equal(true, @comment.reload.is_sticky) assert_match(/updated comment ##{@comment.id}/, ModAction.last.description) + assert_equal(@comment, ModAction.last.subject) + assert_equal(@mod, ModAction.last.creator) assert_response :success end @@ -224,6 +228,8 @@ class CommentsControllerTest < ActionDispatch::IntegrationTest assert_equal("abc", @comment.reload.body) assert_match(/updated comment ##{@comment.id}/, ModAction.last.description) + assert_equal(@comment, ModAction.last.subject) + assert_equal(@user, ModAction.last.creator) assert_response :success end @@ -233,6 +239,8 @@ class CommentsControllerTest < ActionDispatch::IntegrationTest assert_equal("herp derp", @comment.reload.body) assert_equal(true, @comment.is_deleted) assert_match(/deleted comment ##{@comment.id}/, ModAction.last.description) + assert_equal(@comment, ModAction.last.subject) + assert_equal(@user, ModAction.last.creator) assert_response :success end @@ -287,12 +295,14 @@ class CommentsControllerTest < ActionDispatch::IntegrationTest assert_equal(true, @comment.reload.is_deleted) assert_redirected_to @comment assert_match(/deleted comment ##{@comment.id}/, ModAction.last.description) + assert_equal(@comment, ModAction.last.subject) + assert_equal(@user, ModAction.last.creator) end should "mark all pending moderation reports against the comment as handled" do @comment = create(:comment, post: @post) report1 = create(:moderation_report, model: @comment, status: :pending) - report2 = create(:moderation_report, model: @comment, status: :rejected) + report2 = create(:moderation_report, model: @comment, status: :rejected, updater: create(:user)) delete_auth comment_path(@comment.id), @mod assert_redirected_to @comment @@ -311,6 +321,8 @@ class CommentsControllerTest < ActionDispatch::IntegrationTest assert_redirected_to(@comment) assert_equal(false, @comment.reload.is_deleted) assert_match(/updated comment ##{@comment.id}/, ModAction.last.description) + assert_equal(@comment, ModAction.last.subject) + assert_equal(@mod, ModAction.last.creator) end should "not allow normal Members to undelete their own comments" do diff --git a/test/functional/forum_posts_controller_test.rb b/test/functional/forum_posts_controller_test.rb index 0f49ebf85..ffd7d9565 100644 --- a/test/functional/forum_posts_controller_test.rb +++ b/test/functional/forum_posts_controller_test.rb @@ -216,6 +216,8 @@ class ForumPostsControllerTest < ActionDispatch::IntegrationTest assert_redirected_to(forum_topic_path(@forum_topic, anchor: "forum_post_#{@forum_post.id}")) assert_match(/updated forum ##{@forum_post.id}/, ModAction.last.description) + assert_equal(@forum_post, ModAction.last.subject) + assert_equal(@mod, ModAction.last.creator) end end @@ -227,6 +229,8 @@ class ForumPostsControllerTest < ActionDispatch::IntegrationTest assert_redirected_to(@forum_reply) assert_equal(true, @forum_reply.reload.is_deleted?) assert_match(/updated forum ##{@forum_reply.id}/, ModAction.last.description) + assert_equal(@forum_reply, ModAction.last.subject) + assert_equal(@mod, ModAction.last.creator) end should "not allow users to delete their own posts" do @@ -247,7 +251,7 @@ class ForumPostsControllerTest < ActionDispatch::IntegrationTest should "mark all pending moderation reports against the post as handled" do forum_reply = as(@user) { create(:forum_post, topic: @forum_topic, creator: @user) } report1 = create(:moderation_report, model: forum_reply, status: :pending) - report2 = create(:moderation_report, model: forum_reply, status: :rejected) + report2 = create(:moderation_report, model: forum_reply, status: :rejected, updater: @user) delete_auth forum_post_path(forum_reply), @mod assert_redirected_to(forum_post_path(forum_reply)) @@ -266,6 +270,8 @@ class ForumPostsControllerTest < ActionDispatch::IntegrationTest assert_redirected_to(@forum_reply) assert_equal(false, @forum_reply.reload.is_deleted?) assert_match(/updated forum ##{@forum_reply.id}/, ModAction.last.description) + assert_equal(@forum_reply, ModAction.last.subject) + assert_equal(@mod, ModAction.last.creator) end should "not allow users to undelete their own posts" do diff --git a/test/functional/ip_bans_controller_test.rb b/test/functional/ip_bans_controller_test.rb index 157ad014d..096737160 100644 --- a/test/functional/ip_bans_controller_test.rb +++ b/test/functional/ip_bans_controller_test.rb @@ -28,6 +28,8 @@ class IpBansControllerTest < ActionDispatch::IntegrationTest assert_equal("ip_ban_create", ModAction.last&.category) assert_match(/created ip ban for 1\.2\.3\.4/, ModAction.last.description) + assert_equal(IpBan.last, ModAction.last.subject) + assert_equal(@admin, ModAction.last.creator) end end @@ -65,6 +67,8 @@ class IpBansControllerTest < ActionDispatch::IntegrationTest assert_equal(true, @ip_ban.reload.is_deleted) assert_equal("ip_ban_delete", ModAction.last.category) assert_match(/deleted ip ban for #{@ip_ban.ip_addr}/, ModAction.last.description) + assert_equal(@ip_ban, ModAction.last.subject) + assert_equal(@admin, ModAction.last.creator) end should "mark an ip ban as undeleted" do @@ -75,6 +79,8 @@ class IpBansControllerTest < ActionDispatch::IntegrationTest assert_equal(false, @ip_ban.reload.is_deleted?) assert_equal("ip_ban_undelete", ModAction.last.category) assert_match(/undeleted ip ban for #{@ip_ban.ip_addr}/, ModAction.last.description) + assert_equal(@ip_ban, ModAction.last.subject) + assert_equal(@admin, ModAction.last.creator) end end end diff --git a/test/functional/moderation_reports_controller_test.rb b/test/functional/moderation_reports_controller_test.rb index 830d8f923..cf4cec0a0 100644 --- a/test/functional/moderation_reports_controller_test.rb +++ b/test/functional/moderation_reports_controller_test.rb @@ -127,6 +127,8 @@ class ModerationReportsControllerTest < ActionDispatch::IntegrationTest assert_equal("handled", report.reload.status) assert_equal(true, @user.dmails.received.exists?(from: User.system, title: "Thank you for reporting comment ##{@comment.id}")) assert_equal(true, ModAction.moderation_report_handled.where(creator: @mod).exists?) + assert_equal(report, ModAction.last.subject) + assert_equal(@mod, ModAction.last.creator) end should "allow a moderator to mark a moderation report as rejected" do @@ -137,6 +139,8 @@ class ModerationReportsControllerTest < ActionDispatch::IntegrationTest assert_equal("rejected", report.reload.status) assert_equal(false, @user.dmails.received.exists?(from: User.system)) assert_equal(true, ModAction.moderation_report_rejected.where(creator: @mod).exists?) + assert_equal(report, ModAction.last.subject) + assert_equal(@mod, ModAction.last.creator) end end end diff --git a/test/functional/moderator/post/posts_controller_test.rb b/test/functional/moderator/post/posts_controller_test.rb index 1a79e0e2f..7838a4ebe 100644 --- a/test/functional/moderator/post/posts_controller_test.rb +++ b/test/functional/moderator/post/posts_controller_test.rb @@ -69,7 +69,7 @@ module Moderator context "unban action" do should "render" do - @post.ban! + @post.ban!(@admin) post_auth unban_moderator_post_post_path(@post), @admin assert_redirected_to(@post) diff --git a/test/functional/post_regenerations_controller_test.rb b/test/functional/post_regenerations_controller_test.rb index e9e39074c..5a1f4466c 100644 --- a/test/functional/post_regenerations_controller_test.rb +++ b/test/functional/post_regenerations_controller_test.rb @@ -34,6 +34,8 @@ class PostRegenerationsControllerTest < ActionDispatch::IntegrationTest assert_equal(@mod, ModAction.last.creator) assert_equal("post_regenerate_iqdb", ModAction.last.category) assert_equal("regenerated IQDB for post ##{@post.id}", ModAction.last.description) + assert_equal(@post, ModAction.last.subject) + assert_equal(@mod, ModAction.last.creator) end end @@ -56,6 +58,8 @@ class PostRegenerationsControllerTest < ActionDispatch::IntegrationTest assert_equal(@mod, ModAction.last.creator) assert_equal("post_regenerate", ModAction.last.category) assert_equal("regenerated image samples for post ##{@post.id}", ModAction.last.description) + assert_equal(@post, ModAction.last.subject) + assert_equal(@mod, ModAction.last.creator) end should "fix the width and height of exif-rotated images" do diff --git a/test/functional/post_votes_controller_test.rb b/test/functional/post_votes_controller_test.rb index eed707107..9ca6eb80d 100644 --- a/test/functional/post_votes_controller_test.rb +++ b/test/functional/post_votes_controller_test.rb @@ -287,6 +287,8 @@ class PostVotesControllerTest < ActionDispatch::IntegrationTest assert_equal(0, @post.votes.active.count) assert_equal(true, @vote.reload.is_deleted?) assert_match(/deleted post vote #\d+ on post #\d+/, ModAction.post_vote_delete.last.description) + assert_equal(@vote, ModAction.last.subject) + assert_equal(admin, ModAction.last.creator) end should "not fail when attempting to remove an already removed vote" do diff --git a/test/functional/tag_aliases_controller_test.rb b/test/functional/tag_aliases_controller_test.rb index 16561726d..df2084751 100644 --- a/test/functional/tag_aliases_controller_test.rb +++ b/test/functional/tag_aliases_controller_test.rb @@ -63,6 +63,7 @@ class TagAliasesControllerTest < ActionDispatch::IntegrationTest assert_response :redirect assert_equal("deleted", @tag_alias.reload.status) assert_equal(user, ModAction.tag_alias_delete.last.creator) + assert_equal(@tag_alias, ModAction.tag_alias_delete.last.subject) end should "not allow members to delete aliases" do diff --git a/test/functional/tag_implications_controller_test.rb b/test/functional/tag_implications_controller_test.rb index 638830388..e3a2e0ddd 100644 --- a/test/functional/tag_implications_controller_test.rb +++ b/test/functional/tag_implications_controller_test.rb @@ -72,6 +72,7 @@ class TagImplicationsControllerTest < ActionDispatch::IntegrationTest assert_response :redirect assert_equal("deleted", @tag_implication.reload.status) + assert_equal(@tag_implication, ModAction.last.subject) assert_equal(user, ModAction.tag_implication_delete.last.creator) end diff --git a/test/functional/user_feedbacks_controller_test.rb b/test/functional/user_feedbacks_controller_test.rb index 29afe753b..9885cfba1 100644 --- a/test/functional/user_feedbacks_controller_test.rb +++ b/test/functional/user_feedbacks_controller_test.rb @@ -125,6 +125,8 @@ class UserFeedbacksControllerTest < ActionDispatch::IntegrationTest assert_redirected_to @user_feedback assert_equal("blah", @user_feedback.reload.body) assert_match(/updated user feedback for "#{@user.name}":\/users\/#{@user.id}/, ModAction.last.description) + assert_equal(@user, ModAction.last.subject) + assert_equal(@mod, ModAction.last.creator) end should "allow deleting feedbacks given to other users" do @@ -133,6 +135,8 @@ class UserFeedbacksControllerTest < ActionDispatch::IntegrationTest assert_redirected_to @user_feedback assert(@user_feedback.reload.is_deleted?) assert_match(/updated user feedback for "#{@user.name}":\/users\/#{@user.id}/, ModAction.last.description) + assert_equal(@user, ModAction.last.subject) + assert_equal(@mod, ModAction.last.creator) end should "not allow updating feedbacks given to themselves" do diff --git a/test/unit/comment_test.rb b/test/unit/comment_test.rb index 4cdd3a092..5eb39ad2b 100644 --- a/test/unit/comment_test.rb +++ b/test/unit/comment_test.rb @@ -159,9 +159,12 @@ class CommentTest < ActiveSupport::TestCase end should "create a mod action" do - assert_difference("ModAction.count") do - @comment.update(body: "nope") - end + @comment.update(body: "nope") + + assert_equal(1, ModAction.count) + assert_equal("comment_update", ModAction.last.category) + assert_equal(@comment, ModAction.last.subject) + assert_equal(@mod, ModAction.last.creator) end should "credit the moderator as the updater" do diff --git a/test/unit/favorite_group_test.rb b/test/unit/favorite_group_test.rb index ac496ba6f..dc3c6b739 100644 --- a/test/unit/favorite_group_test.rb +++ b/test/unit/favorite_group_test.rb @@ -27,7 +27,7 @@ class FavoriteGroupTest < ActiveSupport::TestCase @fav_group.add(@post) assert_equal([@post.id], @fav_group.post_ids) - @post.expunge! + @post.expunge!(create(:admin_user)) assert_equal([], @fav_group.reload.post_ids) end end diff --git a/test/unit/post_approval_test.rb b/test/unit/post_approval_test.rb index 6b7c7575c..5917687c4 100644 --- a/test/unit/post_approval_test.rb +++ b/test/unit/post_approval_test.rb @@ -68,6 +68,8 @@ class PostApprovalTest < ActiveSupport::TestCase assert_equal(true, @post.reload.is_active?) assert_equal("post_undelete", ModAction.last.category) assert_equal("undeleted post ##{@post.id}", ModAction.last.description) + assert_equal(@post, ModAction.last.subject) + assert_equal(@new_approver, ModAction.last.creator) end end diff --git a/test/unit/post_test.rb b/test/unit/post_test.rb index a5dff31ae..517cfd089 100644 --- a/test/unit/post_test.rb +++ b/test/unit/post_test.rb @@ -34,6 +34,15 @@ class PostTest < ActiveSupport::TestCase perform_enqueued_jobs # perform IqdbAddPostJob end + should "log a modaction" do + @post.expunge!(@user) + + assert_equal(1, ModAction.count) + assert_equal("post_permanent_delete", ModAction.last.category) + assert_equal(@user, ModAction.last.creator) + assert_nil(ModAction.last.subject) + end + should "delete the files" do assert_nothing_raised { @post.file(:preview) } assert_nothing_raised { @post.file(:original) } @@ -64,6 +73,20 @@ class PostTest < ActiveSupport::TestCase assert_equal(0, FavoriteGroup.for_post(@post.id).count) end + should "destroy all modactions belonging to the post" do + create(:mod_action, description: "deleted post ##{@post.id}", category: :post_delete, subject: @post) + create(:mod_action, description: "undeleted post ##{@post.id}", category: :post_undelete, subject: @post) + create(:mod_action, description: "banned post ##{@post.id}", category: :post_ban, subject: @post) + create(:mod_action, description: "unbanned post ##{@post.id}", category: :post_unban, subject: @post) + + @post.expunge!(@user) + + assert_equal(1, ModAction.count) + assert_equal("post_permanent_delete", ModAction.last.category) + assert_equal(@user, ModAction.last.creator) + assert_nil(ModAction.last.subject) + end + should "decrement the uploader's upload count" do assert_difference("@post.uploader.reload.post_upload_count", -1) do @post.expunge! diff --git a/test/unit/post_vote_test.rb b/test/unit/post_vote_test.rb index 4f838f42a..46e3ee8e1 100644 --- a/test/unit/post_vote_test.rb +++ b/test/unit/post_vote_test.rb @@ -107,6 +107,8 @@ class PostVoteTest < ActiveSupport::TestCase vote.soft_delete!(updater: admin) assert_match(/deleted post vote #\d+ on post #\d+/, ModAction.post_vote_delete.last.description) + assert_equal(vote, ModAction.post_vote_delete.last.subject) + assert_equal(admin, ModAction.post_vote_delete.last.creator) end end @@ -129,6 +131,8 @@ class PostVoteTest < ActiveSupport::TestCase should "leave a mod action" do assert_match(/undeleted post vote #\d+ on post #\d+/, ModAction.post_vote_undelete.last.description) + assert_equal(@vote, ModAction.post_vote_undelete.last.subject) + assert_equal(@admin, ModAction.post_vote_undelete.last.creator) end end end diff --git a/test/unit/user_deletion_test.rb b/test/unit/user_deletion_test.rb index 617211c81..d9b208a8a 100644 --- a/test/unit/user_deletion_test.rb +++ b/test/unit/user_deletion_test.rb @@ -70,6 +70,9 @@ class UserDeletionTest < ActiveSupport::TestCase should "generate a modaction" do @deletion.delete! assert_match(/deleted user ##{@user.id}/, ModAction.last.description) + assert_equal(@user, ModAction.last.subject) + assert_equal("user_delete", ModAction.last.category) + assert_equal(@deletion.deleter, ModAction.last.creator) end should "remove any favorites" do @@ -90,7 +93,9 @@ class UserDeletionTest < ActiveSupport::TestCase @deletion.delete! assert_equal("user_#{@user.id}", @user.reload.name) - assert_equal(true, ModAction.exists?(description: "deleted user ##{@user.id}", creator: @deletion.deleter)) + assert_equal("deleted user ##{@user.id}", ModAction.last.description) + assert_equal(@deletion.deleter, ModAction.last.creator) + assert_equal(@user, ModAction.last.subject) end should "not work for other users" do