Skip to content

Commit 2e16ede

Browse files
authored
test: Isolate router tests from Django apps registry (#7579)
1 parent f960837 commit 2e16ede

1 file changed

Lines changed: 46 additions & 22 deletions

File tree

api/tests/unit/app/test_unit_app_routers.py

Lines changed: 46 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,32 @@
1-
from unittest import mock
1+
from collections.abc import Iterator
22

33
import pytest
4+
from django.apps import apps
45
from django.db import models
5-
from django.db.models.options import Options
66

77
from app import routers
88

99

10+
@pytest.fixture(autouse=True)
11+
def isolate_apps_registry() -> Iterator[None]:
12+
# Ad-hoc model subclasses defined in these tests register themselves
13+
# in `apps.all_models` and would otherwise leak into later tests
14+
# (e.g. makemigrations would propose phantom migrations for them).
15+
snapshot = {
16+
app_label: dict(app_models) for app_label, app_models in apps.all_models.items()
17+
}
18+
try:
19+
yield
20+
finally:
21+
# Inner dicts must be restored in place: `AppConfig.models` is set to
22+
# `apps.all_models[label]` by reference at import time, so swapping the
23+
# outer entry leaves the app config pointing at the polluted dict.
24+
for app_label, app_models in apps.all_models.items():
25+
app_models.clear()
26+
app_models.update(snapshot.get(app_label, {}))
27+
apps.clear_cache()
28+
29+
1030
@pytest.mark.parametrize(
1131
["given_app_label", "expected_db"],
1232
[
@@ -19,13 +39,14 @@ def test_analytics_router_db_for_read__given_app_label__returns_expected_db(
1939
expected_db: str | None,
2040
) -> None:
2141
# Given
22-
mock_model = mock.MagicMock(spec=models.Model)
23-
mock_model._meta = mock.MagicMock(spec=Options)
24-
mock_model._meta.app_label = given_app_label
42+
class AnalyticsModel(models.Model):
43+
class Meta:
44+
app_label = given_app_label
45+
2546
router = routers.AnalyticsRouter()
2647

2748
# When
28-
db = router.db_for_read(mock_model)
49+
db = router.db_for_read(AnalyticsModel)
2950

3051
# Then
3152
assert db == expected_db
@@ -43,13 +64,14 @@ def test_analytics_router_db_for_write__given_app_label__returns_expected_db(
4364
expected_db: str | None,
4465
) -> None:
4566
# Given
46-
mock_model = mock.MagicMock(spec=models.Model)
47-
mock_model._meta = mock.MagicMock(spec=Options)
48-
mock_model._meta.app_label = model_app_label
67+
class AnalyticsModel(models.Model):
68+
class Meta:
69+
app_label = model_app_label
70+
4971
router = routers.AnalyticsRouter()
5072

5173
# When
52-
db = router.db_for_write(mock_model)
74+
db = router.db_for_write(AnalyticsModel)
5375

5476
# Then
5577
assert db == expected_db
@@ -68,16 +90,18 @@ def test_analytics_router_allow_relation__given_app_labels__returns_expected(
6890
expected: bool | None,
6991
) -> None:
7092
# Given
71-
mock_instance1 = mock.MagicMock(spec=models.Model)
72-
mock_instance1._meta = mock.MagicMock(spec=Options)
73-
mock_instance1._meta.app_label = model1_app_label
74-
mock_instance2 = mock.MagicMock(spec=models.Model)
75-
mock_instance2._meta = mock.MagicMock(spec=Options)
76-
mock_instance2._meta.app_label = model2_app_label
93+
class AnalyticsModel1(models.Model):
94+
class Meta:
95+
app_label = model1_app_label
96+
97+
class AnalyticsModel2(models.Model):
98+
class Meta:
99+
app_label = model2_app_label
100+
77101
router = routers.AnalyticsRouter()
78102

79103
# When
80-
result = router.allow_relation(mock_instance1, mock_instance2)
104+
result = router.allow_relation(AnalyticsModel1(), AnalyticsModel2())
81105

82106
# Then
83107
assert result == expected
@@ -144,14 +168,14 @@ def test_clickhouse_router_db_for_write__given_app_label__returns_expected_db(
144168
expected_db: str | None,
145169
) -> None:
146170
# Given
147-
class MyModel(models.Model):
171+
class ClickHouseModel(models.Model):
148172
class Meta:
149173
app_label = model_app_label
150174

151175
router = routers.ClickHouseRouter()
152176

153177
# When
154-
db = router.db_for_write(MyModel)
178+
db = router.db_for_write(ClickHouseModel)
155179

156180
# Then
157181
assert db == expected_db
@@ -172,18 +196,18 @@ def test_clickhouse_router_allow_relation__given_app_labels__returns_expected(
172196
expected: bool | None,
173197
) -> None:
174198
# Given
175-
class MyModel1(models.Model):
199+
class ClickHouseModel1(models.Model):
176200
class Meta:
177201
app_label = model1_app_label
178202

179-
class MyModel2(models.Model):
203+
class ClickHouseModel2(models.Model):
180204
class Meta:
181205
app_label = model2_app_label
182206

183207
router = routers.ClickHouseRouter()
184208

185209
# When
186-
result = router.allow_relation(MyModel1(), MyModel2())
210+
result = router.allow_relation(ClickHouseModel1(), ClickHouseModel2())
187211

188212
# Then
189213
assert result is expected

0 commit comments

Comments
 (0)