Initial commit
[ta/config-manager.git] / cmframework / test / cmsnapshot_test.py
diff --git a/cmframework/test/cmsnapshot_test.py b/cmframework/test/cmsnapshot_test.py
new file mode 100644 (file)
index 0000000..7d8f429
--- /dev/null
@@ -0,0 +1,201 @@
+# 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.
+
+import unittest
+import mock
+from mock import call
+import json
+
+from cmframework.server.cmsnapshot import CMSnapshot
+from cmframework.apis.cmerror import CMError
+
+
+class CMSnapshotTest(unittest.TestCase):
+    @staticmethod
+    def snapshot_list_data(name):
+        return {'snapshot_properties': {'some': 'value'},
+                'snapshot_metadata': 'meta-{}'.format(name)}
+
+    @mock.patch('cmframework.server.cmsnapshot.logging')
+    def test_new_snapshot_object(self, mock_logging):
+        mock_handler = mock.MagicMock()
+
+        snapshot = CMSnapshot(mock_handler)
+
+        with self.assertRaises(CMError) as context:
+            snapshot.get_property('foo')
+
+    @mock.patch('cmframework.server.cmsnapshot.logging')
+    def test_restore_without_load(self, mock_logging):
+        mock_handler = mock.MagicMock()
+
+        mock_target_backend = mock.MagicMock()
+        mock_target_backend.get_properties.return_value = {"foo": "bar",
+                                                           "some": {"other": "value"}}
+
+        snapshot = CMSnapshot(mock_handler)
+
+        with self.assertRaises(CMError) as context:
+            snapshot.restore(mock_target_backend)
+
+    @mock.patch('cmframework.server.cmsnapshot.datetime.datetime')
+    @mock.patch('cmframework.server.cmsnapshot.logging')
+    def test_create(self, mock_logging, mock_datetime):
+        mock_handler = mock.MagicMock()
+        mock_handler.snapshot_exists.return_value = False
+
+        mock_source_backend = mock.MagicMock()
+        mock_source_backend.get_properties.return_value = {"foo": "bar", "some": {"other": "value"}}
+        mock_source_backend.get_property.return_value = 'some'
+
+        mock_datetime.now = mock.MagicMock()
+        from datetime import datetime
+        mock_datetime.now.return_value = datetime.now()
+        expected_creation_date = mock_datetime.now.return_value.isoformat()
+
+        snapshot = CMSnapshot(mock_handler)
+        snapshot.create('snap1', mock_source_backend)
+
+        mock_handler.set_data.assert_called_once_with(
+            'snap1',
+            {'snapshot_properties': mock_source_backend.get_properties.return_value,
+             'snapshot_metadata': {'name': 'snap1',
+                                   'creation_date': expected_creation_date,
+                                   'custom': None}})
+
+    @mock.patch('cmframework.server.cmsnapshot.logging')
+    def test_create_already_exists(self, mock_logging):
+        mock_handler = mock.MagicMock()
+        mock_handler.snapshot_exists.return_value = True
+
+        mock_backend_handler = mock.MagicMock()
+
+        snapshot = CMSnapshot(mock_handler)
+
+        with self.assertRaises(CMError) as context:
+            snapshot.create('already_exists', mock_backend_handler)
+
+    @mock.patch('cmframework.server.cmsnapshot.logging')
+    def test_load_non_existing(self, mock_logging):
+        mock_handler = mock.MagicMock()
+        mock_handler.snapshot_exists.return_value = False
+
+        snapshot = CMSnapshot(mock_handler)
+
+        with self.assertRaises(CMError) as context:
+            snapshot.load('snap1')
+
+    @mock.patch('cmframework.server.cmsnapshot.logging')
+    def test_load(self, mock_logging):
+        expected_data = {'some': 'value'}
+        expected_metadata = {'name': 'snap1',
+                             'creation_date': 'somedate',
+                             'custom': None}
+
+        mock_handler = mock.MagicMock()
+        mock_handler.snapshot_exists.return_value = True
+        mock_handler.get_data.return_value = {
+            'snapshot_properties': expected_data,
+            'snapshot_metadata': expected_metadata}
+
+        snapshot = CMSnapshot(mock_handler)
+
+        snapshot.load('already_exists')
+
+        assert snapshot._data == expected_data
+        assert snapshot._metadata == expected_metadata
+
+    @mock.patch('cmframework.server.cmsnapshot.logging')
+    def test_restore(self, mock_logging):
+        expected_data = {'foo': 'bar', 'some': {'other': 'value'}}
+        expected_metadata = {'name': 'already_exists',
+                             'creation_date': 'somedate',
+                             'custom': None}
+
+        mock_handler = mock.MagicMock()
+        mock_handler.snapshot_exists.return_value = True
+        mock_handler.get_data.return_value = {
+            'snapshot_properties': expected_data,
+            'snapshot_metadata': expected_metadata}
+
+        target_backend = mock.MagicMock()
+        target_backend.get_properties.return_value = {"a": "1", "b": "2"}
+
+        snapshot = CMSnapshot(mock_handler)
+        snapshot.load('already_exists')
+
+        snapshot.restore(target_backend)
+
+        assert {'a', 'b'} == set(target_backend.delete_properties.call_args[0][0])
+        target_backend.set_properties.assert_called_once_with(expected_data)
+
+    @mock.patch('cmframework.server.cmsnapshot.logging')
+    def test_restore_only_one_in_target(self, mock_logging):
+        expected_data = {'foo': 'bar', 'some': {'other': 'value'}}
+        expected_metadata = {'name': 'already_exists',
+                             'creation_date': 'somedate',
+                             'custom': None}
+
+        mock_handler = mock.MagicMock()
+        mock_handler.snapshot_exists.return_value = True
+        mock_handler.get_data.return_value = {
+            'snapshot_properties': expected_data,
+            'snapshot_metadata': expected_metadata}
+
+        target_backend = mock.MagicMock()
+        target_backend.get_properties.return_value = {"a": "1"}
+
+        snapshot = CMSnapshot(mock_handler)
+        snapshot.load('already_exists')
+
+        snapshot.restore(target_backend)
+
+        target_backend.delete_property.assert_called_once_with('a')
+        target_backend.set_properties.assert_called_once_with(expected_data)
+
+    @mock.patch('cmframework.server.cmsnapshot.logging')
+    def test_list(self, mock_logging):
+        mock_handler = mock.MagicMock()
+        mock_handler.get_data.side_effect = CMSnapshotTest.snapshot_list_data
+        mock_handler.list_snapshots.return_value = {'snap1', 'snap2'}
+
+        expected_snapshot_list = {'meta-snap1', 'meta-snap2'}
+
+        snapshot = CMSnapshot(mock_handler)
+        snapshot_list = snapshot.list()
+
+        assert set(snapshot_list) == expected_snapshot_list
+
+    @mock.patch('cmframework.server.cmsnapshot.logging')
+    def test_delete(self, mock_logging):
+        mock_handler = mock.MagicMock()
+        mock_handler.snapshot_exists.return_value = True
+
+        snapshot = CMSnapshot(mock_handler)
+        snapshot.delete('already_exists')
+
+        mock_handler.delete_snapshot.assert_called_once_with('already_exists')
+
+    @mock.patch('cmframework.server.cmsnapshot.logging')
+    def test_delete_non_existing(self, mock_logging):
+        mock_handler = mock.MagicMock()
+        mock_handler.snapshot_exists.return_value = False
+
+        snapshot = CMSnapshot(mock_handler)
+
+        with self.assertRaises(CMError) as context:
+            snapshot.delete('snap1')
+
+if __name__ == '__main__':
+    unittest.main()