11import sys
22import os
33from click .testing import CliRunner
4- from datetime import datetime , timedelta
4+ from datetime import datetime , timedelta , timezone
55from config .chassis_modules import (
66 set_state_transition_in_progress ,
77 is_transition_timed_out ,
@@ -490,7 +490,7 @@ def test_shutdown_triggers_transition_in_progress(self):
490490 fvs = {
491491 'admin_status' : 'up' ,
492492 'state_transition_in_progress' : 'True' ,
493- 'transition_start_time' : datetime .utcnow ( ).isoformat ()
493+ 'transition_start_time' : datetime .now ( timezone . utc ).isoformat ()
494494 }
495495 db .cfgdb .set_entry ('CHASSIS_MODULE' , "DPU0" , fvs )
496496
@@ -517,7 +517,7 @@ def test_shutdown_triggers_transition_timeout(self):
517517 fvs = {
518518 'admin_status' : 'up' ,
519519 'state_transition_in_progress' : 'True' ,
520- 'transition_start_time' : (datetime .utcnow ( ) - timedelta (minutes = 30 )).isoformat ()
520+ 'transition_start_time' : (datetime .now ( timezone . utc ) - timedelta (minutes = 30 )).isoformat ()
521521 }
522522 db .cfgdb .set_entry ('CHASSIS_MODULE' , "DPU0" , fvs )
523523
@@ -593,15 +593,35 @@ def test_is_transition_timed_out_all_paths(self):
593593 assert is_transition_timed_out (db , "DPU0" ) is False
594594
595595 # Case 4: Timed out
596- old_time = (datetime .utcnow ( ) - TRANSITION_TIMEOUT - timedelta (seconds = 1 )).isoformat ()
596+ old_time = (datetime .now ( timezone . utc ) - TRANSITION_TIMEOUT - timedelta (seconds = 1 )).isoformat ()
597597 db .statedb .get_entry .return_value = {"transition_start_time" : old_time }
598598 assert is_transition_timed_out (db , "DPU0" ) is True
599599
600600 # Case 5: Not timed out yet
601- now = datetime .utcnow ( ).isoformat ()
601+ now = datetime .now ( timezone . utc ).isoformat ()
602602 db .statedb .get_entry .return_value = {"transition_start_time" : now }
603603 assert is_transition_timed_out (db , "DPU0" ) is False
604604
605+ def test_delete_field (self ):
606+ """Single test to cover missing delete_field and timezone handling lines"""
607+ from config .chassis_modules import StateDBHelper
608+ from datetime import timezone
609+
610+ # Test delete_field method (covers lines 32-34)
611+ mock_sonic_db = mock .MagicMock ()
612+ mock_redis_client = mock .MagicMock ()
613+ mock_sonic_db .get_redis_client .return_value = mock_redis_client
614+ helper = StateDBHelper (mock_sonic_db )
615+ helper .delete_field ('TEST_TABLE' , 'test_key' , 'test_field' )
616+ mock_redis_client .hdel .assert_called_once_with ("TEST_TABLE|test_key" , "test_field" )
617+
618+ # Test timezone-aware datetime handling (covers line 109)
619+ db = mock .MagicMock ()
620+ db .statedb = mock .MagicMock ()
621+ tz_time = (datetime .now (timezone .utc ) - TRANSITION_TIMEOUT - timedelta (seconds = 1 )).isoformat ()
622+ db .statedb .get_entry .return_value = {"transition_start_time" : tz_time }
623+ assert is_transition_timed_out (db , "DPU0" ) is True
624+
605625 @classmethod
606626 def teardown_class (cls ):
607627 print ("TEARDOWN" )
0 commit comments