# encoding: UTF-8

require 'rails_helper'

describe SpamRulesEnforcer do

  let(:ip_address)  { '182.189.119.174' }
  let!(:spammer1)   { Fabricate(:user, ip_address: ip_address) }
  let!(:spammer2)   { Fabricate(:user, ip_address: ip_address) }
  let(:spammer3)    { Fabricate(:user, ip_address: ip_address) }

  context 'flag_sockpuppets is disabled' do
    let!(:first_post)   { create_post(user: spammer1) }
    let!(:second_post)  { create_post(user: spammer2, topic: first_post.topic) }

    it 'should not increase spam count' do
      expect(first_post.reload.spam_count).to  eq(0)
      expect(second_post.reload.spam_count).to eq(0)
    end
  end

  context 'flag_sockpuppets is enabled' do
    before do
      SiteSetting.flag_sockpuppets = true
    end

    after do
      SiteSetting.flag_sockpuppets = false
    end

    context 'first spammer starts a topic' do
      let!(:first_post) { create_post(user: spammer1) }

      context 'second spammer replies' do
        let!(:second_post)  { create_post(user: spammer2, topic: first_post.topic) }

        it 'should increase spam count' do
          expect(first_post.reload.spam_count).to eq(1)
          expect(second_post.reload.spam_count).to eq(1)
        end

        context 'third spam post' do
          let!(:third_post) { create_post(user: spammer3, topic: first_post.topic) }

          it 'should increase spam count' do
            expect(first_post.reload.spam_count).to eq(1)
            expect(second_post.reload.spam_count).to eq(1)
            expect(third_post.reload.spam_count).to eq(1)
          end
        end
      end
    end

    context 'first user is not new' do
      let!(:old_user) { Fabricate(:user, ip_address: ip_address, created_at: 2.days.ago, trust_level: TrustLevel[1]) }

      context 'first user starts a topic' do
        let!(:first_post) { create_post(user: old_user) }

        context 'a reply by a new user at the same IP address' do
          let!(:second_post)  { create_post(user: spammer2, topic: first_post.topic) }

          it 'should increase the spam count correctly' do
            expect(first_post.reload.spam_count).to eq(0)
            expect(second_post.reload.spam_count).to eq(1)
          end
        end
      end
    end
  end

end
