Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit c418e16

Browse filesBrowse files
committed
test: changed test settings as per review comments
1 parent 57e4be4 commit c418e16
Copy full SHA for c418e16

12 files changed

+178
-296
lines changed

‎noxfile.py

Copy file name to clipboardExpand all lines: noxfile.py
+1-1Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ def default(session):
8484
"--cov-append",
8585
"--cov-config=.coveragerc",
8686
"--cov-report=",
87-
"--cov-fail-under=70",
87+
"--cov-fail-under=68",
8888
os.path.join("tests", "unit"),
8989
*session.posargs
9090
)

‎tests/conftest.py

Copy file name to clipboard
+13Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import os
2+
import django
3+
from django.conf import settings
4+
5+
# We manually designate which settings we will be using in an environment
6+
# variable. This is similar to what occurs in the `manage.py` file.
7+
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "tests.settings")
8+
9+
10+
# `pytest` automatically calls this function once when tests are run.
11+
def pytest_configure():
12+
settings.DEBUG = False
13+
django.setup()

‎tests/unit/django_spanner/models.py

Copy file name to clipboardExpand all lines: tests/unit/django_spanner/models.py
-6Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,7 @@
66
"""
77
Different models used for testing django-spanner code.
88
"""
9-
import os
109
from django.db import models
11-
import django
12-
13-
# Load django settings before loading django models.
14-
os.environ["DJANGO_SETTINGS_MODULE"] = "tests.settings"
15-
django.setup()
1610

1711

1812
# Register transformations for model fields.
+33Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# Copyright 2021 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+
from django_spanner.client import DatabaseClient
8+
from django_spanner.base import DatabaseWrapper
9+
from django_spanner.operations import DatabaseOperations
10+
from unittest import TestCase
11+
import os
12+
13+
14+
class SpannerSimpleTestClass(TestCase):
15+
@classmethod
16+
def setUpClass(cls):
17+
cls.PROJECT = os.environ["GOOGLE_CLOUD_PROJECT"]
18+
19+
cls.INSTANCE_ID = "instance_id"
20+
cls.DATABASE_ID = "database_id"
21+
cls.USER_AGENT = "django_spanner/2.2.0a1"
22+
cls.OPTIONS = {"option": "dummy"}
23+
24+
cls.settings_dict = {
25+
"PROJECT": cls.PROJECT,
26+
"INSTANCE": cls.INSTANCE_ID,
27+
"NAME": cls.DATABASE_ID,
28+
"user_agent": cls.USER_AGENT,
29+
"OPTIONS": cls.OPTIONS,
30+
}
31+
cls.db_client = DatabaseClient(cls.settings_dict)
32+
cls.db_wrapper = cls.connection = DatabaseWrapper(cls.settings_dict)
33+
cls.db_operations = DatabaseOperations(cls.connection)

‎tests/unit/django_spanner/test_base.py

Copy file name to clipboardExpand all lines: tests/unit/django_spanner/test_base.py
+26-61Lines changed: 26 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -4,55 +4,24 @@
44
# license that can be found in the LICENSE file or at
55
# https://developers.google.com/open-source/licenses/bsd
66

7-
import unittest
8-
import os
9-
10-
from mock_import import mock_import
117
from unittest import mock
8+
from tests.unit.django_spanner.simple_test import SpannerSimpleTestClass
129

1310

14-
@mock_import()
15-
class TestBase(unittest.TestCase):
16-
PROJECT = os.environ["GOOGLE_CLOUD_PROJECT"]
17-
INSTANCE_ID = "instance_id"
18-
DATABASE_ID = "database_id"
19-
USER_AGENT = "django_spanner/2.2.0a1"
20-
OPTIONS = {"option": "dummy"}
21-
22-
settings_dict = {
23-
"PROJECT": PROJECT,
24-
"INSTANCE": INSTANCE_ID,
25-
"NAME": DATABASE_ID,
26-
"user_agent": USER_AGENT,
27-
"OPTIONS": OPTIONS,
28-
}
29-
30-
def _get_target_class(self):
31-
from django_spanner.base import DatabaseWrapper
32-
33-
return DatabaseWrapper
34-
35-
def _make_one(self, *args, **kwargs):
36-
return self._get_target_class()(*args, **kwargs)
37-
11+
class TestBase(SpannerSimpleTestClass):
3812
def test_property_instance(self):
39-
settings_dict = {"INSTANCE": "instance"}
40-
db_wrapper = self._make_one(settings_dict=settings_dict)
41-
4213
with mock.patch("django_spanner.base.spanner") as mock_spanner:
4314
mock_spanner.Client = mock_client = mock.MagicMock()
4415
mock_client().instance = mock_instance = mock.MagicMock()
45-
_ = db_wrapper.instance
46-
mock_instance.assert_called_once_with(settings_dict["INSTANCE"])
16+
_ = self.db_wrapper.instance
17+
mock_instance.assert_called_once_with(self.INSTANCE_ID)
4718

