1- from unittest import mock
1+ from collections . abc import Iterator
22
33import pytest
4+ from django .apps import apps
45from django .db import models
5- from django .db .models .options import Options
66
77from 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