20
20
21
21
import json
22
22
23
- from unittest .mock import Mock , call , patch , MagicMock
23
+ from unittest .mock import Mock , call
24
24
25
25
from kubernetes import client ,config
26
26
@@ -131,8 +131,8 @@ def test_watch_with_multibyte_utf8(self):
131
131
'
132
132
# same copyright character with bytes split across two stream chunks
133
133
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
136
136
'ame":"test3","resourceVersion":"3"' ,
137
137
'}}}
138
138
',r' b'\n'
@@ -180,8 +180,8 @@ def test_watch_with_invalid_utf8(self):
180
180
b'',
181
181
b'3","invalid":"\xE0\x80',
182
182
b'\xAF ',
183
- '3"},"metadata":{" n ',
184
- 'ame":"test3"' ,
183
+ '3"},"metadata":{
184
+ ', 'ame ":" test3 "',
185
185
'}}}
186
186
',r' b'\n'
187
187
])
@@ -592,60 +592,47 @@ def test_pod_log_empty_lines(self):
592
592
593
593
def test_watch_with_deserialize_param (self ):
594
594
"""test watch.stream() deserialize param"""
595
-
595
+ # prepare test data
596
596
test_json = (
597
597
'{"type": "ADDED", ' r'
598
598
' "object" : {"metadata" : {"name" : "test1" , "resourceVersion" : "1" }, 'r'
599
599
'"spec" : {}, "status" : {}}}
600
600
')
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 ' ])
601
605
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'
634
609
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
+ ])
649
636
650
637
if __name__ == '__main__' :
651
- unittest .main ()
638
+ unittest .main ()
0 commit comments