require 'rails_helper'

describe Agents::WitaiAgent do
  before do
    stub_request(:get, /wit/).to_return(:body => File.read(Rails.root.join('spec/data_fixtures/witai.json')), :status => 200, :headers => {'Content-Type' => 'text/json'})

    @valid_params = {
      :server_access_token => 'x',
      :expected_receive_period_in_days => '2',
      :query => '{{message.content}}'
    }

    @checker = Agents::WitaiAgent.new :name => 'wit.ai agent',
                                      :options => @valid_params

    @checker.user = users :jane
    @checker.save!

    @event = Event.new
    @event.agent = agents :jane_weather_agent
    @event.payload = {:message => {
      :content => 'set the temperature to 22 degrees at 7 PM'
    }}
    @event.save!
  end

  describe '#validation' do
    before do
      expect(@checker).to be_valid
    end

    it 'validates presence of server access token' do
      @checker.options[:server_access_token] = nil
      expect(@checker).not_to be_valid
    end

    it 'validates presence of query' do
      @checker.options[:query] = nil
      expect(@checker).not_to be_valid
    end

    it 'validates presence of expected receive period in days key' do
      @checker.options[:expected_receive_period_in_days] = nil
      expect(@checker).not_to be_valid
    end
  end

  describe '#working' do
    it 'checks if agent is working when event is received withing expected number of days' do
      expect(@checker).not_to be_working
      Agents::WitaiAgent.async_receive @checker.id, [@event.id]
      expect(@checker.reload).to be_working
      two_days_from_now = 2.days.from_now
      allow(Time).to receive(:now) { two_days_from_now }
      expect(@checker.reload).not_to be_working
    end
  end

  describe '#receive' do
    it 'checks that a new event is created after receiving one' do
      expect {
        @checker.receive([@event])
      }.to change { Event.count }.by(1)
    end

    it 'checks the integrity of new event' do
      @checker.receive([@event])
      expect(Event.last.payload[:outcomes][0][:_text]).to eq(@event.payload[:message][:content])
    end
  end
end
