+# Copyright 2021 Canonical Ltd.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+import json
+import unittest
+from unittest.mock import Mock, patch
+import yaml
+
+
+from click.testing import CliRunner
+from osmclient.scripts import osm
+
+
+@patch("builtins.print")
+@patch("osmclient.scripts.osm.PrettyTable")
+@patch("osmclient.scripts.osm.client.Client")
+@patch("osmclient.scripts.osm.check_client_version")
+@patch("osmclient.scripts.osm.get_project")
+class TestVca(unittest.TestCase):
+ def setUp(self):
+ self.runner = CliRunner()
+ self.ctx_obj = Mock()
+ self.table = Mock()
+ self.vca_data = {
+ "name": "name",
+ "_id": "1234",
+ "_admin": {
+ "detailed-status": "status",
+ "operationalState": "state",
+ },
+ }
+
+ def test_vca_list(
+ self,
+ mock_get_project,
+ mock_check_client_version,
+ mock_client,
+ mock_pretty_table,
+ mock_print,
+ ):
+ mock_client.return_value = self.ctx_obj
+ mock_pretty_table.return_value = self.table
+ mock_get_project.return_value = ("5678", "project")
+ self.ctx_obj.vca.list.return_value = [self.vca_data]
+ self.runner.invoke(
+ osm.cli_osm,
+ ["vca-list", "--filter", "somefilter"],
+ )
+ mock_check_client_version.assert_called()
+ self.ctx_obj.vca.list.assert_called_with("somefilter")
+ mock_pretty_table.assert_called_with(["Name", "Id", "Operational State"])
+ self.table.add_row.assert_called_with(["name", "1234", "state"])
+ mock_print.assert_called_with(self.table)
+
+ def test_vca_list_long(
+ self,
+ mock_get_project,
+ mock_check_client_version,
+ mock_client,
+ mock_pretty_table,
+ mock_print,
+ ):
+ mock_client.return_value = self.ctx_obj
+ mock_pretty_table.return_value = self.table
+ mock_get_project.return_value = ("5678", "project")
+ self.ctx_obj.vca.list.return_value = [self.vca_data]
+ self.runner.invoke(
+ osm.cli_osm,
+ ["vca-list", "--filter", "somefilter", "--long"],
+ )
+ mock_check_client_version.assert_called()
+ self.ctx_obj.vca.list.assert_called_with("somefilter")
+ mock_pretty_table.assert_called_with(
+ ["Name", "Id", "Project", "Operational State", "Detailed Status"]
+ )
+ self.table.add_row.assert_called_with(
+ ["name", "1234", "project", "state", "status"]
+ )
+ mock_print.assert_called_with(self.table)
+
+ def test_vca_list_literal(
+ self,
+ mock_get_project,
+ mock_check_client_version,
+ mock_client,
+ mock_pretty_table,
+ mock_print,
+ ):
+ mock_client.return_value = self.ctx_obj
+ self.ctx_obj.vca.list.return_value = [self.vca_data]
+ self.runner.invoke(
+ osm.cli_osm,
+ ["vca-list", "--literal"],
+ )
+ mock_check_client_version.assert_called()
+ self.ctx_obj.vca.list.assert_called()
+ mock_pretty_table.assert_not_called()
+ self.table.add_row.assert_not_called()
+ mock_print.assert_called_with(
+ yaml.safe_dump([self.vca_data], indent=4, default_flow_style=False)
+ )
+
+ def test_vca_show(
+ self,
+ mock_get_project,
+ mock_check_client_version,
+ mock_client,
+ mock_pretty_table,
+ mock_print,
+ ):
+ mock_client.return_value = self.ctx_obj
+ mock_pretty_table.return_value = self.table
+ self.ctx_obj.vca.get.return_value = self.vca_data
+ self.runner.invoke(
+ osm.cli_osm,
+ ["vca-show", "name"],
+ )
+ self.ctx_obj.vca.get.assert_called_with("name")
+ mock_pretty_table.assert_called_with(["key", "attribute"])
+ self.assertEqual(self.table.add_row.call_count, len(self.vca_data))
+ mock_print.assert_called_with(self.table)
+
+ def test_vca_show_literal(
+ self,
+ mock_get_project,
+ mock_check_client_version,
+ mock_client,
+ mock_pretty_table,
+ mock_print,
+ ):
+ mock_client.return_value = self.ctx_obj
+ self.ctx_obj.vca.get.return_value = self.vca_data
+ self.runner.invoke(
+ osm.cli_osm,
+ ["vca-show", "name", "--literal"],
+ )
+ self.ctx_obj.vca.get.assert_called_with("name")
+ mock_pretty_table.assert_not_called()
+ self.table.add_row.assert_not_called()
+ mock_print.assert_called_with(
+ yaml.safe_dump(self.vca_data, indent=4, default_flow_style=False)
+ )
+
+ def test_vca_update(
+ self,
+ mock_get_project,
+ mock_check_client_version,
+ mock_client,
+ mock_pretty_table,
+ mock_print,
+ ):
+ mock_client.return_value = self.ctx_obj
+ self.runner.invoke(
+ osm.cli_osm,
+ ["vca-update", "name"],
+ )
+ mock_check_client_version.assert_called()
+ self.ctx_obj.vca.update.assert_called_with("name", {"name": "name"})
+ mock_pretty_table.assert_not_called()
+ self.table.add_row.assert_not_called()
+ mock_print.assert_not_called()
+
+ def test_vca_update_with_args(
+ self,
+ mock_get_project,
+ mock_check_client_version,
+ mock_client,
+ mock_pretty_table,
+ mock_print,
+ ):
+ mock_client.return_value = self.ctx_obj
+ self.runner.invoke(
+ osm.cli_osm,
+ [
+ "vca-update",
+ "name",
+ "--endpoints",
+ "1.2.3.4:17070",
+ "--user",
+ "user",
+ "--secret",
+ "secret",
+ "--cacert",
+ "cacert",
+ "--lxd-cloud",
+ "lxd_cloud",
+ "--lxd-credentials",
+ "lxd_credentials",
+ "--k8s-cloud",
+ "k8s_cloud",
+ "--k8s-credentials",
+ "k8s_credentials",
+ "--description",
+ "description",
+ "--model-config",
+ json.dumps({"juju-https-proxy": "http://squid:3128"}),
+ ],
+ )
+ mock_check_client_version.assert_called()
+ self.ctx_obj.vca.update.assert_called_with(
+ "name",
+ {
+ "name": "name",
+ "endpoints": ["1.2.3.4:17070"],
+ "user": "user",
+ "secret": "secret",
+ "cacert": "cacert",
+ "lxd-cloud": "lxd_cloud",
+ "lxd-credentials": "lxd_credentials",
+ "k8s-cloud": "k8s_cloud",
+ "k8s-credentials": "k8s_credentials",
+ "description": "description",
+ "model-config": {"juju-https-proxy": "http://squid:3128"},
+ },
+ )
+ mock_pretty_table.assert_not_called()
+ self.table.add_row.assert_not_called()
+ mock_print.assert_not_called()
+
+ def test_vca_add(
+ self,
+ mock_get_project,
+ mock_check_client_version,
+ mock_client,
+ mock_pretty_table,
+ mock_print,
+ ):
+ mock_client.return_value = self.ctx_obj
+ self.runner.invoke(
+ osm.cli_osm,
+ [
+ "vca-add",
+ "name",
+ "--endpoints",
+ "1.2.3.4:17070",
+ "--user",
+ "user",
+ "--secret",
+ "secret",
+ "--cacert",
+ "cacert",
+ "--lxd-cloud",
+ "lxd_cloud",
+ "--lxd-credentials",
+ "lxd_credentials",
+ "--k8s-cloud",
+ "k8s_cloud",
+ "--k8s-credentials",
+ "k8s_credentials",
+ "--description",
+ "description",
+ "--model-config",
+ json.dumps({"juju-https-proxy": "http://squid:3128"}),
+ ],
+ )
+ mock_check_client_version.assert_called()
+ self.ctx_obj.vca.create.assert_called_with(
+ "name",
+ {
+ "name": "name",
+ "endpoints": ["1.2.3.4:17070"],
+ "user": "user",
+ "secret": "secret",
+ "cacert": "cacert",
+ "lxd-cloud": "lxd_cloud",
+ "lxd-credentials": "lxd_credentials",
+ "k8s-cloud": "k8s_cloud",
+ "k8s-credentials": "k8s_credentials",
+ "description": "description",
+ "model-config": {"juju-https-proxy": "http://squid:3128"},
+ },
+ )
+ mock_pretty_table.assert_not_called()
+ self.table.add_row.assert_not_called()
+ mock_print.assert_not_called()
+
+ def test_vca_delete(
+ self,
+ mock_get_project,
+ mock_check_client_version,
+ mock_client,
+ mock_pretty_table,
+ mock_print,
+ ):
+ mock_client.return_value = self.ctx_obj
+ self.runner.invoke(
+ osm.cli_osm,
+ ["vca-delete", "name"],
+ )
+ mock_check_client_version.assert_called()
+ self.ctx_obj.vca.delete.assert_called_with("name", force=False)
+ mock_pretty_table.assert_not_called()
+ self.table.add_row.assert_not_called()
+ mock_print.assert_not_called()
+
+ def test_load(
+ self,
+ mock_get_project,
+ mock_check_client_version,
+ mock_client,
+ mock_pretty_table,
+ mock_print,
+ ):
+ data = osm.load(json.dumps({"juju-https-proxy": "http://squid:3128"}))
+ self.assertEqual(data, {"juju-https-proxy": "http://squid:3128"})