Skip to content

Commit e7d1258

Browse files
committed
Fix main.py test coverage implementation for Python 3.10
- Use sys.modules['mxdev.main'] to access module object for mocking - Fixes AttributeError on Python 3.10 where patch('mxdev.main.X') fails - All 7 new test functions now use patch.object() with module reference - Tests pass on all Python versions (3.10-3.14)
1 parent 4cdeffe commit e7d1258

File tree

1 file changed

+85
-71
lines changed

1 file changed

+85
-71
lines changed

tests/test_main.py

Lines changed: 85 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -177,19 +177,21 @@ def test_main_default_behavior(tmp_path, monkeypatch):
177177
# Mock command line arguments
178178
test_args = ["-c", str(config_file)]
179179

180+
import sys
181+
182+
main_module = sys.modules["mxdev.main"]
183+
180184
with (
181185
patch("sys.argv", ["mxdev"] + test_args),
182-
patch("mxdev.main.load_hooks", return_value=[]),
183-
patch("mxdev.main.read") as mock_read,
184-
patch("mxdev.main.read_hooks") as mock_read_hooks,
185-
patch("mxdev.main.fetch") as mock_fetch,
186-
patch("mxdev.main.write") as mock_write,
187-
patch("mxdev.main.write_hooks") as mock_write_hooks,
188-
patch("mxdev.main.setup_logger") as mock_setup_logger,
186+
patch.object(main_module, "load_hooks", return_value=[]),
187+
patch.object(main_module, "read") as mock_read,
188+
patch.object(main_module, "read_hooks") as mock_read_hooks,
189+
patch.object(main_module, "fetch") as mock_fetch,
190+
patch.object(main_module, "write") as mock_write,
191+
patch.object(main_module, "write_hooks") as mock_write_hooks,
192+
patch.object(main_module, "setup_logger") as mock_setup_logger,
189193
):
190-
from mxdev.main import main
191-
192-
main()
194+
main_module.main()
193195

194196
# Verify logger was set up with INFO level (default)
195197
mock_setup_logger.assert_called_once_with(logging.INFO)
@@ -218,19 +220,21 @@ def test_main_verbose_flag(tmp_path, monkeypatch):
218220

219221
test_args = ["-c", str(config_file), "--verbose"]
220222

223+
import sys
224+
225+
main_module = sys.modules["mxdev.main"]
226+
221227
with (
222228
patch("sys.argv", ["mxdev"] + test_args),
223-
patch("mxdev.main.load_hooks", return_value=[]),
224-
patch("mxdev.main.read"),
225-
patch("mxdev.main.read_hooks"),
226-
patch("mxdev.main.fetch"),
227-
patch("mxdev.main.write"),
228-
patch("mxdev.main.write_hooks"),
229-
patch("mxdev.main.setup_logger") as mock_setup_logger,
229+
patch.object(main_module, "load_hooks", return_value=[]),
230+
patch.object(main_module, "read"),
231+
patch.object(main_module, "read_hooks"),
232+
patch.object(main_module, "fetch"),
233+
patch.object(main_module, "write"),
234+
patch.object(main_module, "write_hooks"),
235+
patch.object(main_module, "setup_logger") as mock_setup_logger,
230236
):
231-
from mxdev.main import main
232-
233-
main()
237+
main_module.main()
234238

235239
# Verify logger was set up with INFO level when verbose flag is used
236240
mock_setup_logger.assert_called_once_with(logging.INFO)
@@ -252,19 +256,21 @@ def test_main_silent_flag(tmp_path, monkeypatch):
252256

253257
test_args = ["-c", str(config_file), "--silent"]
254258

259+
import sys
260+
261+
main_module = sys.modules["mxdev.main"]
262+
255263
with (
256264
patch("sys.argv", ["mxdev"] + test_args),
257-
patch("mxdev.main.load_hooks", return_value=[]),
258-
patch("mxdev.main.read"),
259-
patch("mxdev.main.read_hooks"),
260-
patch("mxdev.main.fetch"),
261-
patch("mxdev.main.write"),
262-
patch("mxdev.main.write_hooks"),
263-
patch("mxdev.main.setup_logger") as mock_setup_logger,
265+
patch.object(main_module, "load_hooks", return_value=[]),
266+
patch.object(main_module, "read"),
267+
patch.object(main_module, "read_hooks"),
268+
patch.object(main_module, "fetch"),
269+
patch.object(main_module, "write"),
270+
patch.object(main_module, "write_hooks"),
271+
patch.object(main_module, "setup_logger") as mock_setup_logger,
264272
):
265-
from mxdev.main import main
266-
267-
main()
273+
main_module.main()
268274

269275
# Verify logger was set up with WARNING level when silent flag is used
270276
mock_setup_logger.assert_called_once_with(logging.WARNING)
@@ -285,19 +291,21 @@ def test_main_offline_flag(tmp_path, monkeypatch):
285291

286292
test_args = ["-c", str(config_file), "--offline"]
287293

