44import pytest
55
66from babs .interaction import BABSInteraction
7+ from babs .utils import scheduler_status_columns
78
89
910def _minimal_status_df ():
@@ -26,6 +27,26 @@ def _minimal_status_df():
2627 )
2728
2829
30+ def _status_df_for_submit ():
31+ return pd .DataFrame (
32+ {
33+ 'sub_id' : ['sub-01' , 'sub-02' , 'sub-03' ],
34+ 'submitted' : [True , True , False ],
35+ 'has_results' : [False , False , False ],
36+ 'is_failed' : [False , True , False ],
37+ 'job_id' : [10 , 11 , - 1 ],
38+ 'task_id' : [1 , 1 , - 1 ],
39+ 'state' : ['R' , '' , '' ],
40+ 'time_used' : ['0:01' , '' , '' ],
41+ 'time_limit' : ['5-00:00:00' , '' , '' ],
42+ 'nodes' : [1 , 0 , 0 ],
43+ 'cpus' : [1 , 0 , 0 ],
44+ 'partition' : ['normal' , '' , '' ],
45+ 'name' : ['test_array_job' , '' , '' ],
46+ }
47+ )
48+
49+
2950def test_babs_submit_blocks_non_cg_jobs (babs_project_subjectlevel , monkeypatch ):
3051 babs_proj = BABSInteraction (project_root = babs_project_subjectlevel )
3152 running_df = pd .DataFrame (
@@ -76,3 +97,81 @@ def _mock_submit_array(analysis_path, queue, total_jobs):
7697 babs_proj .babs_submit (count = 1 )
7798
7899 assert submit_calls
100+
101+
102+ def test_babs_submit_allows_running_skips_jobs (babs_project_subjectlevel , monkeypatch , capsys ):
103+ babs_proj = BABSInteraction (project_root = babs_project_subjectlevel )
104+ running_df = pd .DataFrame (
105+ {
106+ 'job_id' : [10 ],
107+ 'task_id' : [1 ],
108+ 'state' : ['R' ],
109+ 'time_used' : ['0:01' ],
110+ 'time_limit' : ['5-00:00:00' ],
111+ 'nodes' : [1 ],
112+ 'cpus' : [1 ],
113+ 'partition' : ['normal' ],
114+ 'name' : ['test_array_job' ],
115+ 'sub_id' : ['sub-01' ],
116+ }
117+ )
118+ monkeypatch .setattr (babs_proj , 'get_currently_running_jobs_df' , lambda : running_df )
119+ monkeypatch .setattr (babs_proj , 'get_job_status_df' , _status_df_for_submit )
120+
121+ submit_calls = []
122+
123+ def _mock_submit_array (analysis_path , queue , total_jobs ):
124+ submit_calls .append ((analysis_path , queue , total_jobs ))
125+ return 123
126+
127+ monkeypatch .setattr ('babs.interaction.submit_array' , _mock_submit_array )
128+
129+ babs_proj .babs_submit (skip_running_jobs = True )
130+
131+ captured = capsys .readouterr ()
132+ assert submit_calls
133+ assert submit_calls [0 ][2 ] == 2
134+ assert 'Skipping running/pending jobs from job IDs' in captured .out
135+ assert '10' in captured .out
136+
137+
138+ def test_get_currently_running_jobs_df_multiple_job_ids (babs_project_subjectlevel , monkeypatch ):
139+ babs_proj = BABSInteraction (project_root = babs_project_subjectlevel )
140+ status_df = pd .DataFrame (
141+ {
142+ 'sub_id' : ['sub-01' , 'sub-02' ],
143+ 'submitted' : [True , True ],
144+ 'has_results' : [False , False ],
145+ 'is_failed' : [False , False ],
146+ 'job_id' : [10 , 20 ],
147+ 'task_id' : [1 , 2 ],
148+ }
149+ )
150+ monkeypatch .setattr (babs_proj , 'get_job_status_df' , lambda : status_df )
151+ monkeypatch .setattr (babs_proj , 'get_latest_submitted_jobs_df' , pd .DataFrame )
152+
153+ calls = []
154+
155+ def _mock_request_all_job_status (queue , job_id ):
156+ calls .append (job_id )
157+ task_id = 1 if job_id == 10 else 2
158+ return pd .DataFrame (
159+ {
160+ 'job_id' : [job_id ],
161+ 'task_id' : [task_id ],
162+ 'state' : ['R' ],
163+ 'time_used' : ['0:01' ],
164+ 'time_limit' : ['5-00:00:00' ],
165+ 'nodes' : [1 ],
166+ 'cpus' : [1 ],
167+ 'partition' : ['normal' ],
168+ 'name' : ['test_array_job' ],
169+ }
170+ )[scheduler_status_columns ]
171+
172+ monkeypatch .setattr ('babs.base.request_all_job_status' , _mock_request_all_job_status )
173+
174+ running_df = babs_proj .get_currently_running_jobs_df ()
175+
176+ assert set (calls ) == {10 , 20 }
177+ assert set (running_df ['sub_id' ]) == {'sub-01' , 'sub-02' }
0 commit comments