4819
def test_property_nodb_connection(self):
49-
db_wrapper = self._make_one(None)
5020
with self.assertRaises(NotImplementedError):
51-
db_wrapper._nodb_connection()
21+
self.db_wrapper._nodb_connection()
5222

5323
def test_get_connection_params(self):
54-
db_wrapper = self._make_one(self.settings_dict)
55-
params = db_wrapper.get_connection_params()
24+
params = self.db_wrapper.get_connection_params()
5625

5726
self.assertEqual(params["project"], self.PROJECT)
5827
self.assertEqual(params["instance_id"], self.INSTANCE_ID)
@@ -61,54 +30,50 @@ def test_get_connection_params(self):
6130
self.assertEqual(params["option"], self.OPTIONS["option"])
6231

6332
def test_get_new_connection(self):
64-
db_wrapper = self._make_one(self.settings_dict)
65-
db_wrapper.Database = mock_database = mock.MagicMock()
33+
self.db_wrapper.Database = mock_database = mock.MagicMock()
6634
mock_database.connect = mock_connection = mock.MagicMock()
6735
conn_params = {"test_param": "dummy"}
68-
db_wrapper.get_new_connection(conn_params)
36+
self.db_wrapper.get_new_connection(conn_params)
6937
mock_connection.assert_called_once_with(**conn_params)
7038

7139
def test_init_connection_state(self):
72-
db_wrapper = self._make_one(self.settings_dict)
73-
db_wrapper.connection = mock_connection = mock.MagicMock()
40+
self.db_wrapper.connection = mock_connection = mock.MagicMock()
7441
mock_connection.close = mock_close = mock.MagicMock()
75-
db_wrapper.init_connection_state()
42+
self.db_wrapper.init_connection_state()
7643
mock_close.assert_called_once_with()
7744

7845
def test_create_cursor(self):
79-
db_wrapper = self._make_one(self.settings_dict)
80-
db_wrapper.connection = mock_connection = mock.MagicMock()
46+
self.db_wrapper.connection = mock_connection = mock.MagicMock()
8147
mock_connection.cursor = mock_cursor = mock.MagicMock()
82-
db_wrapper.create_cursor()
48+
self.db_wrapper.create_cursor()
8349
mock_cursor.assert_called_once_with()
8450

8551
def test_set_autocommit(self):
86-
db_wrapper = self._make_one(self.settings_dict)
87-
db_wrapper.connection = mock_connection = mock.MagicMock()
52+
self.db_wrapper.connection = mock_connection = mock.MagicMock()
8853
mock_connection.autocommit = False
89-
db_wrapper._set_autocommit(True)
54+
self.db_wrapper._set_autocommit(True)
9055
self.assertEqual(mock_connection.autocommit, True)
9156

9257
def test_is_usable(self):
93-
from google.cloud.spanner_dbapi.exceptions import Error
94-
95-
db_wrapper = self._make_one(self.settings_dict)
96-
db_wrapper.connection = None
97-
self.assertFalse(db_wrapper.is_usable())
58+
self.db_wrapper.connection = None
59+
self.assertFalse(self.db_wrapper.is_usable())
9860

99-
db_wrapper.connection = mock_connection = mock.MagicMock()
61+
self.db_wrapper.connection = mock_connection = mock.MagicMock()
10062
mock_connection.is_closed = True
101-
self.assertFalse(db_wrapper.is_usable())
63+
self.assertFalse(self.db_wrapper.is_usable())
10264

10365
mock_connection.is_closed = False
104-
self.assertTrue(db_wrapper.is_usable())
66+
self.assertTrue(self.db_wrapper.is_usable())
67+
68+
def test_is_usable_with_error(self):
69+
from google.cloud.spanner_dbapi.exceptions import Error
10570

71+
self.db_wrapper.connection = mock_connection = mock.MagicMock()
10672
mock_connection.cursor = mock.MagicMock(side_effect=Error)
107-
self.assertFalse(db_wrapper.is_usable())
73+
self.assertFalse(self.db_wrapper.is_usable())
10874

10975
def test_start_transaction_under_autocommit(self):
110-
db_wrapper = self._make_one(self.settings_dict)
111-
db_wrapper.connection = mock_connection = mock.MagicMock()
76+
self.db_wrapper.connection = mock_connection = mock.MagicMock()
11277
mock_connection.cursor = mock_cursor = mock.MagicMock()
113-
db_wrapper._start_transaction_under_autocommit()
78+
self.db_wrapper._start_transaction_under_autocommit()
11479
mock_cursor.assert_called_once_with()

