From 9d025a993fbcc59868cb32d7685d638e97d60382 Mon Sep 17 00:00:00 2001 From: Matt Gibson Date: Tue, 6 Jan 2015 20:55:31 +0000 Subject: [PATCH 01/32] Converted syntax to Minitest spec. Lots of ordering failures. --- resque-scheduler.gemspec | 2 + test/cli_test.rb | 84 ++++----- test/delayed_queue_test.rb | 102 +++++----- test/env_test.rb | 12 +- test/multi_process_test.rb | 4 +- test/resque-web_test.rb | 331 --------------------------------- test/scheduler_args_test.rb | 38 ++-- test/scheduler_hooks_test.rb | 8 +- test/scheduler_locking_test.rb | 112 +++++------ test/scheduler_setup_test.rb | 62 +++--- test/scheduler_task_test.rb | 8 +- test/scheduler_test.rb | 71 ++++--- test/test_helper.rb | 50 ++--- test/util_test.rb | 4 +- 14 files changed, 269 insertions(+), 619 deletions(-) delete mode 100644 test/resque-web_test.rb diff --git a/resque-scheduler.gemspec b/resque-scheduler.gemspec index f0c671aa..7b548ab9 100644 --- a/resque-scheduler.gemspec +++ b/resque-scheduler.gemspec @@ -25,6 +25,8 @@ Gem::Specification.new do |spec| spec.add_development_dependency 'bundler' spec.add_development_dependency 'json' spec.add_development_dependency 'kramdown' + spec.add_development_dependency 'minitest', '~> 5.0' + spec.add_development_dependency 'mocha' spec.add_development_dependency 'pry' spec.add_development_dependency 'rack-test' diff --git a/test/cli_test.rb b/test/cli_test.rb index 61a428a7..5834e48d 100644 --- a/test/cli_test.rb +++ b/test/cli_test.rb @@ -1,7 +1,7 @@ # vim:fileencoding=utf-8 require_relative 'test_helper' -context 'Cli' do +describe 'Cli' do def mock_runtime_env mock.tap { |m| m.stubs(:setup) } end @@ -12,214 +12,214 @@ def new_cli(argv = [], env = {}) end end - test 'does not require any positional arguments' do + it 'does not require any positional arguments' do assert(!new_cli.nil?) end - test 'initializes verbose from the env' do + it 'initializes verbose from the env' do cli = new_cli([], 'VERBOSE' => 'foo') assert_equal('foo', cli.send(:options)[:verbose]) end - test 'defaults to non-verbose' do + it 'defaults to non-verbose' do assert_equal(false, !!new_cli.send(:options)[:verbose]) end - test 'accepts verbose via -v' do + it 'accepts verbose via -v' do cli = new_cli(%w(-v)) cli.parse_options assert_equal(true, cli.send(:options)[:verbose]) end - test 'accepts verbose via --verbose' do + it 'accepts verbose via --verbose' do cli = new_cli(%w(--verbose)) cli.parse_options assert_equal(true, cli.send(:options)[:verbose]) end - test 'initializes background from the env' do + it 'initializes background from the env' do cli = new_cli([], 'BACKGROUND' => '1') assert_equal('1', cli.send(:options)[:background]) end - test 'defaults to background=false' do + it 'defaults to background=false' do assert_equal(false, !!new_cli.send(:options)[:background]) end - test 'accepts background via -B' do + it 'accepts background via -B' do cli = new_cli(%w(-B)) cli.parse_options assert_equal(true, cli.send(:options)[:background]) end - test 'accepts background via --background' do + it 'accepts background via --background' do cli = new_cli(%w(--background)) cli.parse_options assert_equal(true, cli.send(:options)[:background]) end - test 'initializes pidfile from the env' do + it 'initializes pidfile from the env' do cli = new_cli([], 'PIDFILE' => 'bar') assert_equal('bar', cli.send(:options)[:pidfile]) end - test 'defaults to nil pidfile' do + it 'defaults to nil pidfile' do assert_equal(nil, new_cli.send(:options)[:pidfile]) end - test 'accepts pidfile via -P' do + it 'accepts pidfile via -P' do cli = new_cli(%w(-P foo)) cli.parse_options assert_equal('foo', cli.send(:options)[:pidfile]) end - test 'accepts pidfile via --pidfile' do + it 'accepts pidfile via --pidfile' do cli = new_cli(%w(--pidfile foo)) cli.parse_options assert_equal('foo', cli.send(:options)[:pidfile]) end - test 'defaults to nil dynamic' do + it 'defaults to nil dynamic' do assert_equal(nil, new_cli.send(:options)[:dynamic]) end - test 'initializes env from the env' do + it 'initializes env from the env' do cli = new_cli([], 'RAILS_ENV' => 'flurb') assert_equal('flurb', cli.send(:options)[:env]) end - test 'defaults to nil env' do + it 'defaults to nil env' do assert_equal(nil, new_cli.send(:options)[:env]) end - test 'accepts env via -E' do + it 'accepts env via -E' do cli = new_cli(%w(-E bork)) cli.parse_options assert_equal('bork', cli.send(:options)[:env]) end - test 'accepts env via --environment' do + it 'accepts env via --environment' do cli = new_cli(%w(--environment hork)) cli.parse_options assert_equal('hork', cli.send(:options)[:env]) end - test 'initializes initializer_path from the env' do + it 'initializes initializer_path from the env' do cli = new_cli([], 'INITIALIZER_PATH' => 'herp.rb') assert_equal('herp.rb', cli.send(:options)[:initializer_path]) end - test 'defaults to nil initializer_path' do + it 'defaults to nil initializer_path' do assert_equal(nil, new_cli.send(:options)[:initializer_path]) end - test 'accepts initializer_path via -I' do + it 'accepts initializer_path via -I' do cli = new_cli(%w(-I hambone.rb)) cli.parse_options assert_equal('hambone.rb', cli.send(:options)[:initializer_path]) end - test 'accepts initializer_path via --initalizer-path' do + it 'accepts initializer_path via --initalizer-path' do cli = new_cli(%w(--initializer-path cookies.rb)) cli.parse_options assert_equal('cookies.rb', cli.send(:options)[:initializer_path]) end - test 'loads given initilalizer_path' do + it 'loads given initilalizer_path' do cli = new_cli(%w(--initializer-path fuzzbert.rb)) cli.expects(:load).with('fuzzbert.rb') cli.pre_run end - test 'initializes quiet from the env' do + it 'initializes quiet from the env' do cli = new_cli([], 'QUIET' => '1') assert_equal('1', cli.send(:options)[:quiet]) end - test 'defaults to un-quieted' do + it 'defaults to un-quieted' do assert_equal(false, !!new_cli.send(:options)[:quiet]) end - test 'accepts quiet via -q' do + it 'accepts quiet via -q' do cli = new_cli(%w(-q)) cli.parse_options assert_equal(true, cli.send(:options)[:quiet]) end - test 'accepts quiet via --quiet' do + it 'accepts quiet via --quiet' do cli = new_cli(%w(--quiet)) cli.parse_options assert_equal(true, cli.send(:options)[:quiet]) end - test 'initializes logfile from the env' do + it 'initializes logfile from the env' do cli = new_cli([], 'LOGFILE' => 'example.log') assert_equal('example.log', cli.send(:options)[:logfile]) end - test 'defaults to nil logfile' do + it 'defaults to nil logfile' do assert_equal(nil, new_cli.send(:options)[:logfile]) end - test 'accepts logfile via -l' do + it 'accepts logfile via -l' do cli = new_cli(%w(-l hurm.out)) cli.parse_options assert_equal('hurm.out', cli.send(:options)[:logfile]) end - test 'accepts logfile via --logfile' do + it 'accepts logfile via --logfile' do cli = new_cli(%w(--logfile flam.log)) cli.parse_options assert_equal('flam.log', cli.send(:options)[:logfile]) end - test 'initializes logformat from the env' do + it 'initializes logformat from the env' do cli = new_cli([], 'LOGFORMAT' => 'fancy') assert_equal('fancy', cli.send(:options)[:logformat]) end - test 'defaults to nil logformat' do + it 'defaults to nil logformat' do assert_equal(nil, new_cli.send(:options)[:logformat]) end - test 'accepts logformat via -F' do + it 'accepts logformat via -F' do cli = new_cli(%w(-F silly)) cli.parse_options assert_equal('silly', cli.send(:options)[:logformat]) end - test 'accepts logformat via --logformat' do + it 'accepts logformat via --logformat' do cli = new_cli(%w(--logformat flimsy)) cli.parse_options assert_equal('flimsy', cli.send(:options)[:logformat]) end - test 'defaults to dynamic=false' do + it 'defaults to dynamic=false' do assert_equal(false, !!new_cli.send(:options)[:dynamic]) end - test 'initializes app_name from the env' do + it 'initializes app_name from the env' do cli = new_cli([], 'APP_NAME' => 'sprocket') assert_equal('sprocket', cli.send(:options)[:app_name]) end - test 'defaults to nil app_name' do + it 'defaults to nil app_name' do assert_equal(nil, new_cli.send(:options)[:app_name]) end - test 'accepts app_name via -n' do + it 'accepts app_name via -n' do cli = new_cli(%w(-n hambone)) cli.parse_options assert_equal('hambone', cli.send(:options)[:app_name]) end - test 'accepts app_name via --app-name' do + it 'accepts app_name via --app-name' do cli = new_cli(%w(--app-name flimsy)) cli.parse_options assert_equal('flimsy', cli.send(:options)[:app_name]) end - test 'runs Resque::Scheduler' do + it 'runs Resque::Scheduler' do Resque::Scheduler.expects(:run) Resque::Scheduler::Cli.run!([], {}) end diff --git a/test/delayed_queue_test.rb b/test/delayed_queue_test.rb index 6d043443..0fabd5dd 100644 --- a/test/delayed_queue_test.rb +++ b/test/delayed_queue_test.rb @@ -1,13 +1,13 @@ # vim:fileencoding=utf-8 require_relative 'test_helper' -context 'DelayedQueue' do - setup do +describe 'DelayedQueue' do + before do Resque::Scheduler.quiet = true Resque.redis.flushall end - test 'enqueue_at adds correct list and zset' do + it 'enqueue_at adds correct list and zset' do timestamp = Time.now + 1 encoded_job = Resque.encode( class: SomeIvarJob.to_s, @@ -48,7 +48,7 @@ 'job timestamps set should be empty') end - test 'enqueue_at with queue adds correct list and zset and queue' do + it 'enqueue_at with queue adds correct list and zset and queue' do timestamp = Time.now + 1 encoded_job = Resque.encode( class: SomeIvarJob.to_s, @@ -91,7 +91,7 @@ 'job timestamps set should be empty') end - test "a job in the future doesn't come out" do + it "a job in the future doesn't come out" do timestamp = Time.now + 600 encoded_job = Resque.encode( class: SomeIvarJob.to_s, @@ -119,7 +119,7 @@ assert_nil(read_timestamp, 'No timestamps should be ready for queueing') end - test 'a job in the future comes out if you want it to' do + it 'a job in the future comes out if you want it to' do timestamp = Time.now + 600 # 10 minutes from now Resque.enqueue_at(timestamp, SomeIvarJob, 'path') @@ -131,7 +131,7 @@ 'one we put in') end - test 'enqueue_at and enqueue_in are equivelent' do + it 'enqueue_at and enqueue_in are equivelent' do timestamp = Time.now + 60 encoded_job = Resque.encode( class: SomeIvarJob.to_s, @@ -150,11 +150,11 @@ 'job timestamps should have one entry now') end - test 'empty delayed_queue_peek returns empty array' do + it 'empty delayed_queue_peek returns empty array' do assert_equal([], Resque.delayed_queue_peek(0, 20)) end - test 'delayed_queue_peek returns stuff' do + it 'delayed_queue_peek returns stuff' do t = Time.now expected_timestamps = (1..5).to_a.map do |i| (t + 60 + i).to_i @@ -169,30 +169,30 @@ assert_equal(expected_timestamps[1, 2], timestamps) end - test 'delayed_queue_schedule_size returns correct size' do + it 'delayed_queue_schedule_size returns correct size' do assert_equal(0, Resque.delayed_queue_schedule_size) Resque.enqueue_at(Time.now + 60, SomeIvarJob) assert_equal(1, Resque.delayed_queue_schedule_size) end - test 'delayed_timestamp_size returns 0 when nothing is queue' do + it 'delayed_timestamp_size returns 0 when nothing is queue' do t = Time.now + 60 assert_equal(0, Resque.delayed_timestamp_size(t)) end - test 'delayed_timestamp_size returns 1 when one thing is queued' do + it 'delayed_timestamp_size returns 1 when one thing is queued' do t = Time.now + 60 Resque.enqueue_at(t, SomeIvarJob) assert_equal(1, Resque.delayed_timestamp_size(t)) end - test 'delayed_timestamp_peek returns empty array when nothings in it' do + it 'delayed_timestamp_peek returns empty array when nothings in it' do t = Time.now + 60 assert_equal([], Resque.delayed_timestamp_peek(t, 0, 1), "make sure it's an empty array, not nil") end - test 'delayed_timestamp_peek returns an array containing one job ' \ + it 'delayed_timestamp_peek returns an array containing one job ' \ 'when one thing is queued' do t = Time.now + 60 Resque.enqueue_at(t, SomeIvarJob) @@ -202,7 +202,7 @@ ) end - test 'delayed_timestamp_peek returns an array of multiple jobs ' \ + it 'delayed_timestamp_peek returns an array of multiple jobs ' \ 'when more than one job is queued' do t = Time.now + 60 Resque.enqueue_at(t, SomeIvarJob) @@ -211,7 +211,7 @@ assert_equal([job, job], Resque.delayed_timestamp_peek(t, 0, 2)) end - test 'delayed_timestamp_peek only returns an array of one job ' \ + it 'delayed_timestamp_peek only returns an array of one job ' \ 'if only asked for 1' do t = Time.now + 60 Resque.enqueue_at(t, SomeIvarJob) @@ -220,12 +220,12 @@ assert_equal([job], Resque.delayed_timestamp_peek(t, 0, 1)) end - test 'handle_delayed_items with no items' do + it 'handle_delayed_items with no items' do Resque::Scheduler.expects(:enqueue).never Resque::Scheduler.handle_delayed_items end - test 'handle_delayed_item with items' do + it 'handle_delayed_item with items' do t = Time.now - 60 # in the past # 2 SomeIvarJob jobs should be created in the "ivar" queue @@ -234,7 +234,7 @@ Resque.enqueue_at(t, SomeIvarJob) end - test 'handle_delayed_items with items in the future' do + it 'handle_delayed_items with items in the future' do t = Time.now + 60 # in the future Resque.enqueue_at(t, SomeIvarJob) Resque.enqueue_at(t, SomeIvarJob) @@ -244,14 +244,14 @@ Resque::Scheduler.handle_delayed_items(t) end - test 'calls klass#scheduled when enqueuing jobs if it exists' do + it 'calls klass#scheduled when enqueuing jobs if it exists' do t = Time.now - 60 FakeCustomJobClassEnqueueAt.expects(:scheduled) .once.with(:test, FakeCustomJobClassEnqueueAt.to_s, foo: 'bar') Resque.enqueue_at(t, FakeCustomJobClassEnqueueAt, foo: 'bar') end - test 'when Resque.inline = true, calls klass#scheduled ' \ + it 'when Resque.inline = true, calls klass#scheduled ' \ 'when enqueuing jobs if it exists' do old_val = Resque.inline begin @@ -265,7 +265,7 @@ end end - test 'enqueue_delayed_items_for_timestamp creates jobs ' \ + it 'enqueue_delayed_items_for_timestamp creates jobs ' \ 'and empties the delayed queue' do t = Time.now + 60 @@ -281,7 +281,7 @@ assert_equal(0, Resque.delayed_timestamp_peek(t, 0, 3).length) end - test 'enqueue_delayed creates jobs and empties the delayed queue' do + it 'enqueue_delayed creates jobs and empties the delayed queue' do t = Time.now + 60 Resque.enqueue_at(t, SomeIvarJob, 'foo') @@ -299,7 +299,7 @@ assert_equal(1, Resque.delayed_timestamp_peek(t, 0, 3).length) end - test 'handle_delayed_items works with out specifying queue ' \ + it 'handle_delayed_items works with out specifying queue ' \ '(upgrade case)' do t = Time.now - 60 Resque.delayed_push(t, class: 'SomeIvarJob') @@ -312,7 +312,7 @@ Resque::Scheduler.handle_delayed_items end - test 'reset_delayed_queue clears the queue' do + it 'reset_delayed_queue clears the queue' do t = Time.now + 120 4.times { Resque.enqueue_at(t, SomeIvarJob) } 4.times { Resque.enqueue_at(Time.now + rand(100), SomeIvarJob) } @@ -322,7 +322,7 @@ assert_equal(0, Resque.redis.keys('timestamps:*').size) end - test 'remove_delayed removes job and returns the count' do + it 'remove_delayed removes job and returns the count' do t = Time.now + 120 encoded_job = Resque.encode( class: SomeIvarJob.to_s, @@ -335,14 +335,14 @@ assert_equal(0, Resque.redis.scard("timestamps:#{encoded_job}")) end - test 'scheduled_at returns an array containing job schedule time' do + it 'scheduled_at returns an array containing job schedule time' do t = Time.now + 120 Resque.enqueue_at(t, SomeIvarJob) assert_equal([t.to_i], Resque.scheduled_at(SomeIvarJob)) end - test "remove_delayed doesn't remove things it shouldn't" do + it "remove_delayed doesn't remove things it shouldn't" do t = Time.now + 120 Resque.enqueue_at(t, SomeIvarJob, 'foo') Resque.enqueue_at(t, SomeIvarJob, 'bar') @@ -352,7 +352,7 @@ assert_equal(0, Resque.remove_delayed(SomeIvarJob)) end - test 'remove_delayed respected param' do + it 'remove_delayed respected param' do t = Time.now + 120 Resque.enqueue_at(t, SomeIvarJob, 'foo') Resque.enqueue_at(t, SomeIvarJob, 'bar') @@ -363,7 +363,7 @@ assert_equal(1, Resque.delayed_queue_schedule_size) end - test 'remove_delayed removes items in different timestamps' do + it 'remove_delayed removes items in different timestamps' do t = Time.now + 120 Resque.enqueue_at(t, SomeIvarJob, 'foo') Resque.enqueue_at(t + 1, SomeIvarJob, 'bar') @@ -374,7 +374,7 @@ assert_equal(2, Resque.count_all_scheduled_jobs) end - test 'remove_delayed_selection removes multiple items matching ' \ + it 'remove_delayed_selection removes multiple items matching ' \ 'arguments at same timestamp' do t = Time.now + 120 Resque.enqueue_at(t, SomeIvarJob, 'bar', 'llama') @@ -389,7 +389,7 @@ assert_equal(2, Resque.count_all_scheduled_jobs) end - test 'remove_delayed_selection removes single item matching arguments' do + it 'remove_delayed_selection removes single item matching arguments' do t = Time.now + 120 Resque.enqueue_at(t, SomeIvarJob, 'foo') Resque.enqueue_at(t + 1, SomeIvarJob, 'bar') @@ -400,7 +400,7 @@ assert_equal(3, Resque.count_all_scheduled_jobs) end - test 'remove_delayed_selection removes multiple items matching arguments' do + it 'remove_delayed_selection removes multiple items matching arguments' do t = Time.now + 120 Resque.enqueue_at(t, SomeIvarJob, 'foo') Resque.enqueue_at(t + 1, SomeIvarJob, 'bar') @@ -411,7 +411,7 @@ assert_equal(2, Resque.count_all_scheduled_jobs) end - test 'remove_delayed_selection removes multiple items matching ' \ + it 'remove_delayed_selection removes multiple items matching ' \ 'arguments as hash' do t = Time.now + 120 Resque.enqueue_at(t, SomeIvarJob, foo: 'foo') @@ -425,7 +425,7 @@ assert_equal(2, Resque.count_all_scheduled_jobs) end - test 'remove_delayed_selection ignores jobs with no arguments' do + it 'remove_delayed_selection ignores jobs with no arguments' do t = Time.now + 120 Resque.enqueue_at(t, SomeIvarJob) Resque.enqueue_at(t + 1, SomeIvarJob) @@ -436,7 +436,7 @@ assert_equal(4, Resque.count_all_scheduled_jobs) end - test "remove_delayed_selection doesn't remove items it shouldn't" do + it "remove_delayed_selection doesn't remove items it shouldn't" do t = Time.now + 120 Resque.enqueue_at(t, SomeIvarJob, 'foo') Resque.enqueue_at(t + 1, SomeIvarJob, 'bar') @@ -447,7 +447,7 @@ assert_equal(4, Resque.count_all_scheduled_jobs) end - test 'remove_delayed_selection ignores last_enqueued_at redis key' do + it 'remove_delayed_selection ignores last_enqueued_at redis key' do t = Time.now + 120 Resque.enqueue_at(t, SomeIvarJob) Resque.last_enqueued_at(SomeIvarJob, t) @@ -456,7 +456,7 @@ assert_equal(t.to_s, Resque.get_last_enqueued_at(SomeIvarJob)) end - test 'remove_delayed_selection removes item by class' do + it 'remove_delayed_selection removes item by class' do t = Time.now + 120 Resque.enqueue_at(t, SomeIvarJob, 'foo') Resque.enqueue_at(t, SomeQuickJob, 'foo') @@ -467,7 +467,7 @@ assert_equal(1, Resque.count_all_scheduled_jobs) end - test 'remove_delayed_selection removes item by class name as a string' do + it 'remove_delayed_selection removes item by class name as a string' do t = Time.now + 120 Resque.enqueue_at(t, SomeIvarJob, 'foo') Resque.enqueue_at(t, SomeQuickJob, 'foo') @@ -478,7 +478,7 @@ assert_equal(1, Resque.count_all_scheduled_jobs) end - test 'remove_delayed_selection removes item by class name as a symbol' do + it 'remove_delayed_selection removes item by class name as a symbol' do t = Time.now + 120 Resque.enqueue_at(t, SomeIvarJob, 'foo') Resque.enqueue_at(t, SomeQuickJob, 'foo') @@ -489,7 +489,7 @@ assert_equal(1, Resque.count_all_scheduled_jobs) end - test 'remove_delayed_selection removes items only from matching job class' do + it 'remove_delayed_selection removes items only from matching job class' do t = Time.now + 120 Resque.enqueue_at(t, SomeIvarJob, 'foo') Resque.enqueue_at(t, SomeQuickJob, 'foo') @@ -504,7 +504,7 @@ assert_equal(4, Resque.count_all_scheduled_jobs) end - test 'remove_delayed_selection removes items from matching job class ' \ + it 'remove_delayed_selection removes items from matching job class ' \ 'without params' do t = Time.now + 120 Resque.enqueue_at(t, SomeIvarJob) @@ -516,7 +516,7 @@ assert_equal(2, Resque.count_all_scheduled_jobs) end - test 'remove_delayed_job_from_timestamp removes instances of jobs ' \ + it 'remove_delayed_job_from_timestamp removes instances of jobs ' \ 'at a given timestamp' do t = Time.now + 120 Resque.enqueue_at(t, SomeIvarJob, 'foo') @@ -526,7 +526,7 @@ assert_equal 0, Resque.delayed_timestamp_size(t) end - test "remove_delayed_job_from_timestamp doesn't remove items from " \ + it "remove_delayed_job_from_timestamp doesn't remove items from " \ 'other timestamps' do t1 = Time.now + 120 t2 = t1 + 1 @@ -539,7 +539,7 @@ assert_equal 0, Resque.delayed_timestamp_size(t2) end - test 'remove_delayed_job_from_timestamp removes nothing if there ' \ + it 'remove_delayed_job_from_timestamp removes nothing if there ' \ 'are no matches' do t = Time.now + 120 assert_equal( @@ -547,7 +547,7 @@ ) end - test 'remove_delayed_job_from_timestamp only removes items that ' \ + it 'remove_delayed_job_from_timestamp only removes items that ' \ 'match args' do t = Time.now + 120 Resque.enqueue_at(t, SomeIvarJob, 'foo') @@ -558,7 +558,7 @@ assert_equal 1, Resque.delayed_timestamp_size(t) end - test 'remove_delayed_job_from_timestamp returns the number of ' \ + it 'remove_delayed_job_from_timestamp returns the number of ' \ 'items removed' do t = Time.now + 120 Resque.enqueue_at(t, SomeIvarJob, 'foo') @@ -567,7 +567,7 @@ ) end - test 'remove_delayed_job_from_timestamp should cleanup the delayed ' \ + it 'remove_delayed_job_from_timestamp should cleanup the delayed ' \ 'timestamp list if not jobs are left' do t = Time.now + 120 Resque.enqueue_at(t, SomeIvarJob, 'foo') @@ -578,13 +578,13 @@ assert Resque.delayed_queue_peek(0, 100).empty? end - test 'invalid job class' do + it 'invalid job class' do assert_raises Resque::NoQueueError do Resque.enqueue_in(10, String) end end - test 'inlining jobs with Resque.inline config' do + it 'inlining jobs with Resque.inline config' do begin Resque.inline = true Resque::Job.expects(:create).once.with(:ivar, SomeIvarJob, 'foo', 'bar') @@ -599,7 +599,7 @@ end end - test 'delayed?' do + it 'delayed?' do Resque.enqueue_at Time.now + 1, SomeIvarJob Resque.enqueue_at Time.now + 1, SomeIvarJob, id: 1 diff --git a/test/env_test.rb b/test/env_test.rb index b280100e..d8d31e38 100644 --- a/test/env_test.rb +++ b/test/env_test.rb @@ -1,18 +1,18 @@ # vim:fileencoding=utf-8 require_relative 'test_helper' -context 'Env' do +describe 'Env' do def new_env(options = {}) Resque::Scheduler::Env.new(options) end - test 'daemonizes when background is true' do + it 'daemonizes when background is true' do Process.expects(:daemon) env = new_env(background: true) env.setup end - test 'reconnects redis when background is true' do + it 'reconnects redis when background is true' do Process.stubs(:daemon) mock_redis_client = mock('redis_client') mock_redis = mock('redis') @@ -23,7 +23,7 @@ def new_env(options = {}) env.setup end - test 'aborts when background is given and Process does not support daemon' do + it 'aborts when background is given and Process does not support daemon' do Process.stubs(:daemon) Process.expects(:respond_to?).with('daemon').returns(false) env = new_env(background: true) @@ -31,14 +31,14 @@ def new_env(options = {}) env.setup end - test 'keep set config if no option given' do + it 'keep set config if no option given' do Resque::Scheduler.configure { |c| c.dynamic = true } env = new_env env.setup assert_equal(true, Resque::Scheduler.dynamic) end - test 'override config if option given' do + it 'override config if option given' do Resque::Scheduler.configure { |c| c.dynamic = true } env = new_env(dynamic: false) env.setup diff --git a/test/multi_process_test.rb b/test/multi_process_test.rb index 90d0102a..168e63c0 100644 --- a/test/multi_process_test.rb +++ b/test/multi_process_test.rb @@ -1,8 +1,8 @@ # vim:fileencoding=utf-8 require_relative 'test_helper' -context 'Multi Process' do - test 'setting schedule= from many process does not corrupt the schedules' do +describe 'Multi Process' do + it 'setting schedule= from many process does not corrupt the schedules' do schedules = {} counts = [] threads = [] diff --git a/test/resque-web_test.rb b/test/resque-web_test.rb deleted file mode 100644 index 356b7ce7..00000000 --- a/test/resque-web_test.rb +++ /dev/null @@ -1,331 +0,0 @@ -# vim:fileencoding=utf-8 -require_relative 'test_helper' - -require 'resque/server/test_helper' - -context 'on GET to /schedule' do - setup { get '/schedule' } - - test('is 200') { assert last_response.ok? } -end - -context 'on GET to /schedule with scheduled jobs' do - setup do - Resque::Scheduler.env = 'production' - Resque.schedule = { - 'some_ivar_job' => { - 'cron' => '* * * * *', - 'class' => 'SomeIvarJob', - 'args' => '/tmp', - 'rails_env' => 'production' - }, - 'some_other_job' => { - 'every' => ['1m', ['1h']], - 'queue' => 'high', - 'custom_job_class' => 'SomeOtherJob', - 'args' => { - 'b' => 'blah' - } - }, - 'some_fancy_job' => { - 'every' => ['1m'], - 'queue' => 'fancy', - 'class' => 'SomeFancyJob', - 'args' => 'sparkles', - 'rails_env' => 'fancy' - }, - 'shared_env_job' => { - 'cron' => '* * * * *', - 'class' => 'SomeSharedEnvJob', - 'args' => '/tmp', - 'rails_env' => 'fancy, production' - } - } - Resque::Scheduler.load_schedule! - get '/schedule' - end - - test('is 200') { assert last_response.ok? } - - test 'see the scheduled job' do - assert last_response.body.include?('SomeIvarJob') - end - - test 'excludes jobs for other envs' do - assert !last_response.body.include?('SomeFancyJob') - end - - test 'includes job used in multiple environments' do - assert last_response.body.include?('SomeSharedEnvJob') - end - - test 'allows delete when dynamic' do - Resque::Scheduler.stubs(:dynamic).returns(true) - get '/schedule' - - assert last_response.body.include?('Delete') - end - - test "doesn't allow delete when static" do - Resque::Scheduler.stubs(:dynamic).returns(false) - get '/schedule' - - assert !last_response.body.include?('Delete') - end -end - -context 'on GET to /delayed' do - setup { get '/delayed' } - - test('is 200') { assert last_response.ok? } -end - -context 'on GET to /delayed/jobs/:klass'do - setup do - @t = Time.now + 3600 - Resque.enqueue_at(@t, SomeIvarJob, 'foo', 'bar') - get( - URI('/delayed/jobs/SomeIvarJob?args=' << - URI.encode(%w(foo bar).to_json)).to_s - ) - end - - test('is 200') { assert last_response.ok? } - - test 'see the scheduled job' do - assert last_response.body.include?(@t.to_s) - end - - context 'with a namespaced class' do - setup do - @t = Time.now + 3600 - module Foo - class Bar - def self.queue - 'bar' - end - end - end - Resque.enqueue_at(@t, Foo::Bar, 'foo', 'bar') - get( - URI('/delayed/jobs/Foo::Bar?args=' << - URI.encode(%w(foo bar).to_json)).to_s - ) - end - - test('is 200') { assert last_response.ok? } - - test 'see the scheduled job' do - assert last_response.body.include?(@t.to_s) - end - end -end - -module Test - RESQUE_SCHEDULE = { - 'job_without_params' => { - 'cron' => '* * * * *', - 'class' => 'JobWithoutParams', - 'args' => { - 'host' => 'localhost' - }, - 'rails_env' => 'production' - }, - 'job_with_params' => { - 'every' => '1m', - 'class' => 'JobWithParams', - 'args' => { - 'host' => 'localhost' - }, - 'parameters' => { - 'log_level' => { - 'description' => 'The level of logging', - 'default' => 'warn' - } - } - } - } -end - -context 'POST /schedule/requeue' do - setup do - Resque.schedule = Test::RESQUE_SCHEDULE - Resque::Scheduler.load_schedule! - end - - test 'job without params' do - # Regular jobs without params should redirect to /overview - job_name = 'job_without_params' - Resque::Scheduler.stubs(:enqueue_from_config) - .once.with(Resque.schedule[job_name]) - - post '/schedule/requeue', 'job_name' => job_name - follow_redirect! - assert_equal 'http://example.org/overview', last_request.url - assert last_response.ok? - end - - test 'job with params' do - # If a job has params defined, - # it should render the template with a form for the job params - job_name = 'job_with_params' - post '/schedule/requeue', 'job_name' => job_name - - assert last_response.ok?, last_response.errors - assert last_response.body.include?('This job requires parameters') - assert last_response.body.include?( - %() - ) - - Resque.schedule[job_name]['parameters'].each do |_param_name, param_config| - assert last_response.body.include?( - '(?)] - ) - assert last_response.body.include?( - ') - ) - end - end -end - -context 'POST /schedule/requeue_with_params' do - setup do - Resque.schedule = Test::RESQUE_SCHEDULE - Resque::Scheduler.load_schedule! - end - - test 'job with params' do - job_name = 'job_with_params' - log_level = 'error' - - job_config = Resque.schedule[job_name] - args = job_config['args'].merge('log_level' => log_level) - job_config = job_config.merge('args' => args) - - Resque::Scheduler.stubs(:enqueue_from_config).once.with(job_config) - - post '/schedule/requeue_with_params', - 'job_name' => job_name, - 'log_level' => log_level - - follow_redirect! - assert_equal 'http://example.org/overview', last_request.url - - assert last_response.ok?, last_response.errors - end -end - -context 'on POST to /delayed/search' do - setup do - t = Time.now + 60 - Resque.enqueue_at(t, SomeIvarJob) - Resque.enqueue(SomeQuickJob) - end - - test 'should find matching scheduled job' do - post '/delayed/search', 'search' => 'ivar' - assert last_response.status == 200 - assert last_response.body.include?('SomeIvarJob') - end - - test 'should find matching queued job' do - post '/delayed/search', 'search' => 'quick' - assert last_response.status == 200 - assert last_response.body.include?('SomeQuickJob') - end -end - -context 'on POST to /delayed/cancel_now' do - setup { post '/delayed/cancel_now' } - - test 'redirects to overview' do - assert last_response.status == 302 - assert last_response.header['Location'].include? '/delayed' - end -end - -context 'on POST to /delayed/clear' do - setup { post '/delayed/clear' } - - test 'redirects to delayed' do - assert last_response.status == 302 - assert last_response.header['Location'].include? '/delayed' - end -end - -context 'on POST to /delayed/queue_now' do - setup { post '/delayed/queue_now' } - - test 'redirects to overview' do - assert last_response.status == 302 - assert last_response.header['Location'].include? '/overview' - end -end - -context 'on GET to /delayed/:timestamp' do - setup { get '/delayed/1234567890' } - - test 'shows delayed_timestamp view' do - assert last_response.status == 200 - end -end - -context 'DELETE /schedule when dynamic' do - setup do - Resque.schedule = Test::RESQUE_SCHEDULE - Resque::Scheduler.load_schedule! - Resque::Scheduler.stubs(:dynamic).returns(true) - end - - test 'redirects to schedule page' do - delete '/schedule' - - status = last_response.status - redirect_location = last_response.original_headers['Location'] - response_status_msg = "Expected response to be a 302, but was a #{status}." - redirect_msg = "Redirect to #{redirect_location} instead of /schedule." - - assert status == 302, response_status_msg - assert_match %r{/schedule/?$}, redirect_location, redirect_msg - end - - test 'does not show the deleted job' do - delete '/schedule', job_name: 'job_with_params' - follow_redirect! - - msg = 'The job should not have been shown on the /schedule page.' - assert !last_response.body.include?('job_with_params'), msg - end - - test 'removes job from redis' do - delete '/schedule', job_name: 'job_with_params' - - msg = 'The job was not deleted from redis.' - assert_nil Resque.fetch_schedule('job_with_params'), msg - end -end - -context 'DELETE /schedule when static' do - setup do - Resque.schedule = Test::RESQUE_SCHEDULE - Resque::Scheduler.load_schedule! - Resque::Scheduler.stubs(:dynamic).returns(false) - end - - test 'does not remove the job from the UI' do - delete '/schedule', job_name: 'job_with_params' - follow_redirect! - - msg = 'The job should not have been removed from the /schedule page.' - assert last_response.body.include?('job_with_params'), msg - end - - test 'does not remove job from redis' do - delete '/schedule', job_name: 'job_with_params' - - msg = 'The job should not have been deleted from redis.' - assert Resque.fetch_schedule('job_with_params'), msg - end -end diff --git a/test/scheduler_args_test.rb b/test/scheduler_args_test.rb index 0655369c..27399472 100644 --- a/test/scheduler_args_test.rb +++ b/test/scheduler_args_test.rb @@ -2,8 +2,8 @@ require_relative 'test_helper' -context 'scheduling jobs with arguments' do - setup do +describe 'scheduling jobs with arguments' do + before do Resque::Scheduler.clear_schedule! Resque::Scheduler.configure do |c| c.dynamic = false @@ -12,7 +12,7 @@ end end - test 'enqueue_from_config puts stuff in resque without class loaded' do + it 'enqueue_from_config puts stuff in resque without class loaded' do Resque::Job.stubs(:create).once.returns(true) .with('joes_queue', 'UndefinedJob', '/tmp') Resque::Scheduler.enqueue_from_config( @@ -23,7 +23,7 @@ ) end - test 'enqueue_from_config with_every_syntax' do + it 'enqueue_from_config with_every_syntax' do Resque::Job.stubs(:create).once.returns(true) .with('james_queue', 'JamesJob', '/tmp') Resque::Scheduler.enqueue_from_config( @@ -34,7 +34,7 @@ ) end - test 'enqueue_from_config puts jobs in the resque queue' do + it 'enqueue_from_config puts jobs in the resque queue' do Resque::Job.stubs(:create).once.returns(true) .with(:ivar, SomeIvarJob, '/tmp') Resque::Scheduler.enqueue_from_config( @@ -44,7 +44,7 @@ ) end - test 'enqueue_from_config with custom_class_job in resque' do + it 'enqueue_from_config with custom_class_job in resque' do FakeCustomJobClass.stubs(:scheduled).once.returns(true) .with(:ivar, 'SomeIvarJob', '/tmp') Resque::Scheduler.enqueue_from_config( @@ -55,7 +55,7 @@ ) end - test 'enqueue_from_config puts stuff in resque when env matches' do + it 'enqueue_from_config puts stuff in resque when env matches' do Resque::Scheduler.env = 'production' assert_equal(0, Resque::Scheduler.rufus_scheduler.jobs.size) @@ -84,7 +84,7 @@ assert_equal(2, Resque::Scheduler.rufus_scheduler.jobs.size) end - test 'enqueue_from_config does not enqueue when env does not match' do + it 'enqueue_from_config does not enqueue when env does not match' do Resque::Scheduler.env = nil assert_equal(0, Resque::Scheduler.rufus_scheduler.jobs.size) Resque.schedule = { @@ -112,7 +112,7 @@ assert_equal(0, Resque::Scheduler.rufus_scheduler.jobs.size) end - test 'enqueue_from_config when env env arg is not set' do + it 'enqueue_from_config when env env arg is not set' do Resque::Scheduler.env = 'production' assert_equal(0, Resque::Scheduler.rufus_scheduler.jobs.size) @@ -127,7 +127,7 @@ assert_equal(1, Resque::Scheduler.rufus_scheduler.jobs.size) end - test "calls the worker without arguments when 'args' is missing " \ + it "calls the worker without arguments when 'args' is missing " \ 'from the config' do Resque::Scheduler.enqueue_from_config(YAML.load(<<-YAML)) class: SomeIvarJob @@ -136,7 +136,7 @@ Resque.reserve('ivar').perform end - test "calls the worker without arguments when 'args' is blank " \ + it "calls the worker without arguments when 'args' is blank " \ 'in the config' do Resque::Scheduler.enqueue_from_config(YAML.load(<<-YAML)) class: SomeIvarJob @@ -146,7 +146,7 @@ Resque.reserve('ivar').perform end - test 'calls the worker with a string when the config lists a string' do + it 'calls the worker with a string when the config lists a string' do Resque::Scheduler.enqueue_from_config(YAML.load(<<-YAML)) class: SomeIvarJob args: string @@ -155,7 +155,7 @@ Resque.reserve('ivar').perform end - test 'calls the worker with a Fixnum when the config lists an integer' do + it 'calls the worker with a Fixnum when the config lists an integer' do Resque::Scheduler.enqueue_from_config(YAML.load(<<-YAML)) class: SomeIvarJob args: 1 @@ -164,7 +164,7 @@ Resque.reserve('ivar').perform end - test 'calls the worker with multiple arguments when the config ' \ + it 'calls the worker with multiple arguments when the config ' \ 'lists an array' do Resque::Scheduler.enqueue_from_config(YAML.load(<<-YAML)) class: SomeIvarJob @@ -176,7 +176,7 @@ Resque.reserve('ivar').perform end - test 'calls the worker with an array when the config lists ' \ + it 'calls the worker with an array when the config lists ' \ 'a nested array' do Resque::Scheduler.enqueue_from_config(YAML.load(<<-YAML)) class: SomeIvarJob @@ -188,7 +188,7 @@ Resque.reserve('ivar').perform end - test 'calls the worker with a hash when the config lists a hash' do + it 'calls the worker with a hash when the config lists a hash' do Resque::Scheduler.enqueue_from_config(YAML.load(<<-YAML)) class: SomeIvarJob args: @@ -198,7 +198,7 @@ Resque.reserve('ivar').perform end - test 'calls the worker with a nested hash when the config lists ' \ + it 'calls the worker with a nested hash when the config lists ' \ 'a nested hash' do Resque::Scheduler.enqueue_from_config(YAML.load(<<-YAML)) class: SomeIvarJob @@ -211,11 +211,11 @@ Resque.reserve('ivar').perform end - test 'poll_sleep_amount defaults to 5' do + it 'poll_sleep_amount defaults to 5' do assert_equal 5, Resque::Scheduler.poll_sleep_amount end - test 'poll_sleep_amount is settable' do + it 'poll_sleep_amount is settable' do Resque::Scheduler.poll_sleep_amount = 1 assert_equal 1, Resque::Scheduler.poll_sleep_amount end diff --git a/test/scheduler_hooks_test.rb b/test/scheduler_hooks_test.rb index 1a36bcdd..df1bb5d4 100644 --- a/test/scheduler_hooks_test.rb +++ b/test/scheduler_hooks_test.rb @@ -1,10 +1,10 @@ # vim:fileencoding=utf-8 require_relative 'test_helper' -context 'scheduling jobs with hooks' do - setup { Resque.redis.flushall } +describe 'scheduling jobs with hooks' do + before { Resque.redis.flushall } - test 'before_schedule hook that does not return false should be enqueued' do + it 'before_schedule hook that does not return false should be enqueued' do enqueue_time = Time.now SomeRealClass.expects(:before_schedule_example).with(:foo) SomeRealClass.expects(:after_schedule_example).with(:foo) @@ -13,7 +13,7 @@ 'job should be enqueued') end - test 'before_schedule hook that returns false should not be enqueued' do + it 'before_schedule hook that returns false should not be enqueued' do enqueue_time = Time.now SomeRealClass.expects(:before_schedule_example).with(:foo).returns(false) SomeRealClass.expects(:after_schedule_example).never diff --git a/test/scheduler_locking_test.rb b/test/scheduler_locking_test.rb index aa940a20..5f4d0417 100644 --- a/test/scheduler_locking_test.rb +++ b/test/scheduler_locking_test.rb @@ -7,32 +7,33 @@ def lock_is_not_held(lock) end end -context '#master_lock_key' do - setup do +describe '#master_lock_key' do + before do @subject = Class.new { extend Resque::Scheduler::Locking } end - teardown do + after do Resque.redis.del(@subject.master_lock.key) end - test 'should have resque prefix' do + it 'should have resque prefix' do assert_equal( @subject.master_lock.key, 'resque:resque_scheduler_master_lock' ) end - context 'with a prefix set via ENV' do - setup do + describe 'with a prefix set via ENV' do + before do ENV['RESQUE_SCHEDULER_MASTER_LOCK_PREFIX'] = 'my.prefix' @subject = Class.new { extend Resque::Scheduler::Locking } end - teardown do + after do + ENV.delete 'RESQUE_SCHEDULER_MASTER_LOCK_PREFIX' Resque.redis.del(@subject.master_lock.key) end - test 'should have ENV prefix' do + it 'should have ENV prefix' do assert_equal( @subject.master_lock.key, 'resque:my.prefix:resque_scheduler_master_lock' @@ -40,36 +41,37 @@ def lock_is_not_held(lock) end end - context 'with a namespace set for resque' do - setup do + describe 'with a namespace set for resque' do + before do Resque.redis.namespace = 'my.namespace' @subject = Class.new { extend Resque::Scheduler::Locking } end - teardown do + after do Resque.redis.namespace = 'resque' Resque.redis.del(@subject.master_lock.key) end - test 'should have resque prefix' do + it 'should have resque prefix' do assert_equal( @subject.master_lock.key, 'my.namespace:resque_scheduler_master_lock' ) end - context 'with a prefix set via ENV' do - setup do + describe 'with a prefix set via ENV' do + before do Resque.redis.namespace = 'my.namespace' ENV['RESQUE_SCHEDULER_MASTER_LOCK_PREFIX'] = 'my.prefix' @subject = Class.new { extend Resque::Scheduler::Locking } end - teardown do + after do Resque.redis.namespace = 'resque' + ENV.delete 'RESQUE_SCHEDULER_MASTER_LOCK_PREFIX' Resque.redis.del(@subject.master_lock.key) end - test 'should have ENV prefix' do + it 'should have ENV prefix' do assert_equal( @subject.master_lock.key, 'my.namespace:my.prefix:resque_scheduler_master_lock' @@ -79,22 +81,22 @@ def lock_is_not_held(lock) end end -context 'Resque::Scheduler::Locking' do - setup do +describe 'Resque::Scheduler::Locking' do + before do @subject = Class.new { extend Resque::Scheduler::Locking } end - teardown do + after do Resque.redis.del(@subject.master_lock.key) end - test 'should use the basic lock mechanism for <= Redis 2.4' do + it 'should use the basic lock mechanism for <= Redis 2.4' do Resque.redis.stubs(:info).returns('redis_version' => '2.4.16') assert_equal @subject.master_lock.class, Resque::Scheduler::Lock::Basic end - test 'should use the resilient lock mechanism for > Redis 2.4' do + it 'should use the resilient lock mechanism for > Redis 2.4' do Resque.redis.stubs(:info).returns('redis_version' => '2.5.12') assert_equal( @@ -102,77 +104,77 @@ def lock_is_not_held(lock) ) end - test 'should be the master if the lock is held' do + it 'should be the master if the lock is held' do @subject.master_lock.acquire! assert @subject.master?, 'should be master' end - test 'should not be the master if the lock is held by someone else' do + it 'should not be the master if the lock is held by someone else' do Resque.redis.set(@subject.master_lock.key, 'somethingelse:1234') assert !@subject.master?, 'should not be master' end - test 'release_master_lock should delegate to master_lock' do + it 'release_master_lock should delegate to master_lock' do @subject.master_lock.expects(:release) @subject.release_master_lock end - test 'release_master_lock! should delegate to master_lock' do + it 'release_master_lock! should delegate to master_lock' do @subject.expects(:warn) @subject.master_lock.expects(:release!) @subject.release_master_lock! end end -context 'Resque::Scheduler::Lock::Base' do - setup do +describe 'Resque::Scheduler::Lock::Base' do + before do @lock = Resque::Scheduler::Lock::Base.new('test_lock_key') end - test '#acquire! should be not implemented' do + it '#acquire! should be not implemented' do assert_raises NotImplementedError do @lock.acquire! end end - test '#locked? should be not implemented' do + it '#locked? should be not implemented' do assert_raises NotImplementedError do @lock.locked? end end end -context 'Resque::Scheduler::Lock::Basic' do +describe 'Resque::Scheduler::Lock::Basic' do include LockTestHelper - setup do + before do @lock = Resque::Scheduler::Lock::Basic.new('test_lock_key') end - teardown do + after do @lock.release! end - test 'you should not have the lock if someone else holds it' do + it 'you should not have the lock if someone else holds it' do lock_is_not_held(@lock) assert !@lock.locked? end - test 'you should not be able to acquire the lock if someone ' \ + it 'you should not be able to acquire the lock if someone ' \ 'else holds it' do lock_is_not_held(@lock) assert !@lock.acquire! end - test 'the lock should receive a TTL on acquiring' do + it 'the lock should receive a TTL on acquiring' do @lock.acquire! assert Resque.redis.ttl(@lock.key) > 0, 'lock should expire' end - test 'releasing should release the master lock' do + it 'releasing should release the master lock' do assert @lock.acquire!, 'should have acquired the master lock' assert @lock.locked?, 'should be locked' @@ -181,7 +183,7 @@ def lock_is_not_held(lock) assert !@lock.locked?, 'should not be locked' end - test 'checking the lock should increase the TTL if we hold it' do + it 'checking the lock should increase the TTL if we hold it' do @lock.acquire! Resque.redis.setex(@lock.key, 10, @lock.value) @@ -190,7 +192,7 @@ def lock_is_not_held(lock) assert Resque.redis.ttl(@lock.key) > 10, 'TTL should have been updated' end - test 'checking the lock should not increase the TTL if we do not hold it' do + it 'checking the lock should not increase the TTL if we do not hold it' do Resque.redis.setex(@lock.key, 10, @lock.value) lock_is_not_held(@lock) @@ -201,41 +203,41 @@ def lock_is_not_held(lock) end end -context 'Resque::Scheduler::Lock::Resilient' do +describe 'Resque::Scheduler::Lock::Resilient' do include LockTestHelper if !Resque::Scheduler.supports_lua? puts '*** Skipping Resque::Scheduler::Lock::Resilient ' \ 'tests, as they require Redis >= 2.5.' else - setup do + before do @lock = Resque::Scheduler::Lock::Resilient.new('test_resilient_lock') end - teardown do + after do @lock.release! end - test 'you should not have the lock if someone else holds it' do + it 'you should not have the lock if someone else holds it' do lock_is_not_held(@lock) assert !@lock.locked?, 'you should not have the lock' end - test 'you should not be able to acquire the lock if someone ' \ + it 'you should not be able to acquire the lock if someone ' \ 'else holds it' do lock_is_not_held(@lock) assert !@lock.acquire! end - test 'the lock should receive a TTL on acquiring' do + it 'the lock should receive a TTL on acquiring' do @lock.acquire! assert Resque.redis.ttl(@lock.key) > 0, 'lock should expire' end - test 'releasing should release the master lock' do + it 'releasing should release the master lock' do assert @lock.acquire!, 'should have acquired the master lock' assert @lock.locked?, 'should be locked' @@ -244,7 +246,7 @@ def lock_is_not_held(lock) assert !@lock.locked?, 'should not be locked' end - test 'checking the lock should increase the TTL if we hold it' do + it 'checking the lock should increase the TTL if we hold it' do @lock.acquire! Resque.redis.setex(@lock.key, 10, @lock.value) @@ -253,7 +255,7 @@ def lock_is_not_held(lock) assert Resque.redis.ttl(@lock.key) > 10, 'TTL should have been updated' end - test 'checking the lock should not increase the TTL if we do ' \ + it 'checking the lock should not increase the TTL if we do ' \ 'not hold it' do Resque.redis.setex(@lock.key, 10, @lock.value) lock_is_not_held(@lock) @@ -264,7 +266,7 @@ def lock_is_not_held(lock) 'TTL should not have been updated' end - test 'setting the lock timeout changes the key TTL if we hold it' do + it 'setting the lock timeout changes the key TTL if we hold it' do @lock.acquire! @lock.stubs(:locked?).returns(true) @@ -278,7 +280,7 @@ def lock_is_not_held(lock) assert_send [ttl, :>, 120] end - test 'setting lock timeout is a noop if not held' do + it 'setting lock timeout is a noop if not held' do @lock.acquire! @lock.timeout = 100 @lock.stubs(:locked?).returns(false) @@ -286,31 +288,31 @@ def lock_is_not_held(lock) assert_equal 100, @lock.timeout end - test 'setting lock timeout nils out lock script' do + it 'setting lock timeout nils out lock script' do @lock.acquire! @lock.timeout = 100 assert_equal nil, @lock.instance_variable_get(:@locked_sha) end - test 'setting lock timeout does not nil out lock script if not held' do + it 'setting lock timeout does not nil out lock script if not held' do @lock.acquire! @lock.locked? @lock.stubs(:locked?).returns(false) @lock.timeout = 100 - assert_not_nil @lock.instance_variable_get(:@locked_sha) + refute_nil @lock.instance_variable_get(:@locked_sha) end - test 'setting lock timeout nils out acquire script' do + it 'setting lock timeout nils out acquire script' do @lock.acquire! @lock.timeout = 100 assert_equal nil, @lock.instance_variable_get(:@acquire_sha) end - test 'setting lock timeout does not nil out acquire script if not held' do + it 'setting lock timeout does not nil out acquire script if not held' do @lock.acquire! @lock.stubs(:locked?).returns(false) @lock.timeout = 100 - assert_not_nil @lock.instance_variable_get(:@acquire_sha) + refute_nil @lock.instance_variable_get(:@acquire_sha) end end end diff --git a/test/scheduler_setup_test.rb b/test/scheduler_setup_test.rb index 00a09937..da654685 100644 --- a/test/scheduler_setup_test.rb +++ b/test/scheduler_setup_test.rb @@ -1,8 +1,8 @@ # vim:fileencoding=utf-8 require_relative 'test_helper' -context 'Resque::Scheduler' do - setup do +describe 'Resque::Scheduler' do + before do ENV['VERBOSE'] = nil nullify_logger Resque::Scheduler.dynamic = false @@ -10,15 +10,15 @@ Resque::Scheduler.clear_schedule! end - teardown { restore_devnull_logfile } + after { restore_devnull_logfile } - test 'set custom logger' do + it 'set custom logger' do custom_logger = MonoLogger.new('/dev/null') Resque::Scheduler.send(:logger=, custom_logger) assert_equal(custom_logger, Resque::Scheduler.send(:logger)) end - test 'configure block' do + it 'configure block' do Resque::Scheduler.quiet = false Resque::Scheduler.configure do |c| c.quiet = true @@ -26,57 +26,57 @@ assert_equal(Resque::Scheduler.quiet, true) end - context 'when getting the env' do + describe 'when getting the env' do def wipe Resque::Scheduler.env = nil Rails.env = nil ENV['RAILS_ENV'] = nil end - setup { wipe } - teardown { wipe } + before { wipe } + after { wipe } - test 'uses the value if set' do + it 'uses the value if set' do Resque::Scheduler.env = 'foo' assert_equal('foo', Resque::Scheduler.env) end - test 'uses Rails.env if present' do + it 'uses Rails.env if present' do Rails.env = 'bar' assert_equal('bar', Resque::Scheduler.env) end - test 'uses $RAILS_ENV if present' do + it 'uses $RAILS_ENV if present' do ENV['RAILS_ENV'] = 'baz' assert_equal('baz', Resque::Scheduler.env) end end - context 'logger default settings' do - setup { nullify_logger } - teardown { restore_devnull_logfile } + describe 'logger default settings' do + before { nullify_logger } + after { restore_devnull_logfile } - test 'uses STDOUT' do + it 'uses STDOUT' do assert_equal( Resque::Scheduler.send(:logger) .instance_variable_get(:@logdev).dev, $stdout ) end - test 'not verbose' do + it 'not verbose' do assert Resque::Scheduler.send(:logger).level > MonoLogger::DEBUG end - test 'not quieted' do + it 'not quieted' do assert Resque::Scheduler.send(:logger).level < MonoLogger::FATAL end end - context 'logger custom settings' do - setup { nullify_logger } - teardown { restore_devnull_logfile } + describe 'logger custom settings' do + before { nullify_logger } + after { restore_devnull_logfile } - test 'uses logfile' do + it 'uses logfile' do Resque::Scheduler.logfile = '/dev/null' assert_equal( Resque::Scheduler.send(:logger) @@ -85,46 +85,46 @@ def wipe ) end - test 'set verbosity' do + it 'set verbosity' do Resque::Scheduler.verbose = true assert Resque::Scheduler.send(:logger).level == MonoLogger::DEBUG end - test 'quiet logger' do + it 'quiet logger' do Resque::Scheduler.quiet = true assert Resque::Scheduler.send(:logger).level == MonoLogger::FATAL end end - context 'logger with json formatter' do - setup do + describe 'logger with json formatter' do + before do nullify_logger Resque::Scheduler.logformat = 'json' $stdout = StringIO.new end - teardown do + after do $stdout = STDOUT end - test 'logs with json' do + it 'logs with json' do Resque::Scheduler.log! 'whatever' assert $stdout.string =~ /"msg":"whatever"/ end end - context 'logger with text formatter' do - setup do + describe 'logger with text formatter' do + before do nullify_logger Resque::Scheduler.logformat = 'text' $stdout = StringIO.new end - teardown do + after do $stdout = STDOUT end - test 'logs with text' do + it 'logs with text' do Resque::Scheduler.log! 'another thing' assert $stdout.string =~ /: another thing/ end diff --git a/test/scheduler_task_test.rb b/test/scheduler_task_test.rb index 75a18835..e3133693 100644 --- a/test/scheduler_task_test.rb +++ b/test/scheduler_task_test.rb @@ -1,8 +1,8 @@ # vim:fileencoding=utf-8 require_relative 'test_helper' -context 'Resque::Scheduler' do - setup do +describe 'Resque::Scheduler' do + before do Resque::Scheduler.configure do |c| c.dynamic = false c.poll_sleep_amount = 0.1 @@ -14,14 +14,14 @@ Resque::Scheduler.send(:instance_variable_set, :@shutdown, false) end - test 'shutdown raises Interrupt when sleeping' do + it 'shutdown raises Interrupt when sleeping' do Thread.current.expects(:raise).with(Interrupt) Resque::Scheduler.send(:instance_variable_set, :@th, Thread.current) Resque::Scheduler.send(:instance_variable_set, :@sleeping, true) Resque::Scheduler.shutdown end - test 'sending TERM to scheduler breaks out of poll_sleep' do + it 'sending TERM to scheduler breaks out of poll_sleep' do Resque::Scheduler.expects(:release_master_lock) @pid = Process.pid diff --git a/test/scheduler_test.rb b/test/scheduler_test.rb index cf64cb83..369dffd2 100644 --- a/test/scheduler_test.rb +++ b/test/scheduler_test.rb @@ -1,8 +1,8 @@ # vim:fileencoding=utf-8 require_relative 'test_helper' -context 'Resque::Scheduler' do - setup do +describe 'Resque::Scheduler' do + before do Resque::Scheduler.configure do |c| c.dynamic = false c.quiet = true @@ -14,7 +14,7 @@ Resque::Scheduler.send(:instance_variable_set, :@scheduled_jobs, {}) end - test 'enqueue constantizes' do + it 'enqueue constantizes' do Resque::Scheduler.env = 'production' config = { 'cron' => '* * * * *', @@ -27,7 +27,7 @@ Resque::Scheduler.enqueue_from_config(config) end - test 'enqueue runs hooks' do + it 'enqueue runs hooks' do Resque::Scheduler.env = 'production' config = { 'cron' => '* * * * *', @@ -45,7 +45,7 @@ Resque::Scheduler.enqueue_from_config(config) end - test 'enqueue_from_config respects queue params' do + it 'enqueue_from_config respects queue params' do config = { 'cron' => '* * * * *', 'class' => 'SomeIvarJob', @@ -55,7 +55,7 @@ Resque::Scheduler.enqueue_from_config(config) end - test 'config makes it into the rufus_scheduler' do + it 'config makes it into the rufus_scheduler' do assert_equal(0, Resque::Scheduler.rufus_scheduler.jobs.size) Resque.schedule = { @@ -71,7 +71,7 @@ assert Resque::Scheduler.scheduled_jobs.include?('some_ivar_job') end - test 'can reload schedule' do + it 'can reload schedule' do Resque::Scheduler.dynamic = true Resque.schedule = { 'some_ivar_job' => { @@ -99,7 +99,7 @@ assert Resque::Scheduler.scheduled_jobs.include?('some_ivar_job2') end - test 'load_schedule_job loads a schedule' do + it 'load_schedule_job loads a schedule' do Resque::Scheduler.load_schedule_job( 'some_ivar_job', 'cron' => '* * * * *', @@ -112,7 +112,7 @@ assert Resque::Scheduler.scheduled_jobs.keys.include?('some_ivar_job') end - test 'load_schedule_job with every with options' do + it 'load_schedule_job with every with options' do Resque::Scheduler.load_schedule_job( 'some_ivar_job', 'every' => ['30s', { 'first_in' => '60s' }], @@ -127,7 +127,7 @@ assert job.opts.keys.include?(:first_in) end - test 'load_schedule_job with cron with options' do + it 'load_schedule_job with cron with options' do Resque::Scheduler.load_schedule_job( 'some_ivar_job', 'cron' => ['* * * * *', { 'allow_overlapping' => 'true' }], @@ -142,7 +142,7 @@ assert job.opts.keys.include?(:allow_overlapping) end - test 'load_schedule_job without cron' do + it 'load_schedule_job without cron' do Resque::Scheduler.load_schedule_job( 'some_ivar_job', 'class' => 'SomeIvarJob', @@ -154,7 +154,7 @@ assert !Resque::Scheduler.scheduled_jobs.keys.include?('some_ivar_job') end - test 'load_schedule_job with an empty cron' do + it 'load_schedule_job with an empty cron' do Resque::Scheduler.load_schedule_job( 'some_ivar_job', 'cron' => '', @@ -167,7 +167,7 @@ assert !Resque::Scheduler.scheduled_jobs.keys.include?('some_ivar_job') end - test 'update_schedule' do + it 'update_schedule' do Resque::Scheduler.dynamic = true Resque.schedule = { 'some_ivar_job' => { @@ -210,7 +210,7 @@ assert_equal 0, Resque.redis.scard(:schedules_changed) end - test 'update_schedule when all jobs have been removed' do + it 'update_schedule when all jobs have been removed' do Resque::Scheduler.dynamic = true Resque.schedule = { 'some_ivar_job' => { @@ -230,7 +230,7 @@ assert_equal 0, Resque.redis.scard(:schedules_changed) end - test 'update_schedule with mocks' do + it 'update_schedule with mocks' do Resque::Scheduler.dynamic = true Resque.schedule = { 'some_ivar_job' => { @@ -272,7 +272,7 @@ assert_equal 0, Resque.redis.scard(:schedules_changed) end - test 'concurrent update_schedule calls' do + it 'concurrent update_schedule calls' do Resque::Scheduler.dynamic = true Resque::Scheduler.load_schedule! jobs_count = 100 @@ -296,7 +296,7 @@ assert_equal 0, Resque.redis.scard(:schedules_changed) end - test 'schedule= sets the schedule' do + it 'schedule= sets the schedule' do Resque::Scheduler.dynamic = true Resque.schedule = { 'my_ivar_job' => { @@ -311,7 +311,7 @@ ) end - test 'schedule= removes schedules not present in the given ' \ + it 'schedule= removes schedules not present in the given ' \ 'schedule argument' do Resque::Scheduler.dynamic = true @@ -333,7 +333,7 @@ ) end - test "schedule= uses job name as 'class' argument if it's missing" do + it "schedule= uses job name as 'class' argument if it's missing" do Resque::Scheduler.dynamic = true Resque.schedule = { 'SomeIvarJob' => { 'cron' => '* * * * *', 'args' => '/tmp/75' @@ -345,7 +345,7 @@ assert_equal('SomeIvarJob', Resque.schedule['SomeIvarJob']['class']) end - test 'schedule= does not mutate argument' do + it 'schedule= does not mutate argument' do schedule = { 'SomeIvarJob' => { 'cron' => '* * * * *', 'args' => '/tmp/75' } } @@ -353,7 +353,7 @@ assert !schedule['SomeIvarJob'].key?('class') end - test 'set_schedule can set an individual schedule' do + it 'set_schedule can set an individual schedule' do Resque.set_schedule( 'some_ivar_job', 'cron' => '* * * * *', 'class' => 'SomeIvarJob', 'args' => '/tmp/22' @@ -365,7 +365,7 @@ assert Resque.redis.sismember(:schedules_changed, 'some_ivar_job') end - test 'fetch_schedule returns a schedule' do + it 'fetch_schedule returns a schedule' do Resque.redis.hset(:schedules, 'some_ivar_job2', Resque.encode( 'cron' => '* * * * *', 'class' => 'SomeIvarJob', 'args' => '/tmp/33' )) @@ -375,7 +375,7 @@ ) end - test 'remove_schedule removes a schedule' do + it 'remove_schedule removes a schedule' do Resque.set_schedule( 'some_ivar_job3', 'cron' => '* * * * *', @@ -390,7 +390,7 @@ assert_equal [], Resque.redis.smembers(:persisted_schedules) end - test 'persisted schedules' do + it 'persisted schedules' do Resque.set_schedule( 'some_ivar_job', 'cron' => '* * * * *', @@ -419,41 +419,40 @@ assert_equal(nil, Resque.schedule['some_job']) end - test 'adheres to lint' do - assert_nothing_raised do - Resque::Plugin.lint(Resque::Scheduler) - Resque::Plugin.lint(Resque::Scheduler::Extension) - end + # The failure to raise an error is implicit here. + it 'adheres to lint' do + Resque::Plugin.lint(Resque::Scheduler) + Resque::Plugin.lint(Resque::Scheduler::Extension) end - test 'procline contains app_name when present' do + it 'procline contains app_name when present' do Resque::Scheduler.app_name = 'foo' assert Resque::Scheduler.send(:build_procline, 'bar') =~ /\[foo\]:/ end - test 'procline omits app_name when absent' do + it 'procline omits app_name when absent' do Resque::Scheduler.app_name = nil assert Resque::Scheduler.send(:build_procline, 'bar') =~ /#{Resque::Scheduler.send(:internal_name)}: bar/ end - test 'procline contains env when present' do + it 'procline contains env when present' do Resque::Scheduler.env = 'xyz' assert Resque::Scheduler.send(:build_procline, 'cage') =~ /\[xyz\]: cage/ end - test 'procline omits env when absent' do + it 'procline omits env when absent' do Resque::Scheduler.env = nil assert Resque::Scheduler.send(:build_procline, 'cage') =~ /#{Resque::Scheduler.send(:internal_name)}: cage/ end - context 'printing schedule' do - setup do + describe 'printing schedule' do + before do Resque::Scheduler.expects(:log!).at_least_once end - test 'prints schedule' do + it 'prints schedule' do fake_rufus_scheduler = mock fake_rufus_scheduler.expects(:jobs).at_least_once .returns(foo: OpenStruct.new(t: nil, last: nil)) diff --git a/test/test_helper.rb b/test/test_helper.rb index c75aeff1..0da9cd6f 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,15 +1,10 @@ # vim:fileencoding=utf-8 require 'simplecov' -require 'test/unit' -require 'mocha/setup' -require 'rack/test' require 'resque' - -$LOAD_PATH.unshift File.dirname(File.expand_path(__FILE__)) + '/../lib' -require 'resque-scheduler' -require 'resque/scheduler/server' - +# This bit needs to be above the minitest require, because otherwise, the +# at_exit calls are in the wrong order and Redis shuts down before the tests +# run. unless ENV['RESQUE_SCHEDULER_DISABLE_TEST_REDIS_SERVER'] # Start our own Redis when the tests start. RedisInstance will take care of # starting and stopping. @@ -17,34 +12,17 @@ RedisInstance.run! end -at_exit { exit MiniTest::Unit.new.run(ARGV) || 0 } - -## -# test/spec/mini 3 -# original work: http://gist.github.com/25455 -# forked and modified: https://gist.github.com/meatballhat/8906709 -# -def context(*args, &block) - return super unless (name = args.first) && block - require 'test/unit' - klass = Class.new(Test::Unit::TestCase) do - def self.test(name, &block) - define_method("test_#{name.gsub(/\W/, '_')}", &block) if block - end - def self.xtest(*_args) - end - def self.setup(&block) - define_method(:setup, &block) - end - def self.teardown(&block) - define_method(:teardown, &block) - end - end - (class << klass; self end).send(:define_method, :name) do - name.gsub(/\W/, '_') - end - klass.class_eval(&block) -end +require 'minitest/autorun' +require 'mocha/setup' +require 'rack/test' + +$LOAD_PATH.unshift File.dirname(File.expand_path(__FILE__)) + '/../lib' +require 'resque-scheduler' +# require 'resque/scheduler/server' + +# minitest/autorun does this now. +# at_exit { exit MiniTest::Unit.new.run(ARGV) || 0 } + unless defined?(Rails) module Rails diff --git a/test/util_test.rb b/test/util_test.rb index 8fdad2c9..e57f0cd2 100644 --- a/test/util_test.rb +++ b/test/util_test.rb @@ -1,11 +1,11 @@ # vim:fileencoding=utf-8 -context 'Util' do +describe 'Util' do def util Resque::Scheduler::Util end - test 'constantizing' do + it 'constantizing' do assert util.constantize('Resque::Scheduler') == Resque::Scheduler end end From 85a7a2a3be4afbdaf4ede9498444692d1b8e144c Mon Sep 17 00:00:00 2001 From: Matt Gibson Date: Tue, 6 Jan 2015 21:19:13 +0000 Subject: [PATCH 02/32] Fix broken env test and add a missing call to require test_helper --- resque-scheduler.gemspec | 2 +- test/env_test.rb | 3 +++ test/util_test.rb | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/resque-scheduler.gemspec b/resque-scheduler.gemspec index 7b548ab9..5d7c48b1 100644 --- a/resque-scheduler.gemspec +++ b/resque-scheduler.gemspec @@ -26,7 +26,7 @@ Gem::Specification.new do |spec| spec.add_development_dependency 'json' spec.add_development_dependency 'kramdown' spec.add_development_dependency 'minitest', '~> 5.0' - + spec.add_development_dependency 'minitest-bisect' spec.add_development_dependency 'mocha' spec.add_development_dependency 'pry' spec.add_development_dependency 'rack-test' diff --git a/test/env_test.rb b/test/env_test.rb index d8d31e38..c02f231d 100644 --- a/test/env_test.rb +++ b/test/env_test.rb @@ -1,5 +1,8 @@ # vim:fileencoding=utf-8 require_relative 'test_helper' +# Running tests in this file alone without this next line fails. This is despite +# the load path being set correctly in the test_helper file. No idea why. +require 'resque/scheduler/env' describe 'Env' do def new_env(options = {}) diff --git a/test/util_test.rb b/test/util_test.rb index e57f0cd2..88807299 100644 --- a/test/util_test.rb +++ b/test/util_test.rb @@ -1,4 +1,5 @@ # vim:fileencoding=utf-8 +require_relative 'test_helper' describe 'Util' do def util From 5ba39c44d3afdbd133f603d8fa184b52b181cb64 Mon Sep 17 00:00:00 2001 From: Matt Gibson Date: Wed, 7 Jan 2015 01:19:21 +0000 Subject: [PATCH 03/32] Fixed some tests --- test/delayed_queue_test.rb | 1 + test/env_test.rb | 3 ++- test/scheduler_task_test.rb | 8 ++++++++ test/test_helper.rb | 6 ++---- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/test/delayed_queue_test.rb b/test/delayed_queue_test.rb index 0fabd5dd..fdf02049 100644 --- a/test/delayed_queue_test.rb +++ b/test/delayed_queue_test.rb @@ -265,6 +265,7 @@ end end + # TODO fails randomly due ot ordering. Test with --seed 3421 it 'enqueue_delayed_items_for_timestamp creates jobs ' \ 'and empties the delayed queue' do t = Time.now + 60 diff --git a/test/env_test.rb b/test/env_test.rb index c02f231d..e4a34e30 100644 --- a/test/env_test.rb +++ b/test/env_test.rb @@ -1,7 +1,8 @@ # vim:fileencoding=utf-8 require_relative 'test_helper' # Running tests in this file alone without this next line fails. This is despite -# the load path being set correctly in the test_helper file. No idea why. +# the load path being set correctly in the test_helper file. This causes random +# ordering failures. TODO No idea why. require 'resque/scheduler/env' describe 'Env' do diff --git a/test/scheduler_task_test.rb b/test/scheduler_task_test.rb index e3133693..f944f44c 100644 --- a/test/scheduler_task_test.rb +++ b/test/scheduler_task_test.rb @@ -10,6 +10,14 @@ Resque.redis.flushall Resque::Scheduler.quiet = true Resque::Scheduler.clear_schedule! + + # When run with --seed 3432, the bottom test fails without the next line: + # Minitest::Assertion: [SystemExit] exception expected, not + # Class : + # Message : <"\"0\" is not in range 1..31"> + # No problem when run in isolation + Resque.schedule = {} # Schedule leaks out from other tests without this. + Resque::Scheduler.send(:instance_variable_set, :@scheduled_jobs, {}) Resque::Scheduler.send(:instance_variable_set, :@shutdown, false) end diff --git a/test/test_helper.rb b/test/test_helper.rb index 0da9cd6f..0a9b391e 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -18,11 +18,9 @@ $LOAD_PATH.unshift File.dirname(File.expand_path(__FILE__)) + '/../lib' require 'resque-scheduler' -# require 'resque/scheduler/server' - -# minitest/autorun does this now. -# at_exit { exit MiniTest::Unit.new.run(ARGV) || 0 } +require 'resque/scheduler/server' +at_exit { exit MiniTest.run(ARGV) || 0 } unless defined?(Rails) module Rails From 928d1de662364bbad57abdba5780b44f3f9837e6 Mon Sep 17 00:00:00 2001 From: Matt Gibson Date: Wed, 7 Jan 2015 20:39:30 +0000 Subject: [PATCH 04/32] Moved the resetting stuff into a function that is called before every test. All tests pass now. --- test/cli_test.rb | 3 +++ test/delayed_queue_test.rb | 3 +-- test/env_test.rb | 3 +++ test/multi_process_test.rb | 3 +++ test/scheduler_args_test.rb | 4 +--- test/scheduler_hooks_test.rb | 2 +- test/scheduler_locking_test.rb | 8 ++++++++ test/scheduler_setup_test.rb | 22 ++++++++++++++++------ test/scheduler_task_test.rb | 15 +-------------- test/scheduler_test.rb | 11 ++--------- test/test_helper.rb | 30 ++++++++++++++++++++++++++++-- test/util_test.rb | 2 ++ 12 files changed, 69 insertions(+), 37 deletions(-) diff --git a/test/cli_test.rb b/test/cli_test.rb index 5834e48d..567e0d9f 100644 --- a/test/cli_test.rb +++ b/test/cli_test.rb @@ -2,6 +2,9 @@ require_relative 'test_helper' describe 'Cli' do + + before { reset_resque_scheduler } + def mock_runtime_env mock.tap { |m| m.stubs(:setup) } end diff --git a/test/delayed_queue_test.rb b/test/delayed_queue_test.rb index fdf02049..17d7b50e 100644 --- a/test/delayed_queue_test.rb +++ b/test/delayed_queue_test.rb @@ -3,8 +3,7 @@ describe 'DelayedQueue' do before do - Resque::Scheduler.quiet = true - Resque.redis.flushall + reset_resque_scheduler end it 'enqueue_at adds correct list and zset' do diff --git a/test/env_test.rb b/test/env_test.rb index e4a34e30..63c9be74 100644 --- a/test/env_test.rb +++ b/test/env_test.rb @@ -6,6 +6,9 @@ require 'resque/scheduler/env' describe 'Env' do + + before { reset_resque_scheduler } + def new_env(options = {}) Resque::Scheduler::Env.new(options) end diff --git a/test/multi_process_test.rb b/test/multi_process_test.rb index 168e63c0..8b03d260 100644 --- a/test/multi_process_test.rb +++ b/test/multi_process_test.rb @@ -2,6 +2,9 @@ require_relative 'test_helper' describe 'Multi Process' do + + before { reset_resque_scheduler } + it 'setting schedule= from many process does not corrupt the schedules' do schedules = {} counts = [] diff --git a/test/scheduler_args_test.rb b/test/scheduler_args_test.rb index 27399472..71a0e737 100644 --- a/test/scheduler_args_test.rb +++ b/test/scheduler_args_test.rb @@ -4,10 +4,8 @@ describe 'scheduling jobs with arguments' do before do - Resque::Scheduler.clear_schedule! + reset_resque_scheduler Resque::Scheduler.configure do |c| - c.dynamic = false - c.quiet = true c.poll_sleep_amount = nil end end diff --git a/test/scheduler_hooks_test.rb b/test/scheduler_hooks_test.rb index df1bb5d4..531ffde5 100644 --- a/test/scheduler_hooks_test.rb +++ b/test/scheduler_hooks_test.rb @@ -2,7 +2,7 @@ require_relative 'test_helper' describe 'scheduling jobs with hooks' do - before { Resque.redis.flushall } + before { reset_resque_scheduler } it 'before_schedule hook that does not return false should be enqueued' do enqueue_time = Time.now diff --git a/test/scheduler_locking_test.rb b/test/scheduler_locking_test.rb index 5f4d0417..5f7ae409 100644 --- a/test/scheduler_locking_test.rb +++ b/test/scheduler_locking_test.rb @@ -9,6 +9,7 @@ def lock_is_not_held(lock) describe '#master_lock_key' do before do + reset_resque_scheduler @subject = Class.new { extend Resque::Scheduler::Locking } end @@ -24,6 +25,7 @@ def lock_is_not_held(lock) describe 'with a prefix set via ENV' do before do + reset_resque_scheduler ENV['RESQUE_SCHEDULER_MASTER_LOCK_PREFIX'] = 'my.prefix' @subject = Class.new { extend Resque::Scheduler::Locking } end @@ -43,6 +45,7 @@ def lock_is_not_held(lock) describe 'with a namespace set for resque' do before do + reset_resque_scheduler Resque.redis.namespace = 'my.namespace' @subject = Class.new { extend Resque::Scheduler::Locking } end @@ -60,6 +63,7 @@ def lock_is_not_held(lock) describe 'with a prefix set via ENV' do before do + reset_resque_scheduler Resque.redis.namespace = 'my.namespace' ENV['RESQUE_SCHEDULER_MASTER_LOCK_PREFIX'] = 'my.prefix' @subject = Class.new { extend Resque::Scheduler::Locking } @@ -83,6 +87,7 @@ def lock_is_not_held(lock) describe 'Resque::Scheduler::Locking' do before do + reset_resque_scheduler @subject = Class.new { extend Resque::Scheduler::Locking } end @@ -128,6 +133,7 @@ def lock_is_not_held(lock) describe 'Resque::Scheduler::Lock::Base' do before do + reset_resque_scheduler @lock = Resque::Scheduler::Lock::Base.new('test_lock_key') end @@ -148,6 +154,7 @@ def lock_is_not_held(lock) include LockTestHelper before do + reset_resque_scheduler @lock = Resque::Scheduler::Lock::Basic.new('test_lock_key') end @@ -211,6 +218,7 @@ def lock_is_not_held(lock) 'tests, as they require Redis >= 2.5.' else before do + reset_resque_scheduler @lock = Resque::Scheduler::Lock::Resilient.new('test_resilient_lock') end diff --git a/test/scheduler_setup_test.rb b/test/scheduler_setup_test.rb index da654685..75d6b72b 100644 --- a/test/scheduler_setup_test.rb +++ b/test/scheduler_setup_test.rb @@ -3,11 +3,10 @@ describe 'Resque::Scheduler' do before do + reset_resque_scheduler + ENV['VERBOSE'] = nil nullify_logger - Resque::Scheduler.dynamic = false - Resque.redis.flushall - Resque::Scheduler.clear_schedule! end after { restore_devnull_logfile } @@ -33,7 +32,10 @@ def wipe ENV['RAILS_ENV'] = nil end - before { wipe } + before do + reset_resque_scheduler + wipe + end after { wipe } it 'uses the value if set' do @@ -53,7 +55,10 @@ def wipe end describe 'logger default settings' do - before { nullify_logger } + before do + reset_resque_scheduler + nullify_logger + end after { restore_devnull_logfile } it 'uses STDOUT' do @@ -73,7 +78,10 @@ def wipe end describe 'logger custom settings' do - before { nullify_logger } + before do + reset_resque_scheduler + nullify_logger + end after { restore_devnull_logfile } it 'uses logfile' do @@ -98,6 +106,7 @@ def wipe describe 'logger with json formatter' do before do + reset_resque_scheduler nullify_logger Resque::Scheduler.logformat = 'json' $stdout = StringIO.new @@ -115,6 +124,7 @@ def wipe describe 'logger with text formatter' do before do + reset_resque_scheduler nullify_logger Resque::Scheduler.logformat = 'text' $stdout = StringIO.new diff --git a/test/scheduler_task_test.rb b/test/scheduler_task_test.rb index f944f44c..6de7e37d 100644 --- a/test/scheduler_task_test.rb +++ b/test/scheduler_task_test.rb @@ -3,23 +3,10 @@ describe 'Resque::Scheduler' do before do + reset_resque_scheduler Resque::Scheduler.configure do |c| - c.dynamic = false c.poll_sleep_amount = 0.1 end - Resque.redis.flushall - Resque::Scheduler.quiet = true - Resque::Scheduler.clear_schedule! - - # When run with --seed 3432, the bottom test fails without the next line: - # Minitest::Assertion: [SystemExit] exception expected, not - # Class : - # Message : <"\"0\" is not in range 1..31"> - # No problem when run in isolation - Resque.schedule = {} # Schedule leaks out from other tests without this. - - Resque::Scheduler.send(:instance_variable_set, :@scheduled_jobs, {}) - Resque::Scheduler.send(:instance_variable_set, :@shutdown, false) end it 'shutdown raises Interrupt when sleeping' do diff --git a/test/scheduler_test.rb b/test/scheduler_test.rb index 369dffd2..ed2cfd96 100644 --- a/test/scheduler_test.rb +++ b/test/scheduler_test.rb @@ -3,15 +3,7 @@ describe 'Resque::Scheduler' do before do - Resque::Scheduler.configure do |c| - c.dynamic = false - c.quiet = true - c.env = nil - c.app_name = nil - end - Resque.redis.flushall - Resque::Scheduler.clear_schedule! - Resque::Scheduler.send(:instance_variable_set, :@scheduled_jobs, {}) + reset_resque_scheduler end it 'enqueue constantizes' do @@ -449,6 +441,7 @@ describe 'printing schedule' do before do + reset_resque_scheduler Resque::Scheduler.expects(:log!).at_least_once end diff --git a/test/test_helper.rb b/test/test_helper.rb index 0a9b391e..a0107edf 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -20,8 +20,6 @@ require 'resque-scheduler' require 'resque/scheduler/server' -at_exit { exit MiniTest.run(ARGV) || 0 } - unless defined?(Rails) module Rails class << self @@ -107,4 +105,32 @@ def restore_devnull_logfile ENV['LOGFILE'] = '/dev/null' end +# Tests need to avoid leaking configuration into the environment so that they +# do not cause failures due to ordering. This function should be run after every +# test. +def reset_resque_scheduler + + # Scheduler test + Resque::Scheduler.configure do |c| + c.dynamic = false + c.quiet = true + c.env = nil + c.app_name = nil + c.poll_sleep_amount = nil + end + Resque.redis.flushall + Resque::Scheduler.clear_schedule! + Resque::Scheduler.send(:instance_variable_set, :@scheduled_jobs, {}) + + # When run with --seed 3432, the bottom test fails without the next line: + # Minitest::Assertion: [SystemExit] exception expected, not + # Class : + # Message : <"\"0\" is not in range 1..31"> + # No problem when run in isolation + Resque.schedule = {} # Schedule leaks out from other tests without this. + + Resque::Scheduler.send(:instance_variable_set, :@shutdown, false) + +end + restore_devnull_logfile diff --git a/test/util_test.rb b/test/util_test.rb index 88807299..b0fc113d 100644 --- a/test/util_test.rb +++ b/test/util_test.rb @@ -6,6 +6,8 @@ def util Resque::Scheduler::Util end + before { reset_resque_scheduler } + it 'constantizing' do assert util.constantize('Resque::Scheduler') == Resque::Scheduler end From 727340f92ee20ceaaedb58ecb3c81c0b48f351d6 Mon Sep 17 00:00:00 2001 From: Matt Gibson Date: Wed, 7 Jan 2015 20:39:57 +0000 Subject: [PATCH 05/32] Remove TODOs --- test/delayed_queue_test.rb | 1 - test/env_test.rb | 3 --- 2 files changed, 4 deletions(-) diff --git a/test/delayed_queue_test.rb b/test/delayed_queue_test.rb index 17d7b50e..f0f9dea4 100644 --- a/test/delayed_queue_test.rb +++ b/test/delayed_queue_test.rb @@ -264,7 +264,6 @@ end end - # TODO fails randomly due ot ordering. Test with --seed 3421 it 'enqueue_delayed_items_for_timestamp creates jobs ' \ 'and empties the delayed queue' do t = Time.now + 60 diff --git a/test/env_test.rb b/test/env_test.rb index 63c9be74..301b0453 100644 --- a/test/env_test.rb +++ b/test/env_test.rb @@ -1,8 +1,5 @@ # vim:fileencoding=utf-8 require_relative 'test_helper' -# Running tests in this file alone without this next line fails. This is despite -# the load path being set correctly in the test_helper file. This causes random -# ordering failures. TODO No idea why. require 'resque/scheduler/env' describe 'Env' do From 4de9e14fe3a3fcc8e534aecfa6929a3af353b9a4 Mon Sep 17 00:00:00 2001 From: Matt Gibson Date: Wed, 7 Jan 2015 20:42:52 +0000 Subject: [PATCH 06/32] Fix comment --- test/test_helper.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/test_helper.rb b/test/test_helper.rb index a0107edf..8d4f3e1f 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -105,8 +105,8 @@ def restore_devnull_logfile ENV['LOGFILE'] = '/dev/null' end -# Tests need to avoid leaking configuration into the environment so that they -# do not cause failures due to ordering. This function should be run after every +# Tests need to avoid leaking configuration into the environment, so that they +# do not cause failures due to ordering. This function should be run before every # test. def reset_resque_scheduler From 72c1aae08094b233469d0ad78d20f659a41bd955 Mon Sep 17 00:00:00 2001 From: Matt Gibson Date: Wed, 7 Jan 2015 21:24:26 +0000 Subject: [PATCH 07/32] Dummy Rails app loads. Tests all pass. --- resque-scheduler.gemspec | 4 + test/dummy/README.rdoc | 28 +++++++ test/dummy/Rakefile | 6 ++ test/dummy/app/assets/images/.keep | 0 .../app/assets/javascripts/application.js | 13 +++ .../app/assets/stylesheets/application.css | 15 ++++ .../app/controllers/application_controller.rb | 5 ++ test/dummy/app/controllers/concerns/.keep | 0 test/dummy/app/helpers/application_helper.rb | 2 + test/dummy/app/mailers/.keep | 0 test/dummy/app/models/.keep | 0 test/dummy/app/models/concerns/.keep | 0 .../app/views/layouts/application.html.erb | 14 ++++ test/dummy/bin/bundle | 3 + test/dummy/bin/rails | 4 + test/dummy/bin/rake | 4 + test/dummy/bin/setup | 29 +++++++ test/dummy/config.ru | 4 + test/dummy/config/application.rb | 27 +++++++ test/dummy/config/boot.rb | 5 ++ test/dummy/config/database.yml | 25 ++++++ test/dummy/config/environment.rb | 5 ++ test/dummy/config/environments/development.rb | 41 ++++++++++ test/dummy/config/environments/production.rb | 79 +++++++++++++++++++ test/dummy/config/environments/test.rb | 42 ++++++++++ test/dummy/config/initializers/assets.rb | 11 +++ .../initializers/backtrace_silencers.rb | 7 ++ .../config/initializers/cookies_serializer.rb | 3 + .../initializers/filter_parameter_logging.rb | 4 + test/dummy/config/initializers/inflections.rb | 16 ++++ test/dummy/config/initializers/mime_types.rb | 4 + .../config/initializers/session_store.rb | 3 + .../config/initializers/wrap_parameters.rb | 14 ++++ test/dummy/config/locales/en.yml | 23 ++++++ test/dummy/config/routes.rb | 4 + test/dummy/config/secrets.yml | 22 ++++++ test/dummy/lib/assets/.keep | 0 test/dummy/log/.keep | 0 test/dummy/public/404.html | 67 ++++++++++++++++ test/dummy/public/422.html | 67 ++++++++++++++++ test/dummy/public/500.html | 66 ++++++++++++++++ test/dummy/public/favicon.ico | 0 test/scheduler_setup_test.rb | 18 +++-- test/scheduler_test.rb | 28 ++++--- test/test_helper.rb | 17 +++- 45 files changed, 709 insertions(+), 20 deletions(-) create mode 100644 test/dummy/README.rdoc create mode 100644 test/dummy/Rakefile create mode 100644 test/dummy/app/assets/images/.keep create mode 100644 test/dummy/app/assets/javascripts/application.js create mode 100644 test/dummy/app/assets/stylesheets/application.css create mode 100644 test/dummy/app/controllers/application_controller.rb create mode 100644 test/dummy/app/controllers/concerns/.keep create mode 100644 test/dummy/app/helpers/application_helper.rb create mode 100644 test/dummy/app/mailers/.keep create mode 100644 test/dummy/app/models/.keep create mode 100644 test/dummy/app/models/concerns/.keep create mode 100644 test/dummy/app/views/layouts/application.html.erb create mode 100755 test/dummy/bin/bundle create mode 100755 test/dummy/bin/rails create mode 100755 test/dummy/bin/rake create mode 100755 test/dummy/bin/setup create mode 100644 test/dummy/config.ru create mode 100644 test/dummy/config/application.rb create mode 100644 test/dummy/config/boot.rb create mode 100644 test/dummy/config/database.yml create mode 100644 test/dummy/config/environment.rb create mode 100644 test/dummy/config/environments/development.rb create mode 100644 test/dummy/config/environments/production.rb create mode 100644 test/dummy/config/environments/test.rb create mode 100644 test/dummy/config/initializers/assets.rb create mode 100644 test/dummy/config/initializers/backtrace_silencers.rb create mode 100644 test/dummy/config/initializers/cookies_serializer.rb create mode 100644 test/dummy/config/initializers/filter_parameter_logging.rb create mode 100644 test/dummy/config/initializers/inflections.rb create mode 100644 test/dummy/config/initializers/mime_types.rb create mode 100644 test/dummy/config/initializers/session_store.rb create mode 100644 test/dummy/config/initializers/wrap_parameters.rb create mode 100644 test/dummy/config/locales/en.yml create mode 100644 test/dummy/config/routes.rb create mode 100644 test/dummy/config/secrets.yml create mode 100644 test/dummy/lib/assets/.keep create mode 100644 test/dummy/log/.keep create mode 100644 test/dummy/public/404.html create mode 100644 test/dummy/public/422.html create mode 100644 test/dummy/public/500.html create mode 100644 test/dummy/public/favicon.ico diff --git a/resque-scheduler.gemspec b/resque-scheduler.gemspec index 5d7c48b1..20a66b32 100644 --- a/resque-scheduler.gemspec +++ b/resque-scheduler.gemspec @@ -33,6 +33,10 @@ Gem::Specification.new do |spec| spec.add_development_dependency 'rake' spec.add_development_dependency 'simplecov' spec.add_development_dependency 'yard' + spec.add_development_dependency 'rails', '~> 4.2.0' + spec.add_development_dependency 'resque-web' + spec.add_development_dependency 'sqlite3' + # We pin rubocop because new cops have a tendency to result in false-y # positives for new contributors, which is not a nice experience. diff --git a/test/dummy/README.rdoc b/test/dummy/README.rdoc new file mode 100644 index 00000000..dd4e97e2 --- /dev/null +++ b/test/dummy/README.rdoc @@ -0,0 +1,28 @@ +== README + +This README would normally document whatever steps are necessary to get the +application up and running. + +Things you may want to cover: + +* Ruby version + +* System dependencies + +* Configuration + +* Database creation + +* Database initialization + +* How to run the test suite + +* Services (job queues, cache servers, search engines, etc.) + +* Deployment instructions + +* ... + + +Please feel free to use a different markup language if you do not plan to run +rake doc:app. diff --git a/test/dummy/Rakefile b/test/dummy/Rakefile new file mode 100644 index 00000000..ba6b733d --- /dev/null +++ b/test/dummy/Rakefile @@ -0,0 +1,6 @@ +# Add your own tasks in files placed in lib/tasks ending in .rake, +# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. + +require File.expand_path('../config/application', __FILE__) + +Rails.application.load_tasks diff --git a/test/dummy/app/assets/images/.keep b/test/dummy/app/assets/images/.keep new file mode 100644 index 00000000..e69de29b diff --git a/test/dummy/app/assets/javascripts/application.js b/test/dummy/app/assets/javascripts/application.js new file mode 100644 index 00000000..c28e5bad --- /dev/null +++ b/test/dummy/app/assets/javascripts/application.js @@ -0,0 +1,13 @@ +// This is a manifest file that'll be compiled into application.js, which will include all the files +// listed below. +// +// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts, +// or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path. +// +// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the +// compiled file. +// +// Read Sprockets README (https://github.com/sstephenson/sprockets#sprockets-directives) for details +// about supported directives. +// +//= require_tree . diff --git a/test/dummy/app/assets/stylesheets/application.css b/test/dummy/app/assets/stylesheets/application.css new file mode 100644 index 00000000..f9cd5b34 --- /dev/null +++ b/test/dummy/app/assets/stylesheets/application.css @@ -0,0 +1,15 @@ +/* + * This is a manifest file that'll be compiled into application.css, which will include all the files + * listed below. + * + * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets, + * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path. + * + * You're free to add application-wide styles to this file and they'll appear at the bottom of the + * compiled file so the styles you add here take precedence over styles defined in any styles + * defined in the other CSS/SCSS files in this directory. It is generally better to create a new + * file per style scope. + * + *= require_tree . + *= require_self + */ diff --git a/test/dummy/app/controllers/application_controller.rb b/test/dummy/app/controllers/application_controller.rb new file mode 100644 index 00000000..d83690e1 --- /dev/null +++ b/test/dummy/app/controllers/application_controller.rb @@ -0,0 +1,5 @@ +class ApplicationController < ActionController::Base + # Prevent CSRF attacks by raising an exception. + # For APIs, you may want to use :null_session instead. + protect_from_forgery with: :exception +end diff --git a/test/dummy/app/controllers/concerns/.keep b/test/dummy/app/controllers/concerns/.keep new file mode 100644 index 00000000..e69de29b diff --git a/test/dummy/app/helpers/application_helper.rb b/test/dummy/app/helpers/application_helper.rb new file mode 100644 index 00000000..de6be794 --- /dev/null +++ b/test/dummy/app/helpers/application_helper.rb @@ -0,0 +1,2 @@ +module ApplicationHelper +end diff --git a/test/dummy/app/mailers/.keep b/test/dummy/app/mailers/.keep new file mode 100644 index 00000000..e69de29b diff --git a/test/dummy/app/models/.keep b/test/dummy/app/models/.keep new file mode 100644 index 00000000..e69de29b diff --git a/test/dummy/app/models/concerns/.keep b/test/dummy/app/models/concerns/.keep new file mode 100644 index 00000000..e69de29b diff --git a/test/dummy/app/views/layouts/application.html.erb b/test/dummy/app/views/layouts/application.html.erb new file mode 100644 index 00000000..593a778b --- /dev/null +++ b/test/dummy/app/views/layouts/application.html.erb @@ -0,0 +1,14 @@ + + + + Dummy + <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %> + <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %> + <%= csrf_meta_tags %> + + + +<%= yield %> + + + diff --git a/test/dummy/bin/bundle b/test/dummy/bin/bundle new file mode 100755 index 00000000..66e9889e --- /dev/null +++ b/test/dummy/bin/bundle @@ -0,0 +1,3 @@ +#!/usr/bin/env ruby +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) +load Gem.bin_path('bundler', 'bundle') diff --git a/test/dummy/bin/rails b/test/dummy/bin/rails new file mode 100755 index 00000000..5191e692 --- /dev/null +++ b/test/dummy/bin/rails @@ -0,0 +1,4 @@ +#!/usr/bin/env ruby +APP_PATH = File.expand_path('../../config/application', __FILE__) +require_relative '../config/boot' +require 'rails/commands' diff --git a/test/dummy/bin/rake b/test/dummy/bin/rake new file mode 100755 index 00000000..17240489 --- /dev/null +++ b/test/dummy/bin/rake @@ -0,0 +1,4 @@ +#!/usr/bin/env ruby +require_relative '../config/boot' +require 'rake' +Rake.application.run diff --git a/test/dummy/bin/setup b/test/dummy/bin/setup new file mode 100755 index 00000000..acdb2c13 --- /dev/null +++ b/test/dummy/bin/setup @@ -0,0 +1,29 @@ +#!/usr/bin/env ruby +require 'pathname' + +# path to your application root. +APP_ROOT = Pathname.new File.expand_path('../../', __FILE__) + +Dir.chdir APP_ROOT do + # This script is a starting point to setup your application. + # Add necessary setup steps to this file: + + puts "== Installing dependencies ==" + system "gem install bundler --conservative" + system "bundle check || bundle install" + + # puts "\n== Copying sample files ==" + # unless File.exist?("config/database.yml") + # system "cp config/database.yml.sample config/database.yml" + # end + + puts "\n== Preparing database ==" + system "bin/rake db:setup" + + puts "\n== Removing old logs and tempfiles ==" + system "rm -f log/*" + system "rm -rf tmp/cache" + + puts "\n== Restarting application server ==" + system "touch tmp/restart.txt" +end diff --git a/test/dummy/config.ru b/test/dummy/config.ru new file mode 100644 index 00000000..bd83b254 --- /dev/null +++ b/test/dummy/config.ru @@ -0,0 +1,4 @@ +# This file is used by Rack-based servers to start the application. + +require ::File.expand_path('../config/environment', __FILE__) +run Rails.application diff --git a/test/dummy/config/application.rb b/test/dummy/config/application.rb new file mode 100644 index 00000000..7961d5b0 --- /dev/null +++ b/test/dummy/config/application.rb @@ -0,0 +1,27 @@ +require File.expand_path('../boot', __FILE__) + +require 'rails/all' + +Bundler.require(*Rails.groups) +require "resque_web" +require "resque-scheduler" + +module Dummy + class Application < Rails::Application + # Settings in config/environments/* take precedence over those specified here. + # Application configuration should go into files in config/initializers + # -- all .rb files in that directory are automatically loaded. + + # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. + # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. + # config.time_zone = 'Central Time (US & Canada)' + + # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded. + # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] + # config.i18n.default_locale = :de + + # Do not swallow errors in after_commit/after_rollback callbacks. + config.active_record.raise_in_transactional_callbacks = true + end +end + diff --git a/test/dummy/config/boot.rb b/test/dummy/config/boot.rb new file mode 100644 index 00000000..6266cfc5 --- /dev/null +++ b/test/dummy/config/boot.rb @@ -0,0 +1,5 @@ +# Set up gems listed in the Gemfile. +ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../../../Gemfile', __FILE__) + +require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE']) +$LOAD_PATH.unshift File.expand_path('../../../../lib', __FILE__) diff --git a/test/dummy/config/database.yml b/test/dummy/config/database.yml new file mode 100644 index 00000000..1c1a37ca --- /dev/null +++ b/test/dummy/config/database.yml @@ -0,0 +1,25 @@ +# SQLite version 3.x +# gem install sqlite3 +# +# Ensure the SQLite 3 gem is defined in your Gemfile +# gem 'sqlite3' +# +default: &default + adapter: sqlite3 + pool: 5 + timeout: 5000 + +development: + <<: *default + database: db/development.sqlite3 + +# Warning: The database defined as "test" will be erased and +# re-generated from your development database when you run "rake". +# Do not set this db to the same as development or production. +test: + <<: *default + database: db/test.sqlite3 + +production: + <<: *default + database: db/production.sqlite3 diff --git a/test/dummy/config/environment.rb b/test/dummy/config/environment.rb new file mode 100644 index 00000000..ee8d90dc --- /dev/null +++ b/test/dummy/config/environment.rb @@ -0,0 +1,5 @@ +# Load the Rails application. +require File.expand_path('../application', __FILE__) + +# Initialize the Rails application. +Rails.application.initialize! diff --git a/test/dummy/config/environments/development.rb b/test/dummy/config/environments/development.rb new file mode 100644 index 00000000..b55e2144 --- /dev/null +++ b/test/dummy/config/environments/development.rb @@ -0,0 +1,41 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # In the development environment your application's code is reloaded on + # every request. This slows down response time but is perfect for development + # since you don't have to restart the web server when you make code changes. + config.cache_classes = false + + # Do not eager load code on boot. + config.eager_load = false + + # Show full error reports and disable caching. + config.consider_all_requests_local = true + config.action_controller.perform_caching = false + + # Don't care if the mailer can't send. + config.action_mailer.raise_delivery_errors = false + + # Print deprecation notices to the Rails logger. + config.active_support.deprecation = :log + + # Raise an error on page load if there are pending migrations. + config.active_record.migration_error = :page_load + + # Debug mode disables concatenation and preprocessing of assets. + # This option may cause significant delays in view rendering with a large + # number of complex assets. + config.assets.debug = true + + # Asset digests allow you to set far-future HTTP expiration dates on all assets, + # yet still be able to expire them through the digest params. + config.assets.digest = true + + # Adds additional error checking when serving assets at runtime. + # Checks for improperly declared sprockets dependencies. + # Raises helpful error messages. + config.assets.raise_runtime_errors = true + + # Raises error for missing translations + # config.action_view.raise_on_missing_translations = true +end diff --git a/test/dummy/config/environments/production.rb b/test/dummy/config/environments/production.rb new file mode 100644 index 00000000..5c1b32e4 --- /dev/null +++ b/test/dummy/config/environments/production.rb @@ -0,0 +1,79 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # Code is not reloaded between requests. + config.cache_classes = true + + # Eager load code on boot. This eager loads most of Rails and + # your application in memory, allowing both threaded web servers + # and those relying on copy on write to perform better. + # Rake tasks automatically ignore this option for performance. + config.eager_load = true + + # Full error reports are disabled and caching is turned on. + config.consider_all_requests_local = false + config.action_controller.perform_caching = true + + # Enable Rack::Cache to put a simple HTTP cache in front of your application + # Add `rack-cache` to your Gemfile before enabling this. + # For large-scale production use, consider using a caching reverse proxy like + # NGINX, varnish or squid. + # config.action_dispatch.rack_cache = true + + # Disable serving static files from the `/public` folder by default since + # Apache or NGINX already handles this. + config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present? + + # Compress JavaScripts and CSS. + config.assets.js_compressor = :uglifier + # config.assets.css_compressor = :sass + + # Do not fallback to assets pipeline if a precompiled asset is missed. + config.assets.compile = false + + # Asset digests allow you to set far-future HTTP expiration dates on all assets, + # yet still be able to expire them through the digest params. + config.assets.digest = true + + # `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb + + # Specifies the header that your server uses for sending files. + # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache + # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX + + # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. + # config.force_ssl = true + + # Use the lowest log level to ensure availability of diagnostic information + # when problems arise. + config.log_level = :debug + + # Prepend all log lines with the following tags. + # config.log_tags = [ :subdomain, :uuid ] + + # Use a different logger for distributed setups. + # config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new) + + # Use a different cache store in production. + # config.cache_store = :mem_cache_store + + # Enable serving of images, stylesheets, and JavaScripts from an asset server. + # config.action_controller.asset_host = 'http://assets.example.com' + + # Ignore bad email addresses and do not raise email delivery errors. + # Set this to true and configure the email server for immediate delivery to raise delivery errors. + # config.action_mailer.raise_delivery_errors = false + + # Enable locale fallbacks for I18n (makes lookups for any locale fall back to + # the I18n.default_locale when a translation cannot be found). + config.i18n.fallbacks = true + + # Send deprecation notices to registered listeners. + config.active_support.deprecation = :notify + + # Use default logging formatter so that PID and timestamp are not suppressed. + config.log_formatter = ::Logger::Formatter.new + + # Do not dump schema after migrations. + config.active_record.dump_schema_after_migration = false +end diff --git a/test/dummy/config/environments/test.rb b/test/dummy/config/environments/test.rb new file mode 100644 index 00000000..1c19f08b --- /dev/null +++ b/test/dummy/config/environments/test.rb @@ -0,0 +1,42 @@ +Rails.application.configure do + # Settings specified here will take precedence over those in config/application.rb. + + # The test environment is used exclusively to run your application's + # test suite. You never need to work with it otherwise. Remember that + # your test database is "scratch space" for the test suite and is wiped + # and recreated between test runs. Don't rely on the data there! + config.cache_classes = true + + # Do not eager load code on boot. This avoids loading your whole application + # just for the purpose of running a single test. If you are using a tool that + # preloads Rails for running tests, you may have to set it to true. + config.eager_load = false + + # Configure static file server for tests with Cache-Control for performance. + config.serve_static_files = true + config.static_cache_control = 'public, max-age=3600' + + # Show full error reports and disable caching. + config.consider_all_requests_local = true + config.action_controller.perform_caching = false + + # Raise exceptions instead of rendering exception templates. + config.action_dispatch.show_exceptions = false + + # Disable request forgery protection in test environment. + config.action_controller.allow_forgery_protection = false + + # Tell Action Mailer not to deliver emails to the real world. + # The :test delivery method accumulates sent emails in the + # ActionMailer::Base.deliveries array. + config.action_mailer.delivery_method = :test + + # Randomize the order test cases are executed. + config.active_support.test_order = :random + + # Print deprecation notices to the stderr. + config.active_support.deprecation = :stderr + + # Raises error for missing translations + # config.action_view.raise_on_missing_translations = true +end diff --git a/test/dummy/config/initializers/assets.rb b/test/dummy/config/initializers/assets.rb new file mode 100644 index 00000000..01ef3e66 --- /dev/null +++ b/test/dummy/config/initializers/assets.rb @@ -0,0 +1,11 @@ +# Be sure to restart your server when you modify this file. + +# Version of your assets, change this if you want to expire all your assets. +Rails.application.config.assets.version = '1.0' + +# Add additional assets to the asset load path +# Rails.application.config.assets.paths << Emoji.images_path + +# Precompile additional assets. +# application.js, application.css, and all non-JS/CSS in app/assets folder are already added. +# Rails.application.config.assets.precompile += %w( search.js ) diff --git a/test/dummy/config/initializers/backtrace_silencers.rb b/test/dummy/config/initializers/backtrace_silencers.rb new file mode 100644 index 00000000..59385cdf --- /dev/null +++ b/test/dummy/config/initializers/backtrace_silencers.rb @@ -0,0 +1,7 @@ +# Be sure to restart your server when you modify this file. + +# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. +# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } + +# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code. +# Rails.backtrace_cleaner.remove_silencers! diff --git a/test/dummy/config/initializers/cookies_serializer.rb b/test/dummy/config/initializers/cookies_serializer.rb new file mode 100644 index 00000000..7f70458d --- /dev/null +++ b/test/dummy/config/initializers/cookies_serializer.rb @@ -0,0 +1,3 @@ +# Be sure to restart your server when you modify this file. + +Rails.application.config.action_dispatch.cookies_serializer = :json diff --git a/test/dummy/config/initializers/filter_parameter_logging.rb b/test/dummy/config/initializers/filter_parameter_logging.rb new file mode 100644 index 00000000..4a994e1e --- /dev/null +++ b/test/dummy/config/initializers/filter_parameter_logging.rb @@ -0,0 +1,4 @@ +# Be sure to restart your server when you modify this file. + +# Configure sensitive parameters which will be filtered from the log file. +Rails.application.config.filter_parameters += [:password] diff --git a/test/dummy/config/initializers/inflections.rb b/test/dummy/config/initializers/inflections.rb new file mode 100644 index 00000000..ac033bf9 --- /dev/null +++ b/test/dummy/config/initializers/inflections.rb @@ -0,0 +1,16 @@ +# Be sure to restart your server when you modify this file. + +# Add new inflection rules using the following format. Inflections +# are locale specific, and you may define rules for as many different +# locales as you wish. All of these examples are active by default: +# ActiveSupport::Inflector.inflections(:en) do |inflect| +# inflect.plural /^(ox)$/i, '\1en' +# inflect.singular /^(ox)en/i, '\1' +# inflect.irregular 'person', 'people' +# inflect.uncountable %w( fish sheep ) +# end + +# These inflection rules are supported but not enabled by default: +# ActiveSupport::Inflector.inflections(:en) do |inflect| +# inflect.acronym 'RESTful' +# end diff --git a/test/dummy/config/initializers/mime_types.rb b/test/dummy/config/initializers/mime_types.rb new file mode 100644 index 00000000..dc189968 --- /dev/null +++ b/test/dummy/config/initializers/mime_types.rb @@ -0,0 +1,4 @@ +# Be sure to restart your server when you modify this file. + +# Add new mime types for use in respond_to blocks: +# Mime::Type.register "text/richtext", :rtf diff --git a/test/dummy/config/initializers/session_store.rb b/test/dummy/config/initializers/session_store.rb new file mode 100644 index 00000000..e766b67b --- /dev/null +++ b/test/dummy/config/initializers/session_store.rb @@ -0,0 +1,3 @@ +# Be sure to restart your server when you modify this file. + +Rails.application.config.session_store :cookie_store, key: '_dummy_session' diff --git a/test/dummy/config/initializers/wrap_parameters.rb b/test/dummy/config/initializers/wrap_parameters.rb new file mode 100644 index 00000000..33725e95 --- /dev/null +++ b/test/dummy/config/initializers/wrap_parameters.rb @@ -0,0 +1,14 @@ +# Be sure to restart your server when you modify this file. + +# This file contains settings for ActionController::ParamsWrapper which +# is enabled by default. + +# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array. +ActiveSupport.on_load(:action_controller) do + wrap_parameters format: [:json] if respond_to?(:wrap_parameters) +end + +# To enable root element in JSON for ActiveRecord objects. +# ActiveSupport.on_load(:active_record) do +# self.include_root_in_json = true +# end diff --git a/test/dummy/config/locales/en.yml b/test/dummy/config/locales/en.yml new file mode 100644 index 00000000..06539571 --- /dev/null +++ b/test/dummy/config/locales/en.yml @@ -0,0 +1,23 @@ +# Files in the config/locales directory are used for internationalization +# and are automatically loaded by Rails. If you want to use locales other +# than English, add the necessary files in this directory. +# +# To use the locales, use `I18n.t`: +# +# I18n.t 'hello' +# +# In views, this is aliased to just `t`: +# +# <%= t('hello') %> +# +# To use a different locale, set it with `I18n.locale`: +# +# I18n.locale = :es +# +# This would use the information in config/locales/es.yml. +# +# To learn more, please read the Rails Internationalization guide +# available at http://guides.rubyonrails.org/i18n.html. + +en: + hello: "Hello world" diff --git a/test/dummy/config/routes.rb b/test/dummy/config/routes.rb new file mode 100644 index 00000000..3caf1aca --- /dev/null +++ b/test/dummy/config/routes.rb @@ -0,0 +1,4 @@ +Rails.application.routes.draw do + + mount ResqueWeb::Engine => "/resque_web" +end diff --git a/test/dummy/config/secrets.yml b/test/dummy/config/secrets.yml new file mode 100644 index 00000000..6d98ee1d --- /dev/null +++ b/test/dummy/config/secrets.yml @@ -0,0 +1,22 @@ +# Be sure to restart your server when you modify this file. + +# Your secret key is used for verifying the integrity of signed cookies. +# If you change this key, all old signed cookies will become invalid! + +# Make sure the secret is at least 30 characters and all random, +# no regular words or you'll be exposed to dictionary attacks. +# You can use `rake secret` to generate a secure secret key. + +# Make sure the secrets in this file are kept private +# if you're sharing your code publicly. + +development: + secret_key_base: 2a5a8b4c8fb5a5d1ee434d88aa5447bba18a60ea8a2f78b938a1d6deef36f5eea8d233e7742e0e371c6c506d71103fd2dce88e6ce66951ae338daf933bae0ade + +test: + secret_key_base: ba1227c183b4f8418c63c49e730d93eb16c09006b47665358598f6cf4191c256064fd84f5cdf4aa9f802b8f9ca507b5b06eb413d53e57fc748c5b72545f5da5b + +# Do not keep production secrets in the repository, +# instead read values from the environment. +production: + secret_key_base: <%= ENV["SECRET_KEY_BASE"] %> diff --git a/test/dummy/lib/assets/.keep b/test/dummy/lib/assets/.keep new file mode 100644 index 00000000..e69de29b diff --git a/test/dummy/log/.keep b/test/dummy/log/.keep new file mode 100644 index 00000000..e69de29b diff --git a/test/dummy/public/404.html b/test/dummy/public/404.html new file mode 100644 index 00000000..b612547f --- /dev/null +++ b/test/dummy/public/404.html @@ -0,0 +1,67 @@ + + + + The page you were looking for doesn't exist (404) + + + + + + +
+
+

