import sys import os import subprocess from spotdl import internals import pytest DUPLICATE_TRACKS_TEST_TABLE = [ ( ( "https://open.spotify.com/track/2DGa7iaidT5s0qnINlwMjJ", "https://open.spotify.com/track/2DGa7iaidT5s0qnINlwMjJ", ), ("https://open.spotify.com/track/2DGa7iaidT5s0qnINlwMjJ",), ), ( ( "https://open.spotify.com/track/2DGa7iaidT5s0qnINlwMjJ", "", "https://open.spotify.com/track/3SipFlNddvL0XNZRLXvdZD", ), ( "https://open.spotify.com/track/2DGa7iaidT5s0qnINlwMjJ", "https://open.spotify.com/track/3SipFlNddvL0XNZRLXvdZD", ), ), ( ( "ncs fade", "https://open.spotify.com/track/2DGa7iaidT5s0qnINlwMjJ", "", "ncs fade", ), ("ncs fade", "https://open.spotify.com/track/2DGa7iaidT5s0qnINlwMjJ"), ), ( ("ncs spectre ", " https://open.spotify.com/track/2DGa7iaidT5s0qnINlwMjJ", ""), ("ncs spectre", "https://open.spotify.com/track/2DGa7iaidT5s0qnINlwMjJ"), ), ] def test_default_music_directory(): if sys.platform.startswith("linux"): output = subprocess.check_output(["xdg-user-dir", "MUSIC"]) expect_directory = output.decode("utf-8").rstrip() else: home = os.path.expanduser("~") expect_directory = os.path.join(home, "Music") directory = internals.get_music_dir() assert directory == expect_directory class TestPathFilterer: def test_create_directory(self, tmpdir): expect_path = True global folder_path folder_path = os.path.join(str(tmpdir), "filter_this_folder") internals.filter_path(folder_path) is_path = os.path.isdir(folder_path) assert is_path == expect_path def test_remove_temp_files(self, tmpdir): expect_file = False file_path = os.path.join(folder_path, "pesky_file.temp") open(file_path, "a") internals.filter_path(folder_path) is_file = os.path.isfile(file_path) assert is_file == expect_file class TestVideoTimeFromSeconds: def test_from_seconds(self): expect_duration = "35" duration = internals.videotime_from_seconds(35) assert duration == expect_duration def test_from_minutes(self): expect_duration = "2:38" duration = internals.videotime_from_seconds(158) assert duration == expect_duration def test_from_hours(self): expect_duration = "1:16:02" duration = internals.videotime_from_seconds(4562) assert duration == expect_duration class TestGetSeconds: def test_from_seconds(self): expect_secs = 45 secs = internals.get_sec("0:45") assert secs == expect_secs secs = internals.get_sec("0.45") assert secs == expect_secs def test_from_minutes(self): expect_secs = 213 secs = internals.get_sec("3.33") assert secs == expect_secs secs = internals.get_sec("3:33") assert secs == expect_secs def test_from_hours(self): expect_secs = 5405 secs = internals.get_sec("1.30.05") assert secs == expect_secs secs = internals.get_sec("1:30:05") assert secs == expect_secs def test_raise_error(self): with pytest.raises(ValueError): internals.get_sec("10*05") with pytest.raises(ValueError): internals.get_sec("02,28,46") @pytest.mark.parametrize("duplicates, expected", DUPLICATE_TRACKS_TEST_TABLE) def test_get_unique_tracks(tmpdir, duplicates, expected): file_path = os.path.join(str(tmpdir), "test_duplicates.txt") with open(file_path, "w") as f: f.write("\n".join(duplicates)) unique_tracks = internals.get_unique_tracks(file_path) assert tuple(unique_tracks) == expected