‎tests/unit/django_spanner/test_client.py

Copy file name to clipboardExpand all lines: tests/unit/django_spanner/test_client.py
+4-28Lines changed: 4 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -4,36 +4,12 @@
44
# license that can be found in the LICENSE file or at
55
# https://developers.google.com/open-source/licenses/bsd
66

7-
import unittest
8-
import os
9-
from google.cloud.spanner_dbapi.exceptions import NotSupportedError
10-
11-
12-
class TestClient(unittest.TestCase):
13-
PROJECT = os.environ["GOOGLE_CLOUD_PROJECT"]
14-
INSTANCE_ID = "instance_id"
15-
DATABASE_ID = "database_id"
16-
USER_AGENT = "django_spanner/2.2.0a1"
17-
OPTIONS = {"option": "dummy"}
18-
19-
settings_dict = {
20-
"PROJECT": PROJECT,
21-
"INSTANCE": INSTANCE_ID,
22-
"NAME": DATABASE_ID,
23-
"user_agent": USER_AGENT,
24-
"OPTIONS": OPTIONS,
25-
}
267

27-
def _get_target_class(self):
28-
from django_spanner.client import DatabaseClient
29-
30-
return DatabaseClient
8+
from google.cloud.spanner_dbapi.exceptions import NotSupportedError
9+
from tests.unit.django_spanner.simple_test import SpannerSimpleTestClass
3110

32-
def _make_one(self, *args, **kwargs):
33-
return self._get_target_class()(*args, **kwargs)
3411

12+
class TestClient(SpannerSimpleTestClass):
3513
def test_runshell(self):
36-
db_wrapper = self._make_one(self.settings_dict)
37-
3814
with self.assertRaises(NotSupportedError):
39-
db_wrapper.runshell(parameters=self.settings_dict)
15+
self.db_client.runshell(parameters=self.settings_dict)

‎tests/unit/django_spanner/test_compiler.py

Copy file name to clipboardExpand all lines: tests/unit/django_spanner/test_compiler.py
+12-32Lines changed: 12 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,15 @@
44
# license that can be found in the LICENSE file or at
55
# https://developers.google.com/open-source/licenses/bsd
66

7-
from django.test import SimpleTestCase
87
from django.core.exceptions import EmptyResultSet
98
from django.db.utils import DatabaseError
109
from django_spanner.compiler import SQLCompiler
1110
from django.db.models.query import QuerySet
11+
from tests.unit.django_spanner.simple_test import SpannerSimpleTestClass
1212
from .models import Number
1313

1414