The page you were looking for doesn't exist.

+

You may have mistyped the address or the page may have moved.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/test/dummy/public/422.html b/test/dummy/public/422.html new file mode 100644 index 00000000..a21f82b3 --- /dev/null +++ b/test/dummy/public/422.html @@ -0,0 +1,67 @@ + + + + The change you wanted was rejected (422) + + + + + + +
+
+

The change you wanted was rejected.

+

Maybe you tried to change something you didn't have access to.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/test/dummy/public/500.html b/test/dummy/public/500.html new file mode 100644 index 00000000..061abc58 --- /dev/null +++ b/test/dummy/public/500.html @@ -0,0 +1,66 @@ + + + + We're sorry, but something went wrong (500) + + + + + + +
+
+

We're sorry, but something went wrong.

+
+

If you are the application owner check the logs for more information.

+
+ + diff --git a/test/dummy/public/favicon.ico b/test/dummy/public/favicon.ico new file mode 100644 index 00000000..e69de29b diff --git a/test/scheduler_setup_test.rb b/test/scheduler_setup_test.rb index 75d6b72b..2c76887a 100644 --- a/test/scheduler_setup_test.rb +++ b/test/scheduler_setup_test.rb @@ -28,7 +28,6 @@ describe 'when getting the env' do def wipe Resque::Scheduler.env = nil - Rails.env = nil ENV['RAILS_ENV'] = nil end @@ -39,18 +38,23 @@ def wipe after { wipe } it 'uses the value if set' do - Resque::Scheduler.env = 'foo' - assert_equal('foo', Resque::Scheduler.env) + Rails.stub(:env, nil) do + Resque::Scheduler.env = 'foo' + assert_equal('foo', Resque::Scheduler.env) + end end it 'uses Rails.env if present' do - Rails.env = 'bar' - assert_equal('bar', Resque::Scheduler.env) + Rails.stub(:env, 'bar') do + assert_equal('bar', Resque::Scheduler.env) + end end it 'uses $RAILS_ENV if present' do - ENV['RAILS_ENV'] = 'baz' - assert_equal('baz', Resque::Scheduler.env) + Rails.stub(:env, nil) do + ENV['RAILS_ENV'] = 'baz' + assert_equal('baz', Resque::Scheduler.env) + end end end diff --git a/test/scheduler_test.rb b/test/scheduler_test.rb index ed2cfd96..d6c0ee02 100644 --- a/test/scheduler_test.rb +++ b/test/scheduler_test.rb @@ -418,25 +418,33 @@ end it 'procline contains app_name when present' do - Resque::Scheduler.app_name = 'foo' - assert Resque::Scheduler.send(:build_procline, 'bar') =~ /\[foo\]:/ + Rails.stub(:env, nil) do + Resque::Scheduler.app_name = 'foo' + assert Resque::Scheduler.send(:build_procline, 'bar') =~ /\[foo\]:/ + end end it 'procline omits app_name when absent' do - Resque::Scheduler.app_name = nil - assert Resque::Scheduler.send(:build_procline, 'bar') =~ - /#{Resque::Scheduler.send(:internal_name)}: bar/ + Rails.stub(:env, nil) do + Resque::Scheduler.app_name = nil + assert Resque::Scheduler.send(:build_procline, 'bar') =~ + /#{Resque::Scheduler.send(:internal_name)}: bar/, "Got #{Resque::Scheduler.send(:build_procline, 'bar')}, instead of #{Resque::Scheduler.send(:internal_name)}: bar" + end end it 'procline contains env when present' do - Resque::Scheduler.env = 'xyz' - assert Resque::Scheduler.send(:build_procline, 'cage') =~ /\[xyz\]: cage/ + Rails.stub(:env, nil) do + Resque::Scheduler.env = 'xyz' + assert Resque::Scheduler.send(:build_procline, 'cage') =~ /\[xyz\]: cage/ + end end it 'procline omits env when absent' do - Resque::Scheduler.env = nil - assert Resque::Scheduler.send(:build_procline, 'cage') =~ - /#{Resque::Scheduler.send(:internal_name)}: cage/ + Rails.stub(:env, nil) do + Resque::Scheduler.env = nil + assert Resque::Scheduler.send(:build_procline, 'cage') =~ + /#{Resque::Scheduler.send(:internal_name)}: cage/ + end end describe 'printing schedule' do diff --git a/test/test_helper.rb b/test/test_helper.rb index 8d4f3e1f..e3222471 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,10 +1,18 @@ # vim:fileencoding=utf-8 require 'simplecov' -require 'resque' -# This bit needs to be above the minitest require, because otherwise, the + +ENV["RAILS_ENV"] = "test" +require File.expand_path("../../test/dummy/config/environment.rb", __FILE__) +ActiveRecord::Migrator.migrations_paths = [File.expand_path("../../test/dummy/db/migrate", __FILE__)] +ActiveRecord::Migrator.migrations_paths << File.expand_path('../../db/migrate', __FILE__) + + +# This bit needs to be above the minitest require (in rails/test_help), but +# after the Rails app is started. This is because otherwise, the # at_exit calls are in the wrong order and Redis shuts down before the tests # run. +require 'resque' unless ENV['RESQUE_SCHEDULER_DISABLE_TEST_REDIS_SERVER'] # Start our own Redis when the tests start. RedisInstance will take care of # starting and stopping. @@ -12,7 +20,10 @@ RedisInstance.run! end -require 'minitest/autorun' +require "rails/test_help" + +require "minitest/spec" +require "minitest/mock" require 'mocha/setup' require 'rack/test' From 8a89518a1db6017cc07485bcc2e0fa24c9692790 Mon Sep 17 00:00:00 2001 From: Matt Gibson Date: Wed, 7 Jan 2015 21:33:36 +0000 Subject: [PATCH 08/32] Remove mintest-bisect --- resque-scheduler.gemspec | 1 - 1 file changed, 1 deletion(-) diff --git a/resque-scheduler.gemspec b/resque-scheduler.gemspec index 20a66b32..99e99b3c 100644 --- a/resque-scheduler.gemspec +++ b/resque-scheduler.gemspec @@ -26,7 +26,6 @@ Gem::Specification.new do |spec| spec.add_development_dependency 'json' spec.add_development_dependency 'kramdown' spec.add_development_dependency 'minitest', '~> 5.0' - spec.add_development_dependency 'minitest-bisect' spec.add_development_dependency 'mocha' spec.add_development_dependency 'pry' spec.add_development_dependency 'rack-test' From 8164d2d4464f8704bf8b97df67c5abdc369e3938 Mon Sep 17 00:00:00 2001 From: Matt Gibson Date: Wed, 7 Jan 2015 23:37:24 +0000 Subject: [PATCH 09/32] DB for dummy app --- test/dummy/db/development.sqlite3 | Bin 0 -> 12288 bytes test/dummy/db/schema.rb | 16 ++++++++++++++++ test/dummy/db/test.sqlite3 | Bin 0 -> 12288 bytes 3 files changed, 16 insertions(+) create mode 100644 test/dummy/db/development.sqlite3 create mode 100644 test/dummy/db/schema.rb create mode 100644 test/dummy/db/test.sqlite3 diff --git a/test/dummy/db/development.sqlite3 b/test/dummy/db/development.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..7ad34b645a07557c3bda2534281973badfd3edd6 GIT binary patch literal 12288 zcmeI#O-sWt7{KwgQ!0YY+pZ5exr6lJS#W9(gVHf=!P|&4y29FF+YPV#3VujGhbcG^ z%J3+R{{w0B(xk~Rr{{4R=Z%%uRaKZquGG2mJar?Yl=5Baxw4D4eY9)1xA&{Quj;GI zuj4Z}>i17n|Ih^tNGMzSxg-nZK{?te!7y zVP-}CR+%PWm3611clQvD(nzvoJk25*C->2l=zY_*OcK$ZMYLS#jjd|;2R&SR!60-S z2^#afw4HA|9sbV_($Q@k{js=gOf_GaN|H$`NfyV$HaB-kKY;)O2q1s}0tg_000Iag lfB*sqEO6SMjr{+BZw_P7Sxr21zS#W9(gVHf=!P}^_y29FF*A1`x3Vukx#4cvi zgHVP?Vf-Iy@<`e=`Q?sFcE3MUyh*HXK9@G4UW$I3o?;8Cp-H`h+r zHw$s<^m(4O-feYQ%?jedZ5aG9xvbM_I!h~wMzKUm81{B|bM0=GDFgxtAbL>SB-p literal 0 HcmV?d00001 From 6b72766eb3ed9100bbd6549128b69e3c4ddf9290 Mon Sep 17 00:00:00 2001 From: Matt Gibson Date: Wed, 7 Jan 2015 23:43:07 +0000 Subject: [PATCH 10/32] Ignore logs in the dummy app --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index f979559b..7018bde4 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,5 @@ nbproject .env .env.* + +/test/dummy/log From 2f1f93b00c06edd9539736b3909f4178491cb3d2 Mon Sep 17 00:00:00 2001 From: Matt Gibson Date: Wed, 7 Jan 2015 23:54:50 +0000 Subject: [PATCH 11/32] Directory path in .gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 7018bde4..6cf79dee 100644 --- a/.gitignore +++ b/.gitignore @@ -16,4 +16,4 @@ nbproject .env .env.* -/test/dummy/log +/test/dummy/log/ From 8c320aacb1bc44407658f3c0c7380de3de5fbb9a Mon Sep 17 00:00:00 2001 From: Matt Gibson Date: Thu, 8 Jan 2015 00:45:29 +0000 Subject: [PATCH 12/32] Failing test for the presence of the schedule tab --- resque-scheduler.gemspec | 2 ++ test/integration/resque_web_engine_test.rb | 15 +++++++++++++++ test/support/integration_case.rb | 5 +++++ test/test_helper.rb | 5 +++++ 4 files changed, 27 insertions(+) create mode 100644 test/integration/resque_web_engine_test.rb create mode 100644 test/support/integration_case.rb diff --git a/resque-scheduler.gemspec b/resque-scheduler.gemspec index 99e99b3c..44cbdf6c 100644 --- a/resque-scheduler.gemspec +++ b/resque-scheduler.gemspec @@ -26,6 +26,7 @@ Gem::Specification.new do |spec| spec.add_development_dependency 'json' spec.add_development_dependency 'kramdown' spec.add_development_dependency 'minitest', '~> 5.0' + spec.add_development_dependency 'minitest-rails' spec.add_development_dependency 'mocha' spec.add_development_dependency 'pry' spec.add_development_dependency 'rack-test' @@ -35,6 +36,7 @@ Gem::Specification.new do |spec| spec.add_development_dependency 'rails', '~> 4.2.0' spec.add_development_dependency 'resque-web' spec.add_development_dependency 'sqlite3' + spec.add_development_dependency 'capybara' # We pin rubocop because new cops have a tendency to result in false-y diff --git a/test/integration/resque_web_engine_test.rb b/test/integration/resque_web_engine_test.rb new file mode 100644 index 00000000..2abcbd44 --- /dev/null +++ b/test/integration/resque_web_engine_test.rb @@ -0,0 +1,15 @@ +require_relative '../test_helper' + +class ResqueWebEngineTest < ActionDispatch::IntegrationTest + fixtures :all + + # test "the truth" do + # assert true + # end + + test 'the schedule tab should show up in Resque Web' do + visit '/resque_web' + click_link 'Schedule' + assert_select 'title', 'Schedule' + end +end \ No newline at end of file diff --git a/test/support/integration_case.rb b/test/support/integration_case.rb new file mode 100644 index 00000000..bd9932f0 --- /dev/null +++ b/test/support/integration_case.rb @@ -0,0 +1,5 @@ +# Define a bare test case to use with Capybara +class ActionDispatch::IntegrationTest < ActiveSupport::TestCase + include Capybara::DSL + include Rails.application.routes.url_helpers +end \ No newline at end of file diff --git a/test/test_helper.rb b/test/test_helper.rb index e3222471..b1975dc2 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -27,6 +27,11 @@ require 'mocha/setup' require 'rack/test' +require 'capybara/rails' +Capybara.default_driver = :rack_test +Capybara.default_selector = :css +require_relative 'support/integration_case' + $LOAD_PATH.unshift File.dirname(File.expand_path(__FILE__)) + '/../lib' require 'resque-scheduler' require 'resque/scheduler/server' From 59290e04b93aa5cfdf4b23cdd8a0dc789a4e01c2 Mon Sep 17 00:00:00 2001 From: Matt Gibson Date: Sun, 28 Dec 2014 23:03:18 +0000 Subject: [PATCH 13/32] Basic transfer of server content to new engine --- lib/resque-scheduler.rb | 1 + lib/resque/scheduler/engine.rb | 24 +++++++++ .../resque_scheduler/schedules_controller.rb | 30 +++++++++++ .../resque_scheduler/schedules/index.html.erb | 53 +++++++++++++++++++ .../schedules/requeue-params.erb | 23 ++++++++ 5 files changed, 131 insertions(+) create mode 100644 lib/resque/scheduler/engine.rb create mode 100644 lib/resque/scheduler/engine/app/controllers/resque_web/plugins/resque_scheduler/schedules_controller.rb create mode 100644 lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/schedules/index.html.erb create mode 100644 lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/schedules/requeue-params.erb diff --git a/lib/resque-scheduler.rb b/lib/resque-scheduler.rb index b770cd91..5c64f324 100644 --- a/lib/resque-scheduler.rb +++ b/lib/resque-scheduler.rb @@ -1,4 +1,5 @@ # vim:fileencoding=utf-8 require_relative 'resque/scheduler' +require 'resque/scheduler/engine' Resque.extend Resque::Scheduler::Extension diff --git a/lib/resque/scheduler/engine.rb b/lib/resque/scheduler/engine.rb new file mode 100644 index 00000000..d451be19 --- /dev/null +++ b/lib/resque/scheduler/engine.rb @@ -0,0 +1,24 @@ +require 'resque_web' + +module ResqueWeb::Plugins::ResqueScheduler + class Engine < Rails::Engine + isolate_namespace ResqueWeb::Plugins::ResqueScheduler + paths["app"] << 'lib/resque/scheduler/engine/app' + paths["app/helpers"] << 'lib/resque/scheduler/engine/app/helpers' + paths["app/views"] << 'lib/resque/scheduler/engine/app/views' + paths["app/controllers"] << 'lib/resque/scheduler/engine/app/controllers' + end + + Engine.routes do + resources :schedules, only: [:index, :destroy] + end + + def self.engine_path + "/scheduler" + end + + def self.tabs + [{'schedule' => Engine.app.url_helpers.schedules_path}] + + end +end \ No newline at end of file diff --git a/lib/resque/scheduler/engine/app/controllers/resque_web/plugins/resque_scheduler/schedules_controller.rb b/lib/resque/scheduler/engine/app/controllers/resque_web/plugins/resque_scheduler/schedules_controller.rb new file mode 100644 index 00000000..c9c24a21 --- /dev/null +++ b/lib/resque/scheduler/engine/app/controllers/resque_web/plugins/resque_scheduler/schedules_controller.rb @@ -0,0 +1,30 @@ +module ResqueWeb::Plugins::ResqueScheduler + + class SchedulesController < ResqueWeb::ApplicationController + + def index + Resque.reload_schedule! if Resque::Scheduler.dynamic + end + + def destroy + if Resque::Scheduler.dynamic + job_name = params['job_name'] || params[:job_name] + Resque.remove_schedule(job_name) + end + redirect schedules_path + end + + def requeue + @job_name = params['job_name'] || params[:job_name] + config = Resque.schedule[@job_name] + @parameters = config['parameters'] || config[:parameters] + if @parameters + render_template 'requeue-params' + else + Resque::Scheduler.enqueue_from_config(config) + redirect overview_path + end + end + + end +end \ No newline at end of file diff --git a/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/schedules/index.html.erb b/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/schedules/index.html.erb new file mode 100644 index 00000000..1fa6e3df --- /dev/null +++ b/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/schedules/index.html.erb @@ -0,0 +1,53 @@ +

