scheduler_spec.rb 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. require 'rails_helper'
  2. RSpec.describe Scheduler do
  3. before do
  4. module SpecSpace
  5. class DelayedJobBackend
  6. def self.start
  7. # noop
  8. end
  9. # rubocop:disable Style/TrivialAccessors
  10. def self.reschedule=(reschedule)
  11. @reschedule = reschedule
  12. end
  13. def self.reschedule?(_delayed_job)
  14. @reschedule || false
  15. end
  16. end
  17. end
  18. end
  19. after do
  20. SpecSpace.send(:remove_const, :DelayedJobBackend)
  21. end
  22. describe '.cleanup' do
  23. it 'gets called by .threads' do
  24. expect(described_class).to receive(:cleanup).and_throw(:called)
  25. expect do
  26. described_class.threads
  27. end.to throw_symbol(:called)
  28. end
  29. context 'not called from .threads method' do
  30. it 'throws an exception' do
  31. expect do
  32. described_class.cleanup
  33. end.to raise_error(RuntimeError)
  34. end
  35. it 'throws no exception with force parameter' do
  36. expect do
  37. described_class.cleanup(force: true)
  38. end.not_to raise_error
  39. end
  40. end
  41. # helpers to avoid the throwing behaviour "describe"d above
  42. def simulate_threads_call
  43. threads
  44. end
  45. def threads
  46. described_class.cleanup
  47. end
  48. it 'keeps unlocked Delayed::Job-s' do
  49. # meta :)
  50. described_class.delay.cleanup
  51. expect do
  52. simulate_threads_call
  53. end.not_to change {
  54. Delayed::Job.count
  55. }
  56. end
  57. context 'locked Delayed::Job' do
  58. it 'gets destroyed' do
  59. # meta :)
  60. described_class.delay.cleanup
  61. # lock job (simluates interrupted scheduler task)
  62. locked_job = Delayed::Job.last
  63. locked_job.update_attribute(:locked_at, Time.zone.now)
  64. expect do
  65. simulate_threads_call
  66. end.to change {
  67. Delayed::Job.count
  68. }.by(-1)
  69. end
  70. context 'respond to reschedule?' do
  71. it 'gets rescheduled for positive responses' do
  72. SpecSpace::DelayedJobBackend.reschedule = true
  73. SpecSpace::DelayedJobBackend.delay.start
  74. # lock job (simluates interrupted scheduler task)
  75. locked_job = Delayed::Job.last
  76. locked_job.update_attribute(:locked_at, Time.zone.now)
  77. expect do
  78. simulate_threads_call
  79. end.to not_change {
  80. Delayed::Job.count
  81. }.and change {
  82. Delayed::Job.last.locked_at
  83. }
  84. end
  85. it 'gets destroyed for negative responses' do
  86. SpecSpace::DelayedJobBackend.reschedule = false
  87. SpecSpace::DelayedJobBackend.delay.start
  88. # lock job (simluates interrupted scheduler task)
  89. locked_job = Delayed::Job.last
  90. locked_job.update_attribute(:locked_at, Time.zone.now)
  91. expect do
  92. simulate_threads_call
  93. end.to change {
  94. Delayed::Job.count
  95. }.by(-1)
  96. end
  97. end
  98. end
  99. end
  100. end