/
/
/
1"""Unit tests for genre helper functions (_normalize_genre_name)."""
2
3from music_assistant.controllers.media.genres import GenreController
4
5_normalize = GenreController._normalize_genre_name
6
7
8def test_normalize_basic() -> None:
9 """Test basic genre name normalization."""
10 result = _normalize("Rock")
11 assert result == ("Rock", "Rock", "rock", "rock")
12
13
14def test_normalize_with_spaces() -> None:
15 """Test normalization of multi-word genre name."""
16 result = _normalize("Classic Rock")
17 assert result is not None
18 name, sort_name, search_name, search_sort_name = result
19 assert name == "Classic Rock"
20 assert sort_name == "Classic Rock"
21 # replace_space=True strips spaces from search names
22 assert search_name == "classicrock"
23 assert search_sort_name == "classicrock"
24
25
26def test_normalize_strips_whitespace() -> None:
27 """Test that leading/trailing whitespace is stripped."""
28 result = _normalize(" Jazz ")
29 assert result is not None
30 name, sort_name, search_name, search_sort_name = result
31 assert name == "Jazz"
32 assert sort_name == "Jazz"
33 assert search_name == "jazz"
34 assert search_sort_name == "jazz"
35
36
37def test_normalize_empty_string() -> None:
38 """Test that empty string returns None."""
39 assert _normalize("") is None
40
41
42def test_normalize_whitespace_only() -> None:
43 """Test that whitespace-only string returns None."""
44 assert _normalize(" ") is None
45
46
47def test_normalize_special_characters() -> None:
48 """Test diacritics are handled via create_safe_string (unidecode)."""
49 result = _normalize("Café")
50 assert result is not None
51 name, _sort_name, search_name, _search_sort_name = result
52 assert name == "Café"
53 assert search_name == "cafe"
54
55
56def test_normalize_unicode() -> None:
57 """Test unicode transliteration."""
58 result = _normalize("Electrónica")
59 assert result is not None
60 name, _sort_name, search_name, _search_sort_name = result
61 assert name == "Electrónica"
62 assert search_name == "electronica"
63
64
65def test_normalize_ampersand() -> None:
66 """Test R&B search_name normalization (& is stripped)."""
67 result = _normalize("R&B")
68 assert result is not None
69 name, _sort_name, search_name, _search_sort_name = result
70 assert name == "R&B"
71 assert search_name == "rb"
72
73
74def test_normalize_slash() -> None:
75 """Test compound genre name with special chars."""
76 result = _normalize("Drum & Bass / Jungle")
77 assert result is not None
78 name, _sort_name, search_name, _search_sort_name = result
79 assert name == "Drum & Bass / Jungle"
80 # All non-alphanumeric chars (including spaces, &, /) are stripped
81 assert search_name == "drumbassjungle"
82
83
84def test_normalize_returns_four_tuple() -> None:
85 """Test that a valid input always returns a tuple of exactly 4 strings."""
86 result = _normalize("Pop")
87 assert result is not None
88 assert isinstance(result, tuple)
89 assert len(result) == 4
90 assert all(isinstance(s, str) for s in result)
91