require 'spec_helper'
require_db 'db_layer'
require_db 'grid'
require_intelligence 'virtual'

module RCS
module Intelligence

  describe Virtual do

    enable_license
    silence_alerts

    let(:operation) { Item.create!(name: 'test-operation', _kind: 'operation', path: [], stat: ::Stat.new) }

    let(:target_entity) do
      target = Item.create!(name: 'bob', _kind: 'target', path: [operation._id], stat: ::Stat.new)
      Entity.any_in({path: [target._id]}).first
    end

    def virtual_entity name, url
      entity = Entity.create!(name: name, type: :virtual, level: :automatic, path: [operation._id])
      [url].flatten.each { |u| entity.create_or_update_handle(:url, u) }
      entity
    end

    it 'should use the Tracer module' do
      expect(subject).to respond_to(:trace)
    end

    describe '#process_url_evidence' do

      let(:url_evidence) do
        Evidence.dynamic_new('bob').tap do |e|
          e.data = {'url' => 'http://it.wikipedia.org/wiki/Tim_Berners-Lee'}
          e.type = :url
        end
      end

      let(:another_url_evidence) do
        Evidence.dynamic_new('bob').tap do |e|
          e.data = {'url' => "https://it.wikipedia.org/wiki/lajos_tüköry?edit=1"}
          e.type = :url
        end
      end

      context 'when there isn\'t any matching virtual entity' do

        let!(:entity) { virtual_entity("4chan", "http://4chan.org/terrorism") }

        it 'does not create any link' do
          subject.process_url_evidence target_entity, url_evidence
          expect(target_entity.reload).not_to be_linked_to entity.reload
        end
      end

      context 'when there is a matching virtual entity' do

        let!(:entity) { virtual_entity("wikipedia", ["http://it.wikipedia.org/wiki/Tim_Berners-Lee", "https://it.wikipedia.org/wiki/lajos_tüköry"]) }

        it 'creates a virtual link' do
          subject.process_url_evidence target_entity, url_evidence
          subject.process_url_evidence target_entity, another_url_evidence
          link = target_entity.links.first

          expect(target_entity.reload).to be_linked_to entity.reload
          expect(target_entity.links.size).to eql 1
          expect(link.type).to eql :virtual
          expect(link.info).to eq({:url=>["http://it.wikipedia.org/wiki/Tim_Berners-Lee", "https://it.wikipedia.org/wiki/lajos_tüköry?edit=1"]})
        end
      end

      context 'when there is a partial matching virtual entity (different protocol)' do

        let!(:entity) { virtual_entity("wikipedia", ["it.wikipedia.org/wiki/Tim_Berners-Lee", "ftp://it.wikipedia.org/wiki/lajos_tüköry"]) }

        it 'creates a virtual link' do
          subject.process_url_evidence target_entity, url_evidence
          subject.process_url_evidence target_entity, another_url_evidence
          link = target_entity.links.first

          expect(target_entity.reload).to be_linked_to entity.reload
          expect(target_entity.links.size).to eql 1
          expect(link.type).to eql :virtual
          expect(link.info).to eq({:url=>["http://it.wikipedia.org/wiki/Tim_Berners-Lee", "https://it.wikipedia.org/wiki/lajos_tüköry?edit=1"]})
        end
      end

    end
  end

end
end
