canvas_sync 0.23.5 → 0.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (205) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +2 -4
  3. data/lib/canvas_sync/version.rb +1 -1
  4. data/lib/canvas_sync.rb +6 -4
  5. data/spec/canvas_sync/canvas_sync_spec.rb +11 -11
  6. data/spec/canvas_sync/live_events/process_event_job_spec.rb +1 -0
  7. data/spec/{dummy → internal}/app/models/application_record.rb +1 -0
  8. data/spec/{dummy → internal}/app/models/content_migration.rb +0 -0
  9. data/spec/{dummy → internal}/app/models/course.rb +0 -1
  10. data/spec/{dummy → internal}/app/models/course_nickname.rb +0 -0
  11. data/spec/{dummy → internal}/app/models/learning_outcome.rb +0 -0
  12. data/spec/{dummy → internal}/app/services/live_events/assignment_event.rb +0 -0
  13. data/spec/{dummy → internal}/app/services/live_events/course_event.rb +0 -0
  14. data/spec/{dummy → internal}/app/services/live_events/course_section_event.rb +0 -0
  15. data/spec/{dummy → internal}/app/services/live_events/enrollment_event.rb +0 -0
  16. data/spec/{dummy → internal}/app/services/live_events/grade_event.rb +0 -0
  17. data/spec/{dummy → internal}/app/services/live_events/module_event.rb +0 -0
  18. data/spec/{dummy → internal}/app/services/live_events/module_item_event.rb +0 -0
  19. data/spec/{dummy → internal}/app/services/live_events/submission_event.rb +0 -0
  20. data/spec/{dummy → internal}/app/services/live_events/syllabus_event.rb +0 -0
  21. data/spec/{dummy → internal}/app/services/live_events/user_event.rb +0 -0
  22. data/spec/internal/bin/rails +9 -0
  23. data/spec/internal/config/database.yml +5 -0
  24. data/spec/internal/config/routes.rb +5 -0
  25. data/spec/internal/config/storage.yml +3 -0
  26. data/spec/{dummy/db/migrate/20220926221926_create_users.rb → internal/db/migrate/20250912205136_create_users.rb} +0 -0
  27. data/spec/{dummy/db/migrate/20201016181346_create_pseudonyms.rb → internal/db/migrate/20250912205137_create_pseudonyms.rb} +0 -0
  28. data/spec/{dummy/db/migrate/20200415171620_create_groups.rb → internal/db/migrate/20250912205139_create_groups.rb} +0 -0
  29. data/spec/{dummy/db/migrate/20200416214248_create_group_memberships.rb → internal/db/migrate/20250912205140_create_group_memberships.rb} +0 -0
  30. data/spec/{dummy/db/migrate/20190702203622_create_accounts.rb → internal/db/migrate/20250912205141_create_accounts.rb} +0 -0
  31. data/spec/{dummy/db/migrate/20190702203623_create_terms.rb → internal/db/migrate/20250912205142_create_terms.rb} +0 -0
  32. data/spec/{dummy/db/migrate/20190702203625_create_sections.rb → internal/db/migrate/20250912205144_create_sections.rb} +0 -0
  33. data/spec/{dummy/db/migrate/20190702203626_create_assignments.rb → internal/db/migrate/20250912205145_create_assignments.rb} +0 -0
  34. data/spec/{dummy/db/migrate/20190702203627_create_submissions.rb → internal/db/migrate/20250912205146_create_submissions.rb} +0 -0
  35. data/spec/{dummy/db/migrate/20190927204545_create_roles.rb → internal/db/migrate/20250912205147_create_roles.rb} +2 -2
  36. data/spec/{dummy/db/migrate/20190927204546_create_admins.rb → internal/db/migrate/20250912205148_create_admins.rb} +0 -0
  37. data/spec/{dummy/db/migrate/20190702203630_create_assignment_groups.rb → internal/db/migrate/20250912205149_create_assignment_groups.rb} +0 -0
  38. data/spec/{dummy/db/migrate/20190702203631_create_context_modules.rb → internal/db/migrate/20250912205150_create_context_modules.rb} +0 -0
  39. data/spec/{dummy/db/migrate/20190702203632_create_context_module_items.rb → internal/db/migrate/20250912205151_create_context_module_items.rb} +0 -0
  40. data/spec/{dummy/db/migrate/20210907233329_create_user_observers.rb → internal/db/migrate/20250912205152_create_user_observers.rb} +0 -0
  41. data/spec/{dummy/db/migrate/20210907233330_create_grading_periods.rb → internal/db/migrate/20250912205153_create_grading_periods.rb} +0 -0
  42. data/spec/{dummy/db/migrate/20211001184920_create_grading_period_groups.rb → internal/db/migrate/20250912205154_create_grading_period_groups.rb} +0 -0
  43. data/spec/{dummy/db/migrate/20220308072643_create_content_migrations.rb → internal/db/migrate/20250912205155_create_content_migrations.rb} +0 -0
  44. data/spec/{dummy/db/migrate/20220712210559_create_learning_outcomes.rb → internal/db/migrate/20250912205156_create_learning_outcomes.rb} +0 -0
  45. data/spec/{dummy/db/migrate/20240523101010_create_learning_outcome_results.rb → internal/db/migrate/20250912205157_create_learning_outcome_results.rb} +0 -0
  46. data/spec/{dummy/db/migrate/20240510094100_create_rubric_associations.rb → internal/db/migrate/20250912205160_create_rubric_associations.rb} +0 -0
  47. data/spec/{dummy/db/migrate/20240510101100_create_rubric_assessments.rb → internal/db/migrate/20250912205161_create_rubric_assessments.rb} +0 -0
  48. data/spec/{dummy/db/migrate/20240828161300_create_course_progresses.rb → internal/db/migrate/20250912205162_create_course_progresses.rb} +0 -0
  49. data/spec/internal/db/schema.rb +6 -0
  50. data/spec/spec_helper.rb +8 -4
  51. metadata +182 -372
  52. data/lib/canvas_sync/job_batches/batch.rb +0 -595
  53. data/lib/canvas_sync/job_batches/callback.rb +0 -135
  54. data/lib/canvas_sync/job_batches/chain_builder.rb +0 -247
  55. data/lib/canvas_sync/job_batches/compat/active_job.rb +0 -108
  56. data/lib/canvas_sync/job_batches/compat/sidekiq/web/batches_assets/css/styles.less +0 -182
  57. data/lib/canvas_sync/job_batches/compat/sidekiq/web/batches_assets/js/batch_tree.js +0 -108
  58. data/lib/canvas_sync/job_batches/compat/sidekiq/web/batches_assets/js/util.js +0 -2
  59. data/lib/canvas_sync/job_batches/compat/sidekiq/web/helpers.rb +0 -41
  60. data/lib/canvas_sync/job_batches/compat/sidekiq/web/views/_batch_tree.erb +0 -6
  61. data/lib/canvas_sync/job_batches/compat/sidekiq/web/views/_batches_table.erb +0 -44
  62. data/lib/canvas_sync/job_batches/compat/sidekiq/web/views/_common.erb +0 -13
  63. data/lib/canvas_sync/job_batches/compat/sidekiq/web/views/_jobs_table.erb +0 -21
  64. data/lib/canvas_sync/job_batches/compat/sidekiq/web/views/_pagination.erb +0 -26
  65. data/lib/canvas_sync/job_batches/compat/sidekiq/web/views/batch.erb +0 -81
  66. data/lib/canvas_sync/job_batches/compat/sidekiq/web/views/batches.erb +0 -23
  67. data/lib/canvas_sync/job_batches/compat/sidekiq/web/views/pool.erb +0 -137
  68. data/lib/canvas_sync/job_batches/compat/sidekiq/web/views/pools.erb +0 -47
  69. data/lib/canvas_sync/job_batches/compat/sidekiq/web.rb +0 -218
  70. data/lib/canvas_sync/job_batches/compat/sidekiq.rb +0 -149
  71. data/lib/canvas_sync/job_batches/compat.rb +0 -20
  72. data/lib/canvas_sync/job_batches/context_hash.rb +0 -157
  73. data/lib/canvas_sync/job_batches/hier_batch_ids.lua +0 -25
  74. data/lib/canvas_sync/job_batches/jobs/base_job.rb +0 -5
  75. data/lib/canvas_sync/job_batches/jobs/concurrent_batch_job.rb +0 -20
  76. data/lib/canvas_sync/job_batches/jobs/managed_batch_job.rb +0 -175
  77. data/lib/canvas_sync/job_batches/jobs/serial_batch_job.rb +0 -20
  78. data/lib/canvas_sync/job_batches/pool.rb +0 -254
  79. data/lib/canvas_sync/job_batches/pool_refill.lua +0 -47
  80. data/lib/canvas_sync/job_batches/redis_model.rb +0 -67
  81. data/lib/canvas_sync/job_batches/redis_script.rb +0 -161
  82. data/lib/canvas_sync/job_batches/schedule_callback.lua +0 -14
  83. data/lib/canvas_sync/job_batches/status.rb +0 -89
  84. data/lib/canvas_sync/job_uniqueness/compat/active_job.rb +0 -75
  85. data/lib/canvas_sync/job_uniqueness/compat/sidekiq.rb +0 -135
  86. data/lib/canvas_sync/job_uniqueness/compat.rb +0 -20
  87. data/lib/canvas_sync/job_uniqueness/configuration.rb +0 -25
  88. data/lib/canvas_sync/job_uniqueness/job_uniqueness.rb +0 -47
  89. data/lib/canvas_sync/job_uniqueness/lock_context.rb +0 -199
  90. data/lib/canvas_sync/job_uniqueness/locksmith.rb +0 -92
  91. data/lib/canvas_sync/job_uniqueness/on_conflict/base.rb +0 -32
  92. data/lib/canvas_sync/job_uniqueness/on_conflict/log.rb +0 -13
  93. data/lib/canvas_sync/job_uniqueness/on_conflict/null_strategy.rb +0 -9
  94. data/lib/canvas_sync/job_uniqueness/on_conflict/raise.rb +0 -11
  95. data/lib/canvas_sync/job_uniqueness/on_conflict/reject.rb +0 -21
  96. data/lib/canvas_sync/job_uniqueness/on_conflict/reschedule.rb +0 -20
  97. data/lib/canvas_sync/job_uniqueness/on_conflict.rb +0 -62
  98. data/lib/canvas_sync/job_uniqueness/strategy/base.rb +0 -107
  99. data/lib/canvas_sync/job_uniqueness/strategy/until_and_while_executing.rb +0 -35
  100. data/lib/canvas_sync/job_uniqueness/strategy/until_executed.rb +0 -20
  101. data/lib/canvas_sync/job_uniqueness/strategy/until_executing.rb +0 -20
  102. data/lib/canvas_sync/job_uniqueness/strategy/until_expired.rb +0 -16
  103. data/lib/canvas_sync/job_uniqueness/strategy/while_executing.rb +0 -26
  104. data/lib/canvas_sync/job_uniqueness/strategy.rb +0 -27
  105. data/lib/canvas_sync/job_uniqueness/unique_job_common.rb +0 -79
  106. data/spec/dummy/README.rdoc +0 -1
  107. data/spec/dummy/Rakefile +0 -6
  108. data/spec/dummy/app/services/live_events/assignment_created_event.rb +0 -12
  109. data/spec/dummy/app/services/live_events/assignment_updated_event.rb +0 -12
  110. data/spec/dummy/app/services/live_events/base_event.rb +0 -52
  111. data/spec/dummy/app/services/live_events/course_created_event.rb +0 -12
  112. data/spec/dummy/app/services/live_events/course_section_created_event.rb +0 -12
  113. data/spec/dummy/app/services/live_events/course_section_updated_event.rb +0 -12
  114. data/spec/dummy/app/services/live_events/course_updated_event.rb +0 -12
  115. data/spec/dummy/app/services/live_events/enrollment_created_event.rb +0 -12
  116. data/spec/dummy/app/services/live_events/enrollment_updated_event.rb +0 -12
  117. data/spec/dummy/app/services/live_events/grade_changed_event.rb +0 -12
  118. data/spec/dummy/app/services/live_events/module_created_event.rb +0 -12
  119. data/spec/dummy/app/services/live_events/module_item_created_event.rb +0 -12
  120. data/spec/dummy/app/services/live_events/module_item_updated_event.rb +0 -12
  121. data/spec/dummy/app/services/live_events/module_updated_event.rb +0 -12
  122. data/spec/dummy/app/services/live_events/submission_created_event.rb +0 -12
  123. data/spec/dummy/app/services/live_events/submission_updated_event.rb +0 -12
  124. data/spec/dummy/app/services/live_events/syllabus_updated_event.rb +0 -12
  125. data/spec/dummy/app/services/live_events/user_created_event.rb +0 -12
  126. data/spec/dummy/app/services/live_events/user_updated_event.rb +0 -12
  127. data/spec/dummy/bin/rails +0 -4
  128. data/spec/dummy/config/application.rb +0 -39
  129. data/spec/dummy/config/boot.rb +0 -5
  130. data/spec/dummy/config/database.yml +0 -25
  131. data/spec/dummy/config/environment.rb +0 -5
  132. data/spec/dummy/config/environments/development.rb +0 -41
  133. data/spec/dummy/config/environments/test.rb +0 -44
  134. data/spec/dummy/config/initializers/assets.rb +0 -11
  135. data/spec/dummy/config/initializers/session_store.rb +0 -3
  136. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -14
  137. data/spec/dummy/config/routes.rb +0 -3
  138. data/spec/dummy/config/secrets.yml +0 -22
  139. data/spec/dummy/config.ru +0 -4
  140. data/spec/dummy/db/schema.rb +0 -563
  141. data/spec/job_batching/batch_spec.rb +0 -531
  142. data/spec/job_batching/callback_spec.rb +0 -38
  143. data/spec/job_batching/compat/active_job_spec.rb +0 -107
  144. data/spec/job_batching/compat/sidekiq_spec.rb +0 -127
  145. data/spec/job_batching/context_hash_spec.rb +0 -54
  146. data/spec/job_batching/flow_spec.rb +0 -82
  147. data/spec/job_batching/integration/fail_then_succeed.rb +0 -42
  148. data/spec/job_batching/integration/integration.rb +0 -57
  149. data/spec/job_batching/integration/nested.rb +0 -88
  150. data/spec/job_batching/integration/simple.rb +0 -47
  151. data/spec/job_batching/integration/workflow.rb +0 -134
  152. data/spec/job_batching/integration_helper.rb +0 -50
  153. data/spec/job_batching/pool_spec.rb +0 -161
  154. data/spec/job_batching/status_spec.rb +0 -76
  155. data/spec/job_batching/support/base_job.rb +0 -14
  156. data/spec/job_batching/support/sample_callback.rb +0 -2
  157. data/spec/job_uniqueness/compat/active_job_spec.rb +0 -49
  158. data/spec/job_uniqueness/compat/sidekiq_spec.rb +0 -68
  159. data/spec/job_uniqueness/lock_context_spec.rb +0 -106
  160. data/spec/job_uniqueness/on_conflict/log_spec.rb +0 -11
  161. data/spec/job_uniqueness/on_conflict/raise_spec.rb +0 -10
  162. data/spec/job_uniqueness/on_conflict/reschedule_spec.rb +0 -63
  163. data/spec/job_uniqueness/on_conflict_spec.rb +0 -16
  164. data/spec/job_uniqueness/spec_helper.rb +0 -17
  165. data/spec/job_uniqueness/strategy/base_spec.rb +0 -100
  166. data/spec/job_uniqueness/strategy/until_and_while_executing_spec.rb +0 -48
  167. data/spec/job_uniqueness/strategy/until_executed_spec.rb +0 -23
  168. data/spec/job_uniqueness/strategy/until_executing_spec.rb +0 -23
  169. data/spec/job_uniqueness/strategy/until_expired_spec.rb +0 -23
  170. data/spec/job_uniqueness/strategy/while_executing_spec.rb +0 -33
  171. data/spec/job_uniqueness/support/lock_strategy.rb +0 -28
  172. data/spec/job_uniqueness/support/on_conflict.rb +0 -24
  173. data/spec/job_uniqueness/support/test_worker.rb +0 -19
  174. data/spec/job_uniqueness/unique_job_common_spec.rb +0 -45
  175. /data/spec/{dummy → internal}/app/models/account.rb +0 -0
  176. /data/spec/{dummy → internal}/app/models/admin.rb +0 -0
  177. /data/spec/{dummy → internal}/app/models/assignment.rb +0 -0
  178. /data/spec/{dummy → internal}/app/models/assignment_group.rb +0 -0
  179. /data/spec/{dummy → internal}/app/models/assignment_override.rb +0 -0
  180. /data/spec/{dummy → internal}/app/models/context_module.rb +0 -0
  181. /data/spec/{dummy → internal}/app/models/context_module_item.rb +0 -0
  182. /data/spec/{dummy → internal}/app/models/course_progress.rb +0 -0
  183. /data/spec/{dummy → internal}/app/models/enrollment.rb +0 -0
  184. /data/spec/{dummy → internal}/app/models/grading_period.rb +0 -0
  185. /data/spec/{dummy → internal}/app/models/grading_period_group.rb +0 -0
  186. /data/spec/{dummy → internal}/app/models/group.rb +0 -0
  187. /data/spec/{dummy → internal}/app/models/group_membership.rb +0 -0
  188. /data/spec/{dummy → internal}/app/models/learning_outcome_result.rb +0 -0
  189. /data/spec/{dummy → internal}/app/models/pseudonym.rb +0 -0
  190. /data/spec/{dummy → internal}/app/models/role.rb +0 -0
  191. /data/spec/{dummy → internal}/app/models/rubric.rb +0 -0
  192. /data/spec/{dummy → internal}/app/models/rubric_assessment.rb +0 -0
  193. /data/spec/{dummy → internal}/app/models/rubric_association.rb +0 -0
  194. /data/spec/{dummy → internal}/app/models/score.rb +0 -0
  195. /data/spec/{dummy → internal}/app/models/section.rb +0 -0
  196. /data/spec/{dummy → internal}/app/models/submission.rb +0 -0
  197. /data/spec/{dummy → internal}/app/models/term.rb +0 -0
  198. /data/spec/{dummy → internal}/app/models/user.rb +0 -0
  199. /data/spec/{dummy → internal}/app/models/user_observer.rb +0 -0
  200. /data/spec/{dummy/db/migrate/20190702203621_create_courses.rb → internal/db/migrate/20250912205138_create_courses.rb} +0 -0
  201. /data/spec/{dummy/db/migrate/20190702203624_create_enrollments.rb → internal/db/migrate/20250912205143_create_enrollments.rb} +0 -0
  202. /data/spec/{dummy/db/migrate/20250319194134_create_course_nicknames.rb → internal/db/migrate/20250912205158_create_course_nicknames.rb} +0 -0
  203. /data/spec/{dummy/db/migrate/20250319194135_create_rubrics.rb → internal/db/migrate/20250912205159_create_rubrics.rb} +0 -0
  204. /data/spec/{dummy/db/migrate/20241223080202_create_assignment_overrides.rb → internal/db/migrate/20250912205163_create_assignment_overrides.rb} +0 -0
  205. /data/spec/{dummy/db/migrate/20250626194330_create_scores.rb → internal/db/migrate/20250912205164_create_scores.rb} +0 -0
