require 'rails_helper'
require 'mqtt'
require './spec/support/fake_mqtt_server'

describe Agents::MqttAgent do

  before :each do
    @error_log = StringIO.new

    @server = MQTT::FakeServer.new('127.0.0.1')
    @server.logger = Logger.new(@error_log)
    @server.logger.level = Logger::DEBUG
    @server.start

    @valid_params = {
      'uri' => "mqtt://#{@server.address}:#{@server.port}",
      'topic' => '/#',
      'max_read_time' => '0.1',
      'expected_update_period_in_days' => "2"
    }

    @checker = Agents::MqttAgent.new(
      :name => "somename", 
      :options => @valid_params, 
      :schedule => "midnight",
    )
    @checker.user = users(:jane)
    @checker.save!
  end

  after :each do
    @server.stop
  end

  describe "#check" do
    it "should create events in the initial run" do
      expect { @checker.check }.to change { Event.count }.by(2)
    end

    it "should ignore retained messages that are previously received" do
      expect { @checker.check }.to change { Event.count }.by(2)
      expect { @checker.check }.to change { Event.count }.by(1)
      expect { @checker.check }.to change { Event.count }.by(1)
      expect { @checker.check }.to change { Event.count }.by(2)
    end
  end

  describe "#working?" do
    it "checks if its generating events as scheduled" do
      expect(@checker).not_to be_working
      @checker.check
      expect(@checker.reload).to be_working
      three_days_from_now = 3.days.from_now
      allow(Time).to receive(:now) { three_days_from_now }
      expect(@checker).not_to be_working
    end
  end
end
