Add cloudtaf framework
[ta/cloudtaf.git] / libraries / hostcli / test_hostcliuser.py
diff --git a/libraries/hostcli/test_hostcliuser.py b/libraries/hostcli/test_hostcliuser.py
new file mode 100644 (file)
index 0000000..2596640
--- /dev/null
@@ -0,0 +1,128 @@
+# Copyright 2019 Nokia
+#
+# 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.
+
+# pylint: disable=redefined-outer-name
+from collections import namedtuple
+import mock
+import pytest
+from openstackcli import (
+    OpenStack,
+    Runner)
+from . import hostcliuser
+from .hostcli import HostCli
+from .hostcliuser import HostCliUser
+
+
+@pytest.fixture
+def mock_hostcli():
+    with mock.patch.object(hostcliuser, 'HostCli',
+                           mock.create_autospec(HostCli)) as p:
+        yield p
+
+
+@pytest.fixture
+def mock_openstack():
+    with mock.patch.object(hostcliuser,
+                           'OpenStack',
+                           mock.create_autospec(OpenStack)) as p:
+        yield p
+
+
+@pytest.fixture
+def mock_runner():
+    with mock.patch.object(hostcliuser,
+                           'Runner',
+                           mock.create_autospec(Runner)) as p:
+        yield p
+
+
+@pytest.fixture(params=[{},
+                        {'envname': 'envname'},
+                        {'envname': 'otherenv'}])
+def envkwargs(request):
+    return request.param
+
+
+@pytest.fixture
+def examplehostcliuser(mock_remotesession,
+                       mock_runners,
+                       envkwargs):
+    e = ExampleHostCliUser(mock_runners,
+                           mock_remotesession=mock_remotesession,
+                           envkwargs=envkwargs)
+    e.initialize(mock_remotesession, **envkwargs)
+    for runner in mock_runners:
+        initialize = runner.return_value.initialize
+        initialize.assert_called_once_with(mock_remotesession, **envkwargs)
+    return e
+
+
+@pytest.fixture
+def mock_runners(mock_hostcli, mock_openstack, mock_runner):
+    return MockRunners(hostcli=mock_hostcli,
+                       openstack=mock_openstack,
+                       runner=mock_runner)
+
+
+class ExampleHostCliUser(HostCliUser):
+
+    def __init__(self, mock_runners, mock_remotesession, envkwargs):
+        super(ExampleHostCliUser, self).__init__()
+        self._mock_runners = mock_runners
+        self._mock_remotesession = mock_remotesession
+        self._envkwargs = envkwargs
+
+    @property
+    def cmd(self):
+        return 'cmd'
+
+    def verify_runs(self):
+        target = 'target'
+        for rm in self._runnermocks:
+            mock_run = rm.mock.return_value.run
+            assert rm.runner.run(self.cmd, target=target) == mock_run.return_value
+            mock_run.assert_called_once_with(self.cmd, target=target)
+
+            execute = self._mock_remotesession.execute_command_in_target
+            assert self._remotesession.execute_command_in_target(
+                self.cmd, target=target) == execute.return_value
+
+    @property
+    def _runnermocks(self):
+        yield RunnerMock(runner=self._hostcli, mock=self._mock_runners.hostcli)
+        yield RunnerMock(runner=self._openstack, mock=self._mock_runners.openstack)
+        yield RunnerMock(runner=self._runner, mock=self._mock_runners.runner)
+
+    def verify_get_env_target(self):
+        postfix = ('.{}'.format(self._envkwargs['envname'])
+                   if self._envkwargs else
+                   '')
+        assert self._get_env_target() == 'default{}'.format(postfix)
+        assert self._get_env_target('target') == 'target{}'.format(postfix)
+
+
+class RunnerMock(namedtuple('RunMock', ['runner', 'mock'])):
+    pass
+
+
+class MockRunners(namedtuple('MockRunners', ['hostcli', 'openstack', 'runner'])):
+    pass
+
+
+def test_hostcliuser_runners(examplehostcliuser):
+    examplehostcliuser.verify_runs()
+
+
+def test_get_env_target(examplehostcliuser):
+    examplehostcliuser.verify_get_env_target()