@@ -16,6 +16,16 @@ class MultishardingTest < ActiveSupport::TestCase
16
16
end
17
17
end
18
18
19
+ test "shard_selection_lambda can override which shard is used to enqueue individual jobs" do
20
+ shard_selection_lambda = -> ( active_job :, active_jobs :) { :queue_shard_two if active_job . arguments . first == "hey!" }
21
+
22
+ with_shard_selection_lambda ( shard_selection_lambda ) do
23
+ assert_difference -> { connected_to_shard_two { SolidQueue ::Job . count } } , 1 do
24
+ AddToBufferJob . perform_later "hey!"
25
+ end
26
+ end
27
+ end
28
+
19
29
test "jobs are enqueued for later in the right shard" do
20
30
assert_difference -> { SolidQueue ::ScheduledExecution . count } , 1 do
21
31
assert_difference -> { connected_to_shard_two { SolidQueue ::ScheduledExecution . count } } , 1 do
@@ -39,4 +49,31 @@ class MultishardingTest < ActiveSupport::TestCase
39
49
end
40
50
end
41
51
end
52
+
53
+ test "shard_selection_lambda can override which shard is used to enqueue jobs in bulk" do
54
+ active_jobs = [
55
+ AddToBufferJob . new ( 2 ) ,
56
+ ShardTwoJob . new ( 6 ) ,
57
+ AddToBufferJob . new ( 3 ) ,
58
+ ShardTwoJob . new ( 7 )
59
+ ]
60
+ shard_selection_lambda = -> ( active_job :, active_jobs :) { :queue_shard_two if active_jobs . size == 2 }
61
+
62
+ with_shard_selection_lambda ( shard_selection_lambda ) do
63
+ assert_difference -> { SolidQueue ::Job . count } , 0 do
64
+ assert_difference -> { connected_to_shard_two { SolidQueue ::Job . count } } , 4 do
65
+ ActiveJob . perform_all_later ( active_jobs )
66
+ end
67
+ end
68
+ end
69
+ end
70
+
71
+ private
72
+
73
+ def with_shard_selection_lambda ( lambda , &block )
74
+ SolidQueue . shard_selection_lambda = lambda
75
+ block . call
76
+ ensure
77
+ SolidQueue . shard_selection_lambda = nil
78
+ end
42
79
end
0 commit comments