99from django .urls import reverse
1010from rq .cron import CronJob
1111
12+ from django_rq import get_connection
1213from django_rq .cron import DjangoCronScheduler
1314from tests .fixtures import say_hello
1415
@@ -180,7 +181,19 @@ def test_cron_scheduler_detail_view(self):
180181 """Test cron scheduler detail view with various scenarios."""
181182 # Create a real scheduler and register it
182183 scheduler = DjangoCronScheduler (name = 'test-scheduler' )
183- scheduler .register (say_hello , "default" , interval = 60 )
184+ scheduler .register (
185+ say_hello ,
186+ "default" ,
187+ interval = 60 ,
188+ args = ("hello" ,),
189+ kwargs = {"target" : "world" },
190+ meta = {"source" : "test" },
191+ job_timeout = 20 ,
192+ result_ttl = 500 ,
193+ ttl = 60 ,
194+ failure_ttl = 120 ,
195+ )
196+ scheduler .register (say_hello , "default" , cron = "*/5 * * * *" )
184197 scheduler .register_birth ()
185198
186199 for prefix in ('admin:django_rq_' , 'django_rq:' ):
@@ -190,7 +203,24 @@ def test_cron_scheduler_detail_view(self):
190203 response = self .client .get (url )
191204 self .assertEqual (response .status_code , 200 )
192205 self .assertEqual (response .context ['scheduler' ].name , 'test-scheduler' )
206+ self .assertEqual (len (response .context ['cron_jobs' ]), 2 )
207+ first_cron_job = response .context ['cron_jobs' ][0 ]
208+ self .assertEqual (first_cron_job ['func_name' ], 'tests.fixtures.say_hello' )
209+ self .assertEqual (first_cron_job ['queue_name' ], 'default' )
210+ self .assertEqual (first_cron_job ['schedule' ], 'every 60 seconds' )
193211 self .assertContains (response , 'test-scheduler' )
212+ self .assertContains (response , 'Cron Jobs' )
213+ self .assertContains (response , 'tests.fixtures.say_hello' )
214+ self .assertContains (response , 'default' )
215+ self .assertContains (response , 'every 60 seconds' )
216+ self .assertContains (response , 'cron: */5 * * * *' )
217+ self .assertContains (response , 'hello' )
218+ self .assertContains (response , 'world' )
219+ self .assertContains (response , 'source' )
220+ self .assertContains (response , 'job_timeout=20' )
221+ self .assertContains (response , 'result_ttl=500' )
222+ self .assertContains (response , 'ttl=60' )
223+ self .assertContains (response , 'failure_ttl=120' )
194224
195225 # Test 2: Non-existent scheduler returns 404
196226 url = reverse (f'{ prefix } cron_scheduler_detail' , args = [connection_index , 'nonexistent-scheduler' ])
@@ -204,3 +234,18 @@ def test_cron_scheduler_detail_view(self):
204234
205235 # Clean up
206236 scheduler .register_death ()
237+
238+ def test_cron_scheduler_detail_view_with_no_jobs (self ):
239+ """Test cron scheduler detail view gracefully handles schedulers with no jobs."""
240+ scheduler = DjangoCronScheduler (connection = get_connection ("default" ), name = 'empty-scheduler' )
241+ scheduler .register_birth ()
242+
243+ for prefix in ('admin:django_rq_' , 'django_rq:' ):
244+ url = reverse (f'{ prefix } cron_scheduler_detail' , args = [scheduler .connection_index , 'empty-scheduler' ])
245+ response = self .client .get (url )
246+ self .assertEqual (response .status_code , 200 )
247+ self .assertEqual (response .context ['scheduler' ].name , 'empty-scheduler' )
248+ self .assertEqual (response .context ['cron_jobs' ], [])
249+ self .assertContains (response , 'No persisted cron jobs found' )
250+
251+ scheduler .register_death ()
0 commit comments