From 6c78674266a5b52581595c95a649d9bf82d89c6a Mon Sep 17 00:00:00 2001
From: Laszlo Hegedus <laszlo.hegedus@ericsson.com>
Date: Fri, 20 May 2016 14:44:18 +0200
Subject: [PATCH] Add unit tests for common repositories module

Add unit tests for repositories.mysql module.

Change-Id: Ia834b87cf5619bdb2bdf471352600e69e53a3eea
---
 monasca_common/tests/test_repositories.py | 93 +++++++++++++++++++++++
 1 file changed, 93 insertions(+)
 create mode 100644 monasca_common/tests/test_repositories.py

diff --git a/monasca_common/tests/test_repositories.py b/monasca_common/tests/test_repositories.py
new file mode 100644
index 00000000..d832dd3c
--- /dev/null
+++ b/monasca_common/tests/test_repositories.py
@@ -0,0 +1,93 @@
+#   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
+
+import monasca_common.repositories.exceptions as exceptions
+from monasca_common.repositories.mysql import mysql_repository
+
+
+class TestMySQLRepository(unittest.TestCase):
+
+    def setUp(self):
+        self.cfg_patcher = mock.patch('oslo_config.cfg.CONF')
+
+        self.mock_cfg = self.cfg_patcher.start()
+
+    def tearDown(self):
+        self.cfg_patcher.stop()
+
+    def test_init(self):
+        mysql_repository_obj = mysql_repository.MySQLRepository()
+
+        self.assertEqual(mysql_repository_obj.conf, self.mock_cfg)
+        self.assertEqual(mysql_repository_obj.database_name,
+                         self.mock_cfg.mysql.database_name)
+        self.assertEqual(mysql_repository_obj.database_server,
+                         self.mock_cfg.mysql.hostname)
+        self.assertEqual(mysql_repository_obj.database_uid,
+                         self.mock_cfg.mysql.username)
+        self.assertEqual(mysql_repository_obj.database_pwd,
+                         self.mock_cfg.mysql.password)
+
+    def test_init_with_exception(self):
+        self.mock_cfg.mysql = None
+
+        self.assertRaises(exceptions.RepositoryException,
+                          mysql_repository.MySQLRepository)
+
+    @mock.patch('pymysql.cursors')
+    @mock.patch('pymysql.connect')
+    def test_execute_query(self, mock_pymysql_connect, mock_pymysql_cursors):
+        query = mock.Mock()
+        params = mock.Mock()
+        ctx = mock_pymysql_connect.return_value
+        cursor = ctx.cursor.return_value
+        mysql_repository_obj = mysql_repository.MySQLRepository()
+
+        mysql_repository_obj._execute_query(query, params)
+
+        self.assertTrue(mock_pymysql_connect.called)
+        ctx.cursor.assert_called_once_with(mock_pymysql_cursors.DictCursor)
+        cursor.execute.assert_called_once_with(query, params)
+        self.assertTrue(cursor.fetchall)
+
+    def _test_mysql_try_catch_block_decorator_with_exception(
+            self, exception, expected_exception_class=None):
+        @mysql_repository.mysql_try_catch_block
+        def raise_exception():
+            raise exception
+
+        if expected_exception_class is None:
+            expected_exception_class = exception.__class__
+
+        self.assertRaises(expected_exception_class, raise_exception)
+
+    def test_mysql_try_catch_decorator_with_repository_exceptions(self):
+        for exception in [exceptions.DoesNotExistException(),
+                          exceptions.AlreadyExistsException(),
+                          exceptions.InvalidUpdateException()]:
+            self._test_mysql_try_catch_block_decorator_with_exception(
+                exception)
+
+    @mock.patch('monasca_common.repositories.mysql.mysql_repository.LOG')
+    def test_mysql_try_catch_decorator_with_non_repository_exception(
+            self, mock_log):
+        class NonRepositoryException(Exception):
+            pass
+        exception = NonRepositoryException()
+
+        self._test_mysql_try_catch_block_decorator_with_exception(
+            exception, expected_exception_class=exceptions.RepositoryException)
+        mock_log.exception.assert_called_once_with(exception)