require 'spec_helper'

describe IncomingLink do

  it { should belong_to :topic }
  it { should validate_presence_of :url }

  let(:post) { Fabricate(:post) }

  let(:topic) { post.topic }

  let :incoming_link do
    IncomingLink.create(url: "/t/slug/#{topic.id}/#{post.post_number}",
                                             referer: "http://twitter.com")
  end

  describe 'local topic link' do

    it 'should validate properly' do
      Fabricate.build(:incoming_link).should be_valid
    end

    describe 'tracking link counts' do
      it "increases the incoming link counts" do
        incoming_link
        lambda { post.reload }.should change(post, :incoming_link_count).by(1)
        lambda { topic.reload }.should change(topic, :incoming_link_count).by(1)
      end
    end

    describe 'saving local link' do
      it 'has correct info set' do
        incoming_link.domain.should == "twitter.com"
        incoming_link.topic_id.should == topic.id
        incoming_link.post_number.should == post.post_number
      end

    end
  end

  describe 'add' do
    class TestRequest<Rack::Request
      attr_accessor :remote_ip
    end
    def req(url, referer=nil)
      env = Rack::MockRequest.env_for(url)
      env['HTTP_REFERER'] = referer if referer
      TestRequest.new(env)
    end

    it "does not explode with bad referer" do
      IncomingLink.add(req('http://sam.com','file:///Applications/Install/75067ABC-C9D1-47B7-8ACE-76AEDE3911B2/Install/'))
    end

    it "does nothing if referer is empty" do
      IncomingLink.expects(:create).never
      IncomingLink.add(req('http://somesite.com'))
    end

    it "does nothing if referer is same as host" do
      IncomingLink.expects(:create).never
      IncomingLink.add(req('http://somesite.com', 'http://somesite.com'))
    end

    it "expects to be called with referer and user id" do
      IncomingLink.expects(:create).once.returns(true)
      IncomingLink.add(req('http://somesite.com', 'http://some.other.site.com'), build(:user))
    end

    it "is able to look up user_id and log it from the GET params" do
      user = Fabricate(:user, username: "Bob")
      IncomingLink.add(req('http://somesite.com?u=bob'))
      first = IncomingLink.first
      first.user_id.should == user.id
    end
  end

  describe 'non-topic url' do
    it 'has nothing set' do
      link = Fabricate.build(:incoming_link_not_topic)
      link.topic_id.should be_blank
      link.user_id.should be_blank
    end

  end

end