1+ # frozen_string_literal: true
2+
3+ require 'spec_helper'
4+
5+ describe "Que Jobs Ext View" , skip : true do
6+
7+ class TestJob < Que ::Job
8+ include Que ::JobMethods
9+
10+ def default_resolve_action
11+ # prevents default deletion of complete jobs for testing purposes
12+ finish
13+ end
14+ end
15+
16+ class TestFailedJob < TestJob
17+ def run
18+ raise Que ::Error , 'Test Error'
19+ end
20+ end
21+
22+ describe 'job.enqueue' do
23+ it "should mirror enqueued job" do
24+ assert_equal 0 , jobs_dataset . count
25+ assert_equal 0 , jobs_ext_dataset . count
26+
27+ TestJob . enqueue (
28+ 1 ,
29+ 'two' ,
30+ string : "string" ,
31+ integer : 5 ,
32+ array : [ 1 , "two" , { three : 3 } ] ,
33+ hash : { one : 1 , two : 'two' , three : [ 3 ] } ,
34+ job_options : {
35+ priority : 4 ,
36+ queue : 'special_queue_name' ,
37+ run_at : Time . now
38+ }
39+ )
40+
41+ assert_equal 1 , jobs_dataset . count
42+ assert_equal 1 , jobs_ext_dataset . count
43+
44+ job = jobs_dataset . first
45+ ext_job = jobs_ext_dataset . first
46+ assert_equal ext_job [ :queue ] , job [ :queue ]
47+ assert_equal ext_job [ :priority ] , job [ :priority ]
48+ assert_equal ext_job [ :run_at ] , job [ :run_at ]
49+ assert_equal ext_job [ :first_run_at ] , job [ :first_run_at ]
50+ assert_equal ext_job [ :job_class ] , job [ :job_class ]
51+ assert_equal ext_job [ :args ] , job [ :args ]
52+ assert_equal ext_job [ :job_schema_version ] , job [ :job_schema_version ]
53+
54+ jobs_dataset . delete
55+
56+ assert_equal 0 , jobs_dataset . count
57+ assert_equal 0 , jobs_ext_dataset . count
58+ end
59+
60+ it "should include additional lock data" do
61+ locker_settings . clear
62+ locker_settings [ :listen ] = false
63+ locker_settings [ :poll_interval ] = 0.02
64+ locker
65+
66+ TestJob . enqueue
67+
68+ sleep_until { locked_ids . count . positive? && locked_ids . first == jobs_ext_dataset . first [ :lock_id ] }
69+
70+ locker . stop!
71+
72+ jobs_dataset . delete
73+ end
74+
75+ it "should add additional updated_at" do
76+ TestJob . enqueue
77+
78+ ext_job = jobs_ext_dataset . first
79+
80+ assert_equal ext_job [ :run_at ] , ext_job [ :updated_at ]
81+
82+ locker
83+
84+ sleep_until_equal ( 1 ) { finished_jobs_dataset . count }
85+
86+ locker . stop!
87+
88+ ext_job = jobs_ext_dataset . first
89+
90+ assert_equal ext_job [ :finished_at ] , ext_job [ :updated_at ]
91+
92+ jobs_dataset . delete
93+ end
94+
95+ describe "should include additional status" do
96+
97+ let ( :notified_errors ) { [ ] }
98+
99+ it "should set status to scheduled when run_at is in the future" do
100+ TestJob . enqueue ( job_options : { run_at : Time . now + 1 } )
101+
102+ assert_equal jobs_ext_dataset . first [ :status ] , 'scheduled'
103+
104+ jobs_dataset . delete
105+ end
106+
107+ it "should set status to queued when run_at is in the past and the job is not currently running, completed, failed or errored" do
108+ TestJob . enqueue ( job_options : { run_at : Time . now - 1 } )
109+
110+ assert_equal jobs_ext_dataset . first [ :status ] , 'queued'
111+
112+ jobs_dataset . delete
113+ end
114+
115+ it "should set status to running when the job has a lock associated with it" do
116+ locker_settings . clear
117+ locker_settings [ :listen ] = false
118+ locker_settings [ :poll_interval ] = 0.02
119+ locker
120+
121+ TestJob . enqueue
122+
123+ sleep_until { locked_ids . count . positive? && locked_ids . first == jobs_ext_dataset . first [ :lock_id ] && jobs_ext_dataset . first [ :status ] == 'running' }
124+
125+ locker . stop!
126+
127+ jobs_dataset . delete
128+ end
129+
130+ it "should set status to complete when finished_at is present" do
131+ TestJob . enqueue
132+
133+ locker
134+
135+ sleep_until_equal ( 1 ) { DB [ :que_lockers ] . count }
136+
137+ sleep_until { finished_jobs_dataset . count . positive? }
138+
139+ locker . stop!
140+
141+ assert_equal jobs_ext_dataset . first [ :status ] , 'completed'
142+
143+ jobs_dataset . delete
144+ end
145+
146+ it "should set status to errored when error_count is positive and expired_at is not present" do
147+ Que . error_notifier = proc { |e | notified_errors << e }
148+
149+ TestFailedJob . class_eval do
150+ self . maximum_retry_count = 100 # prevent from entering failed state on first error
151+ end
152+
153+ locker
154+
155+ sleep_until_equal ( 1 ) { DB [ :que_lockers ] . count }
156+
157+ TestFailedJob . enqueue
158+
159+ sleep_until { errored_jobs_dataset . where ( expired_at : nil ) . count . positive? }
160+
161+ locker . stop!
162+
163+ ext_job = jobs_ext_dataset . first
164+
165+ assert_equal ext_job [ :status ] , 'errored'
166+ assert_equal notified_errors . count , 1
167+ assert_equal notified_errors . first . message , 'Test Error'
168+
169+
170+ jobs_dataset . delete
171+ end
172+
173+ it "should set status to failed when expired_at is present" do
174+ TestFailedJob . class_eval do
175+ self . maximum_retry_count = 0
176+ end
177+
178+ Que . error_notifier = proc { |e | notified_errors << e }
179+
180+ locker
181+
182+ sleep_until_equal ( 1 ) { DB [ :que_lockers ] . count }
183+
184+ TestFailedJob . enqueue
185+
186+ sleep_until { expired_jobs_dataset . count . positive? }
187+
188+ locker . stop!
189+
190+ assert_equal jobs_ext_dataset . first [ :status ] , 'failed'
191+ assert_equal notified_errors . count , 1
192+ assert_equal notified_errors . first . message , 'Test Error'
193+
194+
195+ jobs_dataset . delete
196+ end
197+ end
198+ end
199+ end
0 commit comments