88#
99# *****************************************************************************
1010
11- from unittest .mock import patch , MagicMock
11+ from unittest .mock import patch , mock_open
1212from kubernetes .config .config_exception import ConfigException
1313
1414from mas .devops .ocp import connect
@@ -18,15 +18,16 @@ class TestOcpConnect:
1818 """Test suite for ocp.connect() function."""
1919
2020 @patch ("mas.devops.ocp.config.load_kube_config" )
21- @patch ("mas.devops.ocp.os.unlink" )
22- @patch ("mas.devops.ocp.tempfile.NamedTemporaryFile" )
21+ @patch ("mas.devops.ocp.os.makedirs" )
22+ @patch ("mas.devops.ocp.os.path.exists" )
23+ @patch ("builtins.open" , new_callable = mock_open )
24+ @patch ("mas.devops.ocp.yaml.safe_load" )
2325 @patch ("mas.devops.ocp.yaml.dump" )
24- def test_connect_success (self , mock_yaml_dump , mock_tempfile , mock_unlink , mock_load_config ):
26+ def test_connect_success (self , mock_yaml_dump , mock_yaml_load , mock_file , mock_exists , mock_makedirs , mock_load_config ):
2527 """Test successful connection to OCP cluster."""
26- # Setup mock temporary file
27- mock_file = MagicMock ()
28- mock_file .name = "/tmp/test.kubeconfig"
29- mock_tempfile .return_value .__enter__ .return_value = mock_file
28+ # Setup - kubeconfig exists with existing content
29+ mock_exists .return_value = True
30+ mock_yaml_load .return_value = {"apiVersion" : "v1" , "kind" : "Config" , "clusters" : [], "users" : [], "contexts" : [], "current-context" : "" }
3031
3132 # Execute
3233 result = connect (
@@ -38,19 +39,21 @@ def test_connect_success(self, mock_yaml_dump, mock_tempfile, mock_unlink, mock_
3839 # Verify
3940 assert result is True
4041 mock_yaml_dump .assert_called_once ()
41- mock_load_config .assert_called_once_with (config_file = "/tmp/test.kubeconfig" )
42- mock_unlink .assert_called_once_with ("/tmp/test.kubeconfig" )
42+ mock_load_config .assert_called_once ()
43+ # Verify the kubeconfig was written
44+ assert mock_file .call_count >= 2 # Once for read, once for write
4345
4446 @patch ("mas.devops.ocp.config.load_kube_config" )
45- @patch ("mas.devops.ocp.os.unlink" )
46- @patch ("mas.devops.ocp.tempfile.NamedTemporaryFile" )
47+ @patch ("mas.devops.ocp.os.makedirs" )
48+ @patch ("mas.devops.ocp.os.path.exists" )
49+ @patch ("builtins.open" , new_callable = mock_open )
50+ @patch ("mas.devops.ocp.yaml.safe_load" )
4751 @patch ("mas.devops.ocp.yaml.dump" )
48- def test_connect_with_tls_skip (self , mock_yaml_dump , mock_tempfile , mock_unlink , mock_load_config ):
52+ def test_connect_with_tls_skip (self , mock_yaml_dump , mock_yaml_load , mock_file , mock_exists , mock_makedirs , mock_load_config ):
4953 """Test connection with TLS verification skipped."""
50- # Setup mock temporary file
51- mock_file = MagicMock ()
52- mock_file .name = "/tmp/test.kubeconfig"
53- mock_tempfile .return_value .__enter__ .return_value = mock_file
54+ # Setup - kubeconfig exists
55+ mock_exists .return_value = True
56+ mock_yaml_load .return_value = {"apiVersion" : "v1" , "kind" : "Config" , "clusters" : [], "users" : [], "contexts" : [], "current-context" : "" }
5457
5558 # Execute
5659 result = connect (
@@ -66,15 +69,16 @@ def test_connect_with_tls_skip(self, mock_yaml_dump, mock_tempfile, mock_unlink,
6669 assert call_args ["clusters" ][0 ]["cluster" ]["insecure-skip-tls-verify" ] is True
6770
6871 @patch ("mas.devops.ocp.config.load_kube_config" )
69- @patch ("mas.devops.ocp.os.unlink" )
70- @patch ("mas.devops.ocp.tempfile.NamedTemporaryFile" )
72+ @patch ("mas.devops.ocp.os.makedirs" )
73+ @patch ("mas.devops.ocp.os.path.exists" )
74+ @patch ("builtins.open" , new_callable = mock_open )
75+ @patch ("mas.devops.ocp.yaml.safe_load" )
7176 @patch ("mas.devops.ocp.yaml.dump" )
72- def test_connect_config_exception (self , mock_yaml_dump , mock_tempfile , mock_unlink , mock_load_config ):
77+ def test_connect_config_exception (self , mock_yaml_dump , mock_yaml_load , mock_file , mock_exists , mock_makedirs , mock_load_config ):
7378 """Test connection failure with ConfigException."""
74- # Setup mock temporary file
75- mock_file = MagicMock ()
76- mock_file .name = "/tmp/test.kubeconfig"
77- mock_tempfile .return_value .__enter__ .return_value = mock_file
79+ # Setup - kubeconfig exists
80+ mock_exists .return_value = True
81+ mock_yaml_load .return_value = {"apiVersion" : "v1" , "kind" : "Config" , "clusters" : [], "users" : [], "contexts" : [], "current-context" : "" }
7882
7983 # Setup mock to raise ConfigException
8084 mock_load_config .side_effect = ConfigException ("Invalid configuration" )
@@ -87,18 +91,18 @@ def test_connect_config_exception(self, mock_yaml_dump, mock_tempfile, mock_unli
8791
8892 # Verify
8993 assert result is False
90- mock_unlink .assert_not_called () # Should not clean up on error
9194
9295 @patch ("mas.devops.ocp.config.load_kube_config" )
93- @patch ("mas.devops.ocp.os.unlink" )
94- @patch ("mas.devops.ocp.tempfile.NamedTemporaryFile" )
96+ @patch ("mas.devops.ocp.os.makedirs" )
97+ @patch ("mas.devops.ocp.os.path.exists" )
98+ @patch ("builtins.open" , new_callable = mock_open )
99+ @patch ("mas.devops.ocp.yaml.safe_load" )
95100 @patch ("mas.devops.ocp.yaml.dump" )
96- def test_connect_unexpected_exception (self , mock_yaml_dump , mock_tempfile , mock_unlink , mock_load_config ):
101+ def test_connect_unexpected_exception (self , mock_yaml_dump , mock_yaml_load , mock_file , mock_exists , mock_makedirs , mock_load_config ):
97102 """Test connection failure with unexpected exception."""
98- # Setup mock temporary file
99- mock_file = MagicMock ()
100- mock_file .name = "/tmp/test.kubeconfig"
101- mock_tempfile .return_value .__enter__ .return_value = mock_file
103+ # Setup - kubeconfig exists
104+ mock_exists .return_value = True
105+ mock_yaml_load .return_value = {"apiVersion" : "v1" , "kind" : "Config" , "clusters" : [], "users" : [], "contexts" : [], "current-context" : "" }
102106
103107 # Setup mock to raise unexpected exception
104108 mock_load_config .side_effect = RuntimeError ("Unexpected error" )
@@ -111,4 +115,26 @@ def test_connect_unexpected_exception(self, mock_yaml_dump, mock_tempfile, mock_
111115
112116 # Verify
113117 assert result is False
114- mock_unlink .assert_not_called () # Should not clean up on error
118+
119+ @patch ("mas.devops.ocp.config.load_kube_config" )
120+ @patch ("mas.devops.ocp.os.makedirs" )
121+ @patch ("mas.devops.ocp.os.path.exists" )
122+ @patch ("builtins.open" , new_callable = mock_open )
123+ @patch ("mas.devops.ocp.yaml.dump" )
124+ def test_connect_creates_new_kubeconfig (self , mock_yaml_dump , mock_file , mock_exists , mock_makedirs , mock_load_config ):
125+ """Test connection creates new kubeconfig when it doesn't exist."""
126+ # Setup - kubeconfig doesn't exist
127+ mock_exists .return_value = False
128+
129+ # Execute
130+ result = connect (
131+ server = "https://api.test.example.com:6443" ,
132+ token = "test-token-123" ,
133+ skipVerify = False ,
134+ )
135+
136+ # Verify
137+ assert result is True
138+ mock_makedirs .assert_called_once () # Should create directory
139+ mock_yaml_dump .assert_called_once ()
140+ mock_load_config .assert_called_once ()
0 commit comments