2015-10-11 05:41:23 -04:00
|
|
|
require 'rails_helper'
|
2013-06-13 04:18:17 -04:00
|
|
|
require_dependency 'validators/post_validator'
|
|
|
|
|
|
|
|
describe Validators::PostValidator do
|
2017-07-07 02:09:14 -04:00
|
|
|
let(:post) { build(:post, topic: Fabricate(:topic)) }
|
2015-11-30 13:08:35 -05:00
|
|
|
let(:validator) { Validators::PostValidator.new({}) }
|
2013-06-13 04:18:17 -04:00
|
|
|
|
2017-04-26 23:53:53 -04:00
|
|
|
context "#post_body_validator" do
|
|
|
|
it 'should not allow a post with an empty raw' do
|
2016-12-05 07:31:43 -05:00
|
|
|
post.raw = ""
|
|
|
|
validator.post_body_validator(post)
|
2017-04-26 23:53:53 -04:00
|
|
|
expect(post.errors).to_not be_empty
|
|
|
|
end
|
|
|
|
|
|
|
|
context "when empty raw can bypass validation" do
|
|
|
|
let(:validator) { Validators::PostValidator.new(skip_post_body: true) }
|
|
|
|
|
|
|
|
it "should be allowed for empty raw based on site setting" do
|
|
|
|
post.raw = ""
|
|
|
|
validator.post_body_validator(post)
|
|
|
|
expect(post.errors).to be_empty
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe "when post's topic is a PM between a human and a non human user" do
|
|
|
|
let(:robot) { Fabricate(:user, id: -3) }
|
|
|
|
let(:user) { Fabricate(:user) }
|
|
|
|
|
|
|
|
let(:topic) do
|
|
|
|
Fabricate(:private_message_topic, topic_allowed_users: [
|
|
|
|
Fabricate.build(:topic_allowed_user, user: robot),
|
|
|
|
Fabricate.build(:topic_allowed_user, user: user)
|
|
|
|
])
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'should allow a post with an empty raw' do
|
|
|
|
post = Fabricate.build(:post, topic: topic)
|
|
|
|
post.raw = ""
|
|
|
|
validator.post_body_validator(post)
|
|
|
|
|
|
|
|
expect(post.errors).to be_empty
|
|
|
|
end
|
2016-12-05 07:31:43 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2013-06-13 04:18:17 -04:00
|
|
|
context "stripped_length" do
|
|
|
|
it "adds an error for short raw" do
|
|
|
|
post.raw = "abc"
|
|
|
|
validator.stripped_length(post)
|
|
|
|
expect(post.errors.count).to eq(1)
|
|
|
|
end
|
|
|
|
|
|
|
|
it "adds no error for long raw" do
|
|
|
|
post.raw = "this is a long topic body testing 123"
|
|
|
|
validator.stripped_length(post)
|
|
|
|
expect(post.errors.count).to eq(0)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2013-12-19 13:45:55 -05:00
|
|
|
context "too_many_posts" do
|
|
|
|
it "should be invalid when the user has posted too much" do
|
|
|
|
post.user.expects(:posted_too_much_in_topic?).returns(true)
|
|
|
|
validator.max_posts_validator(post)
|
|
|
|
expect(post.errors.count).to be > 0
|
|
|
|
end
|
|
|
|
|
2013-12-20 11:29:44 -05:00
|
|
|
it "should be allowed to edit when the user has posted too much" do
|
|
|
|
post.user.stubs(:posted_too_much_in_topic?).returns(true)
|
|
|
|
post.expects(:new_record?).returns(false)
|
|
|
|
validator.max_posts_validator(post)
|
|
|
|
expect(post.errors.count).to be(0)
|
|
|
|
end
|
|
|
|
|
2013-12-19 13:45:55 -05:00
|
|
|
it "should be valid when the user hasn't posted too much" do
|
|
|
|
post.user.expects(:posted_too_much_in_topic?).returns(false)
|
|
|
|
validator.max_posts_validator(post)
|
|
|
|
expect(post.errors.count).to be(0)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2016-02-01 10:37:49 -05:00
|
|
|
context "too_many_mentions" do
|
|
|
|
before do
|
|
|
|
SiteSetting.newuser_max_mentions_per_post = 2
|
|
|
|
SiteSetting.max_mentions_per_post = 3
|
|
|
|
end
|
|
|
|
|
|
|
|
it "should be invalid when new user exceeds max mentions limit" do
|
|
|
|
post.acting_user = build(:newuser)
|
|
|
|
post.expects(:raw_mentions).returns(['jake', 'finn', 'jake_old'])
|
|
|
|
validator.max_mention_validator(post)
|
|
|
|
expect(post.errors.count).to be > 0
|
|
|
|
end
|
|
|
|
|
2017-02-26 19:40:42 -05:00
|
|
|
it "should be invalid when leader user exceeds max mentions limit" do
|
2016-02-01 10:37:49 -05:00
|
|
|
post.acting_user = build(:trust_level_4)
|
|
|
|
post.expects(:raw_mentions).returns(['jake', 'finn', 'jake_old', 'jake_new'])
|
|
|
|
validator.max_mention_validator(post)
|
|
|
|
expect(post.errors.count).to be > 0
|
|
|
|
end
|
|
|
|
|
|
|
|
it "should be valid when new user does not exceed max mentions limit" do
|
|
|
|
post.acting_user = build(:newuser)
|
|
|
|
post.expects(:raw_mentions).returns(['jake', 'finn'])
|
|
|
|
validator.max_mention_validator(post)
|
|
|
|
expect(post.errors.count).to be(0)
|
|
|
|
end
|
|
|
|
|
2016-04-18 16:08:42 -04:00
|
|
|
it "should be valid when new user exceeds max mentions limit in PM" do
|
|
|
|
post.acting_user = build(:newuser)
|
|
|
|
post.topic.expects(:private_message?).returns(true)
|
|
|
|
post.expects(:raw_mentions).returns(['jake', 'finn', 'jake_old'])
|
|
|
|
validator.max_mention_validator(post)
|
|
|
|
expect(post.errors.count).to be(0)
|
|
|
|
end
|
|
|
|
|
2017-02-26 19:40:42 -05:00
|
|
|
it "should be valid when leader user does not exceed max mentions limit" do
|
2016-02-01 10:37:49 -05:00
|
|
|
post.acting_user = build(:trust_level_4)
|
|
|
|
post.expects(:raw_mentions).returns(['jake', 'finn', 'jake_old'])
|
|
|
|
validator.max_mention_validator(post)
|
|
|
|
expect(post.errors.count).to be(0)
|
|
|
|
end
|
|
|
|
|
|
|
|
it "should be valid for moderator in all cases" do
|
|
|
|
post.acting_user = build(:moderator)
|
|
|
|
post.expects(:raw_mentions).never
|
|
|
|
validator.max_mention_validator(post)
|
|
|
|
expect(post.errors.count).to be(0)
|
|
|
|
end
|
|
|
|
|
|
|
|
it "should be valid for admin in all cases" do
|
|
|
|
post.acting_user = build(:admin)
|
|
|
|
post.expects(:raw_mentions).never
|
|
|
|
validator.max_mention_validator(post)
|
|
|
|
expect(post.errors.count).to be(0)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-04-05 00:21:03 -04:00
|
|
|
context "too_many_images" do
|
|
|
|
before do
|
|
|
|
SiteSetting.min_trust_to_post_images = 0
|
|
|
|
SiteSetting.newuser_max_images = 2
|
|
|
|
end
|
|
|
|
|
|
|
|
it "should be invalid when new user exceeds max mentions limit" do
|
|
|
|
post.acting_user = build(:newuser)
|
|
|
|
post.expects(:image_count).returns(3)
|
|
|
|
validator.max_images_validator(post)
|
|
|
|
expect(post.errors.count).to be > 0
|
|
|
|
end
|
|
|
|
|
|
|
|
it "should be valid when new user does not exceed max mentions limit" do
|
|
|
|
post.acting_user = build(:newuser)
|
|
|
|
post.expects(:image_count).returns(2)
|
|
|
|
validator.max_images_validator(post)
|
|
|
|
expect(post.errors.count).to be(0)
|
|
|
|
end
|
|
|
|
|
|
|
|
it "should be invalid when user trust level is not sufficient" do
|
|
|
|
SiteSetting.min_trust_to_post_images = 4
|
|
|
|
post.acting_user = build(:leader)
|
|
|
|
post.expects(:image_count).returns(2)
|
|
|
|
validator.max_images_validator(post)
|
|
|
|
expect(post.errors.count).to be > 0
|
|
|
|
end
|
|
|
|
|
|
|
|
it "should be valid for moderator in all cases" do
|
|
|
|
post.acting_user = build(:moderator)
|
|
|
|
post.expects(:image_count).never
|
|
|
|
validator.max_images_validator(post)
|
|
|
|
expect(post.errors.count).to be(0)
|
|
|
|
end
|
|
|
|
|
|
|
|
it "should be valid for admin in all cases" do
|
|
|
|
post.acting_user = build(:admin)
|
|
|
|
post.expects(:image_count).never
|
|
|
|
validator.max_images_validator(post)
|
|
|
|
expect(post.errors.count).to be(0)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2013-06-13 04:18:17 -04:00
|
|
|
context "invalid post" do
|
|
|
|
it "should be invalid" do
|
|
|
|
validator.validate(post)
|
|
|
|
expect(post.errors.count).to be > 0
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2013-09-06 11:50:05 -04:00
|
|
|
describe "unique_post_validator" do
|
|
|
|
before do
|
2017-07-07 02:09:14 -04:00
|
|
|
SiteSetting.unique_posts_mins = 5
|
2013-09-06 11:50:05 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
context "post is unique" do
|
|
|
|
before do
|
2013-09-09 16:17:31 -04:00
|
|
|
post.stubs(:matches_recent_post?).returns(false)
|
2013-09-06 11:50:05 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it "should not add an error" do
|
|
|
|
validator.unique_post_validator(post)
|
2015-01-09 11:34:37 -05:00
|
|
|
expect(post.errors.count).to eq(0)
|
2013-09-06 11:50:05 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context "post is not unique" do
|
|
|
|
before do
|
2013-09-09 16:17:31 -04:00
|
|
|
post.stubs(:matches_recent_post?).returns(true)
|
2013-09-06 11:50:05 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it "should add an error" do
|
|
|
|
validator.unique_post_validator(post)
|
|
|
|
expect(post.errors.count).to be > 0
|
|
|
|
end
|
|
|
|
|
|
|
|
it "should not add an error if post.skip_unique_check is true" do
|
|
|
|
post.skip_unique_check = true
|
|
|
|
validator.unique_post_validator(post)
|
2015-01-09 11:34:37 -05:00
|
|
|
expect(post.errors.count).to eq(0)
|
2013-09-06 11:50:05 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2015-12-01 04:40:23 -05:00
|
|
|
shared_examples "almost no validations" do
|
2014-07-28 16:40:06 -04:00
|
|
|
it "skips most validations" do
|
2015-12-01 04:40:23 -05:00
|
|
|
validator.expects(:stripped_length).never
|
|
|
|
validator.expects(:raw_quality).never
|
|
|
|
validator.expects(:max_posts_validator).never
|
|
|
|
validator.expects(:max_mention_validator).never
|
|
|
|
validator.expects(:max_images_validator).never
|
|
|
|
validator.expects(:max_attachments_validator).never
|
2018-02-06 18:07:24 -05:00
|
|
|
validator.expects(:newuser_links_validator).never
|
2015-12-01 04:40:23 -05:00
|
|
|
validator.expects(:unique_post_validator).never
|
|
|
|
validator.validate(post)
|
2014-07-28 16:40:06 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2015-12-01 04:40:23 -05:00
|
|
|
context "admin editing a static page" do
|
|
|
|
before do
|
|
|
|
post.acting_user = build(:admin)
|
2017-07-07 02:09:14 -04:00
|
|
|
SiteSetting.tos_topic_id = post.topic_id
|
2015-12-01 04:40:23 -05:00
|
|
|
end
|
2015-11-30 13:08:35 -05:00
|
|
|
|
2015-12-01 04:40:23 -05:00
|
|
|
include_examples "almost no validations"
|
|
|
|
end
|
2015-11-30 13:08:35 -05:00
|
|
|
|
2015-12-01 04:40:23 -05:00
|
|
|
context "staged user" do
|
|
|
|
before { post.acting_user = build(:user, staged: true) }
|
|
|
|
include_examples "almost no validations"
|
2015-11-30 13:08:35 -05:00
|
|
|
end
|
|
|
|
|
2013-06-13 04:18:17 -04:00
|
|
|
end
|