require 'rails_helper'

describe Agents::TranslationAgent do
    before do
        @valid_params = {
            :name    => "somename",
            :options => {           
                :client_id     => "xxxxxx",
                :client_secret => "xxxxxx" ,
                :to            => "fi",
                :expected_receive_period_in_days => 1,
                :content       => {
                    :text => "{{message}}",
                    :content => "{{xyz}}"
                }
            }
        }

        @checker = Agents::TranslationAgent.new(@valid_params)
        @checker.user = users(:jane)
        @checker.save!

        @event = Event.new
        @event.agent = agents(:jane_weather_agent)
        @event.payload = {
            :message => "somevalue",
            :xyz => "someothervalue"
        }

        stub_request(:any, /microsoft/).to_return(:body => "response", :status => 200)
        stub_request(:any, /windows/).to_return(:body => JSON.dump({
            :access_token => 'xxx'}), :status => 200)

    end

    describe "#receive" do
        it "checks if it can handle multiple events" do
            event1 = Event.new
            event1.agent = agents(:bob_weather_agent)
            event1.payload = {
                :xyz => "value1",
                :message => "value2"
            }

            expect {
                @checker.receive([@event,event1])
            }.to change { Event.count }.by(2)
        end
    end

    describe "#working?" do
        it "checks if events have been received within expected receive period" do
            expect(@checker).not_to be_working
            Agents::TranslationAgent.async_receive @checker.id, [@event.id]
            expect(@checker.reload).to be_working
            two_days_from_now = 2.days.from_now
            stub(Time).now { two_days_from_now }  
            expect(@checker.reload).not_to be_working
        end
    end

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

        it "should validate presence of content key" do
            @checker.options[:content] = nil
            expect(@checker).not_to be_valid
        end

        it "should validate presence of expected_receive_period_in_days key" do
            @checker.options[:expected_receive_period_in_days] = nil
            expect(@checker).not_to be_valid
        end

        it "should validate presence of client_id key" do
            @checker.options[:client_id] = ""
            expect(@checker).not_to be_valid
        end

        it "should validate presence of client_secret key" do
            @checker.options[:client_secret] = ""
            expect(@checker).not_to be_valid
        end

        it "should validate presence of 'to' key" do
            @checker.options[:to] = ""
            expect(@checker).not_to be_valid
        end
    end
end