Schedule

+ +

+ The list below contains all scheduled jobs. Click "Queue now" to + queue + a job immediately. + Server local time: <%= Time.now %> + Current master: <%= Resque.redis.get(Resque::Scheduler.master_lock.key) %> +

+
+ + + <% if Resque::Scheduler.dynamic %> + + <% end %> + + + + + + + + + + <% Resque.schedule.keys.sort.select { |n| scheduled_in_this_env?(n) }.each do |name| %> + <% config = Resque.schedule[name] %> + + <% if Resque::Scheduler.dynamic %> + + <% end %> + + + + + + + + + + <% end %> +
NameDescriptionIntervalClassQueueArgumentsLast Enqueued
+
" method="post" style="margin-left: 0"> + + + +
+
+
" method="post" style="margin-left: 0"> + + +
+
<%= h name %><%= h config['description'] %><%= h schedule_interval(config) %><%= h schedule_class(config) %><%= h config['queue'] || queue_from_class_name(config['class']) %><%= h config['args'].inspect %><%= h Resque.get_last_enqueued_at(name) || 'Never' %>
+
diff --git a/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/schedules/requeue-params.erb b/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/schedules/requeue-params.erb new file mode 100644 index 00000000..1464f5bb --- /dev/null +++ b/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/schedules/requeue-params.erb @@ -0,0 +1,23 @@ +

