@@ -43,90 +43,65 @@ class @Utils |
||
| 43 | 43 |
|
| 44 | 44 |
if with_event_mode is 'no' |
| 45 | 45 |
return @invokeDryRun(url, data, cleanup) |
| 46 |
+ $.ajax url, |
|
| 47 |
+ method: 'GET', |
|
| 48 |
+ data: |
|
| 49 |
+ with_event_mode: with_event_mode |
|
| 50 |
+ source_ids: $.map($(".link-region select option:selected"), (el) -> $(el).val() )
|
|
| 51 |
+ success: (modal_data) => |
|
| 52 |
+ Utils.showDynamicModal modal_data, |
|
| 53 |
+ body: (body) => |
|
| 54 |
+ form = $(body).find('.dry-run-form')
|
|
| 55 |
+ payload_editor = form.find('.payload-editor')
|
|
| 46 | 56 |
|
| 47 |
- Utils.showDynamicModal """ |
|
| 48 |
- <h5>Event to send#{if with_event_mode is 'maybe' then ' (Optional)' else ''}</h5>
|
|
| 49 |
- <form class="dry-run-form" method="post"> |
|
| 50 |
- <div class="form-group"> |
|
| 51 |
- <textarea rows="10" name="event" class="payload-editor" data-height="200"> |
|
| 52 |
- {}
|
|
| 53 |
- </textarea> |
|
| 54 |
- </div> |
|
| 55 |
- <div class="form-group"> |
|
| 56 |
- <input value="Dry Run" class="btn btn-primary" type="submit" /> |
|
| 57 |
- </div> |
|
| 58 |
- </form> |
|
| 59 |
- """, |
|
| 60 |
- body: (body) => |
|
| 61 |
- form = $(body).find('.dry-run-form')
|
|
| 62 |
- payload_editor = form.find('.payload-editor')
|
|
| 63 |
- if previous = $(button).data('payload')
|
|
| 64 |
- payload_editor.text(previous) |
|
| 65 |
- window.setupJsonEditor(payload_editor) |
|
| 66 |
- form.submit (e) => |
|
| 67 |
- e.preventDefault() |
|
| 68 |
- json = $(e.target).find('.payload-editor').val()
|
|
| 69 |
- json = '{}' if json == ''
|
|
| 70 |
- try |
|
| 71 |
- payload = JSON.parse(json) |
|
| 72 |
- throw true unless payload.constructor is Object |
|
| 73 |
- if Object.keys(payload).length == 0 |
|
| 74 |
- json = '' |
|
| 75 |
- else |
|
| 76 |
- json = JSON.stringify(payload) |
|
| 77 |
- catch |
|
| 78 |
- alert 'Invalid JSON object.' |
|
| 79 |
- return |
|
| 80 |
- if json == '' |
|
| 81 |
- if with_event_mode is 'yes' |
|
| 82 |
- alert 'Event is required for this agent to run.' |
|
| 83 |
- return |
|
| 84 |
- dry_run_data = data |
|
| 85 |
- $(button).data('payload', null)
|
|
| 86 |
- else |
|
| 87 |
- dry_run_data = "event=#{encodeURIComponent(json)}&#{data}"
|
|
| 88 |
- $(button).data('payload', json)
|
|
| 89 |
- $(body).closest('[role=dialog]').on 'hidden.bs.modal', =>
|
|
| 90 |
- @invokeDryRun(url, dry_run_data, cleanup) |
|
| 91 |
- .modal('hide')
|
|
| 92 |
- $(body).closest('[role=dialog]').on 'shown.bs.modal', ->
|
|
| 93 |
- $(this).find('.btn-primary').focus()
|
|
| 94 |
- title: 'Dry Run' |
|
| 95 |
- onHide: cleanup |
|
| 57 |
+ if previous = $(button).data('payload')
|
|
| 58 |
+ payload_editor.text(previous) |
|
| 59 |
+ |
|
| 60 |
+ editor = window.setupJsonEditor(payload_editor)[0] |
|
| 61 |
+ |
|
| 62 |
+ $(body).find('.dry-run-event-sample').click (e) =>
|
|
| 63 |
+ e.preventDefault() |
|
| 64 |
+ editor.json = $(e.currentTarget).data('payload')
|
|
| 65 |
+ editor.rebuild() |
|
| 66 |
+ |
|
| 67 |
+ form.submit (e) => |
|
| 68 |
+ e.preventDefault() |
|
| 69 |
+ json = $(e.target).find('.payload-editor').val()
|
|
| 70 |
+ json = '{}' if json == ''
|
|
| 71 |
+ try |
|
| 72 |
+ payload = JSON.parse(json) |
|
| 73 |
+ throw true unless payload.constructor is Object |
|
| 74 |
+ if Object.keys(payload).length == 0 |
|
| 75 |
+ json = '' |
|
| 76 |
+ else |
|
| 77 |
+ json = JSON.stringify(payload) |
|
| 78 |
+ catch |
|
| 79 |
+ alert 'Invalid JSON object.' |
|
| 80 |
+ return |
|
| 81 |
+ if json == '' |
|
| 82 |
+ if with_event_mode is 'yes' |
|
| 83 |
+ alert 'Event is required for this agent to run.' |
|
| 84 |
+ return |
|
| 85 |
+ dry_run_data = data |
|
| 86 |
+ $(button).data('payload', null)
|
|
| 87 |
+ else |
|
| 88 |
+ dry_run_data = "event=#{encodeURIComponent(json)}&#{data}"
|
|
| 89 |
+ $(button).data('payload', json)
|
|
| 90 |
+ $(body).closest('[role=dialog]').on 'hidden.bs.modal', =>
|
|
| 91 |
+ @invokeDryRun(url, dry_run_data, cleanup) |
|
| 92 |
+ .modal('hide')
|
|
| 93 |
+ $(body).closest('[role=dialog]').on 'shown.bs.modal', ->
|
|
| 94 |
+ $(this).find('.btn-primary').focus()
|
|
| 95 |
+ title: 'Dry Run' |
|
| 96 |
+ onHide: cleanup |
|
| 96 | 97 |
|
| 97 | 98 |
@invokeDryRun: (url, data, callback) -> |
| 98 | 99 |
$('body').css(cursor: 'progress')
|
| 99 |
- $.ajax type: 'POST', url: url, dataType: 'json', data: data |
|
| 100 |
+ $.ajax type: 'POST', url: url, dataType: 'html', data: data |
|
| 100 | 101 |
.always => |
| 101 | 102 |
$('body').css(cursor: 'auto')
|
| 102 |
- .done (json) => |
|
| 103 |
- Utils.showDynamicModal """ |
|
| 104 |
- <!-- Nav tabs --> |
|
| 105 |
- <ul id="resultTabs" class="nav nav-tabs agent-dry-run-tabs" role="tablist"> |
|
| 106 |
- <li role="presentation"><a href="#tabEvents" aria-controls="tabEvents" role="tab" data-toggle="tab">Events</a></li> |
|
| 107 |
- <li role="presentation"><a href="#tabLog" aria-controls="tabLog" role="tab" data-toggle="tab">Log</a></li> |
|
| 108 |
- <li role="presentation"><a href="#tabMemory" aria-controls="tabMemory" role="tab" data-toggle="tab">Memory</a></li> |
|
| 109 |
- </ul> |
|
| 110 |
- <!-- Tab panes --> |
|
| 111 |
- <div class="tab-content"> |
|
| 112 |
- <div role="tabpanel" class="tab-pane" id="tabEvents"> |
|
| 113 |
- <pre class="agent-dry-run-events"></pre> |
|
| 114 |
- </div> |
|
| 115 |
- <div role="tabpanel" class="tab-pane" id="tabLog"> |
|
| 116 |
- <pre><small class="agent-dry-run-log"></small></pre> |
|
| 117 |
- </div> |
|
| 118 |
- <div role="tabpanel" class="tab-pane" id="tabMemory"> |
|
| 119 |
- <pre class="agent-dry-run-memory"></pre> |
|
| 120 |
- </div> |
|
| 121 |
- </div> |
|
| 122 |
- """, |
|
| 123 |
- body: (body) -> |
|
| 124 |
- $(body). |
|
| 125 |
- find('.agent-dry-run-log').text(json.log).end().
|
|
| 126 |
- find('.agent-dry-run-events').text(json.events).end().
|
|
| 127 |
- find('.agent-dry-run-memory').text(json.memory)
|
|
| 128 |
- active = if json.events.match(/^\[?\s*\]?$/) then 'tabLog' else 'tabEvents' |
|
| 129 |
- $('#resultTabs a[href="#' + active + '"]').tab('show')
|
|
| 103 |
+ .done (modal_data) => |
|
| 104 |
+ Utils.showDynamicModal modal_data, |
|
| 130 | 105 |
title: 'Dry Run Results', |
| 131 | 106 |
onHide: callback |
| 132 | 107 |
.fail (xhr, status, error) -> |
@@ -0,0 +1,50 @@ |
||
| 1 |
+module Agents |
|
| 2 |
+ class DryRunsController < ApplicationController |
|
| 3 |
+ include ActionView::Helpers::TextHelper |
|
| 4 |
+ |
|
| 5 |
+ def index |
|
| 6 |
+ @events = if params[:agent_id] |
|
| 7 |
+ current_user.agents.find_by(id: params[:agent_id]).received_events.limit(5) |
|
| 8 |
+ elsif params[:source_ids] |
|
| 9 |
+ Event.where(agent_id: current_user.agents.where(id: params[:source_ids]).pluck(:id)) |
|
| 10 |
+ .order("id DESC").limit(5)
|
|
| 11 |
+ end |
|
| 12 |
+ |
|
| 13 |
+ render layout: false |
|
| 14 |
+ end |
|
| 15 |
+ |
|
| 16 |
+ def create |
|
| 17 |
+ attrs = params[:agent] || {}
|
|
| 18 |
+ if agent = current_user.agents.find_by(id: params[:agent_id]) |
|
| 19 |
+ # POST /agents/:id/dry_run |
|
| 20 |
+ if attrs.present? |
|
| 21 |
+ type = agent.type |
|
| 22 |
+ agent = Agent.build_for_type(type, current_user, attrs) |
|
| 23 |
+ end |
|
| 24 |
+ else |
|
| 25 |
+ # POST /agents/dry_run |
|
| 26 |
+ type = attrs.delete(:type) |
|
| 27 |
+ agent = Agent.build_for_type(type, current_user, attrs) |
|
| 28 |
+ end |
|
| 29 |
+ agent.name ||= '(Untitled)' |
|
| 30 |
+ |
|
| 31 |
+ if agent.valid? |
|
| 32 |
+ if event_payload = params[:event] |
|
| 33 |
+ dummy_agent = Agent.build_for_type('ManualEventAgent', current_user, name: 'Dry-Runner')
|
|
| 34 |
+ dummy_agent.readonly! |
|
| 35 |
+ event = dummy_agent.events.build(user: current_user, payload: event_payload) |
|
| 36 |
+ end |
|
| 37 |
+ |
|
| 38 |
+ @results = agent.dry_run!(event) |
|
| 39 |
+ else |
|
| 40 |
+ @results = { events: [], memory: [],
|
|
| 41 |
+ log: [ |
|
| 42 |
+ "#{pluralize(agent.errors.count, "error")} prohibited this Agent from being saved:",
|
|
| 43 |
+ *agent.errors.full_messages |
|
| 44 |
+ ].join("\n- ") }
|
|
| 45 |
+ end |
|
| 46 |
+ |
|
| 47 |
+ render layout: false |
|
| 48 |
+ end |
|
| 49 |
+ end |
|
| 50 |
+end |
@@ -48,47 +48,6 @@ class AgentsController < ApplicationController |
||
| 48 | 48 |
end |
| 49 | 49 |
end |
| 50 | 50 |
|
| 51 |
- def dry_run |
|
| 52 |
- attrs = params[:agent] || {}
|
|
| 53 |
- if agent = current_user.agents.find_by(id: params[:id]) |
|
| 54 |
- # POST /agents/:id/dry_run |
|
| 55 |
- if attrs.present? |
|
| 56 |
- type = agent.type |
|
| 57 |
- agent = Agent.build_for_type(type, current_user, attrs) |
|
| 58 |
- end |
|
| 59 |
- else |
|
| 60 |
- # POST /agents/dry_run |
|
| 61 |
- type = attrs.delete(:type) |
|
| 62 |
- agent = Agent.build_for_type(type, current_user, attrs) |
|
| 63 |
- end |
|
| 64 |
- agent.name ||= '(Untitled)' |
|
| 65 |
- |
|
| 66 |
- if agent.valid? |
|
| 67 |
- if event_payload = params[:event] |
|
| 68 |
- dummy_agent = Agent.build_for_type('ManualEventAgent', current_user, name: 'Dry-Runner')
|
|
| 69 |
- dummy_agent.readonly! |
|
| 70 |
- event = dummy_agent.events.build(user: current_user, payload: event_payload) |
|
| 71 |
- end |
|
| 72 |
- |
|
| 73 |
- results = agent.dry_run!(event) |
|
| 74 |
- |
|
| 75 |
- render json: {
|
|
| 76 |
- log: results[:log], |
|
| 77 |
- events: Utils.pretty_print(results[:events], false), |
|
| 78 |
- memory: Utils.pretty_print(results[:memory] || {}, false),
|
|
| 79 |
- } |
|
| 80 |
- else |
|
| 81 |
- render json: {
|
|
| 82 |
- log: [ |
|
| 83 |
- "#{pluralize(agent.errors.count, "error")} prohibited this Agent from being saved:",
|
|
| 84 |
- *agent.errors.full_messages |
|
| 85 |
- ].join("\n- "),
|
|
| 86 |
- events: '', |
|
| 87 |
- memory: '', |
|
| 88 |
- } |
|
| 89 |
- end |
|
| 90 |
- end |
|
| 91 |
- |
|
| 92 | 51 |
def type_details |
| 93 | 52 |
@agent = Agent.build_for_type(params[:type], current_user, {})
|
| 94 | 53 |
initialize_presenter |
@@ -7,7 +7,7 @@ |
||
| 7 | 7 |
|
| 8 | 8 |
<% if agent.can_dry_run? %> |
| 9 | 9 |
<li> |
| 10 |
- <%= link_to icon_tag('glyphicon-refresh') + ' Dry Run', '#', 'data-action-url' => dry_run_agent_path(agent), 'data-with-event-mode' => agent_dry_run_with_event_mode(agent), tabindex: "-1", onclick: "Utils.handleDryRunButton(this)" %>
|
|
| 10 |
+ <%= link_to icon_tag('glyphicon-refresh') + ' Dry Run', '#', 'data-action-url' => agent_dry_runs_path(agent), 'data-with-event-mode' => agent_dry_run_with_event_mode(agent), tabindex: "-1", onclick: "Utils.handleDryRunButton(this)" %>
|
|
| 11 | 11 |
</li> |
| 12 | 12 |
<% end %> |
| 13 | 13 |
|
@@ -25,6 +25,6 @@ |
||
| 25 | 25 |
<div class="form-group"> |
| 26 | 26 |
<%= submit_tag "Save", :class => "btn btn-primary" %> |
| 27 | 27 |
<% if agent.can_dry_run? %> |
| 28 |
- <%= button_tag class: 'btn btn-default agent-dry-run-button', type: 'button', 'data-action-url' => agent.persisted? ? dry_run_agent_path(agent) : dry_run_agents_path, 'data-with-event-mode' => agent_dry_run_with_event_mode(agent) do %><%= icon_tag('glyphicon-refresh') %> Dry Run<% end %>
|
|
| 28 |
+ <%= button_tag class: 'btn btn-default agent-dry-run-button', type: 'button', 'data-action-url' => agent.persisted? ? agent_dry_runs_path(agent) : dry_runs_path(type: agent.type), 'data-with-event-mode' => agent_dry_run_with_event_mode(agent) do %><%= icon_tag('glyphicon-refresh') %> Dry Run<% end %>
|
|
| 29 | 29 |
<% end %> |
| 30 | 30 |
</div> |
@@ -0,0 +1,18 @@ |
||
| 1 |
+<!-- Nav tabs --> |
|
| 2 |
+<ul id="resultTabs" class="nav nav-tabs agent-dry-run-tabs" role="tablist"> |
|
| 3 |
+ <li role="presentation" class="<%= @results[:events].empty? ? '' : 'active' %>"><a href="#tabEvents" aria-controls="tabEvents" role="tab" data-toggle="tab">Events</a></li> |
|
| 4 |
+ <li role="presentation" class="<%= @results[:events].empty? ? 'active' : '' %>"><a href="#tabLog" aria-controls="tabLog" role="tab" data-toggle="tab">Log</a></li> |
|
| 5 |
+ <li role="presentation"><a href="#tabMemory" aria-controls="tabMemory" role="tab" data-toggle="tab">Memory</a></li> |
|
| 6 |
+</ul> |
|
| 7 |
+<!-- Tab panes --> |
|
| 8 |
+<div class="tab-content"> |
|
| 9 |
+ <div role="tabpanel" class="tab-pane <%= @results[:events].empty? ? '' : 'active' %>" id="tabEvents"> |
|
| 10 |
+ <pre class="agent-dry-run-events"><%= Utils.pretty_print(@results[:events], false) %></pre> |
|
| 11 |
+ </div> |
|
| 12 |
+ <div role="tabpanel" class="tab-pane <%= @results[:events].empty? ? 'active' : ''%>" id="tabLog"> |
|
| 13 |
+ <pre><small class="agent-dry-run-log"><%= @results[:log] %></small></pre> |
|
| 14 |
+ </div> |
|
| 15 |
+ <div role="tabpanel" class="tab-pane" id="tabMemory"> |
|
| 16 |
+ <pre class="agent-dry-run-memory"><%= Utils.pretty_print(@results[:memory], false) %></pre> |
|
| 17 |
+ </div> |
|
| 18 |
+</div> |
@@ -0,0 +1,20 @@ |
||
| 1 |
+<% if @events && @events.length > 0 %> |
|
| 2 |
+ <h5>Recently received events: </h5> |
|
| 3 |
+ <% @events.each do |event| %> |
|
| 4 |
+ <%= link_to '#', class: 'dry-run-event-sample', 'data-payload' => event.payload.to_json do %> |
|
| 5 |
+ <pre><%= truncate event.payload.to_json, :length => 90, :omission => "" %></pre> |
|
| 6 |
+ <% end %> |
|
| 7 |
+ <% end %> |
|
| 8 |
+<% end %> |
|
| 9 |
+ |
|
| 10 |
+<h5>Event to send<%= params[:with_event_mode] == 'maybe' ? ' (Optional)' : '' %></h5> |
|
| 11 |
+<form class="dry-run-form" method="post"> |
|
| 12 |
+ <div class="form-group"> |
|
| 13 |
+ <textarea rows="10" name="event" class="payload-editor" data-height="200"> |
|
| 14 |
+ {}
|
|
| 15 |
+ </textarea> |
|
| 16 |
+ </div> |
|
| 17 |
+ <div class="form-group"> |
|
| 18 |
+ <input value="Dry Run" class="btn btn-primary" type="submit" /> |
|
| 19 |
+ </div> |
|
| 20 |
+</form> |
@@ -2,7 +2,6 @@ Huginn::Application.routes.draw do |
||
| 2 | 2 |
resources :agents do |
| 3 | 3 |
member do |
| 4 | 4 |
post :run |
| 5 |
- post :dry_run |
|
| 6 | 5 |
post :handle_details_post |
| 7 | 6 |
put :leave_scenario |
| 8 | 7 |
delete :remove_events |
@@ -13,7 +12,6 @@ Huginn::Application.routes.draw do |
||
| 13 | 12 |
put :toggle_visibility |
| 14 | 13 |
post :propagate |
| 15 | 14 |
get :type_details |
| 16 |
- post :dry_run |
|
| 17 | 15 |
get :event_descriptions |
| 18 | 16 |
post :validate |
| 19 | 17 |
post :complete |
@@ -26,6 +24,14 @@ Huginn::Application.routes.draw do |
||
| 26 | 24 |
end |
| 27 | 25 |
|
| 28 | 26 |
resources :events, :only => [:index] |
| 27 |
+ |
|
| 28 |
+ scope module: :agents do |
|
| 29 |
+ resources :dry_runs, only: [:index, :create] |
|
| 30 |
+ end |
|
| 31 |
+ end |
|
| 32 |
+ |
|
| 33 |
+ scope module: :agents do |
|
| 34 |
+ resources :dry_runs, only: [:index, :create] |
|
| 29 | 35 |
end |
| 30 | 36 |
|
| 31 | 37 |
resource :diagram, :only => [:show] |
@@ -0,0 +1,104 @@ |
||
| 1 |
+require 'rails_helper' |
|
| 2 |
+ |
|
| 3 |
+describe Agents::DryRunsController do |
|
| 4 |
+ def valid_attributes(options = {})
|
|
| 5 |
+ {
|
|
| 6 |
+ type: "Agents::WebsiteAgent", |
|
| 7 |
+ name: "Something", |
|
| 8 |
+ options: agents(:bob_website_agent).options, |
|
| 9 |
+ source_ids: [agents(:bob_weather_agent).id, ""] |
|
| 10 |
+ }.merge(options) |
|
| 11 |
+ end |
|
| 12 |
+ |
|
| 13 |
+ before do |
|
| 14 |
+ sign_in users(:bob) |
|
| 15 |
+ end |
|
| 16 |
+ |
|
| 17 |
+ describe "GET index" do |
|
| 18 |
+ it "does not load any events without specifing sources" do |
|
| 19 |
+ get :index, type: 'Agents::WebsiteAgent', source_ids: [] |
|
| 20 |
+ expect(assigns(:events)).to eq([]) |
|
| 21 |
+ end |
|
| 22 |
+ |
|
| 23 |
+ context "does not load events when the agent is owned by a different user" do |
|
| 24 |
+ before do |
|
| 25 |
+ @agent = agents(:jane_website_agent) |
|
| 26 |
+ @agent.sources << @agent |
|
| 27 |
+ @agent.save! |
|
| 28 |
+ expect(@agent.events.count).not_to be(0) |
|
| 29 |
+ end |
|
| 30 |
+ |
|
| 31 |
+ it "for new agents" do |
|
| 32 |
+ get :index, type: 'Agents::WebsiteAgent', source_ids: [@agent.id] |
|
| 33 |
+ expect(assigns(:events)).to eq([]) |
|
| 34 |
+ end |
|
| 35 |
+ |
|
| 36 |
+ it "for existing agents" do |
|
| 37 |
+ expect(@agent.events.count).not_to be(0) |
|
| 38 |
+ expect { get :index, agent_id: @agent }.to raise_error(NoMethodError)
|
|
| 39 |
+ end |
|
| 40 |
+ end |
|
| 41 |
+ |
|
| 42 |
+ context "loads the most recent events" do |
|
| 43 |
+ before do |
|
| 44 |
+ @agent = agents(:bob_website_agent) |
|
| 45 |
+ @agent.sources << @agent |
|
| 46 |
+ @agent.save! |
|
| 47 |
+ end |
|
| 48 |
+ |
|
| 49 |
+ it "load the most recent events when providing source ids" do |
|
| 50 |
+ get :index, type: 'Agents::WebsiteAgent', source_ids: [@agent.id] |
|
| 51 |
+ expect(assigns(:events)).to eq([@agent.events.first]) |
|
| 52 |
+ end |
|
| 53 |
+ |
|
| 54 |
+ it "loads the most recent events for a saved agent" do |
|
| 55 |
+ get :index, agent_id: @agent |
|
| 56 |
+ expect(assigns(:events)).to eq([@agent.events.first]) |
|
| 57 |
+ end |
|
| 58 |
+ end |
|
| 59 |
+ end |
|
| 60 |
+ |
|
| 61 |
+ describe "POST create" do |
|
| 62 |
+ before do |
|
| 63 |
+ stub_request(:any, /xkcd/).to_return(body: File.read(Rails.root.join("spec/data_fixtures/xkcd.html")), status: 200)
|
|
| 64 |
+ end |
|
| 65 |
+ |
|
| 66 |
+ it "does not actually create any agent, event or log" do |
|
| 67 |
+ expect {
|
|
| 68 |
+ post :create, agent: valid_attributes |
|
| 69 |
+ }.not_to change {
|
|
| 70 |
+ [users(:bob).agents.count, users(:bob).events.count, users(:bob).logs.count] |
|
| 71 |
+ } |
|
| 72 |
+ results = assigns(:results) |
|
| 73 |
+ expect(results[:log]).to be_a(String) |
|
| 74 |
+ expect(results[:log]).to include('Extracting html at')
|
|
| 75 |
+ expect(results[:events]).to be_a(Array) |
|
| 76 |
+ expect(results[:events].length).to eq(1) |
|
| 77 |
+ expect(results[:events].map(&:class)).to eq([ActiveSupport::HashWithIndifferentAccess]) |
|
| 78 |
+ expect(results[:memory]).to be_a(Hash) |
|
| 79 |
+ end |
|
| 80 |
+ |
|
| 81 |
+ it "does not actually update an agent" do |
|
| 82 |
+ agent = agents(:bob_weather_agent) |
|
| 83 |
+ expect {
|
|
| 84 |
+ post :create, agent_id: agent, agent: valid_attributes(name: 'New Name') |
|
| 85 |
+ }.not_to change {
|
|
| 86 |
+ [users(:bob).agents.count, users(:bob).events.count, users(:bob).logs.count, agent.name, agent.updated_at] |
|
| 87 |
+ } |
|
| 88 |
+ end |
|
| 89 |
+ |
|
| 90 |
+ it "accepts an event" do |
|
| 91 |
+ agent = agents(:bob_website_agent) |
|
| 92 |
+ agent.options['url_from_event'] = '{{ url }}'
|
|
| 93 |
+ agent.save! |
|
| 94 |
+ url_from_event = "http://xkcd.com/?from_event=1".freeze |
|
| 95 |
+ expect {
|
|
| 96 |
+ post :create, agent_id: agent, event: { url: url_from_event }
|
|
| 97 |
+ }.not_to change {
|
|
| 98 |
+ [users(:bob).agents.count, users(:bob).events.count, users(:bob).logs.count, agent.name, agent.updated_at] |
|
| 99 |
+ } |
|
| 100 |
+ results = assigns(:results) |
|
| 101 |
+ expect(results[:log]).to match(/^\[\d\d:\d\d:\d\d\] INFO -- : Fetching #{Regexp.quote(url_from_event)}$/)
|
|
| 102 |
+ end |
|
| 103 |
+ end |
|
| 104 |
+end |
@@ -408,52 +408,6 @@ describe AgentsController do |
||
| 408 | 408 |
end |
| 409 | 409 |
end |
| 410 | 410 |
|
| 411 |
- describe "POST dry_run" do |
|
| 412 |
- before do |
|
| 413 |
- stub_request(:any, /xkcd/).to_return(body: File.read(Rails.root.join("spec/data_fixtures/xkcd.html")), status: 200)
|
|
| 414 |
- end |
|
| 415 |
- |
|
| 416 |
- it "does not actually create any agent, event or log" do |
|
| 417 |
- sign_in users(:bob) |
|
| 418 |
- expect {
|
|
| 419 |
- post :dry_run, agent: valid_attributes() |
|
| 420 |
- }.not_to change {
|
|
| 421 |
- [users(:bob).agents.count, users(:bob).events.count, users(:bob).logs.count] |
|
| 422 |
- } |
|
| 423 |
- json = JSON.parse(response.body) |
|
| 424 |
- expect(json['log']).to be_a(String) |
|
| 425 |
- expect(json['events']).to be_a(String) |
|
| 426 |
- expect(JSON.parse(json['events']).map(&:class)).to eq([Hash]) |
|
| 427 |
- expect(json['memory']).to be_a(String) |
|
| 428 |
- expect(JSON.parse(json['memory'])).to be_a(Hash) |
|
| 429 |
- end |
|
| 430 |
- |
|
| 431 |
- it "does not actually update an agent" do |
|
| 432 |
- sign_in users(:bob) |
|
| 433 |
- agent = agents(:bob_weather_agent) |
|
| 434 |
- expect {
|
|
| 435 |
- post :dry_run, id: agent, agent: valid_attributes(name: 'New Name') |
|
| 436 |
- }.not_to change {
|
|
| 437 |
- [users(:bob).agents.count, users(:bob).events.count, users(:bob).logs.count, agent.name, agent.updated_at] |
|
| 438 |
- } |
|
| 439 |
- end |
|
| 440 |
- |
|
| 441 |
- it "accepts an event" do |
|
| 442 |
- sign_in users(:bob) |
|
| 443 |
- agent = agents(:bob_website_agent) |
|
| 444 |
- agent.options['url_from_event'] = '{{ url }}'
|
|
| 445 |
- agent.save! |
|
| 446 |
- url_from_event = "http://xkcd.com/?from_event=1".freeze |
|
| 447 |
- expect {
|
|
| 448 |
- post :dry_run, id: agent, event: { url: url_from_event }
|
|
| 449 |
- }.not_to change {
|
|
| 450 |
- [users(:bob).agents.count, users(:bob).events.count, users(:bob).logs.count, agent.name, agent.updated_at] |
|
| 451 |
- } |
|
| 452 |
- json = JSON.parse(response.body) |
|
| 453 |
- expect(json['log']).to match(/^\[\d\d:\d\d:\d\d\] INFO -- : Fetching #{Regexp.quote(url_from_event)}$/)
|
|
| 454 |
- end |
|
| 455 |
- end |
|
| 456 |
- |
|
| 457 | 411 |
describe "DELETE memory" do |
| 458 | 412 |
it "clears memory of the agent" do |
| 459 | 413 |
agent = agents(:bob_website_agent) |