1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
|
import io
import pathlib
import pytest
from mopidy.m3u import translator
from mopidy.m3u.translator import path_to_uri
from mopidy.models import Playlist, Ref, Track
def loads(s, basedir):
return translator.load_items(io.StringIO(s), basedir)
def dumps(items):
fp = io.StringIO()
translator.dump_items(items, fp)
return fp.getvalue()
@pytest.mark.parametrize(
"path,scheme,expected",
[
("test", None, "m3u:test"),
("test.m3u", None, "m3u:test.m3u"),
("./test.m3u", None, "m3u:test.m3u"),
("foo/../test.m3u", None, "m3u:test.m3u"),
("Test Playlist.m3u", None, "m3u:Test%20Playlist.m3u"),
("test.mp3", "file", "file:///test.mp3"),
],
)
def test_path_to_uri(path, scheme, expected):
if scheme is not None:
assert path_to_uri(pathlib.Path(path), scheme) == expected
else:
assert path_to_uri(pathlib.Path(path)) == expected
def test_latin1_path_to_uri():
bytes_path = "æøå.m3u".encode("latin-1")
path = pathlib.Path(bytes_path.decode(errors="surrogateescape"))
assert translator.path_to_uri(path) == "m3u:%E6%F8%E5.m3u"
def test_utf8_path_to_uri():
bytes_path = "æøå.m3u".encode()
path = pathlib.Path(bytes_path.decode())
assert translator.path_to_uri(path) == "m3u:%C3%A6%C3%B8%C3%A5.m3u"
@pytest.mark.parametrize(
"path,expected",
[
("test", "test"),
("test.m3u", "test"),
("../test.m3u", "test"),
("testæ.m3u", "testæ"),
],
)
def test_name_from_path(path, expected):
assert translator.name_from_path(pathlib.Path(path)) == expected
def test_path_from_name():
from mopidy.m3u.translator import path_from_name
assert path_from_name("test") == pathlib.Path("test")
assert path_from_name("test", ".m3u") == pathlib.Path("test.m3u")
assert path_from_name("foo/bar", sep="-") == pathlib.Path("foo-bar")
@pytest.mark.parametrize(
"path,expected",
[
("test.m3u", ("m3u:test.m3u", "test")),
("Test Playlist.m3u", ("m3u:Test%20Playlist.m3u", "Test Playlist")),
],
)
def test_path_to_ref(path, expected):
from mopidy.m3u.translator import path_to_ref
result = path_to_ref(pathlib.Path(path))
assert Ref.playlist(uri=expected[0], name=expected[1]) == result
@pytest.mark.parametrize(
"contents,basedir,expected",
[
("", ".", None),
("test.mp3", "/playlists", ("file:///playlists/test.mp3", "test")),
("../test.mp3", "/playlists", ("file:///test.mp3", "test")),
("/test.mp3", ".", ("file:///test.mp3", "test")),
("file:///test.mp3", ".", ("file:///test.mp3", None)),
("http://example.com/stream", ".", ("http://example.com/stream", None)),
(
"#EXTM3U\n#EXTINF:42,Test\nfile:///test.mp3\n",
".",
("file:///test.mp3", "Test"),
),
(
"#EXTM3U\n#EXTINF:-1,Test\nhttp://example.com/stream\n",
".",
("http://example.com/stream", "Test"),
),
],
)
def test_load_items(contents, basedir, expected):
result = loads(contents, pathlib.Path(basedir))
if expected is not None:
assert [Ref.track(uri=expected[0], name=expected[1])] == result
else:
assert [] == result
def test_dump_items():
assert dumps([]) == ""
assert dumps([Ref.track(uri="file:///test.mp3")]) == ("file:///test.mp3\n")
assert dumps([Ref.track(uri="file:///test.mp3", name="test")]) == (
"#EXTM3U\n" "#EXTINF:-1,test\n" "file:///test.mp3\n"
)
assert dumps([Track(uri="file:///test.mp3", name="test", length=42)]) == (
"#EXTM3U\n" "#EXTINF:-1,test\n" "file:///test.mp3\n"
)
assert dumps([Track(uri="http://example.com/stream")]) == (
"http://example.com/stream\n"
)
assert dumps([Track(uri="http://example.com/stream", name="Test")]) == (
"#EXTM3U\n" "#EXTINF:-1,Test\n" "http://example.com/stream\n"
)
def test_playlist():
from mopidy.m3u.translator import playlist
path = pathlib.Path("test.m3u")
assert playlist(path) == Playlist(uri="m3u:test.m3u", name="test")
assert playlist(path, [Ref(uri="file:///test.mp3")], 1) == Playlist(
uri="m3u:test.m3u",
name="test",
tracks=[Track(uri="file:///test.mp3")],
last_modified=1000,
)
|