294+
import sys
295+
296+
main_module = sys.modules["mxdev.main"]
297+
288298
with (
289299
patch("sys.argv", ["mxdev"] + test_args),
290-
patch("mxdev.main.load_hooks", return_value=[]),
291-
patch("mxdev.main.read"),
292-
patch("mxdev.main.read_hooks"),
293-
patch("mxdev.main.fetch") as mock_fetch,
294-
patch("mxdev.main.write"),
295-
patch("mxdev.main.write_hooks"),
296-
patch("mxdev.main.setup_logger"),
300+
patch.object(main_module, "load_hooks", return_value=[]),
301+
patch.object(main_module, "read"),
302+
patch.object(main_module, "read_hooks"),
303+
patch.object(main_module, "fetch") as mock_fetch,
304+
patch.object(main_module, "write"),
305+
patch.object(main_module, "write_hooks"),
306+
patch.object(main_module, "setup_logger"),
297307
):
298-
from mxdev.main import main
299-
300-
main()
308+
main_module.main()
301309

302310
# Verify fetch was NOT called when offline flag is used
303311
assert not mock_fetch.called
@@ -317,20 +325,22 @@ def test_main_threads_flag(tmp_path, monkeypatch):
317325

318326
test_args = ["-c", str(config_file), "--threads", "8"]
319327

328+
import sys
329+
330+
main_module = sys.modules["mxdev.main"]
331+
320332
with (
321333
patch("sys.argv", ["mxdev"] + test_args),
322-
patch("mxdev.main.load_hooks", return_value=[]),
323-
patch("mxdev.main.Configuration") as mock_config,
324-
patch("mxdev.main.read"),
325-
patch("mxdev.main.read_hooks"),
326-
patch("mxdev.main.fetch"),
327-
patch("mxdev.main.write"),
328-
patch("mxdev.main.write_hooks"),
329-
patch("mxdev.main.setup_logger"),
334+
patch.object(main_module, "load_hooks", return_value=[]),
335+
patch.object(main_module, "Configuration") as mock_config,
336+
patch.object(main_module, "read"),
337+
patch.object(main_module, "read_hooks"),
338+
patch.object(main_module, "fetch"),
339+
patch.object(main_module, "write"),
340+
patch.object(main_module, "write_hooks"),
341+
patch.object(main_module, "setup_logger"),
330342
):
331-
from mxdev.main import main
332-
333-
main()
343+
main_module.main()
334344

335345
# Verify Configuration was called with threads override
336346
mock_config.assert_called_once()
@@ -353,19 +363,21 @@ def test_main_no_fetch_flag(tmp_path, monkeypatch):
353363

354364
test_args = ["-c", str(config_file), "--no-fetch"]
355365

366+
import sys
367+
368+
main_module = sys.modules["mxdev.main"]
369+
356370
with (
357371
patch("sys.argv", ["mxdev"] + test_args),
358-
patch("mxdev.main.load_hooks", return_value=[]),
359-
patch("mxdev.main.read"),
360-
patch("mxdev.main.read_hooks"),
361-
patch("mxdev.main.fetch") as mock_fetch,
362-
patch("mxdev.main.write"),
363-
patch("mxdev.main.write_hooks"),
364-
patch("mxdev.main.setup_logger"),
372+
patch.object(main_module, "load_hooks", return_value=[]),
373+
patch.object(main_module, "read"),
374+
patch.object(main_module, "read_hooks"),
375+
patch.object(main_module, "fetch") as mock_fetch,
376+
patch.object(main_module, "write"),
377+
patch.object(main_module, "write_hooks"),
378+
patch.object(main_module, "setup_logger"),
365379
):
366-
from mxdev.main import main
367-
368-
main()
380+
main_module.main()
369381

370382
# Verify fetch was NOT called when no-fetch flag is used
371383
assert not mock_fetch.called
@@ -385,19 +397,21 @@ def test_main_fetch_only_flag(tmp_path, monkeypatch):
385397

386398
test_args = ["-c", str(config_file), "--fetch-only"]
387399

400+
import sys
401+
402+
main_module = sys.modules["mxdev.main"]
403+
388404
with (
389405
patch("sys.argv", ["mxdev"] + test_args),
390-
patch("mxdev.main.load_hooks", return_value=[]),
391-
patch("mxdev.main.read"),
392-
patch("mxdev.main.read_hooks") as mock_read_hooks,
393-
patch("mxdev.main.fetch"),
394-
patch("mxdev.main.write") as mock_write,
395-
patch("mxdev.main.write_hooks") as mock_write_hooks,
396-
patch("mxdev.main.setup_logger"),
406+
patch.object(main_module, "load_hooks", return_value=[]),
407+
patch.object(main_module, "read"),
408+
patch.object(main_module, "read_hooks") as mock_read_hooks,
409+
patch.object(main_module, "fetch"),
410+
patch.object(main_module, "write") as mock_write,
411+
patch.object(main_module, "write_hooks") as mock_write_hooks,
412+
patch.object(main_module, "setup_logger"),
397413
):
398-
from mxdev.main import main
399-
400-
main()
414+
main_module.main()
401415

402416
# Verify read_hooks was NOT called
403417
assert not mock_read_hooks.called

0 commit comments

Comments
 (0)