Coverage for tests / unit / plugins / test_reset_options.py: 100%

45 statements  

« prev     ^ index     » next       coverage.py v7.13.0, created at 2026-04-03 18:53 +0000

1"""Tests for BaseToolPlugin.reset_options() — B2 singleton state leak fix.""" 

2 

3from __future__ import annotations 

4 

5from typing import TYPE_CHECKING 

6from unittest.mock import patch 

7 

8from assertpy import assert_that 

9 

10if TYPE_CHECKING: 

11 from tests.unit.plugins.conftest import FakeToolPlugin 

12 

13 

14def test_reset_options_restores_defaults(fake_tool_plugin: FakeToolPlugin) -> None: 

15 """Verify reset_options clears accumulated state from set_options.""" 

16 default_timeout = fake_tool_plugin.definition.default_timeout 

17 

18 # Mutate state via set_options 

19 fake_tool_plugin.set_options(exclude_patterns=["*.pyc", "*.pyo"]) 

20 fake_tool_plugin.set_options(include_venv=True) 

21 fake_tool_plugin.set_options(custom_flag="on") 

22 fake_tool_plugin.set_options(timeout=default_timeout + 60) 

23 

24 assert_that(fake_tool_plugin.include_venv).is_true() 

25 assert_that(fake_tool_plugin.options).contains_key("custom_flag") 

26 assert_that(fake_tool_plugin.options["timeout"]).is_equal_to(default_timeout + 60) 

27 

28 # Reset 

29 fake_tool_plugin.reset_options() 

30 

31 assert_that(fake_tool_plugin.include_venv).is_false() 

32 assert_that(fake_tool_plugin.options).does_not_contain_key("custom_flag") 

33 assert_that(fake_tool_plugin.options.get("timeout")).is_equal_to(default_timeout) 

34 

35 

36def test_reset_options_clears_exclude_patterns( 

37 fake_tool_plugin: FakeToolPlugin, 

38) -> None: 

39 """Verify reset_options resets exclude_patterns to defaults.""" 

40 fake_tool_plugin.set_options(exclude_patterns=["custom_pattern_*"]) 

41 

42 assert_that(fake_tool_plugin.exclude_patterns).contains("custom_pattern_*") 

43 

44 fake_tool_plugin.reset_options() 

45 

46 # After reset, should have only the default patterns (from _setup_defaults) 

47 assert_that(fake_tool_plugin.exclude_patterns).does_not_contain("custom_pattern_*") 

48 

49 

50def test_reset_options_allows_clean_reconfiguration( 

51 fake_tool_plugin: FakeToolPlugin, 

52) -> None: 

53 """Verify that set_options after reset_options does not accumulate prior state.""" 

54 fake_tool_plugin.set_options(exclude_patterns=["first_*"]) 

55 fake_tool_plugin.reset_options() 

56 fake_tool_plugin.set_options(exclude_patterns=["second_*"]) 

57 

58 assert_that(fake_tool_plugin.exclude_patterns).contains("second_*") 

59 assert_that(fake_tool_plugin.exclude_patterns).does_not_contain("first_*") 

60 

61 

62def test_bandit_reset_options_preserves_native_config() -> None: 

63 """Verify BanditPlugin.reset_options() re-applies native pyproject.toml config.""" 

64 native_config = { 

65 "skips": ["B101", "B601"], 

66 "tests": ["B201"], 

67 "severity": "HIGH", 

68 } 

69 

70 with patch( 

71 "lintro.tools.definitions.bandit.load_bandit_config", 

72 return_value=native_config, 

73 ): 

74 from lintro.tools.definitions.bandit import BanditPlugin 

75 

76 plugin = BanditPlugin() 

77 

78 # Native config should be applied from __post_init__ 

79 assert_that(plugin.options["skips"]).is_equal_to("B101,B601") 

80 assert_that(plugin.options["tests"]).is_equal_to("B201") 

81 assert_that(plugin.options["severity"]).is_equal_to("HIGH") 

82 

83 # Override all native options with user values 

84 plugin.set_options(skips="B102", tests="B999", severity="LOW") 

85 assert_that(plugin.options["skips"]).is_equal_to("B102") 

86 assert_that(plugin.options["tests"]).is_equal_to("B999") 

87 assert_that(plugin.options["severity"]).is_equal_to("LOW") 

88 

89 # Reset should restore native config, not defaults (which have skips=None) 

90 with patch( 

91 "lintro.tools.definitions.bandit.load_bandit_config", 

92 return_value=native_config, 

93 ): 

94 plugin.reset_options() 

95 

96 assert_that(plugin.options["skips"]).is_equal_to("B101,B601") 

97 assert_that(plugin.options["tests"]).is_equal_to("B201") 

98 assert_that(plugin.options["severity"]).is_equal_to("HIGH")