<%= @job_name %>

+ +

+ This job requires parameters: +

+ +
" method="post"> + + <% @parameters.each do |key, value| %> + <% value ||= {} %> + + + + <% end %> +
+ <%= key %> + <% if value['description'] || value[:description] %> + (?) + <% end %>: +
+ + +
From 27cbfc540e686f1b24b089ce3a43a6b22719f34f Mon Sep 17 00:00:00 2001 From: Matt Gibson Date: Fri, 9 Jan 2015 01:56:27 +0000 Subject: [PATCH 14/32] Scheduler page tests work --- lib/resque/scheduler/engine.rb | 2 +- .../resque_scheduler/schedules_helper.rb | 51 +++++++++++++ resque-scheduler.gemspec | 1 + test/integration/resque_web_engine_test.rb | 75 +++++++++++++++++-- test/support/integration_case.rb | 2 +- test/test_helper.rb | 4 + 6 files changed, 125 insertions(+), 10 deletions(-) create mode 100644 lib/resque/scheduler/engine/app/helpers/resque_web/plugins/resque_scheduler/schedules_helper.rb diff --git a/lib/resque/scheduler/engine.rb b/lib/resque/scheduler/engine.rb index d451be19..aae656f7 100644 --- a/lib/resque/scheduler/engine.rb +++ b/lib/resque/scheduler/engine.rb @@ -19,6 +19,6 @@ def self.engine_path def self.tabs [{'schedule' => Engine.app.url_helpers.schedules_path}] - end + end \ No newline at end of file diff --git a/lib/resque/scheduler/engine/app/helpers/resque_web/plugins/resque_scheduler/schedules_helper.rb b/lib/resque/scheduler/engine/app/helpers/resque_web/plugins/resque_scheduler/schedules_helper.rb new file mode 100644 index 00000000..208b3441 --- /dev/null +++ b/lib/resque/scheduler/engine/app/helpers/resque_web/plugins/resque_scheduler/schedules_helper.rb @@ -0,0 +1,51 @@ +module ResqueWeb::Plugins::ResqueScheduler + + module SchedulesHelper + + def scheduled_in_this_env?(name) + return true if Resque.schedule[name]['rails_env'].nil? + rails_env(name).split(/[\s,]+/).include?(Resque::Scheduler.env) + end + + def rails_env(name) + Resque.schedule[name]['rails_env'] + end + + def schedule_interval_every(every) + every = [*every] + s = 'every: ' << every.first + + return s unless every.length > 1 + + s << ' (' + meta = every.last.map do |key, value| + "#{key.to_s.gsub(/_/, ' ')} #{value}" + end + s << meta.join(', ') << ')' + end + + def schedule_interval(config) + if config['every'] + schedule_interval_every(config['every']) + elsif config['cron'] + 'cron: ' + config['cron'].to_s + else + 'Not currently scheduled' + end + end + + def schedule_class(config) + if config['class'].nil? && !config['custom_job_class'].nil? + config['custom_job_class'] + else + config['class'] + end + end + + def queue_from_class_name(class_name) + Resque.queue_from_class( + Resque::Scheduler::Util.constantize(class_name) + ) + end + end +end \ No newline at end of file diff --git a/resque-scheduler.gemspec b/resque-scheduler.gemspec index 44cbdf6c..3090c677 100644 --- a/resque-scheduler.gemspec +++ b/resque-scheduler.gemspec @@ -37,6 +37,7 @@ Gem::Specification.new do |spec| spec.add_development_dependency 'resque-web' spec.add_development_dependency 'sqlite3' spec.add_development_dependency 'capybara' + spec.add_development_dependency 'launchy' # We pin rubocop because new cops have a tendency to result in false-y diff --git a/test/integration/resque_web_engine_test.rb b/test/integration/resque_web_engine_test.rb index 2abcbd44..5f01f3c1 100644 --- a/test/integration/resque_web_engine_test.rb +++ b/test/integration/resque_web_engine_test.rb @@ -3,13 +3,72 @@ class ResqueWebEngineTest < ActionDispatch::IntegrationTest fixtures :all - # test "the truth" do - # assert true - # end - - test 'the schedule tab should show up in Resque Web' do - visit '/resque_web' - click_link 'Schedule' - assert_select 'title', 'Schedule' + def visit_scheduler_page + visit '/resque_web/scheduler/schedules' + end + + setup do + Resque::Scheduler.env = 'production' + Resque.schedule = { + 'some_ivar_job' => { + 'cron' => '* * * * *', + 'class' => 'SomeIvarJob', + 'args' => '/tmp', + 'rails_env' => 'production' + }, + 'some_other_job' => { + 'every' => ['1m', ['1h']], + 'queue' => 'high', + 'custom_job_class' => 'SomeOtherJob', + 'args' => { + 'b' => 'blah' + } + }, + 'some_fancy_job' => { + 'every' => ['1m'], + 'queue' => 'fancy', + 'class' => 'SomeFancyJob', + 'args' => 'sparkles', + 'rails_env' => 'fancy' + }, + 'shared_env_job' => { + 'cron' => '* * * * *', + 'class' => 'SomeSharedEnvJob', + 'args' => '/tmp', + 'rails_env' => 'fancy, production' + } + } + Resque::Scheduler.load_schedule! + visit_scheduler_page + end + + test '200' do + assert page.has_css?('h1', 'Schedule') + end + + test 'see the scheduled job' do + assert page.body.include?('SomeIvarJob') + end + + test 'excludes jobs for other envs' do + assert !page.body.include?('SomeFancyJob') + end + + test 'includes job used in multiple environments' do + assert page.body.include?('SomeSharedEnvJob') + end + + test 'allows delete when dynamic' do + Resque::Scheduler.stubs(:dynamic).returns(true) + visit_scheduler_page + + assert page.body.include?('Delete') + end + + test "doesn't allow delete when static" do + Resque::Scheduler.stubs(:dynamic).returns(false) + visit_scheduler_page + + assert !page.body.include?('Delete') end end \ No newline at end of file diff --git a/test/support/integration_case.rb b/test/support/integration_case.rb index bd9932f0..886f33aa 100644 --- a/test/support/integration_case.rb +++ b/test/support/integration_case.rb @@ -1,5 +1,5 @@ # Define a bare test case to use with Capybara -class ActionDispatch::IntegrationTest < ActiveSupport::TestCase +class ActionDispatch::IntegrationTest include Capybara::DSL include Rails.application.routes.url_helpers end \ No newline at end of file diff --git a/test/test_helper.rb b/test/test_helper.rb index b1975dc2..2a930f00 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -32,6 +32,10 @@ Capybara.default_selector = :css require_relative 'support/integration_case' +# Filter out Minitest backtrace while allowing backtrace from other libraries +# to be shown. +Minitest.backtrace_filter = Minitest::BacktraceFilter.new + $LOAD_PATH.unshift File.dirname(File.expand_path(__FILE__)) + '/../lib' require 'resque-scheduler' require 'resque/scheduler/server' From 846ff94aee72b2828c635f79d0b97f29e37087e1 Mon Sep 17 00:00:00 2001 From: Matt Gibson Date: Sat, 10 Jan 2015 01:43:16 +0000 Subject: [PATCH 15/32] Add all routes to engine file and fix tabs --- lib/resque/scheduler/engine.rb | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/lib/resque/scheduler/engine.rb b/lib/resque/scheduler/engine.rb index aae656f7..09cc72d1 100644 --- a/lib/resque/scheduler/engine.rb +++ b/lib/resque/scheduler/engine.rb @@ -11,6 +11,20 @@ class Engine < Rails::Engine Engine.routes do resources :schedules, only: [:index, :destroy] + + get 'schedule', to: 'schedules#index' + post 'schedule/requeue', to: 'schedules#requeue' + post 'schedule/requeue_with_params', to: 'schedule#requeue_with_params' + delete 'schedule', to: 'schedules#destroy' + + get 'delayed', to: 'delayed#index', as: 'delayed' + get 'delayed/jobs/:klass', to: 'delayed#jobs_klass', as: 'delayed_job_class' + post 'delayed/search', to: 'delayed#search' + get 'delayed/:timestamp', to: 'delayed#timestamp' + post 'delayed/queue_now', to: 'delayed#queue_now' + post 'delayed/cancel_now', to: 'delayed#cancel_now' + post '/delayed/clear', to: 'delayed#clear' + end def self.engine_path @@ -18,7 +32,8 @@ def self.engine_path end def self.tabs - [{'schedule' => Engine.app.url_helpers.schedules_path}] + [{'schedule' => Engine.app.url_helpers.schedules_path, + 'delayed' => Engine.app.url_helpers.delayed_path}] end end \ No newline at end of file From 621801157e195464ac9041dbff261ff3981de3f1 Mon Sep 17 00:00:00 2001 From: Matt Gibson Date: Sat, 10 Jan 2015 01:43:41 +0000 Subject: [PATCH 16/32] Tests for the delayed page and the job class page --- .../delayed_job_class_page_test.rb | 21 +++++++++++++++++++ .../delayed_job_namespaced_class_page_test.rb | 21 +++++++++++++++++++ .../resque_web_engine/delayed_page_test.rb | 15 +++++++++++++ .../schedule_page_test.rb} | 11 ++++++++-- test/test_helper.rb | 8 +++++++ 5 files changed, 74 insertions(+), 2 deletions(-) create mode 100644 test/integration/resque_web_engine/delayed_job_class_page_test.rb create mode 100644 test/integration/resque_web_engine/delayed_job_namespaced_class_page_test.rb create mode 100644 test/integration/resque_web_engine/delayed_page_test.rb rename test/integration/{resque_web_engine_test.rb => resque_web_engine/schedule_page_test.rb} (87%) diff --git a/test/integration/resque_web_engine/delayed_job_class_page_test.rb b/test/integration/resque_web_engine/delayed_job_class_page_test.rb new file mode 100644 index 00000000..95ca5ddb --- /dev/null +++ b/test/integration/resque_web_engine/delayed_job_class_page_test.rb @@ -0,0 +1,21 @@ +require_relative '../../test_helper' + +module ResqueWeb::Plugins::ResqueScheduler + + class DelayedJobClassPageTest < ActionDispatch::IntegrationTest + fixtures :all + + setup do + @t = Time.now + 3600 + Resque.enqueue_at(@t, SomeIvarJob, 'foo', 'bar') + visit Engine.app.url_helpers.delayed_job_class_path klass: 'SomeIvarJob', args: URI.encode(%w(foo bar).to_json) + end + + test('is 200') { assert page.status_code == 200 } + + test 'see the scheduled job' do + assert page.body.include?(@t.to_s) + end + + end +end \ No newline at end of file diff --git a/test/integration/resque_web_engine/delayed_job_namespaced_class_page_test.rb b/test/integration/resque_web_engine/delayed_job_namespaced_class_page_test.rb new file mode 100644 index 00000000..7b9d5747 --- /dev/null +++ b/test/integration/resque_web_engine/delayed_job_namespaced_class_page_test.rb @@ -0,0 +1,21 @@ +require_relative '../../test_helper' + +module ResqueWeb::Plugins::ResqueScheduler + class DelayedJobNamespacedClassPageTest < ActionDispatch::IntegrationTest + fixtures :all + + setup do + @t = Time.now + 3600 + + Resque.enqueue_at(@t, Foo::Bar, 'foo', 'bar') + visit Engine.app.url_helpers.delayed_job_class_path klass: 'Foo::Bar', args: URI.encode(%w(foo bar).to_json) + end + + test('is 200') { assert page.status_code == 200 } + + test 'see the scheduled job' do + assert page.body.include?(@t.to_s) + end + + end +end \ No newline at end of file diff --git a/test/integration/resque_web_engine/delayed_page_test.rb b/test/integration/resque_web_engine/delayed_page_test.rb new file mode 100644 index 00000000..1bf1af78 --- /dev/null +++ b/test/integration/resque_web_engine/delayed_page_test.rb @@ -0,0 +1,15 @@ +require_relative '../../test_helper' + +module ResqueWeb::Plugins::ResqueScheduler + + class DelayedTest < ActionDispatch::IntegrationTest + + test 'Link to delayed page in navigation works' do + visit '/resque_web' + click_link 'Delayed' + assert page.status_code == 200 + assert page.has_css? 'h1', 'Delayed Jobs' + end + + end +end \ No newline at end of file diff --git a/test/integration/resque_web_engine_test.rb b/test/integration/resque_web_engine/schedule_page_test.rb similarity index 87% rename from test/integration/resque_web_engine_test.rb rename to test/integration/resque_web_engine/schedule_page_test.rb index 5f01f3c1..6d6107cf 100644 --- a/test/integration/resque_web_engine_test.rb +++ b/test/integration/resque_web_engine/schedule_page_test.rb @@ -1,6 +1,6 @@ -require_relative '../test_helper' +require_relative '../../test_helper' -class ResqueWebEngineTest < ActionDispatch::IntegrationTest +class ScheduleTest < ActionDispatch::IntegrationTest fixtures :all def visit_scheduler_page @@ -42,6 +42,13 @@ def visit_scheduler_page visit_scheduler_page end + + test 'Link to Schedule page in navigation works' do + visit '/resque_web' + click_link 'Schedule' + assert page.has_css? 'h1', 'Schedule' + end + test '200' do assert page.has_css?('h1', 'Schedule') end diff --git a/test/test_helper.rb b/test/test_helper.rb index 2a930f00..63ecefc1 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -94,6 +94,14 @@ def self.perform(*args) end end +module Foo + class Bar + def self.queue + 'bar' + end + end +end + JobWithoutParams = Class.new(JobWithParams) %w( From d44cc20e7f856eb7ff4478b4cdd05125cab27802 Mon Sep 17 00:00:00 2001 From: Matt Gibson Date: Sat, 10 Jan 2015 01:44:01 +0000 Subject: [PATCH 17/32] Working delayed and delayed job class pages --- .../resque_scheduler/delayed_controller.rb | 18 ++++++ .../resque_scheduler/delayed_helper.rb | 5 ++ .../resque_scheduler/delayed/_next_more.erb | 23 +++++++ .../resque_scheduler/delayed/_search_form.erb | 8 +++ .../resque_scheduler/delayed/index.erb | 60 +++++++++++++++++++ .../resque_scheduler/delayed/jobs_klass.erb | 20 +++++++ 6 files changed, 134 insertions(+) create mode 100644 lib/resque/scheduler/engine/app/controllers/resque_web/plugins/resque_scheduler/delayed_controller.rb create mode 100644 lib/resque/scheduler/engine/app/helpers/resque_web/plugins/resque_scheduler/delayed_helper.rb create mode 100644 lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/_next_more.erb create mode 100644 lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/_search_form.erb create mode 100644 lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/index.erb create mode 100644 lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/jobs_klass.erb diff --git a/lib/resque/scheduler/engine/app/controllers/resque_web/plugins/resque_scheduler/delayed_controller.rb b/lib/resque/scheduler/engine/app/controllers/resque_web/plugins/resque_scheduler/delayed_controller.rb new file mode 100644 index 00000000..a1f2dc91 --- /dev/null +++ b/lib/resque/scheduler/engine/app/controllers/resque_web/plugins/resque_scheduler/delayed_controller.rb @@ -0,0 +1,18 @@ +module ResqueWeb::Plugins::ResqueScheduler + + class DelayedController < ResqueWeb::ApplicationController + + def index + end + + def jobs_klass + begin + klass = Resque::Scheduler::Util.constantize(params[:klass]) + @args = JSON.load(URI.decode(params[:args])) + @timestamps = Resque.scheduled_at(klass, *@args) + rescue + @timestamps = [] + end + end + end +end \ No newline at end of file diff --git a/lib/resque/scheduler/engine/app/helpers/resque_web/plugins/resque_scheduler/delayed_helper.rb b/lib/resque/scheduler/engine/app/helpers/resque_web/plugins/resque_scheduler/delayed_helper.rb new file mode 100644 index 00000000..c51ae9b6 --- /dev/null +++ b/lib/resque/scheduler/engine/app/helpers/resque_web/plugins/resque_scheduler/delayed_helper.rb @@ -0,0 +1,5 @@ +module ResqueWeb::Plugins::ResqueScheduler + + module DelayedHelper + end +end \ No newline at end of file diff --git a/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/_next_more.erb b/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/_next_more.erb new file mode 100644 index 00000000..784233df --- /dev/null +++ b/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/_next_more.erb @@ -0,0 +1,23 @@ +<% # per_page was added in 1.23.1; gems which add to resque-server don't pass that variable along so it would crash %> +<% # without a default value %> +<% per_page ||= 20 %> +<% if start - per_page >= 0 || start + per_page <= size %> +

