1010from django .test import override_settings
1111
1212
13- def reload_redirects_with_settings (module_path : str , ** settings_kwargs ):
13+ def reload_redirects_with_settings (redirects_module_path : str , middleware_module_path : str , ** settings_kwargs ):
1414 """
1515 Generic decorator that enables dynamic redirect reloading for testing.
1616
1717 This decorator:
18- 1. Overrides specified settings using the same pattern as @override_settings
19- 2. Reloads the specified redirects module to pick up new patterns
20- 3. Patches the redirects middleware to use the reloaded patterns
21- 4. Restores original state after the test
18+ 1. Stores the original setting values before any changes
19+ 2. Overrides specified settings using the same pattern as @override_settings
20+ 3. Reloads the specified redirects module to pick up new patterns
21+ 4. Patches the specified middleware module to use the reloaded patterns
22+ 5. Restores original settings and reloads module again after the test
2223
2324 This is needed because Django loads redirects once at startup and doesn't
2425 reload them when @override_settings is used.
2526
2627 Args:
27- module_path: The module path to reload (e.g., 'bedrock.firefox.redirects')
28- **settings_kwargs: Settings to override (e.g., ENABLE_FIREFOX_COM_REDIRECTS=True)
28+ redirects_module_path: The redirects module path to reload
29+ middleware_module_path: The middleware module path to patch
30+ **settings_kwargs: Settings to override
2931
3032 Usage:
31- @reload_redirects_with_settings('bedrock.firefox.redirects', ENABLE_FIREFOX_COM_REDIRECTS=True)
33+ @reload_redirects_with_settings(
34+ 'bedrock.firefox.redirects',
35+ 'bedrock.redirects.middleware',
36+ ENABLE_FIREFOX_COM_REDIRECTS=True
37+ )
3238 def test_my_redirect():
3339 # Your test code here
3440 pass
@@ -37,63 +43,67 @@ def test_my_redirect():
3743 def decorator (func : Callable ) -> Callable :
3844 @functools .wraps (func )
3945 def wrapper (* args : Any , ** kwargs : Any ) -> Any :
46+ from django .conf import settings
47+
48+ original_settings = {}
49+ for setting_name in settings_kwargs .keys ():
50+ original_settings [setting_name ] = getattr (settings , setting_name , None )
51+
4052 with override_settings (** settings_kwargs ):
41- original_patterns , original_resolver = _patch_redirects_middleware ( module_path )
53+ original_get_resolver = _reload_module_and_patch_middleware ( redirects_module_path , middleware_module_path )
4254 try :
4355 return func (* args , ** kwargs )
4456 finally :
45- _restore_redirects_middleware (module_path , original_patterns , original_resolver )
57+ restore_settings = {name : value for name , value in original_settings .items ()}
58+ with override_settings (** restore_settings ):
59+ _reload_module_and_patch_middleware (redirects_module_path , middleware_module_path )
60+ middleware_module = importlib .import_module (middleware_module_path )
61+ middleware_module .get_resolver = original_get_resolver
4662
4763 return wrapper
4864
4965 return decorator
5066
5167
52- def _patch_redirects_middleware ( module_path : str ) -> tuple [ Any , Any ] :
68+ def _reload_module_and_patch_middleware ( redirects_module_path : str , middleware_module_path : str ) -> Any :
5369 """
54- Patch the redirects middleware to use reloaded patterns from the specified module .
70+ Import, reload the specified module, and patch the redirects middleware .
5571
5672 Args:
57- module_path: The module path to reload
73+ redirects_module_path: The redirects module path to reload
74+ middleware_module_path: The middleware module path to patch
5875
5976 Returns:
60- Tuple of (original_patterns, original_resolver) for restoration
77+ The original get_resolver function for restoration
6178 """
62- import bedrock .redirects .middleware
63-
64- # Import and reload the specified module
65- module = importlib .import_module (module_path )
66- importlib .reload (module ) # type: ignore
79+ middleware_module = importlib .import_module (middleware_module_path )
6780
68- # Store original state
69- original_patterns = module . redirectpatterns # type: ignore
70- original_resolver = bedrock . redirects . middleware .get_resolver
81+ redirects_module = importlib . import_module ( redirects_module_path )
82+ importlib . reload ( redirects_module ) # type: ignore
83+ original_get_resolver = middleware_module .get_resolver
7184
72- # Patch the resolver to use the reloaded patterns
7385 def patched_get_resolver (patterns = None ):
7486 if patterns is None :
75- patterns = module .redirectpatterns # type: ignore
76- return original_resolver (patterns )
87+ patterns = redirects_module .redirectpatterns # type: ignore
88+ return original_get_resolver (patterns )
7789
78- bedrock . redirects . middleware .get_resolver = patched_get_resolver
90+ middleware_module .get_resolver = patched_get_resolver
7991
80- return original_patterns , original_resolver
92+ return original_get_resolver
8193
8294
83- def _restore_redirects_middleware (module_path : str , original_patterns : Any , original_resolver : Any ) -> None :
84- """
85- Restore the original redirects middleware state.
86-
87- Args:
88- module_path: The module path that was reloaded
89- original_patterns: The original redirectpatterns to restore
90- original_resolver: The original get_resolver function to restore
95+ def enable_fxc_redirects ():
9196 """
92- import bedrock . redirects . middleware
97+ Convenience decorator for Firefox.com redirect testing.
9398
94- # Restore original patterns
95- module = importlib . import_module ( module_path )
96- module . redirectpatterns = original_patterns # type: ignore
99+ This is a wrapper around reload_redirects_with_settings that enables
100+ Firefox.com redirects for the duration of the test regardless of the
101+ ENABLE_FIREFOX_COM_REDIRECTS environment variable.
97102
98- # Restore original resolver
99- bedrock .redirects .middleware .get_resolver = original_resolver
103+ Usage:
104+ @enable_fxc_redirects()
105+ def test_my_redirect():
106+ # Your test code here
107+ pass
108+ """
109+ return reload_redirects_with_settings ("bedrock.firefox.redirects" , "bedrock.redirects.middleware" , ENABLE_FIREFOX_COM_REDIRECTS = True )
0 commit comments