2020
2121import json
2222
23- from unittest .mock import Mock , call , patch , MagicMock
23+ from unittest .mock import Mock , call
2424
2525from kubernetes import client ,config
2626
@@ -131,8 +131,8 @@ def test_watch_with_multibyte_utf8(self):
131131'
132132 # same copyright character with bytes split across two stream chunks
133133 b'{"type" :"MODIFIED","object":{"data" :{"utf-8" :"\xC2',
134- b'\xA9 3"},"metadata":{" n ' ,
135- # more chunks of the same event, sent as a mix of bytes and strings
134+ b'\xA9 3"},"metadata":{
135+ ' , # more chunks of the same event, sent as a mix of bytes and strings
136136 'ame":"test3","resourceVersion":"3"' ,
137137 '}}}
138138',r' b'\n'
@@ -180,8 +180,8 @@ def test_watch_with_invalid_utf8(self):
180180 b'',
181181 b'3","invalid":"\xE0\x80',
182182 b'\xAF ',
183- '3"},"metadata":{" n ',
184- 'ame":"test3"' ,
183+ '3"},"metadata":{
184+ ', 'ame ":" test3 "',
185185 '}}}
186186',r' b'\n'
187187 ])
@@ -592,60 +592,47 @@ def test_pod_log_empty_lines(self):
592592
593593 def test_watch_with_deserialize_param (self ):
594594 """test watch.stream() deserialize param"""
595-
595+ # prepare test data
596596 test_json = (
597597 '{"type": "ADDED", ' r'
598598 ' "object" : {"metadata" : {"name" : "test1" , "resourceVersion" : "1" }, 'r'
599599 '"spec" : {}, "status" : {}}}
600600')
601+ fake_resp = Mock ()
602+ fake_resp .close = Mock ()
603+ fake_resp .release_conn = Mock ()
604+ fake_resp .stream = Mock (return_value = [test_json + '\n ' ])
601605
602- # Mock object for deserialize=True case
603- metadata_mock = MagicMock ()
604- metadata_mock .name = 'test1'
605- metadata_mock .resource_version = '1'
606-
607- object_mock = MagicMock ()
608- object_mock .metadata = metadata_mock
609-
610- event_deserialized = {
611- 'type' : 'ADDED' ,
612- 'object' : object_mock ,
613- 'raw_object' : json .loads (test_json )['object' ]
614- }
615-
616- # Event for deserialize=False case - object is plain dict
617- event_raw = {
618- 'type' : 'ADDED' ,
619- 'object' : json .loads (test_json )['object' ],
620- 'raw_object' : json .loads (test_json )['object' ]
621- }
622-
623- # Patch Watch.stream to return event_deserialized for deserialize=True
624- # and event_raw for deserialize=False - handle both calls with side_effect
625- def stream_side_effect (func , deserialize ):
626- if deserialize :
627- return [event_deserialized ]
628- else :
629- return [event_raw ]
630-
631- with patch .object (Watch , 'stream' , side_effect = stream_side_effect ):
632-
633- w = Watch ()
606+ fake_api = Mock ()
607+ fake_api .get_namespaces = Mock (return_value = fake_resp )
608+ fake_api .get_namespaces .__doc__ = ':return: V1NamespaceList'
634609
635- # test case with deserialize=True
636- for e in w .stream (lambda : None , deserialize = True ): # dummy API func
637- self .assertEqual ("ADDED" , e ['type' ])
638- self .assertTrue (hasattr (e ['object' ], 'metadata' ))
639- self .assertEqual ("test1" , e ['object' ].metadata .name )
640- self .assertEqual ("1" , e ['object' ].metadata .resource_version )
641- self .assertEqual (event_deserialized ['raw_object' ], e ['raw_object' ])
642-
643- # test case with deserialize=False
644- for e in w .stream (lambda : None , deserialize = False ):
645- self .assertEqual ("ADDED" , e ['type' ])
646- self .assertIsInstance (e ['object' ], dict )
647- self .assertEqual ("test1" , e ['object' ]['metadata' ]['name' ])
648- self .assertEqual ("1" , e ['object' ]['metadata' ]['resourceVersion' ])
610+ # test case with deserialize=True
611+ w = Watch ()
612+ for e in w .stream (fake_api .get_namespaces , deserialize = True ):
613+ self .assertEqual ("ADDED" , e ['type' ])
614+ # Verify that the object is deserialized correctly
615+ self .assertTrue (hasattr (e ['object' ], 'metadata' ))
616+ self .assertEqual ("test1" , e ['object' ].metadata .name )
617+ self .assertEqual ("1" , e ['object' ].metadata .resource_version )
618+ # Verify that the original object is saved
619+ self .assertEqual (json .loads (test_json )['object' ], e ['raw_object' ])
620+
621+ # test case with deserialize=False
622+ w = Watch ()
623+ for e in w .stream (fake_api .get_namespaces , deserialize = False ):
624+ self .assertEqual ("ADDED" , e ['type' ])
625+ # The validation object remains in the original dictionary format
626+ self .assertIsInstance (e ['object' ], dict )
627+ self .assertEqual ("test1" , e ['object' ]['metadata' ]['name' ])
628+ self .assertEqual ("1" , e ['object' ]['metadata' ]['resourceVersion' ])
629+ w .stop () # ensure the loop terminates
630+
631+ # verify the api is called twice
632+ fake_api .get_namespaces .assert_has_calls ([
633+ call (_preload_content = False , watch = True ),
634+ call (_preload_content = False , watch = True )
635+ ])
649636
650637if __name__ == '__main__' :
651- unittest .main ()
638+ unittest .main ()
0 commit comments