@@ -3407,6 +3407,160 @@ def test_wait_for_condition_case_insensitive(self):
34073407 )
34083408 self .assertTrue (result )
34093409
3410+ # Tests for wait_for_condition with job resource type
3411+
3412+ @patch ('time.time' )
3413+ def test_wait_for_condition_job_complete_success (self , mock_time ):
3414+ """Test wait_for_condition for a completed job - success case"""
3415+ mock_time .side_effect = [0 , 0 , 1 , 2 , 2 ]
3416+
3417+ mock_job = MagicMock ()
3418+ mock_job .status .completion_time = "2026-04-20T00:00:00Z"
3419+ mock_job .status .succeeded = 1
3420+ mock_job .status .failed = None
3421+ mock_job .status .active = None
3422+ mock_job .status .conditions = None
3423+
3424+ with patch .object (self .client , 'app' ) as mock_app , \
3425+ patch ('time.sleep' ):
3426+ mock_app .read_namespaced_job .return_value = mock_job
3427+
3428+ result = self .client .wait_for_condition (
3429+ resource_type = "job" ,
3430+ resource_name = "test-job" ,
3431+ wait_condition_type = "complete" ,
3432+ namespace = "test-namespace" ,
3433+ timeout_seconds = 5
3434+ )
3435+
3436+ self .assertTrue (result )
3437+ mock_app .read_namespaced_job .assert_called_with (
3438+ name = "test-job" ,
3439+ namespace = "test-namespace"
3440+ )
3441+
3442+ @patch ('time.time' )
3443+ def test_wait_for_condition_job_complete_timeout (self , mock_time ):
3444+ """Test wait_for_condition for a job - timeout when not yet complete"""
3445+ mock_time .side_effect = [0 , 0 , 2 , 5 , 6 , 6 ]
3446+
3447+ mock_job = MagicMock ()
3448+ mock_job .status .completion_time = None
3449+ mock_job .status .succeeded = 0
3450+ mock_job .status .failed = None
3451+ mock_job .status .active = 1
3452+ mock_job .status .conditions = None
3453+
3454+ with patch .object (self .client , 'app' ) as mock_app , \
3455+ patch ('time.sleep' ):
3456+ mock_app .read_namespaced_job .return_value = mock_job
3457+
3458+ result = self .client .wait_for_condition (
3459+ resource_type = "job" ,
3460+ resource_name = "test-job" ,
3461+ wait_condition_type = "complete" ,
3462+ namespace = "test-namespace" ,
3463+ timeout_seconds = 1
3464+ )
3465+
3466+ self .assertFalse (result )
3467+
3468+ @patch ('time.time' )
3469+ def test_wait_for_condition_job_failed_success (self , mock_time ):
3470+ """Test wait_for_condition for a failed job - detects failure"""
3471+ mock_time .side_effect = [0 , 0 , 1 , 2 , 2 ]
3472+
3473+ mock_job = MagicMock ()
3474+ mock_job .status .completion_time = None
3475+ mock_job .status .succeeded = 0
3476+ mock_job .status .failed = 3
3477+ mock_job .status .active = 0
3478+ mock_job .status .conditions = None
3479+
3480+ with patch .object (self .client , 'app' ) as mock_app , \
3481+ patch ('time.sleep' ):
3482+ mock_app .read_namespaced_job .return_value = mock_job
3483+
3484+ result = self .client .wait_for_condition (
3485+ resource_type = "job" ,
3486+ resource_name = "test-job" ,
3487+ wait_condition_type = "failed" ,
3488+ namespace = "test-namespace" ,
3489+ timeout_seconds = 5
3490+ )
3491+
3492+ self .assertTrue (result )
3493+
3494+ @patch ('time.time' )
3495+ def test_wait_for_condition_all_jobs_complete (self , mock_time ):
3496+ """Test wait_for_condition for all jobs in a namespace - all complete"""
3497+ mock_time .side_effect = [0 , 0 , 1 , 2 , 2 ]
3498+
3499+ mock_job1 = MagicMock ()
3500+ mock_job1 .status .completion_time = "2026-04-20T00:00:00Z"
3501+ mock_job1 .status .succeeded = 1
3502+ mock_job1 .status .failed = None
3503+ mock_job1 .status .active = None
3504+ mock_job1 .status .conditions = None
3505+
3506+ mock_job2 = MagicMock ()
3507+ mock_job2 .status .completion_time = "2026-04-20T00:01:00Z"
3508+ mock_job2 .status .succeeded = 2
3509+ mock_job2 .status .failed = None
3510+ mock_job2 .status .active = None
3511+ mock_job2 .status .conditions = None
3512+
3513+ with patch .object (self .client , 'app' ) as mock_app , \
3514+ patch ('time.sleep' ):
3515+ mock_app .list_namespaced_job .return_value .items = [mock_job1 , mock_job2 ]
3516+
3517+ result = self .client .wait_for_condition (
3518+ resource_type = "job" ,
3519+ resource_name = None ,
3520+ wait_condition_type = "complete" ,
3521+ namespace = "test-namespace" ,
3522+ timeout_seconds = 5 ,
3523+ wait_all = True
3524+ )
3525+
3526+ self .assertTrue (result )
3527+ mock_app .list_namespaced_job .assert_called_with (namespace = "test-namespace" )
3528+
3529+ @patch ('time.time' )
3530+ def test_wait_for_condition_job_not_found (self , mock_time ):
3531+ """Test wait_for_condition for a job that doesn't exist - times out"""
3532+ mock_time .side_effect = [0 , 0 , 2 , 5 , 6 , 6 ]
3533+
3534+ api_exception = ApiException (status = 404 , reason = "Not Found" )
3535+
3536+ with patch .object (self .client , 'app' ) as mock_app , \
3537+ patch ('time.sleep' ):
3538+ mock_app .read_namespaced_job .side_effect = api_exception
3539+
3540+ result = self .client .wait_for_condition (
3541+ resource_type = "job" ,
3542+ resource_name = "nonexistent-job" ,
3543+ wait_condition_type = "complete" ,
3544+ namespace = "test-namespace" ,
3545+ timeout_seconds = 1
3546+ )
3547+
3548+ self .assertFalse (result )
3549+
3550+ def test_wait_for_condition_job_invalid_condition (self ):
3551+ """Test wait_for_condition with invalid condition for job resource"""
3552+ with self .assertRaises (ValueError ) as context :
3553+ self .client .wait_for_condition (
3554+ resource_type = "job" ,
3555+ resource_name = "test-job" ,
3556+ wait_condition_type = "available" ,
3557+ namespace = "test-namespace" ,
3558+ timeout_seconds = 1
3559+ )
3560+
3561+ self .assertIn ("Invalid condition 'available' for resource type 'job'" , str (context .exception ))
3562+ self .assertIn ("Valid conditions: complete, failed" , str (context .exception ))
3563+
34103564 # Tests for the enhanced apply_manifest_from_file method with folder support
34113565 @patch ('os.path.isdir' )
34123566 @patch ('os.path.isfile' )
0 commit comments