2323)
2424
2525from kubernetes .client .rest import ApiException
26+ from tabulate import tabulate
2627
2728SAMPLE_OUTPUT = {
2829 "items" : [
@@ -152,7 +153,7 @@ def test_list_training_jobs_with_namespace(
152153 mock_kubernetes_client .return_value = self .mock_k8s_client
153154 self .mock_k8s_client .list_training_jobs .return_value = SAMPLE_OUTPUT
154155 result = self .mock_list_training_jobs .list_training_jobs (
155- "namespace" , None , None
156+ "namespace" , None , None , None
156157 )
157158 self .assertIn ("test-name" , result )
158159 self .assertIn ("test-name1" , result )
@@ -166,7 +167,7 @@ def test_list_training_jobs_without_namespace(
166167 mock_kubernetes_client .return_value = self .mock_k8s_client
167168 self .mock_k8s_client .get_current_context_namespace .return_value = "namespace"
168169 self .mock_k8s_client .list_training_jobs .return_value = SAMPLE_OUTPUT
169- result = self .mock_list_training_jobs .list_training_jobs (None , None , None )
170+ result = self .mock_list_training_jobs .list_training_jobs (None , None , None , None )
170171 self .assertIn ("test-name" , result )
171172 self .assertIn ("test-name1" , result )
172173 self .assertIn ("Running" , result )
@@ -182,7 +183,7 @@ def test_list_training_jobs_with_namespace_auto_discover(
182183 mock_discover_accessible_namespace .return_value = "discovered-namespace"
183184 self .mock_k8s_client .get_current_context_namespace .return_value = None
184185 self .mock_k8s_client .list_training_jobs .return_value = SAMPLE_OUTPUT
185- result = self .mock_list_training_jobs .list_training_jobs (None , None , None )
186+ result = self .mock_list_training_jobs .list_training_jobs (None , None , None , None )
186187 mock_discover_accessible_namespace .assert_called_once_with (
187188 V1ResourceAttributes (
188189 verb = "list" ,
@@ -209,7 +210,7 @@ def test_list_training_jobs_without_namespace_no_jobs(
209210 mock_kubernetes_client .return_value = self .mock_k8s_client
210211 self .mock_k8s_client .get_current_context_namespace .return_value = "namespace"
211212 self .mock_k8s_client .list_training_jobs .return_value = {"items" : []}
212- result = self .mock_list_training_jobs .list_training_jobs (None , None , None )
213+ result = self .mock_list_training_jobs .list_training_jobs (None , None , None , None )
213214 self .assertNotIn ("test-name" , result )
214215 self .assertNotIn ("test-name1" , result )
215216
@@ -221,7 +222,7 @@ def test_list_training_jobs_all_namespace(
221222 mock_kubernetes_client .return_value = self .mock_k8s_client
222223 self .mock_k8s_client .list_namespaces .return_value = ["namespace" ]
223224 self .mock_k8s_client .list_training_jobs .return_value = SAMPLE_OUTPUT
224- result = self .mock_list_training_jobs .list_training_jobs (None , True , None )
225+ result = self .mock_list_training_jobs .list_training_jobs (None , True , None , None )
225226 self .assertIn ("test-name" , result )
226227 self .assertIn ("test-name1" , result )
227228
@@ -236,7 +237,7 @@ def test_list_training_jobs_all_namespace_api_exception(
236237 status = "Failed" , reason = "unexpected"
237238 )
238239 with self .assertRaises (RuntimeError ):
239- self .mock_list_training_jobs .list_training_jobs (None , True , None )
240+ self .mock_list_training_jobs .list_training_jobs (None , True , None , None )
240241
241242 @mock .patch ("hyperpod_cli.clients.kubernetes_client.KubernetesClient.__new__" )
242243 def test_list_training_jobs_all_namespace_no_jobs (
@@ -246,7 +247,7 @@ def test_list_training_jobs_all_namespace_no_jobs(
246247 mock_kubernetes_client .return_value = self .mock_k8s_client
247248 self .mock_k8s_client .list_namespaces .return_value = ["namespace" ]
248249 self .mock_k8s_client .list_training_jobs .return_value = {"items" : []}
249- result = self .mock_list_training_jobs .list_training_jobs (None , True , None )
250+ result = self .mock_list_training_jobs .list_training_jobs (None , True , None , None )
250251 self .assertNotIn ("test-name" , result )
251252 self .assertNotIn ("test-name1" , result )
252253
@@ -258,7 +259,7 @@ def test_list_training_jobs_all_namespace_missing_metadata(
258259 mock_kubernetes_client .return_value = self .mock_k8s_client
259260 self .mock_k8s_client .list_namespaces .return_value = ["namespace" ]
260261 self .mock_k8s_client .list_training_jobs .return_value = INVALID_OUTPUT
261- result = self .mock_list_training_jobs .list_training_jobs (None , True , None )
262+ result = self .mock_list_training_jobs .list_training_jobs (None , True , None , None )
262263 self .assertNotIn ("name" , result )
263264
264265 @mock .patch ("hyperpod_cli.clients.kubernetes_client.KubernetesClient.__new__" )
@@ -269,5 +270,94 @@ def test_list_training_jobs_all_namespace_missing_status(
269270 mock_kubernetes_client .return_value = self .mock_k8s_client
270271 self .mock_k8s_client .list_namespaces .return_value = ["namespace" ]
271272 self .mock_k8s_client .list_training_jobs .return_value = OUTPUT_WITHOUT_STATUS
272- result = self .mock_list_training_jobs .list_training_jobs (None , True , None )
273+ result = self .mock_list_training_jobs .list_training_jobs (None , True , None , None )
273274 self .assertNotIn ("State: null" , result )
275+
276+ def test_generate_table_with_no_priority_header_and_values (self ):
277+ list_training_jobs = ListTrainingJobs ()
278+ output_jobs = {
279+ "jobs" : [
280+ {
281+ "Name" : "job1" ,
282+ "Namespace" : "namespace1" ,
283+ "CreationTime" : "2023-01-01T00:00:00Z" ,
284+ "State" : "Running"
285+ }
286+ ]
287+ }
288+ priority_header_required = False
289+
290+ result = list_training_jobs ._generate_table (output_jobs , priority_header_required )
291+
292+ expected_headers = ["Name" , "Namespace" , "CreationTime" , "State" ]
293+ expected_jobs = [["job1" , "namespace1" , "2023-01-01T00:00:00Z" , "Running" ]]
294+ expected_result = tabulate (expected_jobs , headers = expected_headers , tablefmt = "presto" )
295+
296+ assert result == expected_result
297+
298+ def test_generate_table_with_priority_header_and_priority_values (self ):
299+ list_training_jobs = ListTrainingJobs ()
300+ output_jobs = {
301+ "jobs" : [
302+ {
303+ "Name" : "job1" ,
304+ "Namespace" : "namespace1" ,
305+ "CreationTime" : "2023-01-01T00:00:00Z" ,
306+ "State" : "Running" ,
307+ "priority" : "high"
308+ },
309+ {
310+ "Name" : "job2" ,
311+ "Namespace" : "namespace2" ,
312+ "CreationTime" : "2023-01-02T00:00:00Z" ,
313+ "State" : "Completed" ,
314+ "priority" : "low"
315+ }
316+ ]
317+ }
318+ priority_header_required = True
319+
320+ result = list_training_jobs ._generate_table (output_jobs , priority_header_required )
321+
322+ expected_headers = ["Name" , "Namespace" , "CreationTime" , "State" , "Priority" ]
323+ expected_jobs = [
324+ ["job1" , "namespace1" , "2023-01-01T00:00:00Z" , "Running" , "high" ],
325+ ["job2" , "namespace2" , "2023-01-02T00:00:00Z" , "Completed" , "low" ]
326+ ]
327+ expected_result = tabulate (expected_jobs , headers = expected_headers , tablefmt = "presto" )
328+
329+ assert result == expected_result
330+
331+ def test_generate_table_with_priority_header_but_no_priority_value (self ):
332+ list_training_jobs = ListTrainingJobs ()
333+ output_jobs = {
334+ "jobs" : [
335+ {
336+ "Name" : "job1" ,
337+ "Namespace" : "namespace1" ,
338+ "CreationTime" : "2023-01-01T00:00:00Z" ,
339+ "State" : "Running"
340+ }
341+ ]
342+ }
343+ priority_header_required = True
344+
345+ result = list_training_jobs ._generate_table (output_jobs , priority_header_required )
346+
347+ expected_headers = ["Name" , "Namespace" , "CreationTime" , "State" , "Priority" ]
348+ expected_jobs = [["job1" , "namespace1" , "2023-01-01T00:00:00Z" , "Running" , "NA" ]]
349+ expected_result = tabulate (expected_jobs , headers = expected_headers , tablefmt = "presto" )
350+
351+ assert result == expected_result
352+
353+ def test_generate_table_empty_jobs (self ):
354+ list_training_jobs = ListTrainingJobs ()
355+ output_jobs = {"jobs" : []}
356+ priority_header_required = False
357+
358+ result = list_training_jobs ._generate_table (output_jobs , priority_header_required )
359+
360+ expected_headers = ["Name" , "Namespace" , "CreationTime" , "State" ]
361+ expected_result = tabulate ([], headers = expected_headers , tablefmt = "presto" )
362+
363+ assert result == expected_result
0 commit comments