@@ -18,8 +18,15 @@ module Agents |
||
18 | 18 |
|
19 | 19 |
def handle_details_post(params) |
20 | 20 |
if params['payload'] |
21 |
- create_event(:payload => params['payload']) |
|
22 |
- { :success => true } |
|
21 |
+ json = interpolate_options(JSON.parse(params['payload'])) |
|
22 |
+ if json['payloads'] && (json.keys - ['payloads']).length > 0 |
|
23 |
+ { :success => false, :error => "If you provide the 'payloads' key, please do not provide any other keys at the top level." } |
|
24 |
+ else |
|
25 |
+ [json['payloads'] || json].flatten.each do |payload| |
|
26 |
+ create_event(:payload => payload) |
|
27 |
+ end |
|
28 |
+ { :success => true } |
|
29 |
+ end |
|
23 | 30 |
else |
24 | 31 |
{ :success => false, :error => "You must provide a JSON payload" } |
25 | 32 |
end |
@@ -1,4 +1,15 @@ |
||
1 |
-<h3>Manually Create Events</h3> |
|
1 |
+<p> |
|
2 |
+ Use this form to manually emit Events from this Agent (usually for testing). |
|
3 |
+</p> |
|
4 |
+ |
|
5 |
+<p> |
|
6 |
+ If you add a top-level key called <code>payloads</code> that points to an array of objects, they will be emitted as a series |
|
7 |
+ of Events. Otherwise, everything entered will be emitted as a single Event. |
|
8 |
+</p> |
|
9 |
+ |
|
10 |
+<p> |
|
11 |
+ Liquid formatting is supported. |
|
12 |
+</p> |
|
2 | 13 |
|
3 | 14 |
<h4 id='event-creation-status'></h4> |
4 | 15 |
|
@@ -22,7 +33,7 @@ |
||
22 | 33 |
$.ajax({ |
23 | 34 |
url: $form.attr('action'), |
24 | 35 |
method: "post", |
25 |
- data: { payload: JSON.parse($form.find("textarea").val()) }, |
|
36 |
+ data: { payload: $form.find("textarea").val() }, |
|
26 | 37 |
dataType: "JSON", |
27 | 38 |
success: function(json) { |
28 | 39 |
if (json.success) { |
@@ -21,7 +21,7 @@ describe AgentsController do |
||
21 | 21 |
describe "POST handle_details_post" do |
22 | 22 |
it "passes control to handle_details_post on the agent" do |
23 | 23 |
sign_in users(:bob) |
24 |
- post :handle_details_post, :id => agents(:bob_manual_event_agent).to_param, :payload => { :foo => "bar" } |
|
24 |
+ post :handle_details_post, :id => agents(:bob_manual_event_agent).to_param, :payload => { :foo => "bar" }.to_json |
|
25 | 25 |
expect(JSON.parse(response.body)).to eq({ "success" => true }) |
26 | 26 |
expect(agents(:bob_manual_event_agent).events.last.payload).to eq({ 'foo' => "bar" }) |
27 | 27 |
end |
@@ -29,7 +29,7 @@ describe AgentsController do |
||
29 | 29 |
it "can only be accessed by the Agent's owner" do |
30 | 30 |
sign_in users(:jane) |
31 | 31 |
expect { |
32 |
- post :handle_details_post, :id => agents(:bob_manual_event_agent).to_param, :payload => { :foo => :bar } |
|
32 |
+ post :handle_details_post, :id => agents(:bob_manual_event_agent).to_param, :payload => { :foo => :bar }.to_json |
|
33 | 33 |
}.to raise_error(ActiveRecord::RecordNotFound) |
34 | 34 |
end |
35 | 35 |
end |
@@ -0,0 +1,50 @@ |
||
1 |
+require 'rails_helper' |
|
2 |
+ |
|
3 |
+describe Agents::ManualEventAgent do |
|
4 |
+ before do |
|
5 |
+ @checker = Agents::ManualEventAgent.new(name: "My Manual Event Agent") |
|
6 |
+ @checker.user = users(:jane) |
|
7 |
+ @checker.save! |
|
8 |
+ end |
|
9 |
+ |
|
10 |
+ describe "#handle_details_post" do |
|
11 |
+ it "emits an event with the given payload" do |
|
12 |
+ expect { |
|
13 |
+ json = { 'foo' => "bar" }.to_json |
|
14 |
+ expect(@checker.handle_details_post({ 'payload' => json })).to eq({ success: true }) |
|
15 |
+ }.to change { @checker.events.count }.by(1) |
|
16 |
+ expect(@checker.events.last.payload).to eq({ 'foo' => 'bar' }) |
|
17 |
+ end |
|
18 |
+ |
|
19 |
+ it "emits multiple events when given a magic 'payloads' key" do |
|
20 |
+ expect { |
|
21 |
+ json = { 'payloads' => [{ 'key' => 'value1' }, { 'key' => 'value2' }] }.to_json |
|
22 |
+ expect(@checker.handle_details_post({ 'payload' => json })).to eq({ success: true }) |
|
23 |
+ }.to change { @checker.events.count }.by(2) |
|
24 |
+ events = @checker.events.order('id desc') |
|
25 |
+ expect(events[0].payload).to eq({ 'key' => 'value2' }) |
|
26 |
+ expect(events[1].payload).to eq({ 'key' => 'value1' }) |
|
27 |
+ end |
|
28 |
+ |
|
29 |
+ it "errors when given both payloads and other top-level keys" do |
|
30 |
+ expect { |
|
31 |
+ json = { 'key' => 'value2', 'payloads' => [{ 'key' => 'value1' }] }.to_json |
|
32 |
+ expect(@checker.handle_details_post({ 'payload' => json })).to eq({ success: false, error: "If you provide the 'payloads' key, please do not provide any other keys at the top level." }) |
|
33 |
+ }.to_not change { @checker.events.count } |
|
34 |
+ end |
|
35 |
+ |
|
36 |
+ it "supports Liquid formatting" do |
|
37 |
+ expect { |
|
38 |
+ json = { 'key' => "{{ 'now' | date: '%Y' }}", 'nested' => { 'lowercase' => "{{ 'uppercase' | upcase }}" } }.to_json |
|
39 |
+ expect(@checker.handle_details_post({ 'payload' => json })).to eq({ success: true }) |
|
40 |
+ }.to change { @checker.events.count }.by(1) |
|
41 |
+ expect(@checker.events.last.payload).to eq({ 'key' => Time.now.year.to_s, 'nested' => { 'lowercase' => 'UPPERCASE' } }) |
|
42 |
+ end |
|
43 |
+ |
|
44 |
+ it "errors when not given a JSON payload" do |
|
45 |
+ expect { |
|
46 |
+ expect(@checker.handle_details_post({ 'foo' =>'bar' })).to eq({ success: false, error: "You must provide a JSON payload" }) |
|
47 |
+ }.not_to change { @checker.events.count } |
|
48 |
+ end |
|
49 |
+ end |
|
50 |
+end |