From 3ce8c9bbf5e66705d2d634bdb9070db2530dc354 Mon Sep 17 00:00:00 2001 From: J0J0 Todos Date: Fri, 26 Jun 2026 08:32:53 +0200 Subject: [PATCH] lastgenre: Tests for _filter_valid helper, even though it's indirectly tested via resolve_genres tests and elsewhere, it makes sense to keep them to help with future refactoring. --- test/plugins/test_lastgenre.py | 60 ++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/test/plugins/test_lastgenre.py b/test/plugins/test_lastgenre.py index 7e1f1ae73..5c1e19f04 100644 --- a/test/plugins/test_lastgenre.py +++ b/test/plugins/test_lastgenre.py @@ -266,6 +266,66 @@ class LastGenrePluginTest(IOMixin, PluginTestCase): "ignored oldest ancestor must not appear in the result" ) + # _filter_valid tests + + def test_filter_valid_no_whitelist_no_ignorelist_returns_all(self): + """With neither whitelist nor ignorelist, all non-empty genres pass.""" + self._setup_config(whitelist=False) + self.plugin.ignore_patterns = defaultdict(list) + result = self.plugin._filter_valid(["rock", "jazz", "blues"]) + assert result == ["rock", "jazz", "blues"] + + def test_filter_valid_strips_empty_and_whitespace(self): + """Empty strings and whitespace-only strings are always removed.""" + self._setup_config(whitelist=False) + self.plugin.ignore_patterns = defaultdict(list) + result = self.plugin._filter_valid(["rock", "", " ", "blues"]) + assert result == ["rock", "blues"] + + def test_filter_valid_whitelist_drops_unknown_genres(self): + """Genres not in the whitelist are removed.""" + self._setup_config(whitelist={"rock", "blues"}) + result = self.plugin._filter_valid(["rock", "jazz", "blues"]) + assert result == ["rock", "blues"] + + def test_filter_valid_whitelist_is_case_insensitive(self): + """Whitelist lookup is lowercased, so genre case doesn't matter.""" + self._setup_config(whitelist={"rock"}) + result = self.plugin._filter_valid(["Rock", "ROCK", "rock"]) + assert result == ["Rock", "ROCK", "rock"] + + def test_filter_valid_ignorelist_drops_matched_genres(self): + """Genres matching ignorelist patterns are removed.""" + self._setup_config(whitelist=False) + self.plugin.ignore_patterns = defaultdict( + list, {"*": [re.compile(r"^metal$", re.IGNORECASE)]} + ) + result = self.plugin._filter_valid(["rock", "metal", "jazz"]) + assert result == ["rock", "jazz"] + + def test_filter_valid_ignorelist_artist_specific(self): + """Artist-specific ignorelist patterns apply only for that artist.""" + self._setup_config(whitelist=False) + self.plugin.ignore_patterns = defaultdict( + list, {"the artist": [re.compile(r"^noise$", re.IGNORECASE)]} + ) + assert self.plugin._filter_valid( + ["noise", "rock"], artist="the artist" + ) == ["rock"] + assert self.plugin._filter_valid(["noise", "rock"], artist="other") == [ + "noise", + "rock", + ] + + def test_filter_valid_whitelist_and_ignorelist_combined(self): + """Whitelist is applied first; ignorelist further filters the remainder.""" + self._setup_config(whitelist={"rock", "metal", "jazz"}) + self.plugin.ignore_patterns = defaultdict( + list, {"*": [re.compile(r"^metal$", re.IGNORECASE)]} + ) + result = self.plugin._filter_valid(["rock", "metal", "pop", "jazz"]) + assert result == ["rock", "jazz"] + @pytest.mark.parametrize( "config_values, item_genre, mock_genres, expected_result",