55# pylint: disable=unused-variable
66
77
8- from collections . abc import Callable
8+ import logging
99
1010import pytest
1111from aiohttp import web
2323
2424@pytest .fixture
2525def mock_logger (mocker : MockerFixture ) -> MockType :
26- return mocker .patch ("logging.getLogger" , autospec = True )
26+ logger_mock : MockType = mocker .create_autospec (logging .Logger , instance = True )
27+ return logger_mock
2728
2829
2930@pytest .fixture
@@ -42,116 +43,95 @@ def app(app_config: dict) -> web.Application:
4243 return _app
4344
4445
45- @pytest .fixture
46- def create_setup_bar () -> Callable [[web .Application ], bool ]:
47- @app_module_setup ("package.bar" , ModuleCategory .ADDON )
48- def setup_bar (app : web .Application ) -> bool :
46+ def test_setup_config_enabled (app_config : dict , app : web .Application ):
47+
48+ @app_module_setup (
49+ "package.zee" ,
50+ ModuleCategory .ADDON ,
51+ # legacy support for config_enabled
52+ config_enabled = "main.zee_enabled" ,
53+ )
54+ def setup_zee (app : web .Application , arg ) -> bool :
55+ assert arg
4956 return True
5057
51- return setup_bar
58+ assert setup_zee ( app , 1 )
5259
60+ assert setup_zee .metadata ()["config_enabled" ] == "main.zee_enabled"
61+ app_config ["main" ]["zee_enabled" ] = False
5362
54- @pytest .fixture
55- def create_setup_foo (mock_logger : MockType ) -> Callable [[web .Application ], bool ]:
56- @app_module_setup ("package.foo" , ModuleCategory .ADDON , logger = mock_logger )
57- def setup_foo (app : web .Application , * , raise_skip : bool = False ) -> bool :
58- if raise_skip :
59- raise SkipModuleSetupError (reason = "explicit skip" )
60- return True
63+ assert not setup_zee (app , 2 )
6164
62- return setup_foo
6365
66+ def test_setup_dependencies (app : web .Application ):
6467
65- @pytest .fixture
66- def create_setup_zee () -> Callable [[web .Application , object , int ], bool ]:
67- @app_module_setup (
68- "package.zee" , ModuleCategory .ADDON , config_enabled = "main.zee_enabled"
69- )
70- def setup_zee (app : web .Application , arg1 , kargs = 55 ) -> bool :
68+ @app_module_setup ("package.foo" , ModuleCategory .ADDON )
69+ def setup_foo (app : web .Application ) -> bool :
7170 return True
7271
73- return setup_zee
74-
75-
76- @pytest .fixture
77- def create_setup_needs_foo () -> Callable [[web .Application , str , int ], bool ]:
7872 @app_module_setup (
7973 "package.needs_foo" ,
8074 ModuleCategory .SYSTEM ,
8175 depends = [
76+ # This module needs foo to be setup first
8277 "package.foo" ,
8378 ],
8479 )
85- def _setup_needs_foo (app : web .Application , arg1 : str , kargs : int = 55 ) -> bool :
80+ def setup_needs_foo (app : web .Application ) -> bool :
8681 return True
8782
88- return _setup_needs_foo
89-
90-
91- def setup_basic (app : web .Application ) -> bool :
92- return True
93-
94-
95- def setup_that_raises (app : web .Application ) -> bool :
96- error_msg = "Setup failed"
97- raise ValueError (error_msg )
98-
99-
100- def test_setup_config_enabled (
101- app_config : dict , app : web .Application , create_setup_zee : Callable
102- ):
103- setup_zee = create_setup_zee ()
104-
105- assert setup_zee (app , 1 )
106- assert setup_zee .metadata ()["config_enabled" ] == "main.zee_enabled"
107- app_config ["main" ]["zee_enabled" ] = False
108- assert not setup_zee (app , 2 )
109-
110-
111- def test_setup_dependencies (
112- app : web .Application ,
113- create_setup_needs_foo : Callable ,
114- create_setup_foo : Callable ,
115- ) -> None :
116- setup_needs_foo = create_setup_needs_foo ()
117- setup_foo = create_setup_foo ()
118-
83+ # setup_foo is not called yet
11984 with pytest .raises (DependencyError ):
120- setup_needs_foo (app , "1" )
85+ setup_needs_foo (app )
12186
122- assert setup_foo (app , "1" )
123- assert setup_needs_foo (app , "2" )
87+ # ok
88+ assert setup_foo (app )
89+ assert setup_needs_foo (app )
12490
91+ # meta
12592 assert setup_needs_foo .metadata ()["dependencies" ] == [
12693 setup_foo .metadata ()["module_name" ],
12794 ]
12895
12996
130- def test_marked_setup (
131- app_config : dict , app : web . Application , create_setup_foo : Callable
132- ) :
133- setup_foo = create_setup_foo ()
97+ def test_marked_setup (app_config : dict , app : web . Application ):
98+ @ app_module_setup ( "package.foo" , ModuleCategory . ADDON )
99+ def setup_foo ( app : web . Application ) -> bool :
100+ return True
134101
135- assert setup_foo (app , 1 )
102+ assert setup_foo (app )
136103 assert setup_foo .metadata ()["module_name" ] == "package.foo"
137104 assert is_setup_completed (setup_foo .metadata ()["module_name" ], app )
138105
139106 app_config ["foo" ]["enabled" ] = False
140- assert not setup_foo (app , 2 )
107+ assert not setup_foo (app )
141108
142109
143- def test_skip_setup (
144- app : web .Application , mock_logger : MockType , create_setup_foo : Callable
145- ):
146- setup_foo = create_setup_foo ()
147- assert not setup_foo (app , 1 , raise_skip = True )
148- assert setup_foo (app , 1 )
149- mock_logger .info .assert_called ()
110+ def test_skip_setup (app : web .Application , mock_logger : MockType ):
111+ @app_module_setup ("package.foo" , ModuleCategory .ADDON , logger = mock_logger )
112+ def setup_foo (app : web .Application , * , raise_skip : bool = False ) -> bool :
113+ if raise_skip :
114+ raise SkipModuleSetupError (reason = "explicit skip" )
115+ return True
150116
117+ assert not setup_foo (app , raise_skip = True )
118+ assert setup_foo (app )
151119
152- def test_ensure_single_setup_runs_once (
153- app : web .Application , mock_logger : MockType
154- ) -> None :
120+ assert mock_logger .info .called
121+ args = [call .args [- 1 ] for call in mock_logger .info .mock_calls ]
122+ assert any ("explicit skip" in arg for arg in args )
123+
124+
125+ def setup_basic (app : web .Application ) -> bool :
126+ return True
127+
128+
129+ def setup_that_raises (app : web .Application ) -> bool :
130+ error_msg = "Setup failed"
131+ raise ValueError (error_msg )
132+
133+
134+ def test_ensure_single_setup_runs_once (app : web .Application , mock_logger : MockType ):
155135 decorated = ensure_single_setup ("test.module" , logger = mock_logger )(setup_basic )
156136
157137 # First call succeeds
@@ -160,16 +140,11 @@ def test_ensure_single_setup_runs_once(
160140
161141 # Second call skips
162142 assert not decorated (app )
163- mock_logger .info .assert_called_with (
164- "Skipping '%s' setup: %s" ,
165- "test.module" ,
166- "'test.module' was already initialized in <Application. Avoid logging objects like this>. Setup can only be executed once per app." ,
167- )
168143
169144
170145def test_ensure_single_setup_error_handling (
171146 app : web .Application , mock_logger : MockType
172- ) -> None :
147+ ):
173148 decorated = ensure_single_setup ("test.error" , logger = mock_logger )(setup_that_raises )
174149
175150 with pytest .raises (ValueError , match = "Setup failed" ):
@@ -179,7 +154,7 @@ def test_ensure_single_setup_error_handling(
179154
180155def test_ensure_single_setup_multiple_modules (
181156 app : web .Application , mock_logger : MockType
182- ) -> None :
157+ ):
183158 decorated1 = ensure_single_setup ("module1" , logger = mock_logger )(setup_basic )
184159 decorated2 = ensure_single_setup ("module2" , logger = mock_logger )(setup_basic )
185160
0 commit comments