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