@@ -25,7 +25,155 @@ class SimpleArgsWithInsertOpts < SimpleArgs
2525 let! ( :driver ) { River ::Driver ::ActiveRecord . new }
2626 let ( :client ) { River ::Client . new ( driver ) }
2727
28- describe "#insert" do
28+ describe "unique insertion" do
29+ it "inserts a unique job once" do
30+ args = SimpleArgsWithInsertOpts . new ( job_num : 1 )
31+ args . insert_opts = River ::InsertOpts . new (
32+ unique_opts : River ::UniqueOpts . new (
33+ by_queue : true
34+ )
35+ )
36+
37+ insert_res = client . insert ( args )
38+ expect ( insert_res . job ) . to_not be_nil
39+ expect ( insert_res . unique_skipped_as_duplicated ) . to be false
40+ original_job = insert_res . job
41+
42+ insert_res = client . insert ( args )
43+ expect ( insert_res . job . id ) . to eq ( original_job . id )
44+ expect ( insert_res . unique_skipped_as_duplicated ) . to be true
45+ end
46+
47+ it "inserts a unique job with an advisory lock prefix" do
48+ client = River ::Client . new ( driver , advisory_lock_prefix : 123456 )
49+
50+ args = SimpleArgsWithInsertOpts . new ( job_num : 1 )
51+ args . insert_opts = River ::InsertOpts . new (
52+ unique_opts : River ::UniqueOpts . new (
53+ by_queue : true
54+ )
55+ )
56+
57+ insert_res = client . insert ( args )
58+ expect ( insert_res . job ) . to_not be_nil
59+ expect ( insert_res . unique_skipped_as_duplicated ) . to be false
60+ original_job = insert_res . job
61+
62+ insert_res = client . insert ( args )
63+ expect ( insert_res . job . id ) . to eq ( original_job . id )
64+ expect ( insert_res . unique_skipped_as_duplicated ) . to be true
65+ end
66+ end
67+
68+ describe "#advisory_lock" do
69+ it "takes an advisory lock" do
70+ driver . advisory_lock ( 123 )
71+ end
72+ end
73+
74+ describe "#job_get_by_kind_and_unique_properties" do
75+ let ( :job_args ) { SimpleArgs . new ( job_num : 1 ) }
76+
77+ it "gets a job by kind" do
78+ insert_res = client . insert ( job_args )
79+
80+ job = driver . send (
81+ :to_job_row ,
82+ driver . job_get_by_kind_and_unique_properties ( River ::Driver ::JobGetByKindAndUniquePropertiesParam . new (
83+ kind : job_args . kind
84+ ) )
85+ )
86+ expect ( job . id ) . to eq ( insert_res . job . id )
87+
88+ expect (
89+ driver . job_get_by_kind_and_unique_properties ( River ::Driver ::JobGetByKindAndUniquePropertiesParam . new (
90+ kind : "does_not_exist"
91+ ) )
92+ ) . to be_nil
93+ end
94+
95+ it "gets a job by created at period" do
96+ insert_res = client . insert ( job_args )
97+
98+ job = driver . send (
99+ :to_job_row ,
100+ driver . job_get_by_kind_and_unique_properties ( River ::Driver ::JobGetByKindAndUniquePropertiesParam . new (
101+ kind : job_args . kind ,
102+ created_at : [ insert_res . job . created_at - 1 , insert_res . job . created_at + 1 ]
103+ ) )
104+ )
105+ expect ( job . id ) . to eq ( insert_res . job . id )
106+
107+ expect (
108+ driver . job_get_by_kind_and_unique_properties ( River ::Driver ::JobGetByKindAndUniquePropertiesParam . new (
109+ kind : job_args . kind ,
110+ created_at : [ insert_res . job . created_at + 1 , insert_res . job . created_at + 3 ]
111+ ) )
112+ ) . to be_nil
113+ end
114+
115+ it "gets a job by encoded args" do
116+ insert_res = client . insert ( job_args )
117+
118+ job = driver . send (
119+ :to_job_row ,
120+ driver . job_get_by_kind_and_unique_properties ( River ::Driver ::JobGetByKindAndUniquePropertiesParam . new (
121+ kind : job_args . kind ,
122+ encoded_args : JSON . dump ( insert_res . job . args )
123+ ) )
124+ )
125+ expect ( job . id ) . to eq ( insert_res . job . id )
126+
127+ expect (
128+ driver . job_get_by_kind_and_unique_properties ( River ::Driver ::JobGetByKindAndUniquePropertiesParam . new (
129+ kind : job_args . kind ,
130+ encoded_args : JSON . dump ( { "job_num" => 2 } )
131+ ) )
132+ ) . to be_nil
133+ end
134+
135+ it "gets a job by queue" do
136+ insert_res = client . insert ( job_args )
137+
138+ job = driver . send (
139+ :to_job_row ,
140+ driver . job_get_by_kind_and_unique_properties ( River ::Driver ::JobGetByKindAndUniquePropertiesParam . new (
141+ kind : job_args . kind ,
142+ queue : insert_res . job . queue
143+ ) )
144+ )
145+ expect ( job . id ) . to eq ( insert_res . job . id )
146+
147+ expect (
148+ driver . job_get_by_kind_and_unique_properties ( River ::Driver ::JobGetByKindAndUniquePropertiesParam . new (
149+ kind : job_args . kind ,
150+ queue : "other_queue"
151+ ) )
152+ ) . to be_nil
153+ end
154+
155+ it "gets a job by state" do
156+ insert_res = client . insert ( job_args )
157+
158+ job = driver . send (
159+ :to_job_row ,
160+ driver . job_get_by_kind_and_unique_properties ( River ::Driver ::JobGetByKindAndUniquePropertiesParam . new (
161+ kind : job_args . kind ,
162+ state : [ River ::JOB_STATE_AVAILABLE , River ::JOB_STATE_COMPLETED ]
163+ ) )
164+ )
165+ expect ( job . id ) . to eq ( insert_res . job . id )
166+
167+ expect (
168+ driver . job_get_by_kind_and_unique_properties ( River ::Driver ::JobGetByKindAndUniquePropertiesParam . new (
169+ kind : job_args . kind ,
170+ state : [ River ::JOB_STATE_RUNNING , River ::JOB_STATE_SCHEDULED ]
171+ ) )
172+ ) . to be_nil
173+ end
174+ end
175+
176+ describe "#job_insert" do
29177 it "inserts a job" do
30178 insert_res = client . insert ( SimpleArgs . new ( job_num : 1 ) )
31179 expect ( insert_res . job ) . to have_attributes (
@@ -133,7 +281,7 @@ class SimpleArgsWithInsertOpts < SimpleArgs
133281 end
134282 end
135283
136- describe "#insert_many " do
284+ describe "#job_insert_many " do
137285 it "inserts multiple jobs" do
138286 num_inserted = client . insert_many ( [
139287 SimpleArgs . new ( job_num : 1 ) ,
@@ -197,6 +345,25 @@ class SimpleArgsWithInsertOpts < SimpleArgs
197345 end
198346 end
199347
348+ describe "#transaction" do
349+ it "runs block in a transaction" do
350+ insert_res = nil
351+
352+ driver . transaction do
353+ insert_res = client . insert ( SimpleArgs . new ( job_num : 1 ) )
354+
355+ river_job = River ::Driver ::ActiveRecord ::RiverJob . find_by ( id : insert_res . job . id )
356+ expect ( river_job ) . to_not be_nil
357+
358+ raise ActiveRecord ::Rollback
359+ end
360+
361+ # Not present because the job was rolled back.
362+ river_job = River ::Driver ::ActiveRecord ::RiverJob . find_by ( id : insert_res . job . id )
363+ expect ( river_job ) . to be_nil
364+ end
365+ end
366+
200367 describe "#to_job_row" do
201368 it "converts a database record to `River::JobRow`" do
202369 now = Time . now . utc
0 commit comments