Skip to content

Commit c6c4acf

Browse files
committed
Cover the database router with tests
1 parent ec6c2e5 commit c6c4acf

File tree

1 file changed

+136
-1
lines changed

1 file changed

+136
-1
lines changed
Lines changed: 136 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,136 @@
1-
# TODO
1+
from itertools import combinations
2+
3+
import pytest
4+
from django.apps import apps
5+
from django.conf import settings
6+
from django.db.models import Model
7+
from pytest_django.fixtures import SettingsWrapper
8+
from pytest_mock import MockerFixture
9+
10+
from task_processor import routers
11+
12+
13+
@pytest.mark.parametrize(
14+
"given_settings, expected",
15+
[
16+
({"TASK_PROCESSOR_DATABASES": ["task_processor"]}, True),
17+
({"TASK_PROCESSOR_DATABASES": ["default", "task_processor"]}, True),
18+
({"TASK_PROCESSOR_DATABASES": ["default"]}, False),
19+
],
20+
)
21+
def test_TaskProcessorRouter__checks_whether_is_enabled(
22+
settings: SettingsWrapper,
23+
given_settings: dict[str, None | str],
24+
expected: bool,
25+
) -> None:
26+
# Given
27+
for key, value in given_settings.items():
28+
setattr(settings, key, value)
29+
30+
# When
31+
router = routers.TaskProcessorRouter()
32+
33+
# Then
34+
assert router.is_enabled is expected
35+
36+
37+
@pytest.mark.parametrize("model", apps.get_app_config("task_processor").get_models())
38+
def test_TaskProcessorRouter__enabled__routes_queries_to_task_processor_database(
39+
mocker: MockerFixture,
40+
model: type[Model],
41+
) -> None:
42+
# Given
43+
mocker.patch.object(routers.TaskProcessorRouter, "is_enabled", new=True)
44+
45+
# When
46+
router = routers.TaskProcessorRouter()
47+
read_database = router.db_for_read(model)
48+
write_database = router.db_for_write(model)
49+
50+
# Then
51+
assert read_database == write_database == "task_processor"
52+
53+
54+
@pytest.mark.parametrize("model", apps.get_app_config("task_processor").get_models())
55+
def test_TaskProcessorRouter__disabled__does_not_route_database_queries(
56+
mocker: MockerFixture,
57+
model: type[Model],
58+
) -> None:
59+
# Given
60+
mocker.patch.object(routers.TaskProcessorRouter, "is_enabled", new=False)
61+
62+
# When
63+
router = routers.TaskProcessorRouter()
64+
read_database = router.db_for_read(model)
65+
write_database = router.db_for_write(model)
66+
allows_relation = router.allow_relation(model(), model())
67+
allows_migrate = {
68+
router.allow_migrate("default", app_label="task_processor"),
69+
router.allow_migrate("task_processor", app_label="task_processor"),
70+
router.allow_migrate("other", app_label="task_processor"),
71+
router.allow_migrate("task_processor", app_label="other"),
72+
}
73+
74+
# Then
75+
assert read_database is None
76+
assert write_database is None
77+
assert allows_relation is None
78+
assert allows_migrate == {None}
79+
80+
81+
@pytest.mark.parametrize(
82+
"model1, model2, expected",
83+
[ # True if both models are from task_processor app
84+
(*model_pair, True)
85+
for model_pair in combinations(
86+
apps.get_app_config("task_processor").get_models(), 2
87+
)
88+
]
89+
+ [ # None if either model is not from task_processor app
90+
(model, apps.get_model(settings.AUTH_USER_MODEL), None)
91+
for model in apps.get_app_config("task_processor").get_models()
92+
],
93+
)
94+
def test_TaskProcessorRouter__allow_relation__returns_according_to_given_models(
95+
mocker: MockerFixture,
96+
model1: type[Model],
97+
model2: type[Model],
98+
expected: bool,
99+
) -> None:
100+
# Given
101+
mocker.patch.object(routers.TaskProcessorRouter, "is_enabled", new=True)
102+
103+
# When
104+
router = routers.TaskProcessorRouter()
105+
allow_relation = router.allow_relation(model1(), model2())
106+
107+
# Then
108+
assert allow_relation is expected
109+
110+
111+
@pytest.mark.parametrize(
112+
"database, app_label, expected",
113+
[
114+
("task_processor", "task_processor", True),
115+
("default", "task_processor", True),
116+
("other", "task_processor", False),
117+
("task_processor", "other", None),
118+
("default", "other", None),
119+
("other", "other", None),
120+
],
121+
)
122+
def test_TaskProcessorRouter__allow_migrate__applies_to_both_databases(
123+
app_label: str,
124+
database: str,
125+
expected: bool,
126+
mocker: MockerFixture,
127+
) -> None:
128+
# Given
129+
mocker.patch.object(routers.TaskProcessorRouter, "is_enabled", new=True)
130+
131+
# When
132+
router = routers.TaskProcessorRouter()
133+
allow_migrate = router.allow_migrate(database, app_label)
134+
135+
# Then
136+
assert allow_migrate is expected

0 commit comments

Comments
 (0)