+ <% if start + per_page <= size %> + « + Next + <% end %> + + <% (size / per_page.to_f - 1).ceil.downto(0).each do |page_num| %> + <% if start == page_num * per_page %> + <%= page_num %> + <% else %> + <%= page_num %> + <% end %> + <% end %> + + <% if start - per_page >= 0 %> + Previous » + <% end %> +

+<% end %> \ No newline at end of file diff --git a/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/_search_form.erb b/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/_search_form.erb new file mode 100644 index 00000000..c150c67a --- /dev/null +++ b/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/_search_form.erb @@ -0,0 +1,8 @@ +
+ + +
+ + + + diff --git a/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/index.erb b/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/index.erb new file mode 100644 index 00000000..c4a313ee --- /dev/null +++ b/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/index.erb @@ -0,0 +1,60 @@ +

Delayed Jobs

+<%- size = Resque.delayed_queue_schedule_size %> + +<%= render partial: 'search_form' %> + +

+ This list below contains the timestamps for scheduled delayed jobs. + Server local time: <%= Time.now %> +

+ +

+ Showing <%= start = params[:start].to_i %> to <%= start + 20 %> of <%= size %> timestamps +

+ + + + + + + + + + + <% Resque.delayed_queue_peek(start, 20).each do |timestamp| %> + + + + + <% job = resque.delayed_timestamp_peek(timestamp, 0, 1).first %> + + + + + <% end %> +
TimestampJob countClassArgsAll schedules
+
" method="post"> + + +
+
"><%= format_time(Time.at(timestamp)) %><%= delayed_timestamp_size = resque.delayed_timestamp_size(timestamp) %> + <% if job && delayed_timestamp_size == 1 %> + <%= h(job['class']) %> + <% else %> + ">see details + <% end %> + <%= h(job['args'].inspect) if job && delayed_timestamp_size == 1 %> + <% if job %> + All schedules + <% end %> +
+ +<% if size > 0 %> +
+
+ +
+<% end %> + +<%= render partial: 'next_more', locals: { :start => start, :size => size } %> + diff --git a/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/jobs_klass.erb b/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/jobs_klass.erb new file mode 100644 index 00000000..f3a4e48a --- /dev/null +++ b/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/jobs_klass.erb @@ -0,0 +1,20 @@ +

Delayed jobs scheduled for <%= params[:klass] %> (<%= @args %>)

+ + + + + + + <% @timestamps.each do |t| %> + + + + <% end %> + <% if @timestamps.empty? %> + + + + <% end %> +
Timestamp
+ <%= Time.at(t) %> +
There are no such jobs scheduled.
From b9711fae651412f65828a77cda762e87a1583542 Mon Sep 17 00:00:00 2001 From: Matt Gibson Date: Fri, 23 Jan 2015 22:08:49 +0000 Subject: [PATCH 18/32] Added tests and code up to requeue_with_params --- lib/resque/scheduler/engine.rb | 4 +- .../resque_scheduler/schedules_controller.rb | 24 +++- .../resque_web_engine/requeue_test.rb | 49 +++++++ .../requeue_with_params_test.rb | 31 ++++ .../resque_web_engine/schedule_page_test.rb | 132 +++++++++--------- test/test_helper.rb | 26 ++++ 6 files changed, 196 insertions(+), 70 deletions(-) create mode 100644 test/integration/resque_web_engine/requeue_test.rb create mode 100644 test/integration/resque_web_engine/requeue_with_params_test.rb diff --git a/lib/resque/scheduler/engine.rb b/lib/resque/scheduler/engine.rb index 09cc72d1..b2e61faa 100644 --- a/lib/resque/scheduler/engine.rb +++ b/lib/resque/scheduler/engine.rb @@ -13,8 +13,8 @@ class Engine < Rails::Engine resources :schedules, only: [:index, :destroy] get 'schedule', to: 'schedules#index' - post 'schedule/requeue', to: 'schedules#requeue' - post 'schedule/requeue_with_params', to: 'schedule#requeue_with_params' + post 'schedule/requeue', to: 'schedules#requeue', as: 'requeue' + post 'schedule/requeue_with_params', to: 'schedules#requeue_with_params', as: 'requeue_with_params' delete 'schedule', to: 'schedules#destroy' get 'delayed', to: 'delayed#index', as: 'delayed' diff --git a/lib/resque/scheduler/engine/app/controllers/resque_web/plugins/resque_scheduler/schedules_controller.rb b/lib/resque/scheduler/engine/app/controllers/resque_web/plugins/resque_scheduler/schedules_controller.rb index c9c24a21..055abcb2 100644 --- a/lib/resque/scheduler/engine/app/controllers/resque_web/plugins/resque_scheduler/schedules_controller.rb +++ b/lib/resque/scheduler/engine/app/controllers/resque_web/plugins/resque_scheduler/schedules_controller.rb @@ -11,7 +11,7 @@ def destroy job_name = params['job_name'] || params[:job_name] Resque.remove_schedule(job_name) end - redirect schedules_path + redirect_to ResqueWeb::Engine.app.url_helpers.overview_path end def requeue @@ -19,12 +19,30 @@ def requeue config = Resque.schedule[@job_name] @parameters = config['parameters'] || config[:parameters] if @parameters - render_template 'requeue-params' + render 'requeue-params' else Resque::Scheduler.enqueue_from_config(config) - redirect overview_path + redirect_to ResqueWeb::Engine.app.url_helpers.overview_path end end + def requeue_with_params + job_name = params['job_name'] || params[:job_name] + config = Resque.schedule[job_name] + # Build args hash from post data (removing the job name) + submitted_args = params.reject do |key, _value| + %w[job_name action controller].include?(key) + end + + # Merge constructed args hash with existing args hash for + # the job, if it exists + config_args = config['args'] || config[:args] || {} + config_args = config_args.merge(submitted_args) + + # Insert the args hash into config and queue the resque job + config = config.merge('args' => config_args) + Resque::Scheduler.enqueue_from_config(config) + redirect_to ResqueWeb::Engine.app.url_helpers.overview_path + end end end \ No newline at end of file diff --git a/test/integration/resque_web_engine/requeue_test.rb b/test/integration/resque_web_engine/requeue_test.rb new file mode 100644 index 00000000..02493cf4 --- /dev/null +++ b/test/integration/resque_web_engine/requeue_test.rb @@ -0,0 +1,49 @@ +require_relative '../../test_helper' + +module ResqueWeb::Plugins::ResqueScheduler + class RequeueTest < ActionDispatch::IntegrationTest + fixtures :all + + setup do + Resque.schedule = Test::RESQUE_SCHEDULE + Resque::Scheduler.load_schedule! + end + + test 'job without params' do + # Regular jobs without params should redirect to /overview + job_name = 'job_without_params' + Resque::Scheduler.stubs(:enqueue_from_config) + .once.with(Resque.schedule[job_name]) + + post Engine.app.url_helpers.requeue_path, 'job_name' => job_name + follow_redirect! + assert_equal 'http://www.example.com/resque_web/overview', request.url + assert response.ok? + end + + test 'job with params' do + # If a job has params defined, + # it should render the template with a form for the job params + job_name = 'job_with_params' + post Engine.app.url_helpers.requeue_path, 'job_name' => job_name + + assert response.ok? + assert response.body.include?('This job requires parameters') + assert response.body.include?( + %() + ) + + Resque.schedule[job_name]['parameters'].each do |_param_name, param_config| + assert response.body.include?( + '(?)] + ) + assert response.body.include?( + ') + ) + end + end + + end +end \ No newline at end of file diff --git a/test/integration/resque_web_engine/requeue_with_params_test.rb b/test/integration/resque_web_engine/requeue_with_params_test.rb new file mode 100644 index 00000000..6a733914 --- /dev/null +++ b/test/integration/resque_web_engine/requeue_with_params_test.rb @@ -0,0 +1,31 @@ +require_relative '../../test_helper' + +module ResqueWeb::Plugins::ResqueScheduler + class RequeueWithParamsTest < ActionDispatch::IntegrationTest + + setup do + Resque.schedule = Test::RESQUE_SCHEDULE + Resque::Scheduler.load_schedule! + end + + test 'job with params' do + job_name = 'job_with_params' + log_level = 'error' + + job_config = Resque.schedule[job_name] + args = job_config['args'].merge('log_level' => log_level) + job_config = job_config.merge('args' => args) + + Resque::Scheduler.stubs(:enqueue_from_config).once.with(job_config) + + post Engine.app.url_helpers.requeue_with_params_path, + 'job_name' => job_name, + 'log_level' => log_level + + follow_redirect! + assert_equal 'http://www.example.com/resque_web/overview', request.url + + assert response.ok? + end + end +end diff --git a/test/integration/resque_web_engine/schedule_page_test.rb b/test/integration/resque_web_engine/schedule_page_test.rb index 6d6107cf..159a8f59 100644 --- a/test/integration/resque_web_engine/schedule_page_test.rb +++ b/test/integration/resque_web_engine/schedule_page_test.rb @@ -1,81 +1,83 @@ require_relative '../../test_helper' -class ScheduleTest < ActionDispatch::IntegrationTest - fixtures :all +module ResqueWeb::Plugins::ResqueScheduler + class ScheduleTest < ActionDispatch::IntegrationTest + fixtures :all - def visit_scheduler_page - visit '/resque_web/scheduler/schedules' - end + def visit_scheduler_page + visit '/resque_web/scheduler/schedules' + end - setup do - Resque::Scheduler.env = 'production' - Resque.schedule = { - 'some_ivar_job' => { - 'cron' => '* * * * *', - 'class' => 'SomeIvarJob', - 'args' => '/tmp', - 'rails_env' => 'production' - }, - 'some_other_job' => { - 'every' => ['1m', ['1h']], - 'queue' => 'high', - 'custom_job_class' => 'SomeOtherJob', - 'args' => { - 'b' => 'blah' - } - }, - 'some_fancy_job' => { - 'every' => ['1m'], - 'queue' => 'fancy', - 'class' => 'SomeFancyJob', - 'args' => 'sparkles', - 'rails_env' => 'fancy' - }, - 'shared_env_job' => { - 'cron' => '* * * * *', - 'class' => 'SomeSharedEnvJob', - 'args' => '/tmp', - 'rails_env' => 'fancy, production' - } - } - Resque::Scheduler.load_schedule! - visit_scheduler_page - end + setup do + Resque::Scheduler.env = 'production' + Resque.schedule = { + 'some_ivar_job' => { + 'cron' => '* * * * *', + 'class' => 'SomeIvarJob', + 'args' => '/tmp', + 'rails_env' => 'production' + }, + 'some_other_job' => { + 'every' => ['1m', ['1h']], + 'queue' => 'high', + 'custom_job_class' => 'SomeOtherJob', + 'args' => { + 'b' => 'blah' + } + }, + 'some_fancy_job' => { + 'every' => ['1m'], + 'queue' => 'fancy', + 'class' => 'SomeFancyJob', + 'args' => 'sparkles', + 'rails_env' => 'fancy' + }, + 'shared_env_job' => { + 'cron' => '* * * * *', + 'class' => 'SomeSharedEnvJob', + 'args' => '/tmp', + 'rails_env' => 'fancy, production' + } + } + Resque::Scheduler.load_schedule! + visit_scheduler_page + end - test 'Link to Schedule page in navigation works' do - visit '/resque_web' - click_link 'Schedule' - assert page.has_css? 'h1', 'Schedule' - end + test 'Link to Schedule page in navigation works' do + visit '/resque_web' + click_link 'Schedule' + assert page.has_css? 'h1', 'Schedule' + end - test '200' do - assert page.has_css?('h1', 'Schedule') - end + test '200' do + assert page.has_css?('h1', 'Schedule') + end - test 'see the scheduled job' do - assert page.body.include?('SomeIvarJob') - end + test 'see the scheduled job' do + assert page.body.include?('SomeIvarJob') + end - test 'excludes jobs for other envs' do - assert !page.body.include?('SomeFancyJob') - end + test 'excludes jobs for other envs' do + assert !page.body.include?('SomeFancyJob') + end - test 'includes job used in multiple environments' do - assert page.body.include?('SomeSharedEnvJob') - end + test 'includes job used in multiple environments' do + assert page.body.include?('SomeSharedEnvJob') + end - test 'allows delete when dynamic' do - Resque::Scheduler.stubs(:dynamic).returns(true) - visit_scheduler_page + test 'allows delete when dynamic' do + Resque::Scheduler.stubs(:dynamic).returns(true) + visit_scheduler_page - assert page.body.include?('Delete') - end + assert page.body.include?('Delete') + end - test "doesn't allow delete when static" do - Resque::Scheduler.stubs(:dynamic).returns(false) - visit_scheduler_page + test "doesn't allow delete when static" do + Resque::Scheduler.stubs(:dynamic).returns(false) + visit_scheduler_page - assert !page.body.include?('Delete') + assert !page.body.include?('Delete') + end end end \ No newline at end of file diff --git a/test/test_helper.rb b/test/test_helper.rb index 63ecefc1..1cbe9c27 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -117,6 +117,32 @@ def self.queue ENV[envvar] = nil end +module Test + RESQUE_SCHEDULE = { + 'job_without_params' => { + 'cron' => '* * * * *', + 'class' => 'JobWithoutParams', + 'args' => { + 'host' => 'localhost' + }, + 'rails_env' => 'production' + }, + 'job_with_params' => { + 'every' => '1m', + 'class' => 'JobWithParams', + 'args' => { + 'host' => 'localhost' + }, + 'parameters' => { + 'log_level' => { + 'description' => 'The level of logging', + 'default' => 'warn' + } + } + } + } +end + def nullify_logger Resque::Scheduler.configure do |c| c.quiet = nil From 0c973d631616962328040e7d8496a659cc83fb38 Mon Sep 17 00:00:00 2001 From: Matt Gibson Date: Fri, 23 Jan 2015 22:46:13 +0000 Subject: [PATCH 19/32] Delayed search --- lib/resque/scheduler/engine.rb | 2 +- .../resque_scheduler/delayed_controller.rb | 58 +++++++++++++++ .../resque_scheduler/delayed_helper.rb | 5 ++ .../resque_scheduler/delayed/search.erb | 72 +++++++++++++++++++ .../delayed_job_class_page_test.rb | 2 +- .../delayed_job_namespaced_class_page_test.rb | 2 +- .../{ => delayed}/delayed_page_test.rb | 2 +- .../delayed/delayed_search_test.rb | 24 +++++++ .../{ => schedules}/requeue_test.rb | 2 +- .../requeue_with_params_test.rb | 2 +- .../{ => schedules}/schedule_page_test.rb | 2 +- 11 files changed, 166 insertions(+), 7 deletions(-) create mode 100644 lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/search.erb rename test/integration/resque_web_engine/{ => delayed}/delayed_job_class_page_test.rb (92%) rename test/integration/resque_web_engine/{ => delayed}/delayed_job_namespaced_class_page_test.rb (92%) rename test/integration/resque_web_engine/{ => delayed}/delayed_page_test.rb (88%) create mode 100644 test/integration/resque_web_engine/delayed/delayed_search_test.rb rename test/integration/resque_web_engine/{ => schedules}/requeue_test.rb (97%) rename test/integration/resque_web_engine/{ => schedules}/requeue_with_params_test.rb (95%) rename test/integration/resque_web_engine/{ => schedules}/schedule_page_test.rb (98%) diff --git a/lib/resque/scheduler/engine.rb b/lib/resque/scheduler/engine.rb index b2e61faa..25ba7c44 100644 --- a/lib/resque/scheduler/engine.rb +++ b/lib/resque/scheduler/engine.rb @@ -19,7 +19,7 @@ class Engine < Rails::Engine get 'delayed', to: 'delayed#index', as: 'delayed' get 'delayed/jobs/:klass', to: 'delayed#jobs_klass', as: 'delayed_job_class' - post 'delayed/search', to: 'delayed#search' + post 'delayed/search', to: 'delayed#search', as: 'delayed_search' get 'delayed/:timestamp', to: 'delayed#timestamp' post 'delayed/queue_now', to: 'delayed#queue_now' post 'delayed/cancel_now', to: 'delayed#cancel_now' diff --git a/lib/resque/scheduler/engine/app/controllers/resque_web/plugins/resque_scheduler/delayed_controller.rb b/lib/resque/scheduler/engine/app/controllers/resque_web/plugins/resque_scheduler/delayed_controller.rb index a1f2dc91..7becc022 100644 --- a/lib/resque/scheduler/engine/app/controllers/resque_web/plugins/resque_scheduler/delayed_controller.rb +++ b/lib/resque/scheduler/engine/app/controllers/resque_web/plugins/resque_scheduler/delayed_controller.rb @@ -14,5 +14,63 @@ def jobs_klass @timestamps = [] end end + + def search + @jobs = find_job(params[:search]) + end + + protected + + def find_job(worker) + worker = worker.downcase + results = working_jobs_for_worker(worker) + + dels = delayed_jobs_for_worker(worker) + results += dels.select do |j| + j['class'].downcase.include?(worker) && + j.merge!('where_at' => 'delayed') + end + + Resque.queues.each do |queue| + queued = Resque.peek(queue, 0, Resque.size(queue)) + queued = [queued] unless queued.is_a?(Array) + results += queued.select do |j| + j['class'].downcase.include?(worker) && + j.merge!('queue' => queue, 'where_at' => 'queued') + end + end + + results + end + + + def working_jobs_for_worker(worker) + [].tap do |results| + working = [*Resque.working] + work = working.select do |w| + w.job && w.job['payload'] && + w.job['payload']['class'].downcase.include?(worker) + end + work.each do |w| + results += [ + w.job['payload'].merge( + 'queue' => w.job['queue'], 'where_at' => 'working' + ) + ] + end + end + end + + def delayed_jobs_for_worker(_worker) + [].tap do |dels| + schedule_size = Resque.delayed_queue_schedule_size + Resque.delayed_queue_peek(0, schedule_size).each do |d| + Resque.delayed_timestamp_peek( + d, 0, Resque.delayed_timestamp_size(d)).each do |j| + dels << j.merge!('timestamp' => d) + end + end + end + end end end \ No newline at end of file diff --git a/lib/resque/scheduler/engine/app/helpers/resque_web/plugins/resque_scheduler/delayed_helper.rb b/lib/resque/scheduler/engine/app/helpers/resque_web/plugins/resque_scheduler/delayed_helper.rb index c51ae9b6..46cbb5d4 100644 --- a/lib/resque/scheduler/engine/app/helpers/resque_web/plugins/resque_scheduler/delayed_helper.rb +++ b/lib/resque/scheduler/engine/app/helpers/resque_web/plugins/resque_scheduler/delayed_helper.rb @@ -1,5 +1,10 @@ module ResqueWeb::Plugins::ResqueScheduler module DelayedHelper + + def format_time(t) + t.strftime('%Y-%m-%d %H:%M:%S %z') + end + end end \ No newline at end of file diff --git a/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/search.erb b/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/search.erb new file mode 100644 index 00000000..a3c7d1eb --- /dev/null +++ b/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/search.erb @@ -0,0 +1,72 @@ +

Search Results

+<%= render partial: 'search_form' %> +
+<% delayed = @jobs.select { |j| j['where_at'] == 'delayed' } %> +

Delayed jobs

+ + + + + + + + + <% delayed.each do |job| %> + + + + + + + + <% end %> +
TimestampClassArgs
+
" method="post"> + + +
+
+
" method="post"> + + + + +
+
<%= format_time(Time.at(job['timestamp'])) %><%= job['class'] %><%= h job['args'].inspect %>
+ + +<% queued = @jobs.select { |j| j['where_at'] == 'queued' } %> +

Queued jobs

+ + + + + + + <% queued.each do |job| %> + + + + + + <% end %> +
QueueClassArgs
<%= job['queue'] %><%= job['class'] %><%= h job['args'].inspect %>
+ +<% working = @jobs.select { |j| j['where_at'] == 'working' } %> +

Working jobs

