diff --git a/app/models/post_appeal.rb b/app/models/post_appeal.rb index bb1291e7f..3d74cb879 100644 --- a/app/models/post_appeal.rb +++ b/app/models/post_appeal.rb @@ -7,12 +7,12 @@ class PostAppeal < ActiveRecord::Base validate :validate_post_is_inactive validate :validate_creator_is_not_limited before_validation :initialize_creator, :on => :create - validates_uniqueness_of :creator_id, :scope => :post_id + validates_uniqueness_of :creator_id, :scope => :post_id, :message => "has already appealed this post" scope :for_user, lambda {|user_id| where(["creator_id = ?", user_id])} scope :recent, lambda {where(["created_at >= ?", 1.day.ago])} def validate_creator_is_not_limited - if PostAppeal.for_user(creator_id).recent.count >= 5 + if appeal_count_for_creator >= 5 errors[:creator] << "can appeal 5 posts a day" false else @@ -22,7 +22,7 @@ class PostAppeal < ActiveRecord::Base def validate_post_is_inactive if !post.is_deleted? && !post.is_flagged? - errors[:post] << "is inactive" + errors[:post] << "is active" false else true @@ -33,4 +33,8 @@ class PostAppeal < ActiveRecord::Base self.creator_id = CurrentUser.id self.creator_ip_addr = CurrentUser.ip_addr end + + def appeal_count_for_creator + PostAppeal.for_user(creator_id).recent.count + end end diff --git a/test/unit/post_appeal_test.rb b/test/unit/post_appeal_test.rb index 8a02182f3..70ccd069f 100644 --- a/test/unit/post_appeal_test.rb +++ b/test/unit/post_appeal_test.rb @@ -1,8 +1,57 @@ require 'test_helper' class PostAppealTest < ActiveSupport::TestCase - # Replace this with your real tests. - test "the truth" do - assert true + context "In all cases" do + setup do + @alice = Factory.create(:user) + CurrentUser.user = @alice + CurrentUser.ip_addr = "127.0.0.1" + MEMCACHE.flush_all + end + + teardown do + CurrentUser.user = nil + CurrentUser.ip_addr = nil + end + + context "a user" do + setup do + @post = Factory.create(:post, :tag_string => "aaa", :is_deleted => true) + end + + should "not be able to appeal a post more than twice" do + assert_difference("PostAppeal.count", 1) do + @post_appeal = PostAppeal.create(:post => @post, :reason => "aaa") + end + + assert_difference("PostAppeal.count", 0) do + @post_appeal = PostAppeal.create(:post => @post, :reason => "aaa") + end + + assert_equal(["Creator has already appealed this post"], @post_appeal.errors.full_messages) + end + + should "not be able to appeal more than 5 posts in 24 hours" do + @post_appeal = PostAppeal.new(:post => @post, :reason => "aaa") + @post_appeal.expects(:appeal_count_for_creator).returns(5) + assert_difference("PostAppeal.count", 0) do + @post_appeal.save + end + assert_equal(["Creator can appeal 5 posts a day"], @post_appeal.errors.full_messages) + end + + should "not be able to appeal an active post" do + @post.update_attribute(:is_deleted, false) + assert_difference("PostAppeal.count", 0) do + @post_appeal = PostAppeal.create(:post => @post, :reason => "aaa") + end + assert_equal(["Post is active"], @post_appeal.errors.full_messages) + end + + should "initialize its creator" do + @post_appeal = PostAppeal.create(:post => @post, :reason => "aaa") + assert_equal(@alice.id, @post_appeal.creator_id) + end + end end end