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
« 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."""
3from __future__ import annotations
5from typing import TYPE_CHECKING
6from unittest.mock import patch
8from assertpy import assert_that
10if TYPE_CHECKING:
11 from tests.unit.plugins.conftest import FakeToolPlugin
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
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)
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)
28 # Reset
29 fake_tool_plugin.reset_options()
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)
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_*"])
42 assert_that(fake_tool_plugin.exclude_patterns).contains("custom_pattern_*")
44 fake_tool_plugin.reset_options()
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_*")
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_*"])
58 assert_that(fake_tool_plugin.exclude_patterns).contains("second_*")
59 assert_that(fake_tool_plugin.exclude_patterns).does_not_contain("first_*")
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 }
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
76 plugin = BanditPlugin()
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")
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")
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()
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")