mirror of
https://github.com/beetbox/beets.git
synced 2025-12-06 16:42:42 +01:00
Refactor _get_genre test to parametrized pytest
This commit is contained in:
parent
b0e0f1b048
commit
a434ecfe7b
1 changed files with 250 additions and 72 deletions
|
|
@ -16,6 +16,8 @@
|
||||||
|
|
||||||
from unittest.mock import Mock
|
from unittest.mock import Mock
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
|
||||||
from beets import config
|
from beets import config
|
||||||
from beets.test import _common
|
from beets.test import _common
|
||||||
from beets.test.helper import BeetsTestCase
|
from beets.test.helper import BeetsTestCase
|
||||||
|
|
@ -163,78 +165,6 @@ class LastGenrePluginTest(BeetsTestCase):
|
||||||
res = plugin._tags_for(MockPylastObj(), min_weight=50)
|
res = plugin._tags_for(MockPylastObj(), min_weight=50)
|
||||||
assert res == ["pop"]
|
assert res == ["pop"]
|
||||||
|
|
||||||
def test_get_genre(self):
|
|
||||||
"""All possible (genre, label) pairs"""
|
|
||||||
mock_genres = {"track": "1", "album": "2", "artist": "3"}
|
|
||||||
|
|
||||||
def mock_fetch_track_genre(self, obj=None):
|
|
||||||
return mock_genres["track"]
|
|
||||||
|
|
||||||
def mock_fetch_album_genre(self, obj):
|
|
||||||
return mock_genres["album"]
|
|
||||||
|
|
||||||
def mock_fetch_artist_genre(self, obj):
|
|
||||||
return mock_genres["artist"]
|
|
||||||
|
|
||||||
lastgenre.LastGenrePlugin.fetch_track_genre = mock_fetch_track_genre
|
|
||||||
lastgenre.LastGenrePlugin.fetch_album_genre = mock_fetch_album_genre
|
|
||||||
lastgenre.LastGenrePlugin.fetch_artist_genre = mock_fetch_artist_genre
|
|
||||||
|
|
||||||
self._setup_config(whitelist=False)
|
|
||||||
item = _common.item()
|
|
||||||
item.genre = mock_genres["track"]
|
|
||||||
|
|
||||||
# The default setting
|
|
||||||
config["lastgenre"] = {"force": False, "keep_allowed": True}
|
|
||||||
res = self.plugin._get_genre(item)
|
|
||||||
assert res == (item.genre, "keep allowed")
|
|
||||||
|
|
||||||
# Not forcing and keeping any existing
|
|
||||||
config["lastgenre"] = {"force": False, "keep_allowed": False}
|
|
||||||
res = self.plugin._get_genre(item)
|
|
||||||
assert res == (item.genre, "keep any")
|
|
||||||
|
|
||||||
# Track
|
|
||||||
config["lastgenre"] = {"force": True, "keep_allowed": False, "source": "track"}
|
|
||||||
res = self.plugin._get_genre(item)
|
|
||||||
assert res == (mock_genres["track"], "track")
|
|
||||||
|
|
||||||
config["lastgenre"] = {"force": True, "keep_allowed": True, "source": "track"}
|
|
||||||
res = self.plugin._get_genre(item)
|
|
||||||
assert res == (mock_genres["track"], "keep + track")
|
|
||||||
print("res after track check:", res)
|
|
||||||
|
|
||||||
# Album
|
|
||||||
config["lastgenre"] = {"source": "album", "keep_allowed": False}
|
|
||||||
res = self.plugin._get_genre(item)
|
|
||||||
print("res is:", res)
|
|
||||||
print("mock_genres is:", mock_genres["album"])
|
|
||||||
assert res == (mock_genres["album"], "album")
|
|
||||||
|
|
||||||
config["lastgenre"] = {"source": "album", "keep_allowed": True}
|
|
||||||
res = self.plugin._get_genre(item)
|
|
||||||
assert res == (mock_genres["album"], "keep + album")
|
|
||||||
|
|
||||||
# Artist
|
|
||||||
config["lastgenre"] = {"source": "artist", "keep_allowed": False}
|
|
||||||
res = self.plugin._get_genre(item)
|
|
||||||
assert res == (mock_genres["artist"], "artist")
|
|
||||||
|
|
||||||
config["lastgenre"] = {"source": "artist", "keep_allowed": True}
|
|
||||||
res = self.plugin._get_genre(item)
|
|
||||||
assert res == (mock_genres["artist"], "keep + artist")
|
|
||||||
|
|
||||||
# Original
|
|
||||||
mock_genres["artist"] = None
|
|
||||||
res = self.plugin._get_genre(item)
|
|
||||||
assert res == (item.genre, "original")
|
|
||||||
|
|
||||||
# Fallback
|
|
||||||
config["lastgenre"] = {"fallback": "rap", "keep_allowed": False}
|
|
||||||
item.genre = None
|
|
||||||
res = self.plugin._get_genre(item)
|
|
||||||
assert res == (config["lastgenre"]["fallback"].get(), "fallback")
|
|
||||||
|
|
||||||
def test_sort_by_depth(self):
|
def test_sort_by_depth(self):
|
||||||
self._setup_config(canonical=True)
|
self._setup_config(canonical=True)
|
||||||
# Normal case.
|
# Normal case.
|
||||||
|
|
@ -245,3 +175,251 @@ class LastGenrePluginTest(BeetsTestCase):
|
||||||
tags = ("electronic", "ambient", "chillout")
|
tags = ("electronic", "ambient", "chillout")
|
||||||
res = self.plugin._sort_by_depth(tags)
|
res = self.plugin._sort_by_depth(tags)
|
||||||
assert res == ["ambient", "electronic"]
|
assert res == ["ambient", "electronic"]
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
"config_values, item_genre, mock_genres, expected_result",
|
||||||
|
[
|
||||||
|
# 0 - default setting. keep whitelisted exisiting, new for empty tags.
|
||||||
|
# (see "Case 4" comment in plugin)
|
||||||
|
(
|
||||||
|
{
|
||||||
|
"force": False,
|
||||||
|
"keep_allowed": True,
|
||||||
|
"source": "album", # means album or artist genre
|
||||||
|
"whitelist": True,
|
||||||
|
},
|
||||||
|
"allowed genre",
|
||||||
|
{
|
||||||
|
"album": "another allowed genre",
|
||||||
|
},
|
||||||
|
("allowed genre", "keep allowed"),
|
||||||
|
),
|
||||||
|
# 1 - default setting when whitelisted+unknown genre existing
|
||||||
|
(
|
||||||
|
{
|
||||||
|
"force": False,
|
||||||
|
"keep_allowed": True,
|
||||||
|
"source": "album",
|
||||||
|
"whitelist": True,
|
||||||
|
},
|
||||||
|
"unknown genre, allowed genre",
|
||||||
|
{
|
||||||
|
"album": "another allowed genre",
|
||||||
|
},
|
||||||
|
("allowed genre", "keep allowed"),
|
||||||
|
),
|
||||||
|
# 2 - default setting when only unknown genre existing
|
||||||
|
# clears existing but does not add new genre. Not desired but expected.
|
||||||
|
(
|
||||||
|
{
|
||||||
|
"force": False,
|
||||||
|
"keep_allowed": True,
|
||||||
|
"source": "album",
|
||||||
|
"whitelist": True,
|
||||||
|
},
|
||||||
|
"unknown genre",
|
||||||
|
{
|
||||||
|
"album": "another allowed genre",
|
||||||
|
},
|
||||||
|
("", "keep allowed"),
|
||||||
|
),
|
||||||
|
# 3 - default setting on empty tag
|
||||||
|
(
|
||||||
|
{
|
||||||
|
"force": False,
|
||||||
|
"keep_allowed": True,
|
||||||
|
"source": "album",
|
||||||
|
"whitelist": True,
|
||||||
|
},
|
||||||
|
"",
|
||||||
|
{
|
||||||
|
"album": "another allowed genre",
|
||||||
|
},
|
||||||
|
("another allowed genre", "album"),
|
||||||
|
),
|
||||||
|
# 4 - force and keep whitelisted
|
||||||
|
# (see "Case 3" comment in plugin)
|
||||||
|
(
|
||||||
|
{
|
||||||
|
"force": True,
|
||||||
|
"keep_allowed": True,
|
||||||
|
"source": "album",
|
||||||
|
"whitelist": True,
|
||||||
|
},
|
||||||
|
"allowed genre, unknown genre",
|
||||||
|
{
|
||||||
|
"album": "another allowed genre",
|
||||||
|
},
|
||||||
|
("allowed genre, another allowed genre", "keep + album"),
|
||||||
|
),
|
||||||
|
# 5 - force and keep whitelisted. artist genre
|
||||||
|
(
|
||||||
|
{
|
||||||
|
"force": True,
|
||||||
|
"keep_allowed": True,
|
||||||
|
"source": "artist", # means artist genre (only)
|
||||||
|
"whitelist": True,
|
||||||
|
},
|
||||||
|
"allowed genre, unknown genre",
|
||||||
|
{
|
||||||
|
"artist": "another allowed genre",
|
||||||
|
},
|
||||||
|
("allowed genre, another allowed genre", "keep + artist"),
|
||||||
|
),
|
||||||
|
# 6 - force and keep whitelisted. track genre
|
||||||
|
(
|
||||||
|
{
|
||||||
|
"force": True,
|
||||||
|
"keep_allowed": True,
|
||||||
|
"source": "track", # means track or album or artist genre
|
||||||
|
"whitelist": True,
|
||||||
|
},
|
||||||
|
"allowed genre, unknown genre",
|
||||||
|
{
|
||||||
|
"track": "another allowed genre",
|
||||||
|
},
|
||||||
|
("allowed genre, another allowed genre", "keep + track"),
|
||||||
|
),
|
||||||
|
# 7 - force and don't keep, overwrites any preexisting
|
||||||
|
# (see "Case 1" comment in plugin)
|
||||||
|
(
|
||||||
|
{
|
||||||
|
"force": True,
|
||||||
|
"keep_allowed": False,
|
||||||
|
"source": "album",
|
||||||
|
"whitelist": True,
|
||||||
|
},
|
||||||
|
"allowed genre, unknown genre",
|
||||||
|
{
|
||||||
|
"album": "another allowed genre",
|
||||||
|
},
|
||||||
|
("another allowed genre", "album"),
|
||||||
|
),
|
||||||
|
# 8 - don't force, don't keep allowed - on empty tag
|
||||||
|
# empty tag gets new genres
|
||||||
|
# (see "Case 2" comment in plugin)
|
||||||
|
(
|
||||||
|
{
|
||||||
|
"force": False,
|
||||||
|
"keep_allowed": False,
|
||||||
|
"source": "album",
|
||||||
|
"whitelist": True,
|
||||||
|
},
|
||||||
|
"",
|
||||||
|
{
|
||||||
|
"album": "another allowed genre, allowed genre",
|
||||||
|
},
|
||||||
|
("another allowed genre, allowed genre", "album"),
|
||||||
|
),
|
||||||
|
# 9 - don't force, don't keep allowed - on pre-populated tag
|
||||||
|
# keeps any preexisting genres
|
||||||
|
# (see "Case 2" comment in plugin)
|
||||||
|
(
|
||||||
|
{
|
||||||
|
"force": False,
|
||||||
|
"keep_allowed": False,
|
||||||
|
"source": "album",
|
||||||
|
"whitelist": True,
|
||||||
|
},
|
||||||
|
"any genre",
|
||||||
|
{
|
||||||
|
"album": "another allowed genre",
|
||||||
|
},
|
||||||
|
("any genre", "keep any"),
|
||||||
|
),
|
||||||
|
# 10 - fallback to next stages until found
|
||||||
|
(
|
||||||
|
{
|
||||||
|
"force": True,
|
||||||
|
"keep_allowed": True,
|
||||||
|
"source": "track",
|
||||||
|
"whitelist": True,
|
||||||
|
},
|
||||||
|
"unknown genre",
|
||||||
|
{
|
||||||
|
"track": None,
|
||||||
|
"album": None,
|
||||||
|
"artist": "allowed genre",
|
||||||
|
},
|
||||||
|
("allowed genre", "artist"),
|
||||||
|
),
|
||||||
|
# 11 - fallback to fallback when nothing found
|
||||||
|
(
|
||||||
|
{
|
||||||
|
"force": True,
|
||||||
|
"keep_allowed": True,
|
||||||
|
"source": "track",
|
||||||
|
"whitelist": True,
|
||||||
|
"fallback": "fallback genre",
|
||||||
|
},
|
||||||
|
"unknown genre",
|
||||||
|
{
|
||||||
|
"track": None,
|
||||||
|
"album": None,
|
||||||
|
"artist": None,
|
||||||
|
},
|
||||||
|
("fallback genre", "fallback"),
|
||||||
|
),
|
||||||
|
# 12 - fallback to allowed pre-existing when nothing found
|
||||||
|
# runs through _format_tag already, thus capitalized; This happens
|
||||||
|
# later for fetched genres!
|
||||||
|
(
|
||||||
|
{
|
||||||
|
"force": True,
|
||||||
|
"keep_allowed": True,
|
||||||
|
"source": "album",
|
||||||
|
"whitelist": True,
|
||||||
|
},
|
||||||
|
"allowed genre",
|
||||||
|
{
|
||||||
|
"album": None,
|
||||||
|
"artist": None,
|
||||||
|
},
|
||||||
|
("Allowed Genre", "original"),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
def test_get_genre(config_values, item_genre, mock_genres, expected_result):
|
||||||
|
"""Test _get_genre with various configurations."""
|
||||||
|
|
||||||
|
def mock_fetch_track_genre(self, obj=None):
|
||||||
|
return mock_genres["track"]
|
||||||
|
|
||||||
|
def mock_fetch_album_genre(self, obj):
|
||||||
|
return mock_genres["album"]
|
||||||
|
|
||||||
|
def mock_fetch_artist_genre(self, obj):
|
||||||
|
return mock_genres["artist"]
|
||||||
|
|
||||||
|
# Mock the last.fm fetchers. When whitelist enabled, we can assume only
|
||||||
|
# whitelisted genres get returned, the plugin's _resolve_genre method
|
||||||
|
# ensures it.
|
||||||
|
lastgenre.LastGenrePlugin.fetch_track_genre = mock_fetch_track_genre
|
||||||
|
lastgenre.LastGenrePlugin.fetch_album_genre = mock_fetch_album_genre
|
||||||
|
lastgenre.LastGenrePlugin.fetch_artist_genre = mock_fetch_artist_genre
|
||||||
|
|
||||||
|
# Initialize plugin instance and item
|
||||||
|
plugin = lastgenre.LastGenrePlugin()
|
||||||
|
item = _common.item()
|
||||||
|
item.genre = item_genre
|
||||||
|
|
||||||
|
# Configure
|
||||||
|
config["lastgenre"] = config_values
|
||||||
|
|
||||||
|
# Mock the whitelist instance variable
|
||||||
|
plugin.whitelist = (
|
||||||
|
set(
|
||||||
|
[
|
||||||
|
"allowed genre",
|
||||||
|
"also allowed genre",
|
||||||
|
"another allowed genre",
|
||||||
|
]
|
||||||
|
)
|
||||||
|
if config_values.get("whitelist")
|
||||||
|
else set([])
|
||||||
|
)
|
||||||
|
|
||||||
|
# Run
|
||||||
|
res = plugin._get_genre(item)
|
||||||
|
assert res == expected_result
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue