|
@@ -0,0 +1,112 @@
|
|
|
+require 'spec_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
|