+ + + + + + + <% working.each do |job| %> + + + + + + <% end %> +
QueueClassArgs
<%= job['queue'] %><%= job['class'] %><%= h job['args'].inspect %>
+ + diff --git a/test/integration/resque_web_engine/delayed_job_class_page_test.rb b/test/integration/resque_web_engine/delayed/delayed_job_class_page_test.rb similarity index 92% rename from test/integration/resque_web_engine/delayed_job_class_page_test.rb rename to test/integration/resque_web_engine/delayed/delayed_job_class_page_test.rb index 95ca5ddb..0cd1aa4d 100644 --- a/test/integration/resque_web_engine/delayed_job_class_page_test.rb +++ b/test/integration/resque_web_engine/delayed/delayed_job_class_page_test.rb @@ -1,4 +1,4 @@ -require_relative '../../test_helper' +require_relative '../../../test_helper' module ResqueWeb::Plugins::ResqueScheduler diff --git a/test/integration/resque_web_engine/delayed_job_namespaced_class_page_test.rb b/test/integration/resque_web_engine/delayed/delayed_job_namespaced_class_page_test.rb similarity index 92% rename from test/integration/resque_web_engine/delayed_job_namespaced_class_page_test.rb rename to test/integration/resque_web_engine/delayed/delayed_job_namespaced_class_page_test.rb index 7b9d5747..ec495669 100644 --- a/test/integration/resque_web_engine/delayed_job_namespaced_class_page_test.rb +++ b/test/integration/resque_web_engine/delayed/delayed_job_namespaced_class_page_test.rb @@ -1,4 +1,4 @@ -require_relative '../../test_helper' +require_relative '../../../test_helper' module ResqueWeb::Plugins::ResqueScheduler class DelayedJobNamespacedClassPageTest < ActionDispatch::IntegrationTest diff --git a/test/integration/resque_web_engine/delayed_page_test.rb b/test/integration/resque_web_engine/delayed/delayed_page_test.rb similarity index 88% rename from test/integration/resque_web_engine/delayed_page_test.rb rename to test/integration/resque_web_engine/delayed/delayed_page_test.rb index 1bf1af78..79e1f958 100644 --- a/test/integration/resque_web_engine/delayed_page_test.rb +++ b/test/integration/resque_web_engine/delayed/delayed_page_test.rb @@ -1,4 +1,4 @@ -require_relative '../../test_helper' +require_relative '../../../test_helper' module ResqueWeb::Plugins::ResqueScheduler diff --git a/test/integration/resque_web_engine/delayed/delayed_search_test.rb b/test/integration/resque_web_engine/delayed/delayed_search_test.rb new file mode 100644 index 00000000..7fd7cf5a --- /dev/null +++ b/test/integration/resque_web_engine/delayed/delayed_search_test.rb @@ -0,0 +1,24 @@ +require_relative '../../../test_helper' + +module ResqueWeb::Plugins::ResqueScheduler + class DelayedSearchTest < ActionDispatch::IntegrationTest + + setup do + t = Time.now + 60 + Resque.enqueue_at(t, SomeIvarJob) + Resque.enqueue(SomeQuickJob) + end + + test 'should find matching scheduled job' do + post Engine.app.url_helpers.delayed_search_path, 'search' => 'ivar' + assert response.status == 200 + assert response.body.include?('SomeIvarJob') + end + + test 'should find matching queued job' do + post Engine.app.url_helpers.delayed_search_path, 'search' => 'quick' + assert response.status == 200 + assert response.body.include?('SomeQuickJob') + end + end +end \ No newline at end of file diff --git a/test/integration/resque_web_engine/requeue_test.rb b/test/integration/resque_web_engine/schedules/requeue_test.rb similarity index 97% rename from test/integration/resque_web_engine/requeue_test.rb rename to test/integration/resque_web_engine/schedules/requeue_test.rb index 02493cf4..b47f7cc5 100644 --- a/test/integration/resque_web_engine/requeue_test.rb +++ b/test/integration/resque_web_engine/schedules/requeue_test.rb @@ -1,4 +1,4 @@ -require_relative '../../test_helper' +require_relative '../../../test_helper' module ResqueWeb::Plugins::ResqueScheduler class RequeueTest < ActionDispatch::IntegrationTest diff --git a/test/integration/resque_web_engine/requeue_with_params_test.rb b/test/integration/resque_web_engine/schedules/requeue_with_params_test.rb similarity index 95% rename from test/integration/resque_web_engine/requeue_with_params_test.rb rename to test/integration/resque_web_engine/schedules/requeue_with_params_test.rb index 6a733914..23821c8e 100644 --- a/test/integration/resque_web_engine/requeue_with_params_test.rb +++ b/test/integration/resque_web_engine/schedules/requeue_with_params_test.rb @@ -1,4 +1,4 @@ -require_relative '../../test_helper' +require_relative '../../../test_helper' module ResqueWeb::Plugins::ResqueScheduler class RequeueWithParamsTest < ActionDispatch::IntegrationTest diff --git a/test/integration/resque_web_engine/schedule_page_test.rb b/test/integration/resque_web_engine/schedules/schedule_page_test.rb similarity index 98% rename from test/integration/resque_web_engine/schedule_page_test.rb rename to test/integration/resque_web_engine/schedules/schedule_page_test.rb index 159a8f59..b4c99328 100644 --- a/test/integration/resque_web_engine/schedule_page_test.rb +++ b/test/integration/resque_web_engine/schedules/schedule_page_test.rb @@ -1,4 +1,4 @@ -require_relative '../../test_helper' +require_relative '../../../test_helper' module ResqueWeb::Plugins::ResqueScheduler class ScheduleTest < ActionDispatch::IntegrationTest From 28fd1f7b6e078beddbf2be13c6a1ea7d79f099a1 Mon Sep 17 00:00:00 2001 From: Matt Gibson Date: Fri, 23 Jan 2015 23:08:06 +0000 Subject: [PATCH 20/32] Cancel now path --- lib/resque/scheduler/engine.rb | 2 +- .../plugins/resque_scheduler/delayed_controller.rb | 8 ++++++++ .../resque_scheduler/delayed/_search_form.erb | 2 +- .../plugins/resque_scheduler/delayed/search.erb | 2 +- .../resque_web_engine/delayed/cancel_now_test.rb | 12 ++++++++++++ 5 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 test/integration/resque_web_engine/delayed/cancel_now_test.rb diff --git a/lib/resque/scheduler/engine.rb b/lib/resque/scheduler/engine.rb index 25ba7c44..45658c19 100644 --- a/lib/resque/scheduler/engine.rb +++ b/lib/resque/scheduler/engine.rb @@ -22,7 +22,7 @@ class Engine < Rails::Engine post 'delayed/search', to: 'delayed#search', as: 'delayed_search' get 'delayed/:timestamp', to: 'delayed#timestamp' post 'delayed/queue_now', to: 'delayed#queue_now' - post 'delayed/cancel_now', to: 'delayed#cancel_now' + post 'delayed/cancel_now', to: 'delayed#cancel_now', as: 'cancel_now' post '/delayed/clear', to: 'delayed#clear' end diff --git a/lib/resque/scheduler/engine/app/controllers/resque_web/plugins/resque_scheduler/delayed_controller.rb b/lib/resque/scheduler/engine/app/controllers/resque_web/plugins/resque_scheduler/delayed_controller.rb index 7becc022..c2680d9d 100644 --- a/lib/resque/scheduler/engine/app/controllers/resque_web/plugins/resque_scheduler/delayed_controller.rb +++ b/lib/resque/scheduler/engine/app/controllers/resque_web/plugins/resque_scheduler/delayed_controller.rb @@ -19,6 +19,14 @@ def search @jobs = find_job(params[:search]) end + def cancel_now + klass = Resque::Scheduler::Util.constantize(params['klass']) + timestamp = params['timestamp'] + args = Resque.decode params['args'] + Resque.remove_delayed_job_from_timestamp(timestamp, klass, *args) + redirect_to Engine.app.url_helpers.delayed_path + end + protected def find_job(worker) diff --git a/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/_search_form.erb b/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/_search_form.erb index c150c67a..a85823bc 100644 --- a/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/_search_form.erb +++ b/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/_search_form.erb @@ -1,4 +1,4 @@ -
+
diff --git a/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/search.erb b/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/search.erb index a3c7d1eb..f826060f 100644 --- a/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/search.erb +++ b/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/search.erb @@ -20,7 +20,7 @@ -
" method="post"> + diff --git a/test/integration/resque_web_engine/delayed/cancel_now_test.rb b/test/integration/resque_web_engine/delayed/cancel_now_test.rb new file mode 100644 index 00000000..bfac0893 --- /dev/null +++ b/test/integration/resque_web_engine/delayed/cancel_now_test.rb @@ -0,0 +1,12 @@ +require_relative '../../../test_helper' + +module ResqueWeb::Plugins::ResqueScheduler + class CancelNowTest < ActionDispatch::IntegrationTest + + test 'redirects to overview' do + post Engine.app.url_helpers.cancel_now_path + assert response.status == 302 + assert response.header['Location'].include? '/delayed' + end + end +end \ No newline at end of file From 4f8e39a2079e2f439941f67c781dec3edbaa8050 Mon Sep 17 00:00:00 2001 From: Matt Gibson Date: Fri, 23 Jan 2015 23:12:29 +0000 Subject: [PATCH 21/32] Clear path --- lib/resque/scheduler/engine.rb | 2 +- .../plugins/resque_scheduler/delayed_controller.rb | 5 +++++ .../resque_web_engine/delayed/clear_test.rb | 13 +++++++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 test/integration/resque_web_engine/delayed/clear_test.rb diff --git a/lib/resque/scheduler/engine.rb b/lib/resque/scheduler/engine.rb index 45658c19..d7f8f2a2 100644 --- a/lib/resque/scheduler/engine.rb +++ b/lib/resque/scheduler/engine.rb @@ -23,7 +23,7 @@ class Engine < Rails::Engine get 'delayed/:timestamp', to: 'delayed#timestamp' post 'delayed/queue_now', to: 'delayed#queue_now' post 'delayed/cancel_now', to: 'delayed#cancel_now', as: 'cancel_now' - post '/delayed/clear', to: 'delayed#clear' + post '/delayed/clear', to: 'delayed#clear', as: 'clear' end diff --git a/lib/resque/scheduler/engine/app/controllers/resque_web/plugins/resque_scheduler/delayed_controller.rb b/lib/resque/scheduler/engine/app/controllers/resque_web/plugins/resque_scheduler/delayed_controller.rb index c2680d9d..5825c58d 100644 --- a/lib/resque/scheduler/engine/app/controllers/resque_web/plugins/resque_scheduler/delayed_controller.rb +++ b/lib/resque/scheduler/engine/app/controllers/resque_web/plugins/resque_scheduler/delayed_controller.rb @@ -27,6 +27,11 @@ def cancel_now redirect_to Engine.app.url_helpers.delayed_path end + def clear + Resque.reset_delayed_queue + redirect_to Engine.app.url_helpers.delayed_path + end + protected def find_job(worker) diff --git a/test/integration/resque_web_engine/delayed/clear_test.rb b/test/integration/resque_web_engine/delayed/clear_test.rb new file mode 100644 index 00000000..7d66d225 --- /dev/null +++ b/test/integration/resque_web_engine/delayed/clear_test.rb @@ -0,0 +1,13 @@ +require_relative '../../../test_helper' + +module ResqueWeb::Plugins::ResqueScheduler + class DelayedClearTest < ActionDispatch::IntegrationTest + + # 'on POST to /delayed/clear' do + test 'redirects to delayed' do + post Engine.app.url_helpers.clear_path + assert response.status == 302 + assert response.header['Location'].include? '/delayed' + end + end +end \ No newline at end of file From c9a734f267ac32f415c26c04f52b93b4169c0a90 Mon Sep 17 00:00:00 2001 From: Matt Gibson Date: Fri, 23 Jan 2015 23:25:34 +0000 Subject: [PATCH 22/32] Queue now path --- lib/resque/scheduler/engine.rb | 2 +- .../plugins/resque_scheduler/delayed_controller.rb | 9 +++++++++ .../resque_web_engine/delayed/queue_now_test.rb | 12 ++++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 test/integration/resque_web_engine/delayed/queue_now_test.rb diff --git a/lib/resque/scheduler/engine.rb b/lib/resque/scheduler/engine.rb index d7f8f2a2..7482e1d6 100644 --- a/lib/resque/scheduler/engine.rb +++ b/lib/resque/scheduler/engine.rb @@ -21,7 +21,7 @@ class Engine < Rails::Engine get 'delayed/jobs/:klass', to: 'delayed#jobs_klass', as: 'delayed_job_class' post 'delayed/search', to: 'delayed#search', as: 'delayed_search' get 'delayed/:timestamp', to: 'delayed#timestamp' - post 'delayed/queue_now', to: 'delayed#queue_now' + post 'delayed/queue_now', to: 'delayed#queue_now', as: 'queue_now' post 'delayed/cancel_now', to: 'delayed#cancel_now', as: 'cancel_now' post '/delayed/clear', to: 'delayed#clear', as: 'clear' diff --git a/lib/resque/scheduler/engine/app/controllers/resque_web/plugins/resque_scheduler/delayed_controller.rb b/lib/resque/scheduler/engine/app/controllers/resque_web/plugins/resque_scheduler/delayed_controller.rb index 5825c58d..fe1fb72f 100644 --- a/lib/resque/scheduler/engine/app/controllers/resque_web/plugins/resque_scheduler/delayed_controller.rb +++ b/lib/resque/scheduler/engine/app/controllers/resque_web/plugins/resque_scheduler/delayed_controller.rb @@ -32,6 +32,15 @@ def clear redirect_to Engine.app.url_helpers.delayed_path end + def queue_now + timestamp = params['timestamp'].to_i + if timestamp > 0 + Resque::Scheduler.enqueue_delayed_items_for_timestamp(timestamp) + end + redirect_to ResqueWeb::Engine.app.url_helpers.overview_path + end + + protected def find_job(worker) diff --git a/test/integration/resque_web_engine/delayed/queue_now_test.rb b/test/integration/resque_web_engine/delayed/queue_now_test.rb new file mode 100644 index 00000000..ec901abb --- /dev/null +++ b/test/integration/resque_web_engine/delayed/queue_now_test.rb @@ -0,0 +1,12 @@ +require_relative '../../../test_helper' + +module ResqueWeb::Plugins::ResqueScheduler + class QueueNowTest < ActionDispatch::IntegrationTest + # 'on POST to /delayed/queue_now' do + test 'redirects to overview' do + post Engine.app.url_helpers.queue_now_path + assert response.status == 302 + assert response.header['Location'].include? '/overview' + end + end +end \ No newline at end of file From fc22491094d213593ee9d333ec928373666f11c8 Mon Sep 17 00:00:00 2001 From: Matt Gibson Date: Fri, 23 Jan 2015 23:37:14 +0000 Subject: [PATCH 23/32] Timestamp path --- lib/resque/scheduler/engine.rb | 2 +- .../resque_scheduler/delayed_controller.rb | 3 +++ .../resque_scheduler/delayed/timestamp.erb | 25 +++++++++++++++++++ .../delayed/timestamp_test.rb | 11 ++++++++ 4 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/timestamp.erb create mode 100644 test/integration/resque_web_engine/delayed/timestamp_test.rb diff --git a/lib/resque/scheduler/engine.rb b/lib/resque/scheduler/engine.rb index 7482e1d6..88839270 100644 --- a/lib/resque/scheduler/engine.rb +++ b/lib/resque/scheduler/engine.rb @@ -20,7 +20,7 @@ class Engine < Rails::Engine get 'delayed', to: 'delayed#index', as: 'delayed' get 'delayed/jobs/:klass', to: 'delayed#jobs_klass', as: 'delayed_job_class' post 'delayed/search', to: 'delayed#search', as: 'delayed_search' - get 'delayed/:timestamp', to: 'delayed#timestamp' + get 'delayed/:timestamp', to: 'delayed#timestamp', as: 'timestamp' post 'delayed/queue_now', to: 'delayed#queue_now', as: 'queue_now' post 'delayed/cancel_now', to: 'delayed#cancel_now', as: 'cancel_now' post '/delayed/clear', to: 'delayed#clear', as: 'clear' diff --git a/lib/resque/scheduler/engine/app/controllers/resque_web/plugins/resque_scheduler/delayed_controller.rb b/lib/resque/scheduler/engine/app/controllers/resque_web/plugins/resque_scheduler/delayed_controller.rb index fe1fb72f..0a8fb6db 100644 --- a/lib/resque/scheduler/engine/app/controllers/resque_web/plugins/resque_scheduler/delayed_controller.rb +++ b/lib/resque/scheduler/engine/app/controllers/resque_web/plugins/resque_scheduler/delayed_controller.rb @@ -40,6 +40,9 @@ def queue_now redirect_to ResqueWeb::Engine.app.url_helpers.overview_path end + def timestamp + @timestamp = params[:timestamp].to_i + end protected diff --git a/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/timestamp.erb b/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/timestamp.erb new file mode 100644 index 00000000..abd18c60 --- /dev/null +++ b/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/timestamp.erb @@ -0,0 +1,25 @@ +

Delayed jobs scheduled for <%= format_time(Time.at(@timestamp)) %>

+ +

Showing <%= start = params[:start].to_i %> to <%= start + 20 %> of <%=size = Resque.delayed_timestamp_size(@timestamp)%> jobs

+ + + + + + + <% jobs = Resque.delayed_timestamp_peek(@timestamp, start, 20) %> + <% jobs.each do |job| %> + + + + + <% end %> + <% if jobs.empty? %> + + + + <% end %> +
ClassArgs
<%= job['class'] %><%=h job['args'].inspect %>
There are no pending jobs scheduled for this time.
+ +<%= render partial: 'next_more', locals: {:start => start, :size => size} %> + diff --git a/test/integration/resque_web_engine/delayed/timestamp_test.rb b/test/integration/resque_web_engine/delayed/timestamp_test.rb new file mode 100644 index 00000000..16ce1ae4 --- /dev/null +++ b/test/integration/resque_web_engine/delayed/timestamp_test.rb @@ -0,0 +1,11 @@ +require_relative '../../../test_helper' + +module ResqueWeb::Plugins::ResqueScheduler + class TimestampTest < ActionDispatch::IntegrationTest + + test 'shows delayed_timestamp view' do + get Engine.app.url_helpers.timestamp_path timestamp: '1234567890' + assert response.status == 200 + end + end +end \ No newline at end of file From 0db7b469d13a93a28fff54da708c540bb0764f64 Mon Sep 17 00:00:00 2001 From: Matt Gibson Date: Fri, 23 Jan 2015 23:46:26 +0000 Subject: [PATCH 24/32] Delete schedule when dynamic --- lib/resque/scheduler/engine.rb | 5 +-- .../resque_scheduler/schedules_controller.rb | 2 +- .../schedules/delete_dynamic_test.rb | 38 +++++++++++++++++++ 3 files changed, 41 insertions(+), 4 deletions(-) create mode 100644 test/integration/resque_web_engine/schedules/delete_dynamic_test.rb diff --git a/lib/resque/scheduler/engine.rb b/lib/resque/scheduler/engine.rb index 88839270..fe834e4e 100644 --- a/lib/resque/scheduler/engine.rb +++ b/lib/resque/scheduler/engine.rb @@ -10,12 +10,11 @@ class Engine < Rails::Engine end Engine.routes do - resources :schedules, only: [:index, :destroy] - get 'schedule', to: 'schedules#index' + get 'schedule', to: 'schedules#index', as: 'schedules' post 'schedule/requeue', to: 'schedules#requeue', as: 'requeue' post 'schedule/requeue_with_params', to: 'schedules#requeue_with_params', as: 'requeue_with_params' - delete 'schedule', to: 'schedules#destroy' + delete 'schedule', to: 'schedules#destroy', as: 'schedule' get 'delayed', to: 'delayed#index', as: 'delayed' get 'delayed/jobs/:klass', to: 'delayed#jobs_klass', as: 'delayed_job_class' diff --git a/lib/resque/scheduler/engine/app/controllers/resque_web/plugins/resque_scheduler/schedules_controller.rb b/lib/resque/scheduler/engine/app/controllers/resque_web/plugins/resque_scheduler/schedules_controller.rb index 055abcb2..ebf65f1b 100644 --- a/lib/resque/scheduler/engine/app/controllers/resque_web/plugins/resque_scheduler/schedules_controller.rb +++ b/lib/resque/scheduler/engine/app/controllers/resque_web/plugins/resque_scheduler/schedules_controller.rb @@ -11,7 +11,7 @@ def destroy job_name = params['job_name'] || params[:job_name] Resque.remove_schedule(job_name) end - redirect_to ResqueWeb::Engine.app.url_helpers.overview_path + redirect_to Engine.app.url_helpers.schedules_path end def requeue diff --git a/test/integration/resque_web_engine/schedules/delete_dynamic_test.rb b/test/integration/resque_web_engine/schedules/delete_dynamic_test.rb new file mode 100644 index 00000000..353807a2 --- /dev/null +++ b/test/integration/resque_web_engine/schedules/delete_dynamic_test.rb @@ -0,0 +1,38 @@ +require_relative '../../../test_helper' + +module ResqueWeb::Plugins::ResqueScheduler + class DeleteDynamicScheduleTest < ActionDispatch::IntegrationTest + setup do + Resque.schedule = Test::RESQUE_SCHEDULE + Resque::Scheduler.load_schedule! + Resque::Scheduler.stubs(:dynamic).returns(true) + end + + test 'redirects to schedule page' do + delete Engine.app.url_helpers.schedule_path + + status = response.status + redirect_location = response.headers['Location'] + response_status_msg = "Expected response to be a 302, but was a #{status}." + redirect_msg = "Redirect to #{redirect_location} instead of /schedule." + + assert status == 302, response_status_msg + assert_match %r{/schedule/?$}, redirect_location, redirect_msg + end + + test 'does not show the deleted job' do + delete Engine.app.url_helpers.schedule_path job_name: 'job_with_params' + follow_redirect! + + msg = 'The job should not have been shown on the /schedule page.' + assert !response.body.include?('job_with_params'), msg + end + + test 'removes job from redis' do + delete Engine.app.url_helpers.schedule_path, job_name: 'job_with_params' + + msg = 'The job was not deleted from redis.' + assert_nil Resque.fetch_schedule('job_with_params'), msg + end + end +end \ No newline at end of file From aa9f6c81b64ce7e0316a9241412b1fc30a0650a8 Mon Sep 17 00:00:00 2001 From: Matt Gibson Date: Fri, 23 Jan 2015 23:48:53 +0000 Subject: [PATCH 25/32] Delete when static --- .../schedules/delete_static_test.rb | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 test/integration/resque_web_engine/schedules/delete_static_test.rb diff --git a/test/integration/resque_web_engine/schedules/delete_static_test.rb b/test/integration/resque_web_engine/schedules/delete_static_test.rb new file mode 100644 index 00000000..90e825c8 --- /dev/null +++ b/test/integration/resque_web_engine/schedules/delete_static_test.rb @@ -0,0 +1,26 @@ +require_relative '../../../test_helper' + +module ResqueWeb::Plugins::ResqueScheduler + class DelayedSearchTest < ActionDispatch::IntegrationTest + setup do + Resque.schedule = Test::RESQUE_SCHEDULE + Resque::Scheduler.load_schedule! + Resque::Scheduler.stubs(:dynamic).returns(false) + end + + test 'does not remove the job from the UI' do + delete Engine.app.url_helpers.schedule_path, job_name: 'job_with_params' + follow_redirect! + + msg = 'The job should not have been removed from the /schedule page.' + assert response.body.include?('job_with_params'), msg + end + + test 'does not remove job from redis' do + delete Engine.app.url_helpers.schedule_path, job_name: 'job_with_params' + + msg = 'The job should not have been deleted from redis.' + assert Resque.fetch_schedule('job_with_params'), msg + end + end +end \ No newline at end of file From 428936dec7d263746a6c2c1e236b22e3d6d917a4 Mon Sep 17 00:00:00 2001 From: Matt Gibson Date: Fri, 23 Jan 2015 23:52:16 +0000 Subject: [PATCH 26/32] Fix tests --- .../plugins/resque_scheduler/delayed/_search_form.erb | 2 +- .../resque_web/plugins/resque_scheduler/delayed/search.erb | 2 +- .../resque_web_engine/schedules/schedule_page_test.rb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/_search_form.erb b/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/_search_form.erb index a85823bc..f89eee9a 100644 --- a/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/_search_form.erb +++ b/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/_search_form.erb @@ -1,4 +1,4 @@ - + diff --git a/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/search.erb b/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/search.erb index f826060f..43ad24b0 100644 --- a/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/search.erb +++ b/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/search.erb @@ -20,7 +20,7 @@ -
+ diff --git a/test/integration/resque_web_engine/schedules/schedule_page_test.rb b/test/integration/resque_web_engine/schedules/schedule_page_test.rb index b4c99328..6ceef7dc 100644 --- a/test/integration/resque_web_engine/schedules/schedule_page_test.rb +++ b/test/integration/resque_web_engine/schedules/schedule_page_test.rb @@ -5,7 +5,7 @@ class ScheduleTest < ActionDispatch::IntegrationTest fixtures :all def visit_scheduler_page - visit '/resque_web/scheduler/schedules' + visit Engine.app.url_helpers.schedules_path end setup do From e1d61eb93ed5579c8efb861548d8d4bd44818004 Mon Sep 17 00:00:00 2001 From: Matt Gibson Date: Fri, 23 Jan 2015 23:58:43 +0000 Subject: [PATCH 27/32] Remove hardcoded paths from views --- .../plugins/resque_scheduler/delayed/index.erb | 10 +++++----- .../plugins/resque_scheduler/delayed/search.erb | 2 +- .../plugins/resque_scheduler/schedules/index.html.erb | 4 ++-- .../resque_scheduler/schedules/requeue-params.erb | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/index.erb b/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/index.erb index c4a313ee..651bb1bf 100644 --- a/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/index.erb +++ b/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/index.erb @@ -24,25 +24,25 @@ <% Resque.delayed_queue_peek(start, 20).each do |timestamp| %> - " method="post"> + - "><%= format_time(Time.at(timestamp)) %> + <%= format_time(Time.at(timestamp)) %> <%= delayed_timestamp_size = resque.delayed_timestamp_size(timestamp) %> <% job = resque.delayed_timestamp_peek(timestamp, 0, 1).first %> <% if job && delayed_timestamp_size == 1 %> <%= h(job['class']) %> <% else %> - ">see details + see details <% end %> <%= h(job['args'].inspect) if job && delayed_timestamp_size == 1 %> <% if job %> - All schedules + All schedules <% end %> @@ -51,7 +51,7 @@ <% if size > 0 %>
-
+
<% end %> diff --git a/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/search.erb b/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/search.erb index 43ad24b0..3ab3e93b 100644 --- a/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/search.erb +++ b/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/search.erb @@ -14,7 +14,7 @@ <% delayed.each do |job| %> -
" method="post"> +
diff --git a/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/schedules/index.html.erb b/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/schedules/index.html.erb index 1fa6e3df..e0340239 100644 --- a/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/schedules/index.html.erb +++ b/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/schedules/index.html.erb @@ -27,7 +27,7 @@ <% if Resque::Scheduler.dynamic %> -
" method="post" style="margin-left: 0"> + @@ -35,7 +35,7 @@ <% end %> - " method="post" style="margin-left: 0"> +
diff --git a/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/schedules/requeue-params.erb b/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/schedules/requeue-params.erb index 1464f5bb..fa69c28b 100644 --- a/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/schedules/requeue-params.erb +++ b/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/schedules/requeue-params.erb @@ -4,7 +4,7 @@ This job requires parameters:

-
" method="post"> + <% @parameters.each do |key, value| %> <% value ||= {} %> From 0c7db2e0ee148bd36e40d8879791f91543e3d823 Mon Sep 17 00:00:00 2001 From: Matt Gibson Date: Sat, 24 Jan 2015 00:17:41 +0000 Subject: [PATCH 28/32] Remove old server --- .../resque_scheduler/delayed/index.erb | 4 +- lib/resque/scheduler/server.rb | 251 ------------------ lib/resque/scheduler/server/views/delayed.erb | 59 ---- .../server/views/delayed_schedules.erb | 20 -- .../server/views/delayed_timestamp.erb | 26 -- .../scheduler/server/views/requeue-params.erb | 23 -- .../scheduler/server/views/scheduler.erb | 52 ---- lib/resque/scheduler/server/views/search.erb | 72 ----- .../scheduler/server/views/search_form.erb | 8 - test/test_helper.rb | 1 - 10 files changed, 2 insertions(+), 514 deletions(-) delete mode 100644 lib/resque/scheduler/server.rb delete mode 100644 lib/resque/scheduler/server/views/delayed.erb delete mode 100644 lib/resque/scheduler/server/views/delayed_schedules.erb delete mode 100644 lib/resque/scheduler/server/views/delayed_timestamp.erb delete mode 100644 lib/resque/scheduler/server/views/requeue-params.erb delete mode 100644 lib/resque/scheduler/server/views/scheduler.erb delete mode 100644 lib/resque/scheduler/server/views/search.erb delete mode 100644 lib/resque/scheduler/server/views/search_form.erb diff --git a/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/index.erb b/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/index.erb index 651bb1bf..c0f975b2 100644 --- a/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/index.erb +++ b/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/index.erb @@ -30,8 +30,8 @@ - - <% job = resque.delayed_timestamp_peek(timestamp, 0, 1).first %> + + <% job = Resque.delayed_timestamp_peek(timestamp, 0, 1).first %>
<%= format_time(Time.at(timestamp)) %><%= delayed_timestamp_size = resque.delayed_timestamp_size(timestamp) %><%= delayed_timestamp_size = Resque.delayed_timestamp_size(timestamp) %> <% if job && delayed_timestamp_size == 1 %> <%= h(job['class']) %> diff --git a/lib/resque/scheduler/server.rb b/lib/resque/scheduler/server.rb deleted file mode 100644 index 6767a17f..00000000 --- a/lib/resque/scheduler/server.rb +++ /dev/null @@ -1,251 +0,0 @@ -# vim:fileencoding=utf-8 -require 'resque-scheduler' -require 'resque/server' -require 'json' - -# Extend Resque::Server to add tabs -module Resque - module Scheduler - module Server - unless defined?(::Resque::Scheduler::Server::VIEW_PATH) - VIEW_PATH = File.join(File.dirname(__FILE__), 'server', 'views') - end - - def self.included(base) - base.class_eval do - helpers { include HelperMethods } - include ServerMethods - - get('/schedule') { schedule } - post('/schedule/requeue') { schedule_requeue } - post('/schedule/requeue_with_params') do - schedule_requeue_with_params - end - delete('/schedule') { delete_schedule } - get('/delayed') { delayed } - get('/delayed/jobs/:klass') { delayed_jobs_klass } - post('/delayed/search') { delayed_search } - get('/delayed/:timestamp') { delayed_timestamp } - post('/delayed/queue_now') { delayed_queue_now } - post('/delayed/cancel_now') { delayed_cancel_now } - post('/delayed/clear') { delayed_clear } - end - end - - module ServerMethods - def schedule - Resque.reload_schedule! if Resque::Scheduler.dynamic - erb scheduler_template('scheduler') - end - - def schedule_requeue - @job_name = params['job_name'] || params[:job_name] - config = Resque.schedule[@job_name] - @parameters = config['parameters'] || config[:parameters] - if @parameters - erb scheduler_template('requeue-params') - else - Resque::Scheduler.enqueue_from_config(config) - redirect u('/overview') - end - end - - def schedule_requeue_with_params - job_name = params['job_name'] || params[:job_name] - config = Resque.schedule[job_name] - # Build args hash from post data (removing the job name) - submitted_args = params.reject do |key, _value| - key == 'job_name' || key == :job_name - end - - # Merge constructed args hash with existing args hash for - # the job, if it exists - config_args = config['args'] || config[:args] || {} - config_args = config_args.merge(submitted_args) - - # Insert the args hash into config and queue the resque job - config = config.merge('args' => config_args) - Resque::Scheduler.enqueue_from_config(config) - redirect u('/overview') - end - - def delete_schedule - if Resque::Scheduler.dynamic - job_name = params['job_name'] || params[:job_name] - Resque.remove_schedule(job_name) - end - redirect u('/schedule') - end - - def delayed - erb scheduler_template('delayed') - end - - def delayed_jobs_klass - begin - klass = Resque::Scheduler::Util.constantize(params[:klass]) - @args = JSON.load(URI.decode(params[:args])) - @timestamps = Resque.scheduled_at(klass, *@args) - rescue - @timestamps = [] - end - - erb scheduler_template('delayed_schedules') - end - - def delayed_search - @jobs = find_job(params[:search]) - erb scheduler_template('search') - end - - def delayed_timestamp - erb scheduler_template('delayed_timestamp') - end - - def delayed_queue_now - timestamp = params['timestamp'].to_i - if timestamp > 0 - Resque::Scheduler.enqueue_delayed_items_for_timestamp(timestamp) - end - redirect u('/overview') - end - - def delayed_cancel_now - klass = Resque::Scheduler::Util.constantize(params['klass']) - timestamp = params['timestamp'] - args = Resque.decode params['args'] - Resque.remove_delayed_job_from_timestamp(timestamp, klass, *args) - redirect u('/delayed') - end - - def delayed_clear - Resque.reset_delayed_queue - redirect u('delayed') - end - end - - module HelperMethods - def format_time(t) - t.strftime('%Y-%m-%d %H:%M:%S %z') - end - - def queue_from_class_name(class_name) - Resque.queue_from_class( - Resque::Scheduler::Util.constantize(class_name) - ) - end - - def find_job(worker) - worker = worker.downcase - results = working_jobs_for_worker(worker) - - dels = delayed_jobs_for_worker(worker) - results += dels.select do |j| - j['class'].downcase.include?(worker) && - j.merge!('where_at' => 'delayed') - end - - Resque.queues.each do |queue| - queued = Resque.peek(queue, 0, Resque.size(queue)) - queued = [queued] unless queued.is_a?(Array) - results += queued.select do |j| - j['class'].downcase.include?(worker) && - j.merge!('queue' => queue, 'where_at' => 'queued') - end - end - - results - end - - def schedule_interval(config) - if config['every'] - schedule_interval_every(config['every']) - elsif config['cron'] - 'cron: ' + config['cron'].to_s - else - 'Not currently scheduled' - end - end - - def schedule_interval_every(every) - every = [*every] - s = 'every: ' << every.first - - return s unless every.length > 1 - - s << ' (' - meta = every.last.map do |key, value| - "#{key.to_s.gsub(/_/, ' ')} #{value}" - end - s << meta.join(', ') << ')' - end - - def schedule_class(config) - if config['class'].nil? && !config['custom_job_class'].nil? - config['custom_job_class'] - else - config['class'] - end - end - - def scheduler_template(name) - File.read( - File.expand_path("../server/views/#{name}.erb", __FILE__) - ) - end - - def scheduled_in_this_env?(name) - return true if Resque.schedule[name]['rails_env'].nil? - rails_env(name).split(/[\s,]+/).include?(Resque::Scheduler.env) - end - - def rails_env(name) - Resque.schedule[name]['rails_env'] - end - - def scheduler_view(filename, options = {}, locals = {}) - source = File.read(File.join(VIEW_PATH, "#{filename}.erb")) - erb source, options, locals - end - - private - - def working_jobs_for_worker(worker) - [].tap do |results| - working = [*Resque.working] - work = working.select do |w| - w.job && w.job['payload'] && - w.job['payload']['class'].downcase.include?(worker) - end - work.each do |w| - results += [ - w.job['payload'].merge( - 'queue' => w.job['queue'], 'where_at' => 'working' - ) - ] - end - end - end - - def delayed_jobs_for_worker(_worker) - [].tap do |dels| - schedule_size = Resque.delayed_queue_schedule_size - Resque.delayed_queue_peek(0, schedule_size).each do |d| - Resque.delayed_timestamp_peek( - d, 0, Resque.delayed_timestamp_size(d)).each do |j| - dels << j.merge!('timestamp' => d) - end - end - end - end - end - end - end -end - -Resque::Server.tabs << 'Schedule' -Resque::Server.tabs << 'Delayed' - -Resque::Server.class_eval do - include Resque::Scheduler::Server -end diff --git a/lib/resque/scheduler/server/views/delayed.erb b/lib/resque/scheduler/server/views/delayed.erb deleted file mode 100644 index 857d16cf..00000000 --- a/lib/resque/scheduler/server/views/delayed.erb +++ /dev/null @@ -1,59 +0,0 @@ -

