diff --git a/app/jobs/order_cycle_open_close_job.rb b/app/jobs/order_cycle_open_close_job.rb new file mode 100644 index 0000000000..78651f8a6b --- /dev/null +++ b/app/jobs/order_cycle_open_close_job.rb @@ -0,0 +1,19 @@ +class OrderCycleOpenCloseJob + def perform + recently_opened_order_cycles.update_all(standing_orders_placed_at: Time.now) + recently_opened_order_cycles.each do |order_cycle| + Delayed::Job.enqueue(StandingOrderPlacementJob.new(order_cycle)) + end + end + + private + + def recently_opened_order_cycles + return @recently_opened_order_cycles unless @recently_opened_order_cycles.nil? + @recently_opened_order_cycles = + OrderCycle.where( + 'orders_open_at BETWEEN (?) AND (?) AND standing_orders_placed_at IS NULL', + 10.minutes.ago, Time.now + ) + end +end diff --git a/spec/jobs/order_cycle_open_close_job_spec.rb b/spec/jobs/order_cycle_open_close_job_spec.rb new file mode 100644 index 0000000000..1034a7d705 --- /dev/null +++ b/spec/jobs/order_cycle_open_close_job_spec.rb @@ -0,0 +1,18 @@ +require 'spec_helper' + +describe OrderCycleOpenCloseJob do + + describe "finding recently opened order cycles" do + let!(:job) { OrderCycleOpenCloseJob.new } + let!(:order_cycle1) { create(:simple_order_cycle, orders_open_at: 11.minutes.ago) } + let!(:order_cycle2) { create(:simple_order_cycle, orders_open_at: 9.minutes.ago) } + let!(:order_cycle3) { create(:simple_order_cycle, orders_open_at: 2.minutes.ago, standing_orders_placed_at: 1.minute.ago ) } + let!(:order_cycle4) { create(:simple_order_cycle, orders_open_at: 1.minute.from_now) } + + it "only returns uninitialized order cycles whose orders_open_at date is within the past 10 minutes" do + order_cycles = job.send(:recently_opened_order_cycles) + expect(order_cycles).to include order_cycle2 + expect(order_cycles).to_not include order_cycle1, order_cycle3, order_cycle4 + end + end +end