@@ -148,6 +148,9 @@ class AgentsController < ApplicationController |
||
| 148 | 148 |
else |
| 149 | 149 |
@agent = agents.build |
| 150 | 150 |
end |
| 151 |
+ |
|
| 152 |
+ @agent.scenario_ids = [params[:scenario_id]] if params[:scenario_id] && current_user.scenarios.find_by(id: params[:scenario_id]) |
|
| 153 |
+ |
|
| 151 | 154 |
initialize_presenter |
| 152 | 155 |
|
| 153 | 156 |
respond_to do |format| |
@@ -236,8 +239,10 @@ class AgentsController < ApplicationController |
||
| 236 | 239 |
when "show" |
| 237 | 240 |
if @agent && !@agent.destroyed? |
| 238 | 241 |
path = agent_path(@agent) |
| 242 |
+ else |
|
| 243 |
+ path = agents_path |
|
| 239 | 244 |
end |
| 240 |
- when /\A#{Regexp::escape scenarios_path}\/\d+\Z/, agents_path
|
|
| 245 |
+ when /\A#{Regexp::escape scenarios_path}\/\d+\z/, agents_path
|
|
| 241 | 246 |
path = ret |
| 242 | 247 |
end |
| 243 | 248 |
|
@@ -48,6 +48,15 @@ class JobsController < ApplicationController |
||
| 48 | 48 |
end |
| 49 | 49 |
end |
| 50 | 50 |
|
| 51 |
+ def destroy_all |
|
| 52 |
+ Delayed::Job.where(locked_at: nil).delete_all |
|
| 53 |
+ |
|
| 54 |
+ respond_to do |format| |
|
| 55 |
+ format.html { redirect_to jobs_path, notice: "All jobs removed." }
|
|
| 56 |
+ format.json { render json: '', status: :ok }
|
|
| 57 |
+ end |
|
| 58 |
+ end |
|
| 59 |
+ |
|
| 51 | 60 |
private |
| 52 | 61 |
|
| 53 | 62 |
def running? |
@@ -79,6 +79,10 @@ |
||
| 79 | 79 |
<%= link_to destroy_failed_jobs_path, class: "btn btn-default", method: :delete do %> |
| 80 | 80 |
<span class="glyphicon glyphicon-trash"></span> Remove failed jobs |
| 81 | 81 |
<% end %> |
| 82 |
+ |
|
| 83 |
+ <%= link_to destroy_all_jobs_path, class: "btn btn-default", method: :delete, data: { confirm: "Are you sure you want to delete ALL pending jobs for all Huginn users?" } do %>
|
|
| 84 |
+ <span class="glyphicon glyphicon-remove"></span> Remove all jobs |
|
| 85 |
+ <% end %> |
|
| 82 | 86 |
</div> |
| 83 | 87 |
</div> |
| 84 | 88 |
</div> |
@@ -16,10 +16,11 @@ |
||
| 16 | 16 |
|
| 17 | 17 |
<div class="btn-group"> |
| 18 | 18 |
<%= link_to icon_tag('glyphicon-chevron-left') + ' Back', scenarios_path, class: "btn btn-default" %>
|
| 19 |
+ <%= link_to icon_tag('glyphicon-plus') + ' New Agent', new_agent_path(scenario_id: @scenario.id), class: "btn btn-default" %>
|
|
| 19 | 20 |
<%= link_to icon_tag('glyphicon-random') + ' View Diagram', scenario_diagram_path(@scenario), class: "btn btn-default" %>
|
| 20 | 21 |
<%= link_to icon_tag('glyphicon-edit') + ' Edit', edit_scenario_path(@scenario), class: "btn btn-default" %>
|
| 21 | 22 |
<% if @scenario.source_url.present? %> |
| 22 |
- <%= link_to icon_tag('glyphicon-plus') + ' Update', new_scenario_imports_path(url: @scenario.source_url), class: "btn btn-default" %>
|
|
| 23 |
+ <%= link_to icon_tag('glyphicon-refresh') + ' Update', new_scenario_imports_path(url: @scenario.source_url), class: "btn btn-default" %>
|
|
| 23 | 24 |
<% end %> |
| 24 | 25 |
<%= link_to icon_tag('glyphicon-share-alt') + ' Share', share_scenario_path(@scenario), class: "btn btn-default" %>
|
| 25 | 26 |
<%= link_to icon_tag('glyphicon-trash') + ' Delete', scenario_path(@scenario), method: :delete, data: { confirm: "This will remove the '#{@scenario.name}' Scenerio from all Agents and delete it. Are you sure?" }, class: "btn btn-default" %>
|
@@ -62,6 +62,7 @@ Huginn::Application.routes.draw do |
||
| 62 | 62 |
end |
| 63 | 63 |
collection do |
| 64 | 64 |
delete :destroy_failed |
| 65 |
+ delete :destroy_all |
|
| 65 | 66 |
end |
| 66 | 67 |
end |
| 67 | 68 |
|
@@ -87,19 +87,35 @@ describe AgentsController do |
||
| 87 | 87 |
end |
| 88 | 88 |
end |
| 89 | 89 |
|
| 90 |
- describe "GET new with :id" do |
|
| 91 |
- it "opens a clone of a given Agent" do |
|
| 92 |
- sign_in users(:bob) |
|
| 93 |
- get :new, :id => agents(:bob_website_agent).to_param |
|
| 94 |
- expect(assigns(:agent).attributes).to eq(users(:bob).agents.build_clone(agents(:bob_website_agent)).attributes) |
|
| 90 |
+ describe "GET new" do |
|
| 91 |
+ describe "with :id" do |
|
| 92 |
+ it "opens a clone of a given Agent" do |
|
| 93 |
+ sign_in users(:bob) |
|
| 94 |
+ get :new, :id => agents(:bob_website_agent).to_param |
|
| 95 |
+ expect(assigns(:agent).attributes).to eq(users(:bob).agents.build_clone(agents(:bob_website_agent)).attributes) |
|
| 96 |
+ end |
|
| 97 |
+ |
|
| 98 |
+ it "only allows the current user to clone his own Agent" do |
|
| 99 |
+ sign_in users(:bob) |
|
| 100 |
+ |
|
| 101 |
+ expect {
|
|
| 102 |
+ get :new, :id => agents(:jane_website_agent).to_param |
|
| 103 |
+ }.to raise_error(ActiveRecord::RecordNotFound) |
|
| 104 |
+ end |
|
| 95 | 105 |
end |
| 96 | 106 |
|
| 97 |
- it "only allows the current user to clone his own Agent" do |
|
| 98 |
- sign_in users(:bob) |
|
| 107 |
+ describe "with a scenario_id" do |
|
| 108 |
+ it 'populates the assigned agent with the scenario' do |
|
| 109 |
+ sign_in users(:bob) |
|
| 110 |
+ get :new, :scenario_id => scenarios(:bob_weather).id |
|
| 111 |
+ expect(assigns(:agent).scenario_ids).to eq([scenarios(:bob_weather).id]) |
|
| 112 |
+ end |
|
| 99 | 113 |
|
| 100 |
- expect {
|
|
| 101 |
- get :new, :id => agents(:jane_website_agent).to_param |
|
| 102 |
- }.to raise_error(ActiveRecord::RecordNotFound) |
|
| 114 |
+ it "does not see other user's scenarios" do |
|
| 115 |
+ sign_in users(:bob) |
|
| 116 |
+ get :new, :scenario_id => scenarios(:jane_weather).id |
|
| 117 |
+ expect(assigns(:agent).scenario_ids).to eq([]) |
|
| 118 |
+ end |
|
| 103 | 119 |
end |
| 104 | 120 |
end |
| 105 | 121 |
|
@@ -1,7 +1,6 @@ |
||
| 1 | 1 |
require 'spec_helper' |
| 2 | 2 |
|
| 3 | 3 |
describe JobsController do |
| 4 |
- |
|
| 5 | 4 |
describe "GET index" do |
| 6 | 5 |
before do |
| 7 | 6 |
async_handler_yaml = |
@@ -71,12 +70,26 @@ describe JobsController do |
||
| 71 | 70 |
before do |
| 72 | 71 |
@failed = Delayed::Job.create(failed_at: Time.now - 1.minute) |
| 73 | 72 |
@running = Delayed::Job.create(locked_at: Time.now, locked_by: 'test') |
| 73 |
+ @pending = Delayed::Job.create |
|
| 74 | 74 |
sign_in users(:jane) |
| 75 | 75 |
end |
| 76 | 76 |
|
| 77 | 77 |
it "just destroy failed jobs" do |
| 78 |
- expect { delete :destroy_failed, id: @failed.id }.to change(Delayed::Job, :count).by(-1)
|
|
| 79 |
- expect { delete :destroy_failed, id: @running.id }.to change(Delayed::Job, :count).by(0)
|
|
| 78 |
+ expect { delete :destroy_failed }.to change(Delayed::Job, :count).by(-1)
|
|
| 79 |
+ end |
|
| 80 |
+ end |
|
| 81 |
+ |
|
| 82 |
+ describe "DELETE destroy_all" do |
|
| 83 |
+ before do |
|
| 84 |
+ @failed = Delayed::Job.create(failed_at: Time.now - 1.minute) |
|
| 85 |
+ @running = Delayed::Job.create(locked_at: Time.now, locked_by: 'test') |
|
| 86 |
+ @pending = Delayed::Job.create |
|
| 87 |
+ sign_in users(:jane) |
|
| 88 |
+ end |
|
| 89 |
+ |
|
| 90 |
+ it "destroys all jobs" do |
|
| 91 |
+ expect { delete :destroy_all }.to change(Delayed::Job, :count).by(-2)
|
|
| 92 |
+ expect(Delayed::Job.find(@running.id)).to be |
|
| 80 | 93 |
end |
| 81 | 94 |
end |
| 82 | 95 |
end |