Delayed Jobs

-<%- size = resque.delayed_queue_schedule_size %> - -<%= scheduler_view :search_form, layout: false %> - -

- This list below contains the timestamps for scheduled delayed jobs. - Server local time: <%= Time.now %> -

- -

- Showing <%= start = params[:start].to_i %> to <%= start + 20 %> of <%= size %> timestamps -

- - - - - - - - - - - <% resque.delayed_queue_peek(start, 20).each do |timestamp| %> - - - - - <% job = resque.delayed_timestamp_peek(timestamp, 0, 1).first %> - - - - - <% end %> -
TimestampJob countClassArgsAll schedules
-
" method="post"> - - -
-
"><%= format_time(Time.at(timestamp)) %><%= delayed_timestamp_size = resque.delayed_timestamp_size(timestamp) %> - <% if job && delayed_timestamp_size == 1 %> - <%= h(job['class']) %> - <% else %> - ">see details - <% end %> - <%= h(job['args'].inspect) if job && delayed_timestamp_size == 1 %> - <% if job %> - All schedules - <% end %> -
- -<% if size > 0 %> -
-
- -
-<% end %> - -<%= partial :next_more, :start => start, :size => size %> diff --git a/lib/resque/scheduler/server/views/delayed_schedules.erb b/lib/resque/scheduler/server/views/delayed_schedules.erb deleted file mode 100644 index 6bf9dd4b..00000000 --- a/lib/resque/scheduler/server/views/delayed_schedules.erb +++ /dev/null @@ -1,20 +0,0 @@ -

Delayed jobs scheduled for <%= params[:klass] %> (<%= @args %>)

- - - - - - -<% @timestamps.each do |t| %> - - - -<% end %> -<% if @timestamps.empty? %> - - - -<% end %> -
Timestamp
- <%= Time.at(t) %> -
There are no such jobs scheduled.
diff --git a/lib/resque/scheduler/server/views/delayed_timestamp.erb b/lib/resque/scheduler/server/views/delayed_timestamp.erb deleted file mode 100644 index f7145b90..00000000 --- a/lib/resque/scheduler/server/views/delayed_timestamp.erb +++ /dev/null @@ -1,26 +0,0 @@ -<% timestamp = params[:timestamp].to_i %> - -

Delayed jobs scheduled for <%= format_time(Time.at(timestamp)) %>

- -

Showing <%= start = params[:start].to_i %> to <%= start + 20 %> of <%=size = resque.delayed_timestamp_size(timestamp)%> jobs

- - - - - - - <% jobs = resque.delayed_timestamp_peek(timestamp, start, 20) %> - <% jobs.each do |job| %> - - - - - <% end %> - <% if jobs.empty? %> - - - - <% end %> -
ClassArgs
<%= job['class'] %><%=h job['args'].inspect %>
There are no pending jobs scheduled for this time.
- -<%= partial :next_more, :start => start, :size => size %> diff --git a/lib/resque/scheduler/server/views/requeue-params.erb b/lib/resque/scheduler/server/views/requeue-params.erb deleted file mode 100644 index 1464f5bb..00000000 --- a/lib/resque/scheduler/server/views/requeue-params.erb +++ /dev/null @@ -1,23 +0,0 @@ -

<%= @job_name %>

- -

- This job requires parameters: -

- -
" method="post"> - - <% @parameters.each do |key, value| %> - <% value ||= {} %> - - - - <% end %> -
- <%= key %> - <% if value['description'] || value[:description] %> - (?) - <% end %>: -
- - -
diff --git a/lib/resque/scheduler/server/views/scheduler.erb b/lib/resque/scheduler/server/views/scheduler.erb deleted file mode 100644 index 1a97e932..00000000 --- a/lib/resque/scheduler/server/views/scheduler.erb +++ /dev/null @@ -1,52 +0,0 @@ -

Schedule

- -

- The list below contains all scheduled jobs. Click "Queue now" to queue - a job immediately. - Server local time: <%= Time.now %> - Current master: <%= Resque.redis.get(Resque::Scheduler.master_lock.key) %> -

-
- - - <% if Resque::Scheduler.dynamic %> - - <% end %> - - - - - - - - - - <% Resque.schedule.keys.sort.select { |n| scheduled_in_this_env?(n) }.each do |name| %> - <% config = Resque.schedule[name] %> - - <% if Resque::Scheduler.dynamic %> - - <% end %> - - - - - - - - - - <% end %> -
NameDescriptionIntervalClassQueueArgumentsLast Enqueued
-
" method="post" style="margin-left: 0"> - - - -
-
-
" method="post" style="margin-left: 0"> - - -
-
<%= h name %><%= h config['description'] %><%= h schedule_interval(config) %><%= h schedule_class(config) %><%= h config['queue'] || queue_from_class_name(config['class']) %><%= h config['args'].inspect %><%= h Resque.get_last_enqueued_at(name) || 'Never' %>
-
diff --git a/lib/resque/scheduler/server/views/search.erb b/lib/resque/scheduler/server/views/search.erb deleted file mode 100644 index ff8252c2..00000000 --- a/lib/resque/scheduler/server/views/search.erb +++ /dev/null @@ -1,72 +0,0 @@ -

Search Results

-<%= scheduler_view :search_form, layout: false %> -
-<% delayed = @jobs.select { |j| j['where_at'] == 'delayed' } %> -

Delayed jobs

- - - - - - - - - <% delayed.each do |job| %> - - - - - - - - <% end %> -
TimestampClassArgs
-
" method="post"> - - -
-
-
" method="post"> - - - - -
-
<%= format_time(Time.at(job['timestamp'])) %><%= job['class'] %><%= h job['args'].inspect %>
- - -<% queued = @jobs.select { |j| j['where_at'] == 'queued' } %> -

Queued jobs

- - - - - - - <% queued.each do |job| %> - - - - - - <% end %> -
QueueClassArgs
<%= job['queue'] %><%= job['class'] %><%= h job['args'].inspect %>
- -<% working = @jobs.select { |j| j['where_at'] == 'working' } %> -

Working jobs

