From 874b4e962ad03e6567ae42555a8644fdef733e07 Mon Sep 17 00:00:00 2001 From: Harper Henn Date: Sun, 17 Aug 2014 15:18:36 -0400 Subject: [PATCH] Let users delete a specific job from a queue in the web UI --- .../resque_web/application_controller.rb | 1 + app/controllers/resque_web/jobs_controller.rb | 12 +++++ .../layouts/resque_web/application.html.erb | 3 ++ app/views/resque_web/queues/show.html.erb | 9 ++++ config/routes.rb | 1 + test/functional/jobs_controller_test.rb | 45 +++++++++++++++++++ 6 files changed, 71 insertions(+) create mode 100644 app/controllers/resque_web/jobs_controller.rb create mode 100644 test/functional/jobs_controller_test.rb diff --git a/app/controllers/resque_web/application_controller.rb b/app/controllers/resque_web/application_controller.rb index fb40424..c725fae 100644 --- a/app/controllers/resque_web/application_controller.rb +++ b/app/controllers/resque_web/application_controller.rb @@ -1,5 +1,6 @@ module ResqueWeb class ApplicationController < ActionController::Base + include ActionView::Helpers::TextHelper protect_from_forgery before_filter :set_subtabs, :authorize diff --git a/app/controllers/resque_web/jobs_controller.rb b/app/controllers/resque_web/jobs_controller.rb new file mode 100644 index 0000000..d68d1fc --- /dev/null +++ b/app/controllers/resque_web/jobs_controller.rb @@ -0,0 +1,12 @@ +module ResqueWeb + class JobsController < ApplicationController + + def destroy + args = JSON.parse(params[:args]) + destroyed = Resque::Job.destroy(params[:queue], params[:job_class], *args) + flash[:info] = "#{pluralize(destroyed, 'job')} deleted." + redirect_to queue_path(params[:queue]) + end + + end +end diff --git a/app/views/layouts/resque_web/application.html.erb b/app/views/layouts/resque_web/application.html.erb index ab50b80..c64a63d 100644 --- a/app/views/layouts/resque_web/application.html.erb +++ b/app/views/layouts/resque_web/application.html.erb @@ -44,6 +44,9 @@ <% end %>
+ <% flash.each do |key, message| %> +
<%= message %>
+ <% end %> <%= yield %>
diff --git a/app/views/resque_web/queues/show.html.erb b/app/views/resque_web/queues/show.html.erb index 9df15bf..3f4c397 100644 --- a/app/views/resque_web/queues/show.html.erb +++ b/app/views/resque_web/queues/show.html.erb @@ -13,11 +13,20 @@ Class Args + Actions <% queue_jobs.each do |job| %> <%= job['class'] %> <%=h job['args'].inspect %> + + <%= form_tag(job_path(job['class']), :method => :delete) do %> + <%= hidden_field_tag :queue, params[:id] %> + <%= hidden_field_tag :job_class, job['class'] %> + <%= hidden_field_tag :args, JSON.dump(job['args']) %> + <%= submit_tag "Delete", :class => 'btn btn-default' %> + <% end %> + <% end %> <% if queue_jobs.empty? %> diff --git a/config/routes.rb b/config/routes.rb index 10c0644..895c371 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -9,6 +9,7 @@ resource :overview, :only => [:show], :controller => :overview resources :working, :only => [:index] + resources :jobs, :only => [:destroy], param: :job_class resources :queues, :only => [:index,:show,:destroy], :constraints => {:id => id_pattern} do member do put 'clear' diff --git a/test/functional/jobs_controller_test.rb b/test/functional/jobs_controller_test.rb new file mode 100644 index 0000000..23e3a72 --- /dev/null +++ b/test/functional/jobs_controller_test.rb @@ -0,0 +1,45 @@ +require 'test_helper' + +module ResqueWeb + class JobsControllerTest < ActionController::TestCase + include ControllerTestHelpers + + let(:queue_name) { 'example_queue' } + let(:args) { ['foo', 'bar'] } + let(:params) { { queue: queue_name, job_class: 'ExampleJob', args: JSON.dump(args)} } + + setup do + @routes = Engine.routes + Resque.push(queue_name, class: 'ExampleJob', args: args) + @queue_size = Resque.size(queue_name) + end + + teardown do + Resque.remove_queue(queue_name) + end + + describe "DELETE /destroy" do + let(:params_without_args) do + params.merge(:args => JSON.dump([])) + end + + it "deletes a job having the specified arguments" do + visit(:destroy, params, method: :delete) + new_queue_size = Resque.size(queue_name) + assert_equal((@queue_size - 1), new_queue_size) + end + + it "deletes all jobs of a class if no args are specified" do + Resque.push(queue_name, class: 'ExampleJob') + visit(:destroy, params_without_args, method: :delete) + new_queue_size = Resque.size(queue_name) + assert_equal(0, new_queue_size) + end + + it "redirects to the queue's show page" do + visit(:destroy, params, method: :delete) + assert_redirected_to queue_path(queue_name) + end + end + end +end