15-
class TestCompiler(SimpleTestCase):
16-
settings_dict = {"dummy_param": "dummy"}
17-
18-
def _get_target_class(self):
19-
from django_spanner.base import DatabaseWrapper
20-
21-
return DatabaseWrapper
22-
23-
def _make_one(self, *args, **kwargs):
24-
return self._get_target_class()(*args, **kwargs)
25-
15+
class TestCompiler(SpannerSimpleTestClass):
2616
def test_unsupported_ordering_slicing_raises_db_error(self):
2717
"""
2818
Tries limit/offset and order by in subqueries which are not supported
@@ -31,23 +21,22 @@ def test_unsupported_ordering_slicing_raises_db_error(self):
3121
qs1 = Number.objects.all()
3222
qs2 = Number.objects.all()
3323
msg = "LIMIT/OFFSET not allowed in subqueries of compound statements"
34-
with self.assertRaisesMessage(DatabaseError, msg):
24+
with self.assertRaisesRegex(DatabaseError, msg):
3525
list(qs1.union(qs2[:10]))
3626
msg = "ORDER BY not allowed in subqueries of compound statements"
37-
with self.assertRaisesMessage(DatabaseError, msg):
27+
with self.assertRaisesRegex(DatabaseError, msg):
3828
list(qs1.order_by("id").union(qs2))
3929

4030
def test_get_combinator_sql_all_union_sql_generated(self):
4131
"""
4232
Tries union sql generator.
4333
"""
44-
connection = self._make_one(self.settings_dict)
4534

4635
qs1 = Number.objects.filter(num__lte=1).values("num")
4736
qs2 = Number.objects.filter(num__gte=8).values("num")
4837
qs4 = qs1.union(qs2)
4938

50-
compiler = SQLCompiler(qs4.query, connection, "default")
39+
compiler = SQLCompiler(qs4.query, self.connection, "default")
5140
sql_compiled, params = compiler.get_combinator_sql("union", True)
5241
self.assertEqual(
5342
sql_compiled,
@@ -63,13 +52,12 @@ def test_get_combinator_sql_distinct_union_sql_generated(self):
6352
"""
6453
Tries union sql generator with distinct.
6554
"""
66-
connection = self._make_one(self.settings_dict)
6755

6856
qs1 = Number.objects.filter(num__lte=1).values("num")
6957
qs2 = Number.objects.filter(num__gte=8).values("num")
7058
qs4 = qs1.union(qs2)
7159

72-
compiler = SQLCompiler(qs4.query, connection, "default")
60+
compiler = SQLCompiler(qs4.query, self.connection, "default")
7361
sql_compiled, params = compiler.get_combinator_sql("union", False)
7462
self.assertEqual(
7563
sql_compiled,
@@ -86,13 +74,11 @@ def test_get_combinator_sql_difference_all_sql_generated(self):
8674
"""
8775
Tries difference sql generator.
8876
"""
89-
connection = self._make_one(self.settings_dict)
90-
9177
qs1 = Number.objects.filter(num__lte=1).values("num")
9278
qs2 = Number.objects.filter(num__gte=8).values("num")
9379
qs4 = qs1.difference(qs2)
9480

95-
compiler = SQLCompiler(qs4.query, connection, "default")
81+
compiler = SQLCompiler(qs4.query, self.connection, "default")
9682
sql_compiled, params = compiler.get_combinator_sql("difference", True)
9783

9884
self.assertEqual(
@@ -109,13 +95,11 @@ def test_get_combinator_sql_difference_distinct_sql_generated(self):
10995
"""
11096
Tries difference sql generator with distinct.
11197
"""
112-
connection = self._make_one(self.settings_dict)
113-
11498
qs1 = Number.objects.filter(num__lte=1).values("num")
11599
qs2 = Number.objects.filter(num__gte=8).values("num")
116100
qs4 = qs1.difference(qs2)
117101

118-
compiler = SQLCompiler(qs4.query, connection, "default")
102+
compiler = SQLCompiler(qs4.query, self.connection, "default")
119103
sql_compiled, params = compiler.get_combinator_sql("difference", False)
120104

121105
self.assertEqual(
@@ -133,20 +117,18 @@ def test_get_combinator_sql_union_and_difference_query_together(self):
133117
"""
134118
Tries sql generator with union of queryset with queryset of difference.
135119
"""
136-
connection = self._make_one(self.settings_dict)
137-
138120
qs1 = Number.objects.filter(num__lte=1).values("num")
139121
qs2 = Number.objects.filter(num__gte=8).values("num")
140122
qs3 = Number.objects.filter(num__exact=10).values("num")
141123
qs4 = qs1.union(qs2.difference(qs3))
142124

143-
compiler = SQLCompiler(qs4.query, connection, "default")
125+
compiler = SQLCompiler(qs4.query, self.connection, "default")
144126
sql_compiled, params = compiler.get_combinator_sql("union", False)
145127
self.assertEqual(
146128
sql_compiled,
147129
[
148130
"SELECT tests_number.num FROM tests_number WHERE "
149-
+ "tests_number.num <= %s UNION DISTINCT ("
131+
+ "tests_number.num <= %s UNION DISTINCT SELECT * FROM ("
150132
+ "SELECT tests_number.num FROM tests_number WHERE "
151133
+ "tests_number.num >= %s EXCEPT DISTINCT "
152134
+ "SELECT tests_number.num FROM tests_number "
@@ -160,14 +142,13 @@ def test_get_combinator_sql_parentheses_in_compound_not_supported(self):
160142
Tries sql generator with union of queryset with queryset of difference,
161143
adding support for parentheses in compound sql statement.
162144
"""
163-
connection = self._make_one(self.settings_dict)
164145

165146
qs1 = Number.objects.filter(num__lte=1).values("num")
166147
qs2 = Number.objects.filter(num__gte=8).values("num")
167148
qs3 = Number.objects.filter(num__exact=10).values("num")
168149
qs4 = qs1.union(qs2.difference(qs3))
169150

170-
compiler = SQLCompiler(qs4.query, connection, "default")
151+
compiler = SQLCompiler(qs4.query, self.connection, "default")
171152
compiler.connection.features.supports_parentheses_in_compound = False
172153
sql_compiled, params = compiler.get_combinator_sql("union", False)
173154
self.assertEqual(
@@ -187,7 +168,6 @@ def test_get_combinator_sql_empty_queryset_raises_exception(self):
187168
"""
188169
Tries sql generator with empty queryset.
189170
"""
190-
connection = self._make_one(self.settings_dict)
191-
compiler = SQLCompiler(QuerySet().query, connection, "default")
171+
compiler = SQLCompiler(QuerySet().query, self.connection, "default")
192172
with self.assertRaises(EmptyResultSet):
193173
compiler.get_combinator_sql("union", False)

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.