- - - - - - - <% working.each do |job| %> - - - - - - <% end %> -
QueueClassArgs
<%= job['queue'] %><%= job['class'] %><%= h job['args'].inspect %>
- - diff --git a/lib/resque/scheduler/server/views/search_form.erb b/lib/resque/scheduler/server/views/search_form.erb deleted file mode 100644 index c150c67a..00000000 --- a/lib/resque/scheduler/server/views/search_form.erb +++ /dev/null @@ -1,8 +0,0 @@ -
- - -
- - - - diff --git a/test/test_helper.rb b/test/test_helper.rb index 1cbe9c27..28dba4c8 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -38,7 +38,6 @@ $LOAD_PATH.unshift File.dirname(File.expand_path(__FILE__)) + '/../lib' require 'resque-scheduler' -require 'resque/scheduler/server' unless defined?(Rails) module Rails From 6cff910ba196b2ad35e1e1ff98f6116d48cd650e Mon Sep 17 00:00:00 2001 From: Matt Gibson Date: Sun, 25 Jan 2015 18:25:22 +0000 Subject: [PATCH 29/32] Make Rubocop happy --- lib/resque/scheduler/engine.rb | 80 +++++---- .../resque_scheduler/delayed_controller.rb | 155 +++++++++--------- .../resque_scheduler/schedules_controller.rb | 82 ++++----- .../resque_scheduler/delayed_helper.rb | 17 +- .../resque_scheduler/schedules_helper.rb | 98 +++++------ resque-scheduler.gemspec | 1 - test/cli_test.rb | 1 - test/dummy/Rakefile | 3 +- test/dummy/bin/setup | 14 +- test/dummy/config/application.rb | 22 ++- test/dummy/config/environments/development.rb | 7 +- test/dummy/config/environments/production.rb | 16 +- test/dummy/config/environments/test.rb | 3 +- test/dummy/config/initializers/assets.rb | 3 +- .../initializers/backtrace_silencers.rb | 6 +- .../config/initializers/wrap_parameters.rb | 3 +- test/dummy/config/routes.rb | 3 +- test/dummy/db/schema.rb | 12 +- test/env_test.rb | 1 - .../delayed/cancel_now_test.rb | 19 ++- .../resque_web_engine/delayed/clear_test.rb | 21 ++- .../delayed/delayed_job_class_page_test.rb | 32 ++-- .../delayed_job_namespaced_class_page_test.rb | 31 ++-- .../delayed/delayed_page_test.rb | 23 +-- .../delayed/delayed_search_test.rb | 39 +++-- .../delayed/queue_now_test.rb | 20 ++- .../delayed/timestamp_test.rb | 17 +- .../schedules/delete_dynamic_test.rb | 75 +++++---- .../schedules/delete_static_test.rb | 42 +++-- .../schedules/requeue_test.rb | 92 ++++++----- .../schedules/requeue_with_params_test.rb | 55 ++++--- .../schedules/schedule_page_test.rb | 101 ++++++------ test/multi_process_test.rb | 1 - test/scheduler_test.rb | 6 +- test/support/integration_case.rb | 10 +- test/test_helper.rb | 66 ++++---- 36 files changed, 628 insertions(+), 549 deletions(-) diff --git a/lib/resque/scheduler/engine.rb b/lib/resque/scheduler/engine.rb index fe834e4e..ef6a1cbc 100644 --- a/lib/resque/scheduler/engine.rb +++ b/lib/resque/scheduler/engine.rb @@ -1,38 +1,48 @@ require 'resque_web' -module ResqueWeb::Plugins::ResqueScheduler - class Engine < Rails::Engine - isolate_namespace ResqueWeb::Plugins::ResqueScheduler - paths["app"] << 'lib/resque/scheduler/engine/app' - paths["app/helpers"] << 'lib/resque/scheduler/engine/app/helpers' - paths["app/views"] << 'lib/resque/scheduler/engine/app/views' - paths["app/controllers"] << 'lib/resque/scheduler/engine/app/controllers' +module ResqueWeb + module Plugins + module ResqueScheduler + class Engine < Rails::Engine + isolate_namespace ResqueWeb::Plugins::ResqueScheduler + paths['app'] << 'lib/resque/scheduler/engine/app' + paths['app/helpers'] << 'lib/resque/scheduler/engine/app/helpers' + paths['app/views'] << 'lib/resque/scheduler/engine/app/views' + paths['app/controllers'] << 'lib/resque/scheduler/'\ + 'engine/app/controllers' + end + + Engine.routes do + get 'schedule', to: 'schedules#index', as: 'schedules' + post 'schedule/requeue', to: 'schedules#requeue', as: 'requeue' + post 'schedule/requeue_with_params', + to: 'schedules#requeue_with_params', + as: 'requeue_with_params' + delete 'schedule', to: 'schedules#destroy', as: 'schedule' + + get 'delayed', to: 'delayed#index', as: 'delayed' + get 'delayed/jobs/:klass', + to: 'delayed#jobs_klass', + as: 'delayed_job_class' + post 'delayed/search', to: 'delayed#search', as: 'delayed_search' + get 'delayed/:timestamp', to: 'delayed#timestamp', as: 'timestamp' + post 'delayed/queue_now', to: 'delayed#queue_now', as: 'queue_now' + post 'delayed/cancel_now', to: 'delayed#cancel_now', as: 'cancel_now' + post '/delayed/clear', to: 'delayed#clear', as: 'clear' + end + + def self.engine_path + '/scheduler' + end + + def self.tabs + [ + { + 'schedule' => Engine.app.url_helpers.schedules_path, + 'delayed' => Engine.app.url_helpers.delayed_path + } + ] + end + end end - - Engine.routes do - - get 'schedule', to: 'schedules#index', as: 'schedules' - post 'schedule/requeue', to: 'schedules#requeue', as: 'requeue' - post 'schedule/requeue_with_params', to: 'schedules#requeue_with_params', as: 'requeue_with_params' - delete 'schedule', to: 'schedules#destroy', as: 'schedule' - - get 'delayed', to: 'delayed#index', as: 'delayed' - get 'delayed/jobs/:klass', to: 'delayed#jobs_klass', as: 'delayed_job_class' - post 'delayed/search', to: 'delayed#search', as: 'delayed_search' - get 'delayed/:timestamp', to: 'delayed#timestamp', as: 'timestamp' - post 'delayed/queue_now', to: 'delayed#queue_now', as: 'queue_now' - post 'delayed/cancel_now', to: 'delayed#cancel_now', as: 'cancel_now' - post '/delayed/clear', to: 'delayed#clear', as: 'clear' - - end - - def self.engine_path - "/scheduler" - end - - def self.tabs - [{'schedule' => Engine.app.url_helpers.schedules_path, - 'delayed' => Engine.app.url_helpers.delayed_path}] - end - -end \ No newline at end of file +end diff --git a/lib/resque/scheduler/engine/app/controllers/resque_web/plugins/resque_scheduler/delayed_controller.rb b/lib/resque/scheduler/engine/app/controllers/resque_web/plugins/resque_scheduler/delayed_controller.rb index 0a8fb6db..c0f45982 100644 --- a/lib/resque/scheduler/engine/app/controllers/resque_web/plugins/resque_scheduler/delayed_controller.rb +++ b/lib/resque/scheduler/engine/app/controllers/resque_web/plugins/resque_scheduler/delayed_controller.rb @@ -1,101 +1,100 @@ -module ResqueWeb::Plugins::ResqueScheduler - - class DelayedController < ResqueWeb::ApplicationController - - def index - end +module ResqueWeb + module Plugins + module ResqueScheduler + class DelayedController < ResqueWeb::ApplicationController + def index + end - def jobs_klass - begin - klass = Resque::Scheduler::Util.constantize(params[:klass]) - @args = JSON.load(URI.decode(params[:args])) - @timestamps = Resque.scheduled_at(klass, *@args) - rescue - @timestamps = [] - end - end + def jobs_klass + klass = Resque::Scheduler::Util.constantize(params[:klass]) + @args = JSON.load(URI.decode(params[:args])) + @timestamps = Resque.scheduled_at(klass, *@args) + rescue + @timestamps = [] + end - def search - @jobs = find_job(params[:search]) - end + def search + @jobs = find_job(params[:search]) + end - def cancel_now - klass = Resque::Scheduler::Util.constantize(params['klass']) - timestamp = params['timestamp'] - args = Resque.decode params['args'] - Resque.remove_delayed_job_from_timestamp(timestamp, klass, *args) - redirect_to Engine.app.url_helpers.delayed_path - end + def cancel_now + klass = Resque::Scheduler::Util.constantize(params['klass']) + timestamp = params['timestamp'] + args = Resque.decode params['args'] + Resque.remove_delayed_job_from_timestamp(timestamp, klass, *args) + redirect_to Engine.app.url_helpers.delayed_path + end - def clear - Resque.reset_delayed_queue - redirect_to Engine.app.url_helpers.delayed_path - end + def clear + Resque.reset_delayed_queue + redirect_to Engine.app.url_helpers.delayed_path + end - def queue_now - timestamp = params['timestamp'].to_i - if timestamp > 0 - Resque::Scheduler.enqueue_delayed_items_for_timestamp(timestamp) - end - redirect_to ResqueWeb::Engine.app.url_helpers.overview_path - end + def queue_now + timestamp = params['timestamp'].to_i + if timestamp > 0 + Resque::Scheduler.enqueue_delayed_items_for_timestamp(timestamp) + end + redirect_to ResqueWeb::Engine.app.url_helpers.overview_path + end - def timestamp - @timestamp = params[:timestamp].to_i - end + def timestamp + @timestamp = params[:timestamp].to_i + end - protected + protected - def find_job(worker) - worker = worker.downcase - results = working_jobs_for_worker(worker) + def find_job(worker) + worker = worker.downcase + results = working_jobs_for_worker(worker) - dels = delayed_jobs_for_worker(worker) - results += dels.select do |j| - j['class'].downcase.include?(worker) && + dels = delayed_jobs_for_worker(worker) + results += dels.select do |j| + j['class'].downcase.include?(worker) && j.merge!('where_at' => 'delayed') - end + end - Resque.queues.each do |queue| - queued = Resque.peek(queue, 0, Resque.size(queue)) - queued = [queued] unless queued.is_a?(Array) - results += queued.select do |j| - j['class'].downcase.include?(worker) && + Resque.queues.each do |queue| + queued = Resque.peek(queue, 0, Resque.size(queue)) + queued = [queued] unless queued.is_a?(Array) + results += queued.select do |j| + j['class'].downcase.include?(worker) && j.merge!('queue' => queue, 'where_at' => 'queued') - end - end - - results - end + end + end + results + end - def working_jobs_for_worker(worker) - [].tap do |results| - working = [*Resque.working] - work = working.select do |w| - w.job && w.job['payload'] && + def working_jobs_for_worker(worker) + [].tap do |results| + working = [*Resque.working] + work = working.select do |w| + w.job && w.job['payload'] && w.job['payload']['class'].downcase.include?(worker) - end - work.each do |w| - results += [ - w.job['payload'].merge( + end + work.each do |w| + results += [ + w.job['payload'].merge( 'queue' => w.job['queue'], 'where_at' => 'working' - ) - ] + ) + ] + end + end end - end - end - def delayed_jobs_for_worker(_worker) - [].tap do |dels| - schedule_size = Resque.delayed_queue_schedule_size - Resque.delayed_queue_peek(0, schedule_size).each do |d| - Resque.delayed_timestamp_peek( - d, 0, Resque.delayed_timestamp_size(d)).each do |j| - dels << j.merge!('timestamp' => d) + def delayed_jobs_for_worker(_worker) + [].tap do |dels| + schedule_size = Resque.delayed_queue_schedule_size + Resque.delayed_queue_peek(0, schedule_size).each do |d| + Resque.delayed_timestamp_peek( + d, 0, Resque.delayed_timestamp_size(d)).each do |j| + dels << j.merge!('timestamp' => d) + end + end end end end end end -end \ No newline at end of file +end diff --git a/lib/resque/scheduler/engine/app/controllers/resque_web/plugins/resque_scheduler/schedules_controller.rb b/lib/resque/scheduler/engine/app/controllers/resque_web/plugins/resque_scheduler/schedules_controller.rb index ebf65f1b..a5002403 100644 --- a/lib/resque/scheduler/engine/app/controllers/resque_web/plugins/resque_scheduler/schedules_controller.rb +++ b/lib/resque/scheduler/engine/app/controllers/resque_web/plugins/resque_scheduler/schedules_controller.rb @@ -1,48 +1,50 @@ -module ResqueWeb::Plugins::ResqueScheduler +module ResqueWeb + module Plugins + module ResqueScheduler + class SchedulesController < ResqueWeb::ApplicationController + def index + Resque.reload_schedule! if Resque::Scheduler.dynamic + end - class SchedulesController < ResqueWeb::ApplicationController + def destroy + if Resque::Scheduler.dynamic + job_name = params['job_name'] || params[:job_name] + Resque.remove_schedule(job_name) + end + redirect_to Engine.app.url_helpers.schedules_path + end - def index - Resque.reload_schedule! if Resque::Scheduler.dynamic - end + def requeue + @job_name = params['job_name'] || params[:job_name] + config = Resque.schedule[@job_name] + @parameters = config['parameters'] || config[:parameters] + if @parameters + render 'requeue-params' + else + Resque::Scheduler.enqueue_from_config(config) + redirect_to ResqueWeb::Engine.app.url_helpers.overview_path + end + end - def destroy - if Resque::Scheduler.dynamic - job_name = params['job_name'] || params[:job_name] - Resque.remove_schedule(job_name) - end - redirect_to Engine.app.url_helpers.schedules_path - end + def requeue_with_params + job_name = params['job_name'] || params[:job_name] + config = Resque.schedule[job_name] + # Build args hash from post data (removing the job name) + submitted_args = params.reject do |key, _value| + %w(job_name action controller).include?(key) + end - def requeue - @job_name = params['job_name'] || params[:job_name] - config = Resque.schedule[@job_name] - @parameters = config['parameters'] || config[:parameters] - if @parameters - render 'requeue-params' - else - Resque::Scheduler.enqueue_from_config(config) - redirect_to ResqueWeb::Engine.app.url_helpers.overview_path - end - end + # Merge constructed args hash with existing args hash for + # the job, if it exists + config_args = config['args'] || config[:args] || {} + config_args = config_args.merge(submitted_args) - def requeue_with_params - job_name = params['job_name'] || params[:job_name] - config = Resque.schedule[job_name] - # Build args hash from post data (removing the job name) - submitted_args = params.reject do |key, _value| - %w[job_name action controller].include?(key) + # Insert the args hash into config and queue the resque job + config = config.merge('args' => config_args) + Resque::Scheduler.enqueue_from_config(config) + redirect_to ResqueWeb::Engine.app.url_helpers.overview_path + end end - - # Merge constructed args hash with existing args hash for - # the job, if it exists - config_args = config['args'] || config[:args] || {} - config_args = config_args.merge(submitted_args) - - # Insert the args hash into config and queue the resque job - config = config.merge('args' => config_args) - Resque::Scheduler.enqueue_from_config(config) - redirect_to ResqueWeb::Engine.app.url_helpers.overview_path end end -end \ No newline at end of file +end diff --git a/lib/resque/scheduler/engine/app/helpers/resque_web/plugins/resque_scheduler/delayed_helper.rb b/lib/resque/scheduler/engine/app/helpers/resque_web/plugins/resque_scheduler/delayed_helper.rb index 46cbb5d4..0f84f06f 100644 --- a/lib/resque/scheduler/engine/app/helpers/resque_web/plugins/resque_scheduler/delayed_helper.rb +++ b/lib/resque/scheduler/engine/app/helpers/resque_web/plugins/resque_scheduler/delayed_helper.rb @@ -1,10 +1,11 @@ -module ResqueWeb::Plugins::ResqueScheduler - - module DelayedHelper - - def format_time(t) - t.strftime('%Y-%m-%d %H:%M:%S %z') +module ResqueWeb + module Plugins + module ResqueScheduler + module DelayedHelper + def format_time(t) + t.strftime('%Y-%m-%d %H:%M:%S %z') + end + end end - end -end \ No newline at end of file +end diff --git a/lib/resque/scheduler/engine/app/helpers/resque_web/plugins/resque_scheduler/schedules_helper.rb b/lib/resque/scheduler/engine/app/helpers/resque_web/plugins/resque_scheduler/schedules_helper.rb index 208b3441..e4170605 100644 --- a/lib/resque/scheduler/engine/app/helpers/resque_web/plugins/resque_scheduler/schedules_helper.rb +++ b/lib/resque/scheduler/engine/app/helpers/resque_web/plugins/resque_scheduler/schedules_helper.rb @@ -1,51 +1,53 @@ -module ResqueWeb::Plugins::ResqueScheduler - - module SchedulesHelper - - def scheduled_in_this_env?(name) - return true if Resque.schedule[name]['rails_env'].nil? - rails_env(name).split(/[\s,]+/).include?(Resque::Scheduler.env) - end - - def rails_env(name) - Resque.schedule[name]['rails_env'] - end - - def schedule_interval_every(every) - every = [*every] - s = 'every: ' << every.first - - return s unless every.length > 1 - - s << ' (' - meta = every.last.map do |key, value| - "#{key.to_s.gsub(/_/, ' ')} #{value}" +module ResqueWeb + module Plugins + module ResqueScheduler + module SchedulesHelper + def scheduled_in_this_env?(name) + return true if Resque.schedule[name]['rails_env'].nil? + rails_env(name).split(/[\s,]+/).include?(Resque::Scheduler.env) + end + + def rails_env(name) + Resque.schedule[name]['rails_env'] + end + + def schedule_interval_every(every) + every = [*every] + s = 'every: ' << every.first + + return s unless every.length > 1 + + s << ' (' + meta = every.last.map do |key, value| + "#{key.to_s.gsub(/_/, ' ')} #{value}" + end + s << meta.join(', ') << ')' + end + + def schedule_interval(config) + if config['every'] + schedule_interval_every(config['every']) + elsif config['cron'] + 'cron: ' + config['cron'].to_s + else + 'Not currently scheduled' + end + end + + def schedule_class(config) + if config['class'].nil? && !config['custom_job_class'].nil? + config['custom_job_class'] + else + config['class'] + end + end + + def queue_from_class_name(class_name) + Resque.queue_from_class( + Resque::Scheduler::Util.constantize(class_name) + ) + end end - s << meta.join(', ') << ')' - end - - def schedule_interval(config) - if config['every'] - schedule_interval_every(config['every']) - elsif config['cron'] - 'cron: ' + config['cron'].to_s - else - 'Not currently scheduled' - end - end - - def schedule_class(config) - if config['class'].nil? && !config['custom_job_class'].nil? - config['custom_job_class'] - else - config['class'] - end - end - - def queue_from_class_name(class_name) - Resque.queue_from_class( - Resque::Scheduler::Util.constantize(class_name) - ) end end -end \ No newline at end of file +end diff --git a/resque-scheduler.gemspec b/resque-scheduler.gemspec index 3090c677..3f978dd0 100644 --- a/resque-scheduler.gemspec +++ b/resque-scheduler.gemspec @@ -39,7 +39,6 @@ Gem::Specification.new do |spec| spec.add_development_dependency 'capybara' spec.add_development_dependency 'launchy' - # We pin rubocop because new cops have a tendency to result in false-y # positives for new contributors, which is not a nice experience. spec.add_development_dependency 'rubocop', '~> 0.28.0' diff --git a/test/cli_test.rb b/test/cli_test.rb index 567e0d9f..00afc2fd 100644 --- a/test/cli_test.rb +++ b/test/cli_test.rb @@ -2,7 +2,6 @@ require_relative 'test_helper' describe 'Cli' do - before { reset_resque_scheduler } def mock_runtime_env diff --git a/test/dummy/Rakefile b/test/dummy/Rakefile index ba6b733d..dfa3aa4b 100644 --- a/test/dummy/Rakefile +++ b/test/dummy/Rakefile @@ -1,5 +1,6 @@ # Add your own tasks in files placed in lib/tasks ending in .rake, -# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. +# for example lib/tasks/capistrano.rake, and they will automatically be +# available to Rake. require File.expand_path('../config/application', __FILE__) diff --git a/test/dummy/bin/setup b/test/dummy/bin/setup index acdb2c13..00ce4d30 100755 --- a/test/dummy/bin/setup +++ b/test/dummy/bin/setup @@ -8,9 +8,9 @@ Dir.chdir APP_ROOT do # This script is a starting point to setup your application. # Add necessary setup steps to this file: - puts "== Installing dependencies ==" - system "gem install bundler --conservative" - system "bundle check || bundle install" + puts '== Installing dependencies ==' + system 'gem install bundler --conservative' + system 'bundle check || bundle install' # puts "\n== Copying sample files ==" # unless File.exist?("config/database.yml") @@ -18,12 +18,12 @@ Dir.chdir APP_ROOT do # end puts "\n== Preparing database ==" - system "bin/rake db:setup" + system 'bin/rake db:setup' puts "\n== Removing old logs and tempfiles ==" - system "rm -f log/*" - system "rm -rf tmp/cache" + system 'rm -f log/*' + system 'rm -rf tmp/cache' puts "\n== Restarting application server ==" - system "touch tmp/restart.txt" + system 'touch tmp/restart.txt' end diff --git a/test/dummy/config/application.rb b/test/dummy/config/application.rb index 7961d5b0..495da3f3 100644 --- a/test/dummy/config/application.rb +++ b/test/dummy/config/application.rb @@ -3,25 +3,29 @@ require 'rails/all' Bundler.require(*Rails.groups) -require "resque_web" -require "resque-scheduler" +require 'resque_web' +require 'resque-scheduler' module Dummy class Application < Rails::Application - # Settings in config/environments/* take precedence over those specified here. - # Application configuration should go into files in config/initializers + # Settings in config/environments/* take precedence over those specified + # here. Application configuration should go into files in + # config/initializers # -- all .rb files in that directory are automatically loaded. - # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. - # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. + # Set Time.zone default to the specified zone and make Active Record + # auto-convert to this zone. Run "rake -D time" for a list of tasks for + # finding time zone names. Default is UTC. # config.time_zone = 'Central Time (US & Canada)' - # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded. - # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] + # The default locale is :en and all translations from + # config/locales/*.rb,yml are auto loaded. + # config.i18n.load_path += Dir[Rails.root.join('my', + # 'locales', + # '*.{rb,yml}').to_s] # config.i18n.default_locale = :de # Do not swallow errors in after_commit/after_rollback callbacks. config.active_record.raise_in_transactional_callbacks = true end end - diff --git a/test/dummy/config/environments/development.rb b/test/dummy/config/environments/development.rb index b55e2144..cd391aca 100644 --- a/test/dummy/config/environments/development.rb +++ b/test/dummy/config/environments/development.rb @@ -1,5 +1,6 @@ Rails.application.configure do - # Settings specified here will take precedence over those in config/application.rb. + # Settings specified here will take precedence over those in + # config/application.rb. # In the development environment your application's code is reloaded on # every request. This slows down response time but is perfect for development @@ -27,8 +28,8 @@ # number of complex assets. config.assets.debug = true - # Asset digests allow you to set far-future HTTP expiration dates on all assets, - # yet still be able to expire them through the digest params. + # Asset digests allow you to set far-future HTTP expiration dates on all + # assets, yet still be able to expire them through the digest params. config.assets.digest = true # Adds additional error checking when serving assets at runtime. diff --git a/test/dummy/config/environments/production.rb b/test/dummy/config/environments/production.rb index 5c1b32e4..fd19fdf1 100644 --- a/test/dummy/config/environments/production.rb +++ b/test/dummy/config/environments/production.rb @@ -1,5 +1,6 @@ Rails.application.configure do - # Settings specified here will take precedence over those in config/application.rb. + # Settings specified here will take precedence over those in + # config/application.rb. # Code is not reloaded between requests. config.cache_classes = true @@ -31,17 +32,19 @@ # Do not fallback to assets pipeline if a precompiled asset is missed. config.assets.compile = false - # Asset digests allow you to set far-future HTTP expiration dates on all assets, - # yet still be able to expire them through the digest params. + # Asset digests allow you to set far-future HTTP expiration dates on all + # assets, # yet still be able to expire them through the digest params. config.assets.digest = true - # `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb + # `config.assets.precompile` and `config.assets.version` have moved to + # config/initializers/assets.rb # Specifies the header that your server uses for sending files. # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX - # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. + # Force all access to the app over SSL, use Strict-Transport-Security, and + # use secure cookies. # config.force_ssl = true # Use the lowest log level to ensure availability of diagnostic information @@ -61,7 +64,8 @@ # config.action_controller.asset_host = 'http://assets.example.com' # Ignore bad email addresses and do not raise email delivery errors. - # Set this to true and configure the email server for immediate delivery to raise delivery errors. + # Set this to true and configure the email server for immediate delivery to + # raise delivery errors. # config.action_mailer.raise_delivery_errors = false # Enable locale fallbacks for I18n (makes lookups for any locale fall back to diff --git a/test/dummy/config/environments/test.rb b/test/dummy/config/environments/test.rb index 1c19f08b..7ac80d3c 100644 --- a/test/dummy/config/environments/test.rb +++ b/test/dummy/config/environments/test.rb @@ -1,5 +1,6 @@ Rails.application.configure do - # Settings specified here will take precedence over those in config/application.rb. + # Settings specified here will take precedence over those in + # config/application.rb. # The test environment is used exclusively to run your application's # test suite. You never need to work with it otherwise. Remember that diff --git a/test/dummy/config/initializers/assets.rb b/test/dummy/config/initializers/assets.rb index 01ef3e66..a71e9524 100644 --- a/test/dummy/config/initializers/assets.rb +++ b/test/dummy/config/initializers/assets.rb @@ -7,5 +7,6 @@ # Rails.application.config.assets.paths << Emoji.images_path # Precompile additional assets. -# application.js, application.css, and all non-JS/CSS in app/assets folder are already added. +# application.js, application.css, and all non-JS/CSS in app/assets folder are +# already added. # Rails.application.config.assets.precompile += %w( search.js ) diff --git a/test/dummy/config/initializers/backtrace_silencers.rb b/test/dummy/config/initializers/backtrace_silencers.rb index 59385cdf..cf74fe3d 100644 --- a/test/dummy/config/initializers/backtrace_silencers.rb +++ b/test/dummy/config/initializers/backtrace_silencers.rb @@ -1,7 +1,9 @@ # Be sure to restart your server when you modify this file. -# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. +# You can add backtrace silencers for libraries that you're using but don't +# wish to see in your backtraces. # Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } -# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code. +# You can also remove all the silencers if you're trying to debug a problem +# that might stem from framework code. # Rails.backtrace_cleaner.remove_silencers! diff --git a/test/dummy/config/initializers/wrap_parameters.rb b/test/dummy/config/initializers/wrap_parameters.rb index 33725e95..6fffb713 100644 --- a/test/dummy/config/initializers/wrap_parameters.rb +++ b/test/dummy/config/initializers/wrap_parameters.rb @@ -3,7 +3,8 @@ # This file contains settings for ActionController::ParamsWrapper which # is enabled by default. -# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array. +# Enable parameter wrapping for JSON. You can disable this by setting :format +# to an empty array. ActiveSupport.on_load(:action_controller) do wrap_parameters format: [:json] if respond_to?(:wrap_parameters) end diff --git a/test/dummy/config/routes.rb b/test/dummy/config/routes.rb index 3caf1aca..26e2f14e 100644 --- a/test/dummy/config/routes.rb +++ b/test/dummy/config/routes.rb @@ -1,4 +1,3 @@ Rails.application.routes.draw do - - mount ResqueWeb::Engine => "/resque_web" + mount ResqueWeb::Engine => '/resque_web' end diff --git a/test/dummy/db/schema.rb b/test/dummy/db/schema.rb index 4dfbb168..49479b37 100644 --- a/test/dummy/db/schema.rb +++ b/test/dummy/db/schema.rb @@ -1,16 +1,18 @@ # encoding: UTF-8 # This file is auto-generated from the current state of the database. Instead # of editing this file, please use the migrations feature of Active Record to -# incrementally modify your database, and then regenerate this schema definition. +# incrementally modify your database, and then regenerate this schema +# definition. # # Note that this schema.rb definition is the authoritative source for your # database schema. If you need to create the application database on another # system, you should be using db:schema:load, not running all the migrations -# from scratch. The latter is a flawed and unsustainable approach (the more migrations -# you'll amass, the slower it'll run and the greater likelihood for issues). +# from scratch. The latter is a flawed and unsustainable approach (the more +# migrations you'll amass, the slower it'll run and the greater likelihood for +# issues). # -# It's strongly recommended that you check this file into your version control system. +# It's strongly recommended that you check this file into your version control +# system. ActiveRecord::Schema.define(version: 0) do - end diff --git a/test/env_test.rb b/test/env_test.rb index 301b0453..fb824d87 100644 --- a/test/env_test.rb +++ b/test/env_test.rb @@ -3,7 +3,6 @@ require 'resque/scheduler/env' describe 'Env' do - before { reset_resque_scheduler } def new_env(options = {}) diff --git a/test/integration/resque_web_engine/delayed/cancel_now_test.rb b/test/integration/resque_web_engine/delayed/cancel_now_test.rb index bfac0893..45242ba1 100644 --- a/test/integration/resque_web_engine/delayed/cancel_now_test.rb +++ b/test/integration/resque_web_engine/delayed/cancel_now_test.rb @@ -1,12 +1,15 @@ require_relative '../../../test_helper' -module ResqueWeb::Plugins::ResqueScheduler - class CancelNowTest < ActionDispatch::IntegrationTest - - test 'redirects to overview' do - post Engine.app.url_helpers.cancel_now_path - assert response.status == 302 - assert response.header['Location'].include? '/delayed' +module ResqueWeb + module Plugins + module ResqueScheduler + class CancelNowTest < ActionDispatch::IntegrationTest + test 'redirects to overview' do + post Engine.app.url_helpers.cancel_now_path + assert response.status == 302 + assert response.header['Location'].include? '/delayed' + end + end end end -end \ No newline at end of file +end diff --git a/test/integration/resque_web_engine/delayed/clear_test.rb b/test/integration/resque_web_engine/delayed/clear_test.rb index 7d66d225..d3774a1b 100644 --- a/test/integration/resque_web_engine/delayed/clear_test.rb +++ b/test/integration/resque_web_engine/delayed/clear_test.rb @@ -1,13 +1,16 @@ require_relative '../../../test_helper' -module ResqueWeb::Plugins::ResqueScheduler - class DelayedClearTest < ActionDispatch::IntegrationTest - - # 'on POST to /delayed/clear' do - test 'redirects to delayed' do - post Engine.app.url_helpers.clear_path - assert response.status == 302 - assert response.header['Location'].include? '/delayed' +module ResqueWeb + module Plugins + module ResqueScheduler + class DelayedClearTest < ActionDispatch::IntegrationTest + # 'on POST to /delayed/clear' do + test 'redirects to delayed' do + post Engine.app.url_helpers.clear_path + assert response.status == 302 + assert response.header['Location'].include? '/delayed' + end + end end end -end \ No newline at end of file +end diff --git a/test/integration/resque_web_engine/delayed/delayed_job_class_page_test.rb b/test/integration/resque_web_engine/delayed/delayed_job_class_page_test.rb index 0cd1aa4d..49fa5dd2 100644 --- a/test/integration/resque_web_engine/delayed/delayed_job_class_page_test.rb +++ b/test/integration/resque_web_engine/delayed/delayed_job_class_page_test.rb @@ -1,21 +1,25 @@ require_relative '../../../test_helper' -module ResqueWeb::Plugins::ResqueScheduler +module ResqueWeb + module Plugins + module ResqueScheduler + class DelayedJobClassPageTest < ActionDispatch::IntegrationTest + fixtures :all - class DelayedJobClassPageTest < ActionDispatch::IntegrationTest - fixtures :all + setup do + @t = Time.now + 3600 + Resque.enqueue_at(@t, SomeIvarJob, 'foo', 'bar') + params = { klass: 'SomeIvarJob', + args: URI.encode(%w(foo bar).to_json) } + visit Engine.app.url_helpers.delayed_job_class_path params + end - setup do - @t = Time.now + 3600 - Resque.enqueue_at(@t, SomeIvarJob, 'foo', 'bar') - visit Engine.app.url_helpers.delayed_job_class_path klass: 'SomeIvarJob', args: URI.encode(%w(foo bar).to_json) - end - - test('is 200') { assert page.status_code == 200 } + test('is 200') { assert page.status_code == 200 } - test 'see the scheduled job' do - assert page.body.include?(@t.to_s) + test 'see the scheduled job' do + assert page.body.include?(@t.to_s) + end + end end - end -end \ No newline at end of file +end diff --git a/test/integration/resque_web_engine/delayed/delayed_job_namespaced_class_page_test.rb b/test/integration/resque_web_engine/delayed/delayed_job_namespaced_class_page_test.rb index ec495669..d8b790c9 100644 --- a/test/integration/resque_web_engine/delayed/delayed_job_namespaced_class_page_test.rb +++ b/test/integration/resque_web_engine/delayed/delayed_job_namespaced_class_page_test.rb @@ -1,21 +1,24 @@ require_relative '../../../test_helper' +module ResqueWeb + module Plugins + module ResqueScheduler + class DelayedJobNamespacedClassPageTest < ActionDispatch::IntegrationTest + fixtures :all -module ResqueWeb::Plugins::ResqueScheduler - class DelayedJobNamespacedClassPageTest < ActionDispatch::IntegrationTest - fixtures :all + setup do + @t = Time.now + 3600 - setup do - @t = Time.now + 3600 + Resque.enqueue_at(@t, Foo::Bar, 'foo', 'bar') + params = { klass: 'Foo::Bar', args: URI.encode(%w(foo bar).to_json) } + visit Engine.app.url_helpers.delayed_job_class_path params + end - Resque.enqueue_at(@t, Foo::Bar, 'foo', 'bar') - visit Engine.app.url_helpers.delayed_job_class_path klass: 'Foo::Bar', args: URI.encode(%w(foo bar).to_json) - end - - test('is 200') { assert page.status_code == 200 } + test('is 200') { assert page.status_code == 200 } - test 'see the scheduled job' do - assert page.body.include?(@t.to_s) + test 'see the scheduled job' do + assert page.body.include?(@t.to_s) + end + end end - end -end \ No newline at end of file +end diff --git a/test/integration/resque_web_engine/delayed/delayed_page_test.rb b/test/integration/resque_web_engine/delayed/delayed_page_test.rb index 79e1f958..1c26455e 100644 --- a/test/integration/resque_web_engine/delayed/delayed_page_test.rb +++ b/test/integration/resque_web_engine/delayed/delayed_page_test.rb @@ -1,15 +1,16 @@ require_relative '../../../test_helper' -module ResqueWeb::Plugins::ResqueScheduler - - class DelayedTest < ActionDispatch::IntegrationTest - - test 'Link to delayed page in navigation works' do - visit '/resque_web' - click_link 'Delayed' - assert page.status_code == 200 - assert page.has_css? 'h1', 'Delayed Jobs' +module ResqueWeb + module Plugins + module ResqueScheduler + class DelayedTest < ActionDispatch::IntegrationTest + test 'Link to delayed page in navigation works' do + visit '/resque_web' + click_link 'Delayed' + assert page.status_code == 200 + assert page.has_css? 'h1', 'Delayed Jobs' + end + end end - end -end \ No newline at end of file +end diff --git a/test/integration/resque_web_engine/delayed/delayed_search_test.rb b/test/integration/resque_web_engine/delayed/delayed_search_test.rb index 7fd7cf5a..7710cc32 100644 --- a/test/integration/resque_web_engine/delayed/delayed_search_test.rb +++ b/test/integration/resque_web_engine/delayed/delayed_search_test.rb @@ -1,24 +1,27 @@ require_relative '../../../test_helper' -module ResqueWeb::Plugins::ResqueScheduler - class DelayedSearchTest < ActionDispatch::IntegrationTest +module ResqueWeb + module Plugins + module ResqueScheduler + class DelayedSearchTest < ActionDispatch::IntegrationTest + setup do + t = Time.now + 60 + Resque.enqueue_at(t, SomeIvarJob) + Resque.enqueue(SomeQuickJob) + end - setup do - t = Time.now + 60 - Resque.enqueue_at(t, SomeIvarJob) - Resque.enqueue(SomeQuickJob) - end - - test 'should find matching scheduled job' do - post Engine.app.url_helpers.delayed_search_path, 'search' => 'ivar' - assert response.status == 200 - assert response.body.include?('SomeIvarJob') - end + test 'should find matching scheduled job' do + post Engine.app.url_helpers.delayed_search_path, 'search' => 'ivar' + assert response.status == 200 + assert response.body.include?('SomeIvarJob') + end - test 'should find matching queued job' do - post Engine.app.url_helpers.delayed_search_path, 'search' => 'quick' - assert response.status == 200 - assert response.body.include?('SomeQuickJob') + test 'should find matching queued job' do + post Engine.app.url_helpers.delayed_search_path, 'search' => 'quick' + assert response.status == 200 + assert response.body.include?('SomeQuickJob') + end + end end end -end \ No newline at end of file +end diff --git a/test/integration/resque_web_engine/delayed/queue_now_test.rb b/test/integration/resque_web_engine/delayed/queue_now_test.rb index ec901abb..c002e7e0 100644 --- a/test/integration/resque_web_engine/delayed/queue_now_test.rb +++ b/test/integration/resque_web_engine/delayed/queue_now_test.rb @@ -1,12 +1,16 @@ require_relative '../../../test_helper' -module ResqueWeb::Plugins::ResqueScheduler - class QueueNowTest < ActionDispatch::IntegrationTest - # 'on POST to /delayed/queue_now' do - test 'redirects to overview' do - post Engine.app.url_helpers.queue_now_path - assert response.status == 302 - assert response.header['Location'].include? '/overview' +module ResqueWeb + module Plugins + module ResqueScheduler + class QueueNowTest < ActionDispatch::IntegrationTest + # 'on POST to /delayed/queue_now' do + test 'redirects to overview' do + post Engine.app.url_helpers.queue_now_path + assert response.status == 302 + assert response.header['Location'].include? '/overview' + end + end end end -end \ No newline at end of file +end diff --git a/test/integration/resque_web_engine/delayed/timestamp_test.rb b/test/integration/resque_web_engine/delayed/timestamp_test.rb index 16ce1ae4..f873bf0e 100644 --- a/test/integration/resque_web_engine/delayed/timestamp_test.rb +++ b/test/integration/resque_web_engine/delayed/timestamp_test.rb @@ -1,11 +1,14 @@ require_relative '../../../test_helper' -module ResqueWeb::Plugins::ResqueScheduler - class TimestampTest < ActionDispatch::IntegrationTest - - test 'shows delayed_timestamp view' do - get Engine.app.url_helpers.timestamp_path timestamp: '1234567890' - assert response.status == 200 +module ResqueWeb + module Plugins + module ResqueScheduler + class TimestampTest < ActionDispatch::IntegrationTest + test 'shows delayed_timestamp view' do + get Engine.app.url_helpers.timestamp_path timestamp: '1234567890' + assert response.status == 200 + end + end end end -end \ No newline at end of file +end diff --git a/test/integration/resque_web_engine/schedules/delete_dynamic_test.rb b/test/integration/resque_web_engine/schedules/delete_dynamic_test.rb index 353807a2..5c9715f4 100644 --- a/test/integration/resque_web_engine/schedules/delete_dynamic_test.rb +++ b/test/integration/resque_web_engine/schedules/delete_dynamic_test.rb @@ -1,38 +1,45 @@ require_relative '../../../test_helper' -module ResqueWeb::Plugins::ResqueScheduler - class DeleteDynamicScheduleTest < ActionDispatch::IntegrationTest - setup do - Resque.schedule = Test::RESQUE_SCHEDULE - Resque::Scheduler.load_schedule! - Resque::Scheduler.stubs(:dynamic).returns(true) - end - - test 'redirects to schedule page' do - delete Engine.app.url_helpers.schedule_path - - status = response.status - redirect_location = response.headers['Location'] - response_status_msg = "Expected response to be a 302, but was a #{status}." - redirect_msg = "Redirect to #{redirect_location} instead of /schedule." - - assert status == 302, response_status_msg - assert_match %r{/schedule/?$}, redirect_location, redirect_msg - end - - test 'does not show the deleted job' do - delete Engine.app.url_helpers.schedule_path job_name: 'job_with_params' - follow_redirect! - - msg = 'The job should not have been shown on the /schedule page.' - assert !response.body.include?('job_with_params'), msg - end - - test 'removes job from redis' do - delete Engine.app.url_helpers.schedule_path, job_name: 'job_with_params' - - msg = 'The job was not deleted from redis.' - assert_nil Resque.fetch_schedule('job_with_params'), msg +module ResqueWeb + module Plugins + module ResqueScheduler + class DeleteDynamicScheduleTest < ActionDispatch::IntegrationTest + setup do + Resque.schedule = Test::RESQUE_SCHEDULE + Resque::Scheduler.load_schedule! + Resque::Scheduler.stubs(:dynamic).returns(true) + end + + test 'redirects to schedule page' do + delete Engine.app.url_helpers.schedule_path + + status = response.status + redirect_location = response.headers['Location'] + status_msg = "Expected response to be a 302, but was a #{status}." + redirect_msg = "Redirect to #{redirect_location} "\ + 'instead of /schedule.' + + assert status == 302, status_msg + assert_match %r{/schedule/?$}, redirect_location, redirect_msg + end + + test 'does not show the deleted job' do + params = { job_name: 'job_with_params' } + delete Engine.app.url_helpers.schedule_path params + follow_redirect! + + msg = 'The job should not have been shown on the /schedule page.' + assert !response.body.include?('job_with_params'), msg + end + + test 'removes job from redis' do + params = { job_name: 'job_with_params' } + delete Engine.app.url_helpers.schedule_path, params + + msg = 'The job was not deleted from redis.' + assert_nil Resque.fetch_schedule('job_with_params'), msg + end + end end end -end \ No newline at end of file +end diff --git a/test/integration/resque_web_engine/schedules/delete_static_test.rb b/test/integration/resque_web_engine/schedules/delete_static_test.rb index 90e825c8..54f92802 100644 --- a/test/integration/resque_web_engine/schedules/delete_static_test.rb +++ b/test/integration/resque_web_engine/schedules/delete_static_test.rb @@ -1,26 +1,32 @@ require_relative '../../../test_helper' -module ResqueWeb::Plugins::ResqueScheduler - class DelayedSearchTest < ActionDispatch::IntegrationTest - setup do - Resque.schedule = Test::RESQUE_SCHEDULE - Resque::Scheduler.load_schedule! - Resque::Scheduler.stubs(:dynamic).returns(false) - end +module ResqueWeb + module Plugins + module ResqueScheduler + class DelayedSearchTest < ActionDispatch::IntegrationTest + setup do + Resque.schedule = Test::RESQUE_SCHEDULE + Resque::Scheduler.load_schedule! + Resque::Scheduler.stubs(:dynamic).returns(false) + end - test 'does not remove the job from the UI' do - delete Engine.app.url_helpers.schedule_path, job_name: 'job_with_params' - follow_redirect! + test 'does not remove the job from the UI' do + params = { job_name: 'job_with_params' } + delete Engine.app.url_helpers.schedule_path, params + follow_redirect! - msg = 'The job should not have been removed from the /schedule page.' - assert response.body.include?('job_with_params'), msg - end + msg = 'The job should not have been removed from the /schedule page.' + assert response.body.include?('job_with_params'), msg + end - test 'does not remove job from redis' do - delete Engine.app.url_helpers.schedule_path, job_name: 'job_with_params' + test 'does not remove job from redis' do + params = { job_name: 'job_with_params' } + delete Engine.app.url_helpers.schedule_path, params - msg = 'The job should not have been deleted from redis.' - assert Resque.fetch_schedule('job_with_params'), msg + msg = 'The job should not have been deleted from redis.' + assert Resque.fetch_schedule('job_with_params'), msg + end + end end end -end \ No newline at end of file +end diff --git a/test/integration/resque_web_engine/schedules/requeue_test.rb b/test/integration/resque_web_engine/schedules/requeue_test.rb index b47f7cc5..b81e55c3 100644 --- a/test/integration/resque_web_engine/schedules/requeue_test.rb +++ b/test/integration/resque_web_engine/schedules/requeue_test.rb @@ -1,49 +1,53 @@ require_relative '../../../test_helper' -module ResqueWeb::Plugins::ResqueScheduler - class RequeueTest < ActionDispatch::IntegrationTest - fixtures :all - - setup do - Resque.schedule = Test::RESQUE_SCHEDULE - Resque::Scheduler.load_schedule! - end - - test 'job without params' do - # Regular jobs without params should redirect to /overview - job_name = 'job_without_params' - Resque::Scheduler.stubs(:enqueue_from_config) - .once.with(Resque.schedule[job_name]) - - post Engine.app.url_helpers.requeue_path, 'job_name' => job_name - follow_redirect! - assert_equal 'http://www.example.com/resque_web/overview', request.url - assert response.ok? - end - - test 'job with params' do - # If a job has params defined, - # it should render the template with a form for the job params - job_name = 'job_with_params' - post Engine.app.url_helpers.requeue_path, 'job_name' => job_name - - assert response.ok? - assert response.body.include?('This job requires parameters') - assert response.body.include?( - %() - ) - - Resque.schedule[job_name]['parameters'].each do |_param_name, param_config| - assert response.body.include?( - '(?)] - ) - assert response.body.include?( - ') - ) +module ResqueWeb + module Plugins + module ResqueScheduler + class RequeueTest < ActionDispatch::IntegrationTest + fixtures :all + + setup do + Resque.schedule = Test::RESQUE_SCHEDULE + Resque::Scheduler.load_schedule! + end + + test 'job without params' do + # Regular jobs without params should redirect to /overview + job_name = 'job_without_params' + Resque::Scheduler.stubs(:enqueue_from_config) + .once.with(Resque.schedule[job_name]) + + post Engine.app.url_helpers.requeue_path, 'job_name' => job_name + follow_redirect! + assert_equal 'http://www.example.com/resque_web/overview', request.url + assert response.ok? + end + + test 'job with params' do + # If a job has params defined, + # it should render the template with a form for the job params + job_name = 'job_with_params' + post Engine.app.url_helpers.requeue_path, 'job_name' => job_name + + assert response.ok? + assert response.body.include?('This job requires parameters') + assert response.body.include?( + %() + ) + + Resque.schedule[job_name]['parameters'].each do |_param_name, + param_config| + assert response.body.include?( + '(?)] + ) + assert response.body.include?( + ') + ) + end + end end end - end -end \ No newline at end of file +end diff --git a/test/integration/resque_web_engine/schedules/requeue_with_params_test.rb b/test/integration/resque_web_engine/schedules/requeue_with_params_test.rb index 23821c8e..c9613ec4 100644 --- a/test/integration/resque_web_engine/schedules/requeue_with_params_test.rb +++ b/test/integration/resque_web_engine/schedules/requeue_with_params_test.rb @@ -1,31 +1,34 @@ require_relative '../../../test_helper' -module ResqueWeb::Plugins::ResqueScheduler - class RequeueWithParamsTest < ActionDispatch::IntegrationTest - - setup do - Resque.schedule = Test::RESQUE_SCHEDULE - Resque::Scheduler.load_schedule! - end - - test 'job with params' do - job_name = 'job_with_params' - log_level = 'error' - - job_config = Resque.schedule[job_name] - args = job_config['args'].merge('log_level' => log_level) - job_config = job_config.merge('args' => args) - - Resque::Scheduler.stubs(:enqueue_from_config).once.with(job_config) - - post Engine.app.url_helpers.requeue_with_params_path, - 'job_name' => job_name, - 'log_level' => log_level - - follow_redirect! - assert_equal 'http://www.example.com/resque_web/overview', request.url - - assert response.ok? +module ResqueWeb + module Plugins + module ResqueScheduler + class RequeueWithParamsTest < ActionDispatch::IntegrationTest + setup do + Resque.schedule = Test::RESQUE_SCHEDULE + Resque::Scheduler.load_schedule! + end + + test 'job with params' do + job_name = 'job_with_params' + log_level = 'error' + + job_config = Resque.schedule[job_name] + args = job_config['args'].merge('log_level' => log_level) + job_config = job_config.merge('args' => args) + + Resque::Scheduler.stubs(:enqueue_from_config).once.with(job_config) + + post Engine.app.url_helpers.requeue_with_params_path, + 'job_name' => job_name, + 'log_level' => log_level + + follow_redirect! + assert_equal 'http://www.example.com/resque_web/overview', request.url + + assert response.ok? + end + end end end end diff --git a/test/integration/resque_web_engine/schedules/schedule_page_test.rb b/test/integration/resque_web_engine/schedules/schedule_page_test.rb index 6ceef7dc..e9715902 100644 --- a/test/integration/resque_web_engine/schedules/schedule_page_test.rb +++ b/test/integration/resque_web_engine/schedules/schedule_page_test.rb @@ -1,83 +1,86 @@ require_relative '../../../test_helper' -module ResqueWeb::Plugins::ResqueScheduler - class ScheduleTest < ActionDispatch::IntegrationTest - fixtures :all +module ResqueWeb + module Plugins + module ResqueScheduler + class ScheduleTest < ActionDispatch::IntegrationTest + fixtures :all - def visit_scheduler_page - visit Engine.app.url_helpers.schedules_path - end + def visit_scheduler_page + visit Engine.app.url_helpers.schedules_path + end - setup do - Resque::Scheduler.env = 'production' - Resque.schedule = { - 'some_ivar_job' => { + setup do + Resque::Scheduler.env = 'production' + Resque.schedule = { + 'some_ivar_job' => { 'cron' => '* * * * *', 'class' => 'SomeIvarJob', 'args' => '/tmp', 'rails_env' => 'production' - }, - 'some_other_job' => { + }, + 'some_other_job' => { 'every' => ['1m', ['1h']], 'queue' => 'high', 'custom_job_class' => 'SomeOtherJob', 'args' => { - 'b' => 'blah' + 'b' => 'blah' } - }, - 'some_fancy_job' => { + }, + 'some_fancy_job' => { 'every' => ['1m'], 'queue' => 'fancy', 'class' => 'SomeFancyJob', 'args' => 'sparkles', 'rails_env' => 'fancy' - }, - 'shared_env_job' => { + }, + 'shared_env_job' => { 'cron' => '* * * * *', 'class' => 'SomeSharedEnvJob', 'args' => '/tmp', 'rails_env' => 'fancy, production' + } } - } - Resque::Scheduler.load_schedule! - visit_scheduler_page - end + Resque::Scheduler.load_schedule! + visit_scheduler_page + end + test 'Link to Schedule page in navigation works' do + visit '/resque_web' + click_link 'Schedule' + assert page.has_css? 'h1', 'Schedule' + end - test 'Link to Schedule page in navigation works' do - visit '/resque_web' - click_link 'Schedule' - assert page.has_css? 'h1', 'Schedule' - end + test '200' do + assert page.has_css?('h1', 'Schedule') + end - test '200' do - assert page.has_css?('h1', 'Schedule') - end + test 'see the scheduled job' do + assert page.body.include?('SomeIvarJob') + end - test 'see the scheduled job' do - assert page.body.include?('SomeIvarJob') - end + test 'excludes jobs for other envs' do + assert !page.body.include?('SomeFancyJob') + end - test 'excludes jobs for other envs' do - assert !page.body.include?('SomeFancyJob') - end - - test 'includes job used in multiple environments' do - assert page.body.include?('SomeSharedEnvJob') - end + test 'includes job used in multiple environments' do + assert page.body.include?('SomeSharedEnvJob') + end - test 'allows delete when dynamic' do - Resque::Scheduler.stubs(:dynamic).returns(true) - visit_scheduler_page + test 'allows delete when dynamic' do + Resque::Scheduler.stubs(:dynamic).returns(true) + visit_scheduler_page - assert page.body.include?('Delete') - end + assert page.body.include?('Delete') + end - test "doesn't allow delete when static" do - Resque::Scheduler.stubs(:dynamic).returns(false) - visit_scheduler_page + test "doesn't allow delete when static" do + Resque::Scheduler.stubs(:dynamic).returns(false) + visit_scheduler_page - assert !page.body.include?('Delete') + assert !page.body.include?('Delete') + end + end end end -end \ No newline at end of file +end diff --git a/test/multi_process_test.rb b/test/multi_process_test.rb index 8b03d260..44ed2386 100644 --- a/test/multi_process_test.rb +++ b/test/multi_process_test.rb @@ -2,7 +2,6 @@ require_relative 'test_helper' describe 'Multi Process' do - before { reset_resque_scheduler } it 'setting schedule= from many process does not corrupt the schedules' do diff --git a/test/scheduler_test.rb b/test/scheduler_test.rb index d6c0ee02..5b233464 100644 --- a/test/scheduler_test.rb +++ b/test/scheduler_test.rb @@ -427,8 +427,10 @@ it 'procline omits app_name when absent' do Rails.stub(:env, nil) do Resque::Scheduler.app_name = nil - assert Resque::Scheduler.send(:build_procline, 'bar') =~ - /#{Resque::Scheduler.send(:internal_name)}: bar/, "Got #{Resque::Scheduler.send(:build_procline, 'bar')}, instead of #{Resque::Scheduler.send(:internal_name)}: bar" + regexp = /#{Resque::Scheduler.send(:internal_name)}: bar/ + message = "Got #{Resque::Scheduler.send(:build_procline, 'bar')}, "\ + "instead of #{Resque::Scheduler.send(:internal_name)}: bar" + assert Resque::Scheduler.send(:build_procline, 'bar') =~ regexp, message end end diff --git a/test/support/integration_case.rb b/test/support/integration_case.rb index 886f33aa..7e680fa5 100644 --- a/test/support/integration_case.rb +++ b/test/support/integration_case.rb @@ -1,5 +1,7 @@ # Define a bare test case to use with Capybara -class ActionDispatch::IntegrationTest - include Capybara::DSL - include Rails.application.routes.url_helpers -end \ No newline at end of file +module ActionDispatch + class IntegrationTest + include Capybara::DSL + include Rails.application.routes.url_helpers + end +end diff --git a/test/test_helper.rb b/test/test_helper.rb index 28dba4c8..774bfc13 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -1,12 +1,16 @@ # vim:fileencoding=utf-8 require 'simplecov' - -ENV["RAILS_ENV"] = "test" -require File.expand_path("../../test/dummy/config/environment.rb", __FILE__) -ActiveRecord::Migrator.migrations_paths = [File.expand_path("../../test/dummy/db/migrate", __FILE__)] -ActiveRecord::Migrator.migrations_paths << File.expand_path('../../db/migrate', __FILE__) - +ENV['RAILS_ENV'] = 'test' +require File.expand_path('../../test/dummy/config/environment.rb', __FILE__) +ActiveRecord::Migrator.migrations_paths = [File.expand_path( + '../../test/dummy/db/migrate', + __FILE__ + )] +ActiveRecord::Migrator.migrations_paths << File.expand_path( + '../../db/migrate', + __FILE__ + ) # This bit needs to be above the minitest require (in rails/test_help), but # after the Rails app is started. This is because otherwise, the @@ -20,10 +24,10 @@ RedisInstance.run! end -require "rails/test_help" +require 'rails/test_help' -require "minitest/spec" -require "minitest/mock" +require 'minitest/spec' +require 'minitest/mock' require 'mocha/setup' require 'rack/test' @@ -118,27 +122,27 @@ def self.queue module Test RESQUE_SCHEDULE = { - 'job_without_params' => { - 'cron' => '* * * * *', - 'class' => 'JobWithoutParams', - 'args' => { - 'host' => 'localhost' - }, - 'rails_env' => 'production' + 'job_without_params' => { + 'cron' => '* * * * *', + 'class' => 'JobWithoutParams', + 'args' => { + 'host' => 'localhost' + }, + 'rails_env' => 'production' + }, + 'job_with_params' => { + 'every' => '1m', + 'class' => 'JobWithParams', + 'args' => { + 'host' => 'localhost' }, - 'job_with_params' => { - 'every' => '1m', - 'class' => 'JobWithParams', - 'args' => { - 'host' => 'localhost' - }, - 'parameters' => { - 'log_level' => { - 'description' => 'The level of logging', - 'default' => 'warn' - } - } + 'parameters' => { + 'log_level' => { + 'description' => 'The level of logging', + 'default' => 'warn' + } } + } } end @@ -159,10 +163,9 @@ def restore_devnull_logfile end # Tests need to avoid leaking configuration into the environment, so that they -# do not cause failures due to ordering. This function should be run before every -# test. +# do not cause failures due to ordering. This function should be run before +# every test. def reset_resque_scheduler - # Scheduler test Resque::Scheduler.configure do |c| c.dynamic = false @@ -183,7 +186,6 @@ def reset_resque_scheduler Resque.schedule = {} # Schedule leaks out from other tests without this. Resque::Scheduler.send(:instance_variable_set, :@shutdown, false) - end restore_devnull_logfile From d46ed7de3725560ae56e1db0c8e635f66dc0e7e1 Mon Sep 17 00:00:00 2001 From: Matt Gibson Date: Sun, 25 Jan 2015 21:57:27 +0000 Subject: [PATCH 30/32] Add classes to tables --- .../views/resque_web/plugins/resque_scheduler/delayed/index.erb | 2 +- .../plugins/resque_scheduler/schedules/index.html.erb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/index.erb b/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/index.erb index c0f975b2..50050d23 100644 --- a/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/index.erb +++ b/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/index.erb @@ -12,7 +12,7 @@ Showing <%= start = params[:start].to_i %> to <%= start + 20 %> of <%= size %> timestamps

- +
diff --git a/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/schedules/index.html.erb b/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/schedules/index.html.erb index e0340239..28d46c69 100644 --- a/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/schedules/index.html.erb +++ b/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/schedules/index.html.erb @@ -8,7 +8,7 @@ Current master: <%= Resque.redis.get(Resque::Scheduler.master_lock.key) %>

-
Timestamp
+
<% if Resque::Scheduler.dynamic %> From 4265204f3403cb47ec4c2999888744fdcceb8c27 Mon Sep 17 00:00:00 2001 From: Matt Gibson Date: Mon, 26 Jan 2015 00:26:07 +0000 Subject: [PATCH 31/32] Styling --- .../plugins/resque_scheduler/delayed/search.erb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/search.erb b/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/search.erb index 3ab3e93b..e81dbbdd 100644 --- a/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/search.erb +++ b/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/search.erb @@ -3,7 +3,7 @@
<% delayed = @jobs.select { |j| j['where_at'] == 'delayed' } %>

Delayed jobs

-
+
@@ -16,7 +16,7 @@
- +
@@ -37,7 +37,7 @@ <% queued = @jobs.select { |j| j['where_at'] == 'queued' } %>

Queued jobs

- +
@@ -54,7 +54,7 @@ <% working = @jobs.select { |j| j['where_at'] == 'working' } %>

Working jobs

-
Queue Class
+
From c4f436f6c80b780c0c3d563fef1f75e209aa90bb Mon Sep 17 00:00:00 2001 From: Matt Gibson Date: Mon, 26 Jan 2015 00:29:16 +0000 Subject: [PATCH 32/32] Styling --- .../views/resque_web/plugins/resque_scheduler/delayed/index.erb | 2 +- .../plugins/resque_scheduler/schedules/index.html.erb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/index.erb b/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/index.erb index 50050d23..d5197e70 100644 --- a/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/index.erb +++ b/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/delayed/index.erb @@ -26,7 +26,7 @@ diff --git a/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/schedules/index.html.erb b/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/schedules/index.html.erb index 28d46c69..5437eb35 100644 --- a/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/schedules/index.html.erb +++ b/lib/resque/scheduler/engine/app/views/resque_web/plugins/resque_scheduler/schedules/index.html.erb @@ -37,7 +37,7 @@
Queue Class
- +
<%= format_time(Time.at(timestamp)) %>
- +
<%= h name %>