@@ -1,127 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe CanvasSync::JobBatches::Compat::Sidekiq do
4
- describe CanvasSync::JobBatches::Compat::Sidekiq::ServerMiddleware do
5
- context 'when without batch' do
6
- it 'just yields' do
7
- yielded = false
8
- expect(CanvasSync::JobBatches::Batch).not_to receive(:process_successful_job)
9
- expect(CanvasSync::JobBatches::Batch).not_to receive(:process_failed_job)
10
- subject.call(nil, {}, nil) { yielded = true }
11
- expect(yielded).to be_truthy
12
- end
13
- end
14
-
15
- context 'when in batch' do
16
- let(:bid) { 'SAMPLEBID' }
17
- let(:jid) { 'SAMPLEJID' }
18
-
19
- context 'when successful' do
20
- it 'yields' do
21
- yielded = false
22
- subject.call(nil, { 'bid' => bid, 'jid' => jid }, nil) { yielded = true }
23
- expect(yielded).to be_truthy
24
- end
25
-
26
- it 'calls process_successful_job' do
27
- expect(CanvasSync::JobBatches::Batch).to receive(:process_successful_job).with(bid, nil)
28
- subject.call(nil, { 'bid' => bid }, nil) {}
29
- end
30
- end
31
-
32
- context 'when failed' do
33
- it 'calls process_failed_job and reraises exception' do
34
- reraised = false
35
- expect(CanvasSync::JobBatches::Batch).to receive(:process_failed_job)
36
- begin
37
- subject.call(nil, { 'bid' => bid }, nil) { raise 'ERR' }
38
- rescue
39
- reraised = true
40
- end
41
- expect(reraised).to be_truthy
42
- end
43
- end
44
- end
45
- end
46
-
47
- describe CanvasSync::JobBatches::Compat::Sidekiq::ClientMiddleware do
48
- context 'when without batch' do
49
- it 'just yields' do
50
- yielded = false
51
- expect(CanvasSync::JobBatches::Batch).not_to receive(:append_jobs)
52
- subject.call(nil, {}, nil) { yielded = true }
53
- expect(yielded).to be_truthy
54
- end
55
- end
56
-
57
- context 'when in batch' do
58
- let(:bid) { 'SAMPLEBID' }
59
- let(:jid) { 'SAMPLEJID' }
60
- before { Thread.current[CanvasSync::JobBatches::CURRENT_BATCH_THREAD_KEY] = CanvasSync::JobBatches::Batch.new(bid) }
61
- after { Thread.current[CanvasSync::JobBatches::CURRENT_BATCH_THREAD_KEY] = nil }
62
-
63
- it 'yields' do
64
- yielded = false
65
- subject.call(nil, { 'jid' => jid }, nil) { yielded = true }
66
- expect(yielded).to be_truthy
67
- end
68
-
69
- it 'increments job queue' do
70
- # expect(CanvasSync::JobBatches::Batch).to receive(:append_jobs).with(bid)
71
- # subject.call(nil, { 'jid' => jid }, nil) {}
72
- end
73
-
74
- it 'assigns bid to msg' do
75
- msg = { 'jid' => jid }
76
- subject.call(nil, msg, nil) {}
77
- expect(msg['bid']).to eq(bid)
78
- end
79
- end
80
- end
81
- end
82
-
83
- RSpec.describe CanvasSync::JobBatches::Compat::Sidekiq do
84
- let(:config) { defined?(Sidekiq::Config) ? double(Sidekiq::Config) : class_double(Sidekiq) }
85
- let(:client_middleware) { double(Sidekiq::Middleware::Chain) }
86
-
87
- context 'client' do
88
- it 'adds client middleware' do
89
- allow(Sidekiq).to receive(:configure_client).and_yield(config)
90
- expect(config).to receive(:client_middleware).and_yield(client_middleware)
91
- expect(client_middleware).to receive(:add).with(CanvasSync::JobBatches::Compat::Sidekiq::ClientMiddleware)
92
- CanvasSync::JobBatches::Compat::Sidekiq.instance_variable_set(:@already_configured, false)
93
- CanvasSync::JobBatches::Compat::Sidekiq.configure
94
- end
95
- end
96
-
97
- context 'server' do
98
- let(:server_middleware) { double(Sidekiq::Middleware::Chain) }
99
- let(:death_handlers) { double(Array) }
100
-
101
- it 'adds client and server middleware' do
102
- allow(Sidekiq).to receive(:configure_server).and_yield(config)
103
- expect(config).to receive(:client_middleware).and_yield(client_middleware)
104
- expect(config).to receive(:server_middleware).and_yield(server_middleware)
105
- expect(config).to receive(:death_handlers).and_return(death_handlers)
106
- expect(client_middleware).to receive(:add).with(CanvasSync::JobBatches::Compat::Sidekiq::ClientMiddleware)
107
- expect(server_middleware).to receive(:add).with(CanvasSync::JobBatches::Compat::Sidekiq::ServerMiddleware)
108
- expect(death_handlers).to receive(:<<)
109
- CanvasSync::JobBatches::Compat::Sidekiq.instance_variable_set(:@already_configured, false)
110
- CanvasSync::JobBatches::Compat::Sidekiq.configure
111
- end
112
- end
113
-
114
- context 'worker' do
115
- it 'defines method bid' do
116
- expect(Sidekiq::Worker.instance_methods).to include(:bid)
117
- end
118
-
119
- it 'defines method batch' do
120
- expect(Sidekiq::Worker.instance_methods).to include(:batch)
121
- end
122
-
123
- it 'defines method valid_within_batch?' do
124
- expect(Sidekiq::Worker.instance_methods).to include(:valid_within_batch?)
125
- end
126
- end
127
- end
@@ -1,54 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe CanvasSync::JobBatches::ContextHash do
4
-
5
- class ContextedJob < BatchTestJobBase
6
- def perform
7
- was_performed(batch_context.flatten)
8
- end
9
-
10
- def was_performed(*args); end
11
-
12
- def self.callback_perform(*args)
13
- perform_later
14
- end
15
- end
16
-
17
- it "works with first-level jobs" do
18
- ActiveJob::Base.queue_adapter = :sidekiq
19
- b = CanvasSync::JobBatches::Batch.new
20
- b.context = { hello: 'world' }
21
- expect_any_instance_of(ContextedJob).to receive(:was_performed).with({ 'hello' => 'world' })
22
- b.jobs do
23
- ContextedJob.perform_later
24
- end
25
- Sidekiq::Worker.drain_all
26
- end
27
-
28
- it "works with nested-batch jobs" do
29
- ActiveJob::Base.queue_adapter = :sidekiq
30
- b = CanvasSync::JobBatches::Batch.new
31
- b.context = { hello: 'world', foo: 'bar' }
32
- expect_any_instance_of(ContextedJob).to receive(:was_performed).with({ 'hello' => 'world', 'foo' => 'baz', 'some' => 'other' })
33
- b.jobs do
34
- b2 = CanvasSync::JobBatches::Batch.new
35
- b2.context = { some: 'other', foo: 'baz' }
36
- b2.jobs do
37
- ContextedJob.perform_later
38
- end
39
- end
40
- Sidekiq::Worker.drain_all
41
- end
42
-
43
- it 'works with a callback batch' do
44
- ActiveJob::Base.queue_adapter = :sidekiq
45
- b = CanvasSync::JobBatches::Batch.new
46
- b.context = { hello: 'world' }
47
- b.on(:success, "ContextedJob.callback_perform")
48
- expect_any_instance_of(ContextedJob).to receive(:was_performed).with({ 'hello' => 'world' })
49
- b.jobs do
50
- BatchTestJobBase.perform_later
51
- end
52
- Sidekiq::Worker.drain_all
53
- end
54
- end
@@ -1,82 +0,0 @@
1
- require 'spec_helper'
2
-
3
- class WorkerA < BatchTestJobBase
4
- def perform
5
- end
6
- end
7
-
8
- class WorkerB < BatchTestJobBase
9
- def perform
10
- end
11
- end
12
-
13
- class WorkerC < BatchTestJobBase
14
- def perform
15
- end
16
- end
17
-
18
- RSpec.describe 'Batch flow' do
19
- context 'when handling a batch' do
20
- let(:batch) { CanvasSync::JobBatches::Batch.new }
21
- before { batch.on(:complete, SampleCallback, :id => 42) }
22
- before { batch.description = 'describing the batch' }
23
- let(:status) { CanvasSync::JobBatches::Batch::Status.new(batch.bid) }
24
- let(:queue) { Sidekiq::Queue.new }
25
-
26
- it 'correctly initializes' do
27
- expect(batch.bid).not_to be_nil
28
- expect(batch.description).to eq('describing the batch')
29
-
30
- batch.jobs do
31
- 3.times do
32
- BatchTestWorker.perform_async
33
- end
34
- end
35
-
36
- expect(status.pending).to eq(3)
37
- expect(status.failures).to eq(0)
38
- expect(status.complete?).to be false
39
- expect(status.created_at).not_to be_nil
40
- expect(status.bid).to eq(batch.bid)
41
- end
42
- end
43
-
44
- context 'when handling a nested batch' do
45
- let(:batchA) { CanvasSync::JobBatches::Batch.new }
46
- let(:batchB) { CanvasSync::JobBatches::Batch.new }
47
- let(:batchC) { CanvasSync::JobBatches::Batch.new(batchA.bid) }
48
- let(:batchD) { CanvasSync::JobBatches::Batch.new }
49
- let(:jids) { [] }
50
- let(:parent) { batchA.bid }
51
- let(:children) { [] }
52
-
53
- it 'handles a basic nested batch' do
54
- batchA.jobs do
55
- jids << WorkerA.perform_async
56
- batchB.jobs do
57
- jids << WorkerB.perform_async
58
- end
59
- jids << WorkerA.perform_async
60
- children << batchB.bid
61
- end
62
-
63
- batchC.jobs do
64
- batchD.jobs do
65
- jids << WorkerC.perform_async
66
- end
67
- children << batchD.bid
68
- end
69
-
70
- expect(jids.size).to eq(4)
71
- expect(CanvasSync::JobBatches::Batch::Status.new(parent).child_count).to eq(2)
72
- children.each do |kid|
73
- status = CanvasSync::JobBatches::Batch::Status.new(kid)
74
- expect(status.child_count).to eq(0)
75
- expect(status.pending).to eq(1)
76
- expect(status.parent_bid).to eq(parent)
77
- end
78
-
79
- end
80
-
81
- end
82
- end
@@ -1,42 +0,0 @@
1
- require_relative '../integration_helper'
2
-
3
- # Workflow when a Job fails, retries, and then succeeds
4
-
5
- class Worker1
6
- include Sidekiq::Worker
7
- sidekiq_options retry: 5
8
-
9
- @@failed = false
10
-
11
- def perform
12
- Sidekiq.logger.info "Work 1"
13
-
14
- unless @@failed
15
- @@failed = true
16
- raise "One Failure"
17
- end
18
- end
19
- end
20
-
21
- class MyCallback
22
- def on_success(status, options)
23
- Sidekiq.logger.info "Overall Success #{options} #{status.data}"
24
- end
25
- alias_method :multi, :on_success
26
-
27
- def on_complete(status, options)
28
- Sidekiq.logger.info "Overall Complete #{options} #{status.data}"
29
- end
30
- end
31
-
32
- overall = CanvasSync::JobBatches::Batch.new
33
- overall.on(:success, MyCallback, to: 'success@gmail.com')
34
- overall.on(:complete, MyCallback, to: 'success@gmail.com')
35
- overall.jobs do
36
- Worker1.perform_async
37
- end
38
-
39
- puts "Overall bid #{overall.bid}"
40
-
41
- output, keys = process_tests
42
- overall_tests(output, keys, file: __FILE__)
@@ -1,57 +0,0 @@
1
- require 'integration_helper'
2
-
3
- # Simple test of adding jobs to the current batch
4
- # Batches:
5
- # - Overall (TestWoker) + Another worker
6
-
7
- class AnotherWorker
8
- include Sidekiq::Worker
9
-
10
- def perform
11
- Sidekiq.logger.info "Another Worker"
12
- end
13
- end
14
-
15
- class TestWorker
16
- include Sidekiq::Worker
17
-
18
- def perform
19
- Sidekiq.logger.info "Test Worker"
20
- if bid
21
- batch.jobs do
22
- AnotherWorker.perform_async
23
- end
24
- end
25
- end
26
- end
27
-
28
- class MyCallback
29
- def on_success(status, options)
30
- Sidekiq.logger.info "Success #{options} #{status.data}"
31
- end
32
- alias_method :multi, :on_success
33
-
34
- def on_complete(status, options)
35
- Sidekiq.logger.info "Complete #{options} #{status.data}"
36
- end
37
- end
38
-
39
- batch = CanvasSync::JobBatches::Batch.new
40
- batch.description = 'Test batch'
41
- batch.callback_queue = :default
42
- batch.on(:success, 'MyCallback#on_success', to: 'success@gmail.com')
43
- batch.on(:success, 'MyCallback#multi', to: 'success@gmail.com')
44
- batch.on(:complete, MyCallback, to: 'complete@gmail.com')
45
-
46
- batch.jobs do
47
- 10.times do
48
- TestWorker.perform_async
49
- end
50
- end
51
- puts CanvasSync::JobBatches::Batch::Status.new(batch.bid).data
52
-
53
- dump_redis_keys
54
-
55
- Sidekiq::Worker.drain_all
56
-
57
- dump_redis_keys
@@ -1,88 +0,0 @@
1
- require 'integration_helper'
2
-
3
- # Tests deep nesting of batches
4
- # Batches:
5
- # - Overall (Worker 1)
6
- # - Worker 2
7
- # - Worker 3
8
- # - Worker 4
9
-
10
- class Worker1
11
- include Sidekiq::Worker
12
-
13
- def perform
14
- Sidekiq.logger.info "Work1"
15
- batch = CanvasSync::JobBatches::Batch.new
16
- batch.on(:success, Worker2)
17
- batch.jobs do
18
- Worker2.perform_async
19
- end
20
- end
21
- end
22
-
23
- class Worker2
24
- include Sidekiq::Worker
25
-
26
- def perform
27
- Sidekiq.logger.info "Work2"
28
- batch = CanvasSync::JobBatches::Batch.new
29
- batch.on(:success, Worker3)
30
- batch.jobs do
31
- Worker3.perform_async
32
- end
33
- end
34
-
35
- def on_success status, opts
36
- Sidekiq.logger.info "Worker 2 Success"
37
- end
38
- end
39
-
40
- class Worker3
41
- include Sidekiq::Worker
42
-
43
- def perform
44
- Sidekiq.logger.info "Work3"
45
- batch = CanvasSync::JobBatches::Batch.new
46
- batch.on(:success, Worker4)
47
- batch.jobs do
48
- Worker4.perform_async
49
- end
50
- end
51
-
52
- def on_success status, opts
53
- Sidekiq.logger.info "Worker 3 Success"
54
- end
55
- end
56
-
57
- class Worker4
58
- include Sidekiq::Worker
59
-
60
- def perform
61
- Sidekiq.logger.info "Work4"
62
- end
63
-
64
- def on_success status, opts
65
- Sidekiq.logger.info "Worker 4 Success"
66
- end
67
- end
68
-
69
-
70
- class SomeClass
71
- def on_complete(status, options)
72
- Sidekiq.logger.info "Overall Complete #{options} #{status.data}"
73
- end
74
- def on_success(status, options)
75
- Sidekiq.logger.info "Overall Success #{options} #{status.data}"
76
- end
77
- end
78
- batch = CanvasSync::JobBatches::Batch.new
79
- batch.on(:success, SomeClass, 'uid' => 3)
80
- batch.on(:complete, SomeClass, 'uid' => 3)
81
- batch.jobs do
82
- Worker1.perform_async
83
- end
84
-
85
- puts "Overall bid #{batch.bid}"
86
-
87
- output, keys = process_tests
88
- overall_tests output, keys
@@ -1,47 +0,0 @@
1
- require 'integration_helper'
2
-
3
- # Simple nested batch without callbacks
4
- # Batches:
5
- # - Overall (Worker1)
6
- # - Worker2
7
-
8
- class Worker1
9
- include Sidekiq::Worker
10
-
11
- def perform
12
- Sidekiq.logger.info "Work1"
13
- batch = CanvasSync::JobBatches::Batch.new
14
- batch.jobs do
15
- Worker2.perform_async
16
- end
17
- end
18
- end
19
-
20
- class Worker2
21
- include Sidekiq::Worker
22
-
23
- def perform
24
- Sidekiq.logger.info "Work2"
25
- end
26
- end
27
-
28
- class SomeClass
29
- def on_complete(status, options)
30
- Sidekiq.logger.info "Overall Complete #{options} #{status.data}"
31
- end
32
- def on_success(status, options)
33
- Sidekiq.logger.info "Overall Success #{options} #{status.data}"
34
- end
35
- end
36
-
37
- batch = CanvasSync::JobBatches::Batch.new
38
- batch.on(:success, SomeClass)
39
- batch.on(:complete, SomeClass)
40
- batch.jobs do
41
- Worker1.perform_async
42
- end
43
-
44
- puts "Overall bid #{batch.bid}"
45
-
46
- output, keys = process_tests
47
- overall_tests output, keys
@@ -1,134 +0,0 @@
1
- require 'integration_helper'
2
-
3
- # Complex workflow with sequential and nested
4
- # Also test sub batches without callbacks
5
- # Batches:
6
- # - Overall
7
- # - Worker1
8
- # - Worker3
9
- # - Worker2 + Worker3
10
- # - Worker1
11
- # - Worker3
12
- # - Worker4
13
- # - Worker5
14
-
15
- class Callbacks
16
- def worker1 status, opts
17
- Sidekiq.logger.info "Success 1 #{status.data}"
18
-
19
- overall = CanvasSync::JobBatches::Batch.new status.parent_bid
20
- overall.jobs do
21
- batch = CanvasSync::JobBatches::Batch.new
22
- batch.on(:success, "Callbacks#worker2")
23
- batch.jobs do
24
- Worker2.perform_async
25
- end
26
- end
27
- end
28
-
29
- def worker2 status, opts
30
- Sidekiq.logger.info "Success 2 #{status.data}"
31
- overall = CanvasSync::JobBatches::Batch.new status.parent_bid
32
- overall.jobs do
33
- batch = CanvasSync::JobBatches::Batch.new
34
- batch.on(:success, "Callbacks#worker4")
35
- batch.jobs do
36
- Worker4.perform_async
37
- end
38
- end
39
-
40
- end
41
-
42
- def worker4 status, opts
43
- Sidekiq.logger.info "Success 4 #{status.data}"
44
- overall = CanvasSync::JobBatches::Batch.new status.parent_bid
45
- overall.jobs do
46
- batch = CanvasSync::JobBatches::Batch.new
47
- batch.on(:success, "Callbacks#worker5")
48
- batch.jobs do
49
- Worker5.perform_async
50
- end
51
- end
52
- end
53
-
54
- def worker5 status, opts
55
- Sidekiq.logger.info "Success 5 #{status.data}"
56
- end
57
- end
58
-
59
- class Worker1
60
- include Sidekiq::Worker
61
-
62
- def perform
63
- Sidekiq.logger.info "Work 1"
64
- batch = CanvasSync::JobBatches::Batch.new
65
- batch.jobs do
66
- Worker3.perform_async
67
- end
68
- end
69
- end
70
-
71
- class Worker2
72
- include Sidekiq::Worker
73
-
74
- def perform
75
- Sidekiq.logger.info "Work 2"
76
- if bid
77
- batch.jobs do
78
- Worker3.perform_async
79
- end
80
- newb = CanvasSync::JobBatches::Batch.new
81
- newb.jobs do
82
- Worker1.perform_async
83
- end
84
- end
85
- end
86
- end
87
-
88
- class Worker3
89
- include Sidekiq::Worker
90
- def perform
91
- Sidekiq.logger.info "Work 3"
92
- end
93
- end
94
-
95
- class Worker4
96
- include Sidekiq::Worker
97
- def perform
98
- Sidekiq.logger.info "Work 4"
99
- end
100
- end
101
-
102
- class Worker5
103
- include Sidekiq::Worker
104
- def perform
105
- Sidekiq.logger.info "Work 5"
106
- end
107
- end
108
-
109
- class MyCallback
110
- def on_success(status, options)
111
- Sidekiq.logger.info "Overall Success #{options} #{status.data}"
112
- end
113
- alias_method :multi, :on_success
114
-
115
- def on_complete(status, options)
116
- Sidekiq.logger.info "Overall Complete #{options} #{status.data}"
117
- end
118
- end
119
-
120
- overall = CanvasSync::JobBatches::Batch.new
121
- overall.on(:success, MyCallback, to: 'success@gmail.com')
122
- overall.on(:complete, MyCallback, to: 'success@gmail.com')
123
- overall.jobs do
124
- batch1 = CanvasSync::JobBatches::Batch.new
125
- batch1.on(:success, "Callbacks#worker1")
126
- batch1.jobs do
127
- Worker1.perform_async
128
- end
129
- end
130
-
131
- puts "Overall bid #{overall.bid}"
132
-
133
- output, keys = process_tests
134
- overall_tests output, keys
@@ -1,50 +0,0 @@
1
- require 'spec_helper'
2
- require 'sidekiq/testing'
3
-
4
- Sidekiq::Testing.server_middleware do |chain|
5
- chain.add CanvasSync::JobBatches::Compat::Sidekiq::ServerMiddleware
6
- end
7
-
8
- CanvasSync.redis { |r| r.flushdb }
9
-
10
- def redis_keys
11
- CanvasSync.redis { |r| r.keys('BID-*') }
12
- end
13
-
14
- def dump_redis_keys
15
- puts redis_keys.inspect
16
- end
17
-
18
- def process_tests
19
- out_buf = StringIO.new
20
- Sidekiq.logger = Logger.new out_buf
21
-
22
- # Sidekiq.logger.level = :info
23
-
24
- Sidekiq::Worker.drain_all
25
-
26
- output = out_buf.string
27
- keys = redis_keys
28
- puts out_buf.string
29
-
30
- [output, keys]
31
- end
32
-
33
- def overall_tests(output, keys, file: nil)
34
- test_name = "Batch Integration Test"
35
- test_name = File.basename(file, ".*") if file
36
-
37
- Rspec.describe test_name do
38
- it "runs overall complete callback" do
39
- expect(output).to include "Overall Complete"
40
- end
41
-
42
- it "runs overall success callback" do
43
- expect(output).to include "Overall Success"
44
- end
45
-
46
- it "cleans redis keys" do
47
- expect(keys).to eq([])
48
- end
49
- end
50
- end