Skip to content

Commit 1da0a77

Browse files
committed
test: add unit tests for job wait_for_condition
1 parent 8c81155 commit 1da0a77

1 file changed

Lines changed: 154 additions & 0 deletions

File tree

modules/python/tests/clients/test_kubernetes_client.py

Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)