require 'rails_helper' describe Agents::GapDetectorAgent do let(:valid_params) { { 'name' => "my gap detector agent", 'options' => { 'window_duration_in_days' => "2", 'message' => "A gap was found!" } } } let(:agent) { _agent = Agents::GapDetectorAgent.new(valid_params) _agent.user = users(:bob) _agent.save! _agent } describe 'validation' do before do expect(agent).to be_valid end it 'should validate presence of message' do agent.options['message'] = nil expect(agent).not_to be_valid end it 'should validate presence of window_duration_in_days' do agent.options['window_duration_in_days'] = "" expect(agent).not_to be_valid agent.options['window_duration_in_days'] = "wrong" expect(agent).not_to be_valid agent.options['window_duration_in_days'] = "1" expect(agent).to be_valid agent.options['window_duration_in_days'] = "0.5" expect(agent).to be_valid end end describe '#receive' do it 'records the event if it has a created_at newer than the last seen' do agent.receive([events(:bob_website_agent_event)]) expect(agent.memory['newest_event_created_at']).to eq events(:bob_website_agent_event).created_at.to_i events(:bob_website_agent_event).created_at = 2.days.ago expect { agent.receive([events(:bob_website_agent_event)]) }.to_not change { agent.memory['newest_event_created_at'] } events(:bob_website_agent_event).created_at = 2.days.from_now expect { agent.receive([events(:bob_website_agent_event)]) }.to change { agent.memory['newest_event_created_at'] }.to(events(:bob_website_agent_event).created_at.to_i) end it 'ignores the event if value_path is present and the value at the path is blank' do agent.options['value_path'] = 'title' agent.receive([events(:bob_website_agent_event)]) expect(agent.memory['newest_event_created_at']).to eq events(:bob_website_agent_event).created_at.to_i events(:bob_website_agent_event).created_at = 2.days.from_now events(:bob_website_agent_event).payload['title'] = '' expect { agent.receive([events(:bob_website_agent_event)]) }.to_not change { agent.memory['newest_event_created_at'] } events(:bob_website_agent_event).payload['title'] = 'present!' expect { agent.receive([events(:bob_website_agent_event)]) }.to change { agent.memory['newest_event_created_at'] }.to(events(:bob_website_agent_event).created_at.to_i) end it 'clears any previous alert' do agent.memory['alerted_at'] = 2.days.ago.to_i agent.receive([events(:bob_website_agent_event)]) expect(agent.memory).to_not have_key('alerted_at') end end describe '#check' do it 'alerts once if no data has been received during window_duration_in_days' do agent.memory['newest_event_created_at'] = 1.days.ago.to_i expect { agent.check }.to_not change { agent.events.count } agent.memory['newest_event_created_at'] = 3.days.ago.to_i expect { agent.check }.to change { agent.events.count }.by(1) expect(agent.events.last.payload).to eq ({ 'message' => 'A gap was found!', 'gap_started_at' => agent.memory['newest_event_created_at'] }) expect { agent.check }.not_to change { agent.events.count } end end end