Skip to content

Commit

Permalink
keep_event can be set to true to cause the incoming event to be re-em…
Browse files Browse the repository at this point in the history
…itted, with message merged in when present
  • Loading branch information
cantino committed Apr 26, 2014
1 parent 304bfbe commit 9462400
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 4 deletions.
23 changes: 20 additions & 3 deletions app/models/agents/trigger_agent.rb
Expand Up @@ -15,6 +15,8 @@ class TriggerAgent < Agent
All rules must match for the Agent to match. The resulting Event will have a payload message of `message`. You can include extractions in the message, for example: `I saw a bar of: <foo.bar>`
Set `keep_event` to `true` if you'd like to re-emit the incoming event, optionally merged with 'message' when provided.
Set `expected_receive_period_in_days` to the maximum amount of time that you'd expect to pass between Events being received by this Agent.
MD

Expand All @@ -25,15 +27,20 @@ class TriggerAgent < Agent
MD

def validate_options
unless options['expected_receive_period_in_days'].present? && options['message'].present? && options['rules'].present? &&
unless options['expected_receive_period_in_days'].present? && options['rules'].present? &&
options['rules'].all? { |rule| rule['type'].present? && VALID_COMPARISON_TYPES.include?(rule['type']) && rule['value'].present? && rule['path'].present? }
errors.add(:base, "expected_receive_period_in_days, message, and rules, with a type, value, and path for every rule, are required")
end

errors.add(:base, "message is required unless 'keep_event' is 'true'") unless options['message'].present? || keep_event?

errors.add(:base, "keep_event, when present, must be 'true' or 'false'") unless options['keep_event'].blank? || %w[true false].include?(options['keep_event'])
end

def default_options
{
'expected_receive_period_in_days' => "2",
'keep_event' => 'false',
'rules' => [{
'type' => "regex",
'value' => "foo\\d+bar",
Expand Down Expand Up @@ -79,10 +86,20 @@ def receive(incoming_events)
end

if match
create_event :payload => { 'message' => make_message(event[:payload]) } # Maybe this should include the
# original event as well?
if keep_event?
payload = event.payload.dup
payload['message'] = make_message(event[:payload]) if options['message'].present?
else
payload = { 'message' => make_message(event[:payload]) }
end

create_event :payload => payload
end
end
end

def keep_event?
options['keep_event'] == 'true'
end
end
end
58 changes: 57 additions & 1 deletion spec/models/agents/trigger_agent_spec.rb
Expand Up @@ -30,9 +30,32 @@
@checker.should be_valid
end

it "should validate presence of options" do
it "should validate presence of message" do
@checker.options['message'] = nil
@checker.should_not be_valid

@checker.options['message'] = ''
@checker.should_not be_valid
end

it "should be valid without a message when 'keep_event' is set" do
@checker.options['keep_event'] = 'true'
@checker.options['message'] = ''
@checker.should be_valid
end

it "if present, 'keep_event' must equal true or false" do
@checker.options['keep_event'] = 'true'
@checker.should be_valid

@checker.options['keep_event'] = 'false'
@checker.should be_valid

@checker.options['keep_event'] = ''
@checker.should be_valid

@checker.options['keep_event'] = 'tralse'
@checker.should_not be_valid
end

it "should validate the three fields in each rule" do
Expand Down Expand Up @@ -278,5 +301,38 @@
@checker.receive([@event])
}.should_not change { Event.count }
end

describe "when 'keep_event' is true" do
before do
@checker.options['keep_event'] = 'true'
@event.payload['foo']['bar']['baz'] = "5"
@checker.options['rules'].first['type'] = "field<value"
end

it "can re-emit the origin event" do
@checker.options['rules'].first['value'] = 3
@checker.options['message'] = ''
@event.payload['message'] = 'hi there'

lambda {
@checker.receive([@event])
}.should_not change { Event.count }

@checker.options['rules'].first['value'] = 6
lambda {
@checker.receive([@event])
}.should change { Event.count }.by(1)

@checker.most_recent_event.payload.should == @event.payload
end

it "merges 'message' into the original event when present" do
@checker.options['rules'].first['value'] = 6

@checker.receive([@event])

@checker.most_recent_event.payload.should == @event.payload.merge(:message => "I saw '5' from Joe")
end
end
end
end

0 comments on commit 9462400

Please sign in to comment.