|
| 1 | +# Copyright 2020 Google LLC |
| 2 | +# |
| 3 | +# Use of this source code is governed by a BSD-style |
| 4 | +# license that can be found in the LICENSE file or at |
| 5 | +# https://developers.google.com/open-source/licenses/bsd |
| 6 | + |
| 7 | +import sys |
| 8 | +import unittest |
| 9 | + |
| 10 | +from mock_import import mock_import |
| 11 | +from unittest import mock |
| 12 | + |
| 13 | + |
| 14 | +@mock_import() |
| 15 | +@unittest.skipIf(sys.version_info < (3, 6), reason="Skipping Python 3.5") |
| 16 | +class TestBase(unittest.TestCase): |
| 17 | + PROJECT = "project" |
| 18 | + INSTANCE_ID = "instance_id" |
| 19 | + DATABASE_ID = "database_id" |
| 20 | + USER_AGENT = "django_spanner/2.2.0a1" |
| 21 | + OPTIONS = {"option": "dummy"} |
| 22 | + |
| 23 | + settings_dict = { |
| 24 | + "PROJECT": PROJECT, |
| 25 | + "INSTANCE": INSTANCE_ID, |
| 26 | + "NAME": DATABASE_ID, |
| 27 | + "user_agent": USER_AGENT, |
| 28 | + "OPTIONS": OPTIONS, |
| 29 | + } |
| 30 | + |
| 31 | + def _get_target_class(self): |
| 32 | + from django_spanner.base import DatabaseWrapper |
| 33 | + |
| 34 | + return DatabaseWrapper |
| 35 | + |
| 36 | + def _make_one(self, *args, **kwargs): |
| 37 | + return self._get_target_class()(*args, **kwargs) |
| 38 | + |
| 39 | + def test_property_instance(self): |
| 40 | + settings_dict = {"INSTANCE": "instance"} |
| 41 | + db_wrapper = self._make_one(settings_dict=settings_dict) |
| 42 | + |
| 43 | + with mock.patch("django_spanner.base.spanner") as mock_spanner: |
| 44 | + mock_spanner.Client = mock_client = mock.MagicMock() |
| 45 | + mock_client().instance = mock_instance = mock.MagicMock() |
| 46 | + _ = db_wrapper.instance |
| 47 | + mock_instance.assert_called_once_with(settings_dict["INSTANCE"]) |
| 48 | + |
| 49 | + def test_property__nodb_connection(self): |
| 50 | + db_wrapper = self._make_one(None) |
| 51 | + with self.assertRaises(NotImplementedError): |
| 52 | + db_wrapper._nodb_connection() |
| 53 | + |
| 54 | + def test_get_connection_params(self): |
| 55 | + db_wrapper = self._make_one(self.settings_dict) |
| 56 | + params = db_wrapper.get_connection_params() |
| 57 | + |
| 58 | + self.assertEqual(params["project"], self.PROJECT) |
| 59 | + self.assertEqual(params["instance_id"], self.INSTANCE_ID) |
| 60 | + self.assertEqual(params["database_id"], self.DATABASE_ID) |
| 61 | + self.assertEqual(params["user_agent"], self.USER_AGENT) |
| 62 | + self.assertEqual(params["option"], self.OPTIONS["option"]) |
| 63 | + |
| 64 | + def test_get_new_connection(self): |
| 65 | + db_wrapper = self._make_one(self.settings_dict) |
| 66 | + db_wrapper.Database = mock_database = mock.MagicMock() |
| 67 | + mock_database.connect = mock_connect = mock.MagicMock() |
| 68 | + conn_params = {"test_param": "dummy"} |
| 69 | + db_wrapper.get_new_connection(conn_params) |
| 70 | + mock_connect.assert_called_once_with(**conn_params) |
| 71 | + |
| 72 | + def test_init_connection_state(self): |
| 73 | + db_wrapper = self._make_one(self.settings_dict) |
| 74 | + db_wrapper.connection = mock_connection = mock.MagicMock() |
| 75 | + mock_connection.close = mock_close = mock.MagicMock() |
| 76 | + db_wrapper.init_connection_state() |
| 77 | + mock_close.assert_called_once_with() |
| 78 | + |
| 79 | + def test_create_cursor(self): |
| 80 | + db_wrapper = self._make_one(self.settings_dict) |
| 81 | + db_wrapper.connection = mock_connection = mock.MagicMock() |
| 82 | + mock_connection.cursor = mock_cursor = mock.MagicMock() |
| 83 | + db_wrapper.create_cursor() |
| 84 | + mock_cursor.assert_called_once_with() |
| 85 | + |
| 86 | + def test__set_autocommit(self): |
| 87 | + db_wrapper = self._make_one(self.settings_dict) |
| 88 | + db_wrapper.connection = mock_connection = mock.MagicMock() |
| 89 | + mock_connection.autocommit = False |
| 90 | + db_wrapper._set_autocommit(True) |
| 91 | + self.assertEqual(mock_connection.autocommit, True) |
| 92 | + |
| 93 | + def test_is_usable(self): |
| 94 | + from google.cloud.spanner_dbapi.exceptions import Error |
| 95 | + |
| 96 | + db_wrapper = self._make_one(self.settings_dict) |
| 97 | + db_wrapper.connection = None |
| 98 | + self.assertFalse(db_wrapper.is_usable()) |
| 99 | + |
| 100 | + db_wrapper.connection = mock_connection = mock.MagicMock() |
| 101 | + mock_connection.is_closed = True |
| 102 | + self.assertFalse(db_wrapper.is_usable()) |
| 103 | + |
| 104 | + mock_connection.is_closed = False |
| 105 | + self.assertTrue(db_wrapper.is_usable()) |
| 106 | + |
| 107 | + mock_connection.cursor = mock.MagicMock(side_effect=Error) |
| 108 | + self.assertFalse(db_wrapper.is_usable()) |
0 commit comments