Skip to content

Commit 0bd8d8f

Browse files
committed
Allow by period uniqueness to be based off scheduled time
This one follows up [1] in the main repository, in which we fix what could be considered a bug in that by period uniqueness was always based off the current time, even though a job may have been given a custom value for `scheduled_at`, which really should take precedence. [1] riverqueue/river#734
1 parent 0d2d588 commit 0bd8d8f

File tree

2 files changed

+19
-1
lines changed

2 files changed

+19
-1
lines changed

lib/client.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ def insert_many(args)
220220
end
221221

222222
if unique_opts.by_period
223-
lower_period_bound = truncate_time(@time_now_utc.call, unique_opts.by_period).utc
223+
lower_period_bound = truncate_time(insert_params.scheduled_at || @time_now_utc.call, unique_opts.by_period).utc
224224

225225
unique_key += "&period=#{lower_period_bound.strftime("%FT%TZ")}"
226226
end

spec/client_spec.rb

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,24 @@ def check_bigint_bounds(int)
291291
expect(insert_res.unique_skipped_as_duplicated).to be false
292292
end
293293

294+
it "inserts a new unique job with period determined from `scheduled_at`" do
295+
job_args = ComplexArgs.new(customer_id: 1, order_id: 2, trace_id: 3, email: "[email protected]")
296+
insert_opts = River::InsertOpts.new(
297+
scheduled_at: now + 3600,
298+
unique_opts: River::UniqueOpts.new(
299+
by_period: 15 * 60
300+
)
301+
)
302+
303+
insert_res = client.insert(job_args, insert_opts: insert_opts)
304+
expect(insert_res.job).to_not be_nil
305+
expect(insert_res.unique_skipped_as_duplicated).to be false
306+
307+
unique_key_str = "&kind=#{insert_res.job.kind}" \
308+
"&period=#{client.send(:truncate_time, now + 3600, 15 * 60).utc.strftime("%FT%TZ")}"
309+
expect(insert_res.job.unique_key).to eq(Digest::SHA256.digest(unique_key_str))
310+
end
311+
294312
it "skips unique check if unique opts empty" do
295313
job_args = SimpleArgsWithInsertOpts.new(job_num: 1)
296314
job_args.insert_opts = River::InsertOpts.new(

0 commit